安卓使用 PN532 读写 NFC

 

动机

安卓手机本身的NFC功能不全且爆破密码太慢,于是买了个PN532破小区门卡。

Windows上有现成的工具MifareOneTool教程,很轻松就解决了,于是想着能否在安卓的Termux上复现,于是就有了这篇文章。

准备

物质准备

  • PN532,我买的是这个PN532+CH340G套餐
  • 一台有OTG功能的安卓手机,安卓版本最低为7.0
  • 自行焊接PN532的引脚

焊接完成后按下表接线,注意PN532上面有两个调节工作模式的开关(开关上覆膜),这里不需要调节。

PN532 USB转TTL模块 USB转TTL线(具体颜色不重要)
GND GND 黑色
VCC 5.0V 红色
TXD/SDA RXD 白色
RXD/SCL TXD 绿色

软件配置

  • Termux:终端模拟器
  • TCPUART:串口转TCP协议
  • RFID Tools v1.3.3:一站式NFC工具箱,支持系统NFC(部分)与PN532等外接NFC设备

Termux配置

该方案在TermuxArch等proot系统中也可使用。强烈建议使用TermuxArch。

感谢这个讨论中给出的方案!

pkg install autoconf make git automake pkg-config libtool clang
# for Arch Linux
# yay -S --needed autoconf make git automake pkg-config libtool gcc
git clone --depth 1 https://github.com/mywalkb/libnfc
cd libnfc
autoreconf -vis
./configure --prefix=$PREFIX --with-drivers=pn532_uart
make -j8
make install

连接

TCPUART监听

将PN532使用USB线连接到手机上,打开TCPUART,点击第一个Connect并在系统弹框中允许访问USB设备;然后下面的选项改为Server,配置监听端口(此处假设为10000),点击Start。记得锁后台,别被杀了。

Termux使用

export LIBNFC_DEVICE="pn532_uart:tcp_127.0.0.1_10000"
# do what you want to do now

如果一切正常,你应该可以开始使用NFC相关命令了。

$ nfc-scan-device # 查看 NFC 设备
nfc-scan-device uses libnfc 1.8.0
1 NFC device(s) found:
error	libnfc.bus.uart	Unable to apply new speed settings.
- user defined device:
    pn532_uart:tcp_127.0.0.1_10000
$ nfc-list # 扫描附近的卡片,注意 PN532 要贴紧卡片
error	libnfc.bus.uart	Unable to apply new speed settings.
NFC device: user defined device opened
2 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): d8  11  c0  02  
      SAK (SEL_RES): 08  

使用

nfc-mfclassic

PN532放在卡片上,执行,若输出类似下图则完全无加密,可以直接读写。如果卡片有加密,则需要在原有命令末尾再指定一个存有密钥的.mfd文件。

详细命令行参数请参考 nfc-mfclassic(1) - Arch manual pages

$ nfc-mfclassic r a u dump.mfd # `a`指使用密钥A,`u`指使用默认UID
NFC reader: user defined device opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): 70  52  c1  02  
      SAK (SEL_RES): 08  
RATS support: no
Guessing size: seems to be a 1024-byte card
Reading out 64 blocks |................................................................|
Done, 64 of 64 blocks read.
Writing data to file: dump.mfd ...Done.

$ nfc-mfclassic W a u dump.mfd # 相比w,W会写入0扇区0块
NFC reader: user defined device opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): 70  52  c1  02  
      SAK (SEL_RES): 08  
RATS support: no
Guessing size: seems to be a 1024-byte card
Sent bits:     50  00  57  cd  
Sent bits:     40 (7 bits)
Received bits: a (4 bits)
Sent bits:     43  
Received bits: 0a  
Card unlocked
Writing 64 blocks |................................................................|
Done, 64 of 64 blocks written.

mfoc & mfcuk

如果你正在用Termux,你得先去编译安装mfoc-hardnestedmfcuk,这里就不多赘述。

如果你在用Arch,可以直接使用yay -S mfoc-hardnested-git mfcuk-git安装。

mfcuk可用于全加密卡,使用mfcuk -C -R 0:A -s 250 -S 250进行爆破,爆破出至少一个密码时可改用mfoc

mfoc-hardnested可用于半加密卡或已知一个密码的卡,使用mfoc-hardnested -O dump.mfd进行爆破。

crypto1_bs

用于半加密卡之一密破解。

git clone https://github.com/aczid/crypto1_bs.git --depth 1
cd crypto1_bs
git clone https://github.com/Tilka/crapto1.git crapto1-v3.3 --depth 1
git clone https://github.com/vk496/craptev1.git craptev1-v1.1 --depth 1
make
./libnfc_crypto1_crack <known key> <for block> <A|B> <target block> <A|B>

收集足够nounces(即停止显示Collected xxx nounces...,进入到Cracking)后,你就可以直接停止破解,在目录下找到0x1111aaaa_003A.txt的文件(1111aaaa为卡片UID,3为待破解扇区,B为待破解扇区密钥类型),并按照动机中的视频教程破解,或是使用./solve_bs 0x1111aaaa_003A.txt 0x1111aaaa破解。

Proxmark3

如果你在用Termux(非proot/chroot)

自己编译各个组件(指termcap等)去吧。我也不确定能不能成功。

如果你在用Windows

直接下预编译版本中有official字样的即可。

Go.bat即可开启Proxmark3控制台,nonces.bin放到Go.bat同一目录下。(见下)

如果你在用Arch

直接yay -S termcap gcc-arm-none-eabi-bin && git clone https://github.com/Proxmark/proxmark3 --depth 1 && cd proxmark3 && wget https://github.com/Proxmark/proxmark3/commit/ee8491b04a5ef3950c2fdc1dd2c2a14706247e7e.diff && git apply ee8491b04a5ef3950c2fdc1dd2c2a14706247e7e.diff && make clean && make all即可。

make完成后,你可以得到client/目录,cd进入此目录。

下载nfc_txt_to_bin.py,并将0x1111aaaa_003A.txt转换为1111aaaa_generated.bin,重命名为nonces.bin丢到client/目录下。

cd client
wget https://github.com/Young-Lord/Young-Lord.github.io/releases/download/assets/nfc_txttobin.py
python3 nfc_txttobin.py 0x1111aaaa_003A.txt 1111aaaa
mv 1111aaaa_generated.bin nonces.bin
# 进入交互式命令行,串口号相关报错不用理
./proxmark3 /

进入proxmark3命令行后,执行以下命令爆破。注意留出足够的运行内存(~2GB)

hf mf hardnested r

很快该扇区密码就能跑出来了。

proxmark3> hf mf hardnested r
--target block no:  0, target key type:A, known target key: 0x000000000000 (not set), file action: read, Slow: No, Tests: 0           
Using no SIMD core.          


          
 time    | #nonces | Activity                                                | expected to brute force          
         |         |                                                         | #states         | time           
------------------------------------------------------------------------------------------------------          
       0 |       0 | Start using 8 threads and no SIMD core                  |                 |          
       0 |       0 | Brute force benchmark: 232 million (2^27.8) keys/s      | 140737488355328 |    7d          
       2 |       0 | Using 235 precalculated bitflip state tables            | 140737488355328 |    7d          
       3 |       0 | Reading nonces from file nonces.bin...                  | 140737488355328 |    7d          
      12 |    1670 | (Ignoring Sum(a8) properties)                           |          686792 |    0s          
      12 |    1670 | Starting brute force...                                 |          686792 |    0s          
      12 |    1670 | Brute force phase completed. Key found: 000000000000    |               0 |    0s    

mfterm

用于更简单地爆破密码、读写转储。

Arch: yay -S mfterm

Termux: 自行编译,wget https://github.com/4ZM/mfterm/releases/download/v1.0.7/mfterm-1.0.7.tar.gz && tar xvf mfterm-1.0.7.tar.gz && cd mfterm-1.0.7/ && ./configure --prefix=$PREFIX "CFLAGS=-Wno-error" && make && make install

注意这里的write unlocked不一定能写入0扇区0块,此时可以尝试使用nfc-mfclassic W

mfdread

Python脚本,用于查看.mfd转储。

下载脚本,搞个虚拟环境安装bitstring依赖即可。

参考资料

来自教程视频的Windows软件下载链接