Network Namespace
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Temel Bilgiler
A network namespace, her bir 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 bir 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.
Nasıl çalışır:
- 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.
- veth çiftleri gibi sanal ağ arayüzleri 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ğlar.
- Bir ad alanındaki 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.
- Süreçler,
setns()
sistem çağrısını kullanarak ad alanları arasında hareket edebilir veyaCLONE_NEWNET
bayrağı ileunshare()
veyaclone()
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.
Laboratuvar:
Farklı Ad Alanları Oluşturma
CLI
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
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.
Hata: bash: fork: Bellek tahsis edilemiyor
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:
- Sorun Açıklaması:
- 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
'iunshare
ile aynı süreçte başlatır. Sonuç olarak,/bin/bash
ve onun çocuk süreçleri orijinal PID ad alanında kalı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ırakır.
- Sonuç:
- 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şturulurkenalloc_pid
fonksiyonunun yeni bir PID tahsis edememesine neden olur ve "Bellek tahsis edilemiyor" hatasını üretir.
- Çö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ı 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.
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; bu da /bin/bash
ve alt süreçlerinin bellek tahsis hatası ile karşılaşmadan çalışmasına olanak tanır.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
Hangi ad alanında olduğunuzu kontrol edin
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
Tüm Ağ ad alanlarını Bulun
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>
Bir Ağ ad alanına girin
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
).
Referanslar
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.