İzmir'de toplu ulaşım sistemindeki tüm araçlardan yararlanmak için kullanılan İzmirim Kart, sosyal medyada farklı bir hikâyeyle gündem oldu. Bir sosyal medya kullanıcısı kartta yazılımsal bir açık bulduğunu ve yaptığı ayarlamalarla toplu ulaşımı nasıl ücretsiz kullanabildiğini sosyal medya hesabından anlattı.

Kartın yazılımındaki açığı yetkililere bildirdiğini açıklayan kullanıcı, "İzmir İnovasyon ve Teknoloji A.Ş ekibi, bu bildirdiğim açık için teşekkür etti ve konuyu ASİS’e bildireceklerini söyledi. 9 Ocak'ta İzmir İnovasyon ve Teknoloji A.Ş., sorunun ASİS tarafından düzeltildiğini onayladı" dedi.

Örümcek adam hislerim uyandı

Sosyal medya kullanıcısı, İzmirim Kart’ı nasıl hacklediğine dair hikayenin tamamını şöyle anlattı:

Bir ay önce İstanbul’dan İzmir’e taşınma kararı aldım. Yeni evim Konak’taydı, arkadaşım ise Balçova’da oturuyordu.

Sürekli arkadaşıma gitmek için tramvay + otobüs kullanıyordum, fakat İzmirim Kart’ım olmadığı için İzmirim Kart uygulamasıyla QR kod okutarak biniyordum.

Bir süre sonra QR kodun nasıl çalıştığını merak ettim. Telefonumun kamerasıyla Karataş tramvay durağındaki QR kodu okuttum ve aşağıdaki gibi bir değerle karşılaştım:

2|c1c98513-1e9e-41d4-8816-3efa2234c851|35|18020|902|222|0|255|0.000000|0.000000|0|0|1|0

Bu değerleri görünce, 5 yıllık #bugbounty avcılığı tecrübem ve örümcek adam hislerim uyandı. Burada bir sorun olduğunu hissettim.

Üşengeç biri olduğum için ilk önce bu hash’i yorumlaması için ChatGPT’ye gönderdim. ChatGPT, kabaca 2. sütunun bir UUID olduğunu, 9. ve 10. sütunların bir coğrafi koordinatı işaret ettiğini söyledi, 3. sütundaki "35"in ise İzmir’i temsil ediyor olabileceğini düşündüm.

Daha sonra otobüse (ESHOT) binmem gerekti. Onun da QR kodunu okutup iki hash de olan farklılıkları görmek istedim. QR kodunun değeri aşağıdaki gibiydi ve ChatGPT’den farkını sordum:

2|327a3887-6386-4206-8f9b-11831aba5041|35|22126|100480|50007|0|255|38.397518|27.069039|0|0|0|0

UUID değerleri ve koordinat gibi bazı değerler farklıydı ama bu pek bir şey ifade etmiyordu. Eve varınca İzmirim Kart mobil uygulamasını incelemeye karar verdim.

Çektiğim QR kodlarını, root’lu ve çoğu uygulamaların basit SSL sabitlemelerini çözen telefonumla, İzmirim Kart uygulamasına giden-gelen requestleri yakalamak istedim. Fakat hiçbir request yakalayamadım. Ya çok güçlü bir SSL sabitlemesi kullanıyorlardı ya da istekler WebSocket istekleri olduğu için yakalayamadım.

Belki diğer uygulama versiyonlarında WebSocket kullanmıyorlardır diye eski APK sürümlerini indirip tek tek test ettim. Ancak 3-5 işe yaramaz istek dışında pek bir şey bulamadım.

SSL sabitlemesini kaldırmak için APK dosyasını yamalayıp yeniden build ederim diye düşünüp uygulamanın son sürüm APK’sini JADX ile açtım. SSL sabitlemesini ararken bir anda QR kodla ilgili kodlarla karşılaştım. Bu değişkenler QR koddaki değerlerle eşleşiyor gibi görünüyordu ve bir değişken dikkatimi çekti: refundMode. İşte burada örümcek hislerim tekrar devreye girdi.

Değişkenlere ve hash’deki değerlere baktığımda, refundMode’nin karşılığı son 4 sütun gibi görünüyordu. Sadece 1 (true) ve 0 (false) değerlerini alıyordu. Bunlardan birinin refundMode’un karşılığı olan boolean değerler olabileceğini düşündüm.

"-0 TL aktarma" yazısını görünce şok oldum

Bir QR kod oluşturucuya giderek çektiğim duraktaki QR değerleri alarak aşağıdaki değerlerde yeni bir QR kod oluşturdum ve diğer telefonumla İzmirim Kart uygulamasından okuttum:

2|c1c98513-1e9e-41d4-8816-3efa2234c851|35|18020|902|222|0|255|0.000000|0.000000|0|0|0|0

Hepsini 0 yapmak bir şeyi değiştirmedi ve -20 TL ücret kesti. Daha sonra son 4 sütunu 1 ile değiştirip tekrar okuttum:

2|c1c98513-1e9e-41d4-8816-3efa2234c851|35|18020|902|222|0|255|0.000000|0.000000|1|1|1|1
"-0 TL aktarma" yazısını görünce şok oldum.
Emin olmak için tekrar tekrar okuttum ve her seferinde aynı sonuç:
-0 TL aktarma
-0 TL aktarma
-0 TL aktarma

İnanılmaz tatmin olmuştum. Ertesi sabah koşarak Karataş tramvay durağına gittim. Önce ilk telefonumla normal QR kodu okuttum. Daha sonra QR oluşturucu ile son değerleri 1|1|1|1 olarak değiştirip yeni QR kod oluşturup diğer telefonumla okuttum. Ve o başarılı “düttürü düttt!” sesi...
Teoriyi canlı olarak kanıtlamak inanılmaz keyifliydi.

İş yerlerini test etmedim

Artık İzmirim Kart’ın geçtiği otobüs, İzban, Metro, Tramvay, Vapur, Teleferik, Doğal Yaşam Parkı ve Buz Patenini ücretsiz-bedava kullanabiliyorum. Ayrıca İzmirim Kart’ın geçtiği üye işyerleri de vardı: lokanta, kırtasiye, bakkal vs. gibi. Ancak bu işyerlerini kısa süreli de olsa mağdur etmek istemediğimden test etmedim.

Sorunun detaylarını paylaştım

Çarşamba, 25 Aralık 2024: İzmir İnovasyon ve Teknoloji A.Ş. ile ilk teması kurdum.

QR kodu otomatik çektikten sonra değiştirip yeni QR kodu oluşturan bir web sitesi demosu hazırladım.

Pazartesi, 30 Aralık 2024: Demo gösterimi için ofise davet edildim. Sorunun detaylarını mobil ve yazılım müdürü eşliğinde yazılım ve geliştirme takımı ile paylaştım.

İlk incelemede sorunun ilgili kodun ASİS’e ait olduğu tespit edildi.
Takım kendi arasında overthinklerken ASİS’i önce “Aziz” diye anlamıştım "Bunlar Azizin kodları" falan meğerse ASİS, 16 ülke, 63 şehir(belediye), 90.000+ cihaz, 40.000+ araçta geçerli kart sistemlerini yazan bir firmaymış.

İzmir İnovasyon ve Teknoloji A.Ş ekibi, bu bildirdiğim açık için teşekkür etti ve konuyu ASİS’e bildireceklerini söyledi.

Perşembe, 9 Ocak 2025: İzmir İnovasyon ve Teknoloji A.Ş., sorunun ASİS tarafından düzeltildiğini onayladı."

Söz konusu paylaşım binlerce beğeni ve onlarca yorum aldı. 

Kaynak: HABER MERKEZİ