Proxmark3
본 실습은 악의적인 목적 없이 오로지 교육적 실습을 위해 진행함을 알립니다.
1. 기본 구조 이해
RFID는 크게 LF와 HF 두 분류로 나누어진다.
LF(Low Frequency)
125kHz 주파수 대역을 사용하며 ISO 11784/5와 같은 프로토콜을 사용한다. 기본적으로 암호화가 매우 약한 방식이다.
우리가 흔히 보는 아파트 출입증이 이에 해당된다고 보면 될 것 같다. LF는 1990년대 설계 당시 보안이 주 목적이 아니였기 때문에 UID 송신만으로 인증을 처리해왔다. 때문에 대부분이 정적 데이터로 이루어져 있어 카드값 그대로 복제 혹은 변조가 가능하다는 취약점을 가진다.
송수신 방법
- 리더기가 125kHz 자기장을 송출한다.
- 카드가 자기장에 유도되어 전력 수신을 받는다.
- UID를 Manchester 혹은 PSK 등의 방식으로 송신한다.
- 리더기는 UID를 수신하여 승인 여부를 판단한다.
Manchester Encoding
맨체스터 코드 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 맨체스터 코드란 정보통신에서 디지털 인코딩의 한 형태이다. 특히, 이는 어떠한 신호를 물리 계층에서 전송할 때 쓰이는 방법이다. 맨체스터 코드에서는 하나
ko.wikipedia.org
디지털 비트를 전기 신호로 바꿀 때 사용하는 변환 기법을 의미한다.
보통 디지털 비트를 전기 신호로 바꾸면 0은 낮은 전압, 1은 높은 전압으로 변환되는 것을 이미지하게 된다.
Manchester Encoding은 단순히 높고 낮은 전압으로 표현하는 것이 아니라 하강 전압과 상승 전압. 즉, 변화의 패턴으로 표현한다.
동기화가 쉬워 리더가 타이밍을 맞추기 쉽다는 장점이 있고 노이즈에 강하다. (노이즈가 강하다는 의미는 LF처럼 속도가 느린 환경에 적합하다.)
PSK (Phase Shift Keying); 위상편이 변조
위상 편이 변조 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 위상 편이 변조(Phase-shift keying, PSK)는 기준 신호(반송파)의 위상을 변경 또는 변조 함으로써 데이터를 전송하는 디지털 변조 방식이다 모든 디지털 변조 방식은
ko.wikipedia.org
고주파의 위상을 바꿔서 데이터를 전송한다.
앞서 Manchester Encoding은 하강 전압과 상승 전압과 같이 변화의 패턴으로 표현하게 된다.
반면, PSK의 경우 신호에 위상을 담아 소통하는 방식이며 0을 0˚에 1을 180˚와 같이 위상에 대응시켜 통신한다.
좁은 주파수 대역에 많은 데이터를 담을 수 있다는 장점이 있고 HF 대역에서 흔히 사용된다.
HF(High Frequency)
13.56MHz 주파수 대역을 사용하며 ISO 14443-A/B, ISO 7816, ISO 18092와 같은 프로토콜을 사용한다. MIFARE나 EMV와 같은 기술 표준을 채택한다. 특히, MIFARE Classic은 Crypto-1이라는 깨진 암호화 방식을 사용하고 있다. 요즘에 사용하는 EMV(Europay, Mastercard, Visa)의 경우 RSA, ECC, SDA/DDA/CDA와 같은 암호화 방식을 채택하고 있다.
1. 리더기가 13.56MHz 자기장을 송출한다.
2. 카드가 자기장에 유도되어 전력 수신을 받는다.
3. 리더기와 카드가 Anti-Collision을 수행한다. (다중 카드 구별)
4. UID + 명령 (Read/Write)를 주고받는다.
5. 필요 시 인증을 수행한다.
Anti-Collision (충돌 방지 프로토콜)
Anti-Collision은 다수의 RFID 태그가 동시에 필드 안에 있을 때, 오인하지 않고 각 태그를 하나씩 고유하게 식별하여 충돌없이 통신하는 프로토콜이다. 자세한 매커니즘은 https://www.nxp.com/docs/en/application-note/AN10833.pdf 문서에 설명되어 있다. UID에 대해 SELECT 명령을 보내며 응답을 확인하고 다음 Cascade Level로 넘어가야 하는지 판단하며 반복하는 절차를 진행하는 로직으로 구성되어 있다.
2. 카드 식별 및 정보 수집
실습 준비 (선택)
# Magic Card UID 할당
[usb] pm3 --> hf mf csetuid -u 11223344
# 할당된 UID 확인
[usb] pm3 --> hf search
# Magic Card 초기화
[usb] pm3 --> hf mf cwipe
# Data 셋업
echo -n "$(printf '00%.0s' {1..1008})a0a1a2a3a4a5787878787878ffffffffffff" | xxd -r -p > test_hex.bin
# Data 할당
[usb] pm3 --> hf mf cload -f test_hex.bin
1. 카드 기본 정보 획득
[usb] pm3 --> hf search
🕛 Searching for ISO14443-A tag...
[=] ---------- ISO14443-A Information ----------
[+] UID: 00 00 00 00 ( ONUID, re-used )
[+] ATQA: 00 04
[+] SAK: 08 [2]
[+] Possible types:
[+] MIFARE Classic 1K
[=]
[=] Proprietary non iso14443-4 card found
[=] RATS not supported
[+] Magic capabilities... Gen 1a
[#] Static nonce......... 009080a2
[+] Static nonce......... yes
[?] Hint: Use `hf mf c*` magic commands
[?] Hint: Try `hf mf info`
[+] Valid ISO 14443-A tag found
- UID가 표출되어 있고 ONUID(One-time Non-Unique ID)이며 re-used로 식별된것을 보아 Magic Card일 확률이 높음.
- ATQA(Answer To Request, Type A): 카드의 특성을 나타내는 값이며, REQA 혹은 WUPA에 대한 응답으로 사용된다. 해당 값이 00 04이기 때문에 UID가 Single 임을 알 수 있다.
- UID가 4 Bytes(Single), 7 Bytes(Double), 10 Bytes(Triple)인지 표시
- Bit Frame Anticollision을 지원하는지 표시
- Proprietary - 제조사 전용 비트 기입
- SAK(Select Acknowledge): 카드가 선택되었을 때, 리더기에 자신임을 확정적으로 식별하기 위해 보내는 응답이다. 해당 값이 08임을 보아 MIFARE Classic 1K임을 알 수 있다.
- 08: MIFARE Classic 1K
- 28: Classic 1K + ISO14443-4
- 20: MIFARE Ultralight
- 40: MIFARE DESFire
- 00: UID 전송만 완료
2. 카드 상세 정보 획득
[usb] pm3 --> hf mf info
[=] --- ISO14443-a Information ---------------------
[+] UID: 00 00 00 00
[+] ATQA: 00 04
[+] SAK: 08 [1]
[=] --- Keys Information
[+] loaded 2 user keys
[+] loaded 61 hardcoded keys
[+] Sector 0 key A... 000000000000
[+] Sector 0 key B... 000000000000
[+] Sector 1 key A... 000000000000
[=] --- Fingerprint
[=] <n/a>
[=] --- Magic Tag Information
[+] Magic capabilities... Gen 1a
[=] --- PRNG Information
[#] Static nonce......... 009080a2
[+] Static nonce... yes
- Sector 0~1의 Key A/B 모두 0x00으로 설정되어 있음을 의미한다.
- 0x00은 Default Key(기본키)이며, 변경되지 않은 카드임을 의미한다
- loaded 2 user keys, 61 hardcoded keys는 Key Dictionary를 이용해 key 대치를 시행해본 상태임을 의미한다.
- Magic Card Gen 1a는 UID 변경이 가능하고 Crypto-1 암호화 알고리즘을 실제 시행하는 것처럼 시뮬레이션 하는 카드임을 의미한다.
- Static nonce yes는 카드의 난수 생성이 정적(static)임을 나타낸다.
3. 키 존재 여부 확인
[usb] pm3 --> hf mf chk
[+] loaded 61 hardcoded keys
[=] Start check for keys...
[=] .................................
[=] time in checkkeys 9 seconds
[=] testing to read key B...
[=] Sector: 15, First block: 60, Last block: 63, Num of blocks: 4
[=] Reading sector trailer
Data:78 78 FF FF FF FF
[+] found keys:
[+] -----+-----+--------------+---+--------------+----
[+] Sec | Blk | key A |res| key B |res
[+] -----+-----+--------------+---+--------------+----
[+] 000 | 003 | 000000000000 | 1 | 000000000000 | 1
[+] 001 | 007 | 000000000000 | 1 | 000000000000 | 1
[+] 002 | 011 | 000000000000 | 1 | 000000000000 | 1
[+] 003 | 015 | 000000000000 | 1 | 000000000000 | 1
[+] 004 | 019 | 000000000000 | 1 | 000000000000 | 1
[+] 005 | 023 | 000000000000 | 1 | 000000000000 | 1
[+] 006 | 027 | 000000000000 | 1 | 000000000000 | 1
[+] 007 | 031 | 000000000000 | 1 | 000000000000 | 1
[+] 008 | 035 | 000000000000 | 1 | 000000000000 | 1
[+] 009 | 039 | 000000000000 | 1 | 000000000000 | 1
[+] 010 | 043 | 000000000000 | 1 | 000000000000 | 1
[+] 011 | 047 | 000000000000 | 1 | 000000000000 | 1
[+] 012 | 051 | 000000000000 | 1 | 000000000000 | 1
[+] 013 | 055 | 000000000000 | 1 | 000000000000 | 1
[+] 014 | 059 | 000000000000 | 1 | 000000000000 | 1
[+] 015 | 063 | A0A1A2A3A4A5 | 1 | 7878FFFFFFFF | 1
[+] -----+-----+--------------+---+--------------+----
[+] ( 0:Failed / 1:Success )
Sector 구성
Block 0 | 제조사 데이터 | UID, BCC 등 (섹터 0에서만 의미 있음) |
Block 1 | 사용자 데이터 저장용 | 16 Bytes |
Block 2 | 사용자 데이터 저장용 | 16 Bytes |
Block 3 | Sector Trailer | Key A (6 Bytes) + Access Bits (4 Bytes) + Key B (6 Bytes) |
4. 데이터 확인
[usb] pm3 --> hf mf cview
[+] View magic Gen1a MIFARE Classic 1K
[=] .................................................................
[=] -----+-----+-------------------------------------------------+-----------------
[=] sec | blk | data | ascii
[=] -----+-----+-------------------------------------------------+-----------------
[=] 0 | 0 | 00 56 78 BB 95 08 04 00 02 B2 1E 24 23 27 1E 1D | .Vx��....�.$#'..
[=] | 1 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 2 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 3 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 1 | 4 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 5 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 6 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 7 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 2 | 8 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 10 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 11 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 3 | 12 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 13 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 14 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 15 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 4 | 16 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 17 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 18 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 19 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 5 | 20 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 21 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 22 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 23 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 6 | 24 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 25 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 26 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 27 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 7 | 28 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 29 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 30 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 31 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 8 | 32 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 33 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 34 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 35 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 9 | 36 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 37 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 38 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 39 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 10 | 40 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 41 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 42 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 43 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 11 | 44 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 45 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 46 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 47 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 12 | 48 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 49 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 50 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 51 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 13 | 52 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 53 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 54 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 55 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 14 | 56 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 57 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 58 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 59 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] 15 | 60 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 61 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 62 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
[=] | 63 | FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF | �������.�i������
[=] -----+-----+-------------------------------------------------+-----------------
3. 카드 읽기 및 쓰기
특정 Sector 쓰기
[usb] pm3 --> hf mf wrbl --blk 39 -k FFFFFFFFFFFF -a --force -d A0A1A2A3A4A5FF0780B0B1B2B3B4B5B6
[=] Sector trailer (ST) write detected
[+] ST checks ( ok )
[=] Writing block no 39, key type:A - FFFFFFFFFFFF
[=] data: A0 A1 A2 A3 A4 A5 FF 07 80 B0 B1 B2 B3 B4 B5 B6
[+] Write ( ok )
[?] Hint: Try `hf mf rdbl` to verify
특정 Sector 읽기
[usb] pm3 --> hf mf rdbl --blk 39 -k A0A1A2A3A4A5 -a
[=] # | sector 09 / 0x09 | ascii
[=] ----+-------------------------------------------------+-----------------
[=] 39 | 00 00 00 00 00 00 FF 07 80 B0 B1 B2 B3 B4 B5 B6 | ......�.��������
[usb] pm3 --> hf mf rdbl --blk 39 -k B1B2B3B4B5B6 -b
[=] # | sector 09 / 0x09 | ascii
[=] ----+-------------------------------------------------+-----------------
[=] 39 | 00 00 00 00 00 00 FF 07 80 B0 B1 B2 B3 B4 B5 B6 | ......�.��������