DDexec / EverythingExec
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Linux'ta bir programı çalıştırmak için, bir dosya olarak var olması, dosya sistemi hiyerarşisi aracılığıyla bir şekilde erişilebilir olması gerekir (bu, execve()
'nin nasıl çalıştığıdır). Bu dosya diskte veya ram'de (tmpfs, memfd) bulunabilir, ancak bir dosya yoluna ihtiyacınız vardır. Bu, bir Linux sisteminde neyin çalıştırılacağını kontrol etmeyi çok kolay hale getirmiştir, tehditleri ve saldırganın araçlarını tespit etmeyi veya onların hiçbir şey çalıştırmaya çalışmasını engellemeyi kolaylaştırır (ör. g. yetkisiz kullanıcıların yürütülebilir dosyaları herhangi bir yere yerleştirmesine izin vermemek).
Ama bu teknik tüm bunları değiştirmek için burada. İstediğiniz süreci başlatamıyorsanız... o zaman zaten mevcut olan birini ele geçirirsiniz.
Bu teknik, salt okunur, noexec, dosya adı beyaz listeleme, hash beyaz listeleme gibi yaygın koruma tekniklerini atlamanıza olanak tanır...
Son script, çalışması için aşağıdaki araçlara bağımlıdır, bunların saldırdığınız sistemde erişilebilir olması gerekir (varsayılan olarak, bunların hepsini her yerde bulacaksınız):
Eğer bir sürecin belleğini keyfi olarak değiştirebiliyorsanız, onu ele geçirebilirsiniz. Bu, zaten var olan bir süreci kaçırmak ve onu başka bir programla değiştirmek için kullanılabilir. Bunu ya ptrace()
sistem çağrısını kullanarak (bu, sistemde sistem çağrılarını yürütme yeteneğine sahip olmanızı veya gdb'nin mevcut olmasını gerektirir) ya da daha ilginç bir şekilde, /proc/$pid/mem
dosyasına yazarak başarabiliriz.
/proc/$pid/mem
dosyası, bir sürecin tüm adres alanının bire bir eşlemesidir (örneğin 0x0000000000000000
ile 0x7ffffffffffff000
arasında x86-64'te). Bu, bu dosyadan x
ofsetinde okumak veya yazmanın, sanal adres x
'teki içeriği okumak veya değiştirmekle aynı olduğu anlamına gelir.
Şimdi, karşılaşmamız gereken dört temel sorun var:
Genel olarak, yalnızca root ve dosyanın program sahibi onu değiştirebilir.
ASLR.
Programın adres alanında eşlenmemiş bir adrese okumaya veya yazmaya çalışırsak, bir I/O hatası alırız.
Bu sorunların, mükemmel olmasa da, iyi olan çözümleri vardır:
Çoğu shell yorumlayıcısı, daha sonra çocuk süreçler tarafından miras alınacak dosya tanımlayıcılarının oluşturulmasına izin verir. Yazma izinlerine sahip mem
dosyasına işaret eden bir fd oluşturabiliriz... böylece o fd'yi kullanan çocuk süreçler shell'in belleğini değiştirebilir.
ASLR bile bir sorun değildir, sürecin adres alanı hakkında bilgi edinmek için shell'in maps
dosyasını veya procfs'den herhangi bir dosyayı kontrol edebiliriz.
Bu nedenle, dosya üzerinde lseek()
yapmamız gerekiyor. Shell'den bu, kötü ünlü dd
kullanılmadıkça yapılamaz.
Adımlar oldukça kolaydır ve anlamak için herhangi bir uzmanlık gerektirmez:
Çalıştırmak istediğimiz ikili dosyayı ve yükleyiciyi analiz ederek hangi eşlemelere ihtiyaç duyduklarını öğrenin. Ardından, geniş anlamda, her execve()
çağrısında çekirdek tarafından gerçekleştirilen aynı adımları gerçekleştirecek bir "shell" kodu oluşturun:
Söz konusu eşlemeleri oluşturun.
İkili dosyaları bunlara okuyun.
İzinleri ayarlayın.
Son olarak, program için argümanlarla yığını başlatın ve yükleyici tarafından gereken yardımcı vektörü yerleştirin.
Yükleyiciye atlayın ve geri kalanını yapmasına izin verin (programın ihtiyaç duyduğu kütüphaneleri yükleyin).
syscall
dosyasından, sürecin yürüttüğü sistem çağrısından sonra döneceği adresi alın.
O yeri, yürütülebilir olacak şekilde, shell kodumuzla üzerine yazın (yazılamaz sayfaları değiştirebildiğimiz için mem
üzerinden).
Çalıştırmak istediğimiz programı sürecin stdin'ine geçirin (söz konusu "shell" kodu tarafından read()
ile okunacaktır).
Bu noktada, yükleyicinin programımız için gerekli kütüphaneleri yüklemesi ve içine atlaması kalır.
Aracı kontrol edin https://github.com/arget13/DDexec
dd
için birkaç alternatif vardır, bunlardan biri olan tail
, şu anda mem
dosyası üzerinden lseek()
yapmak için kullanılan varsayılan programdır (bu, dd
kullanmanın tek amacıdır). Bu alternatifler şunlardır:
SEEKER
değişkenini ayarlayarak kullanılan arayıcıyı değiştirebilirsiniz, ör. g.:
Eğer scriptte uygulanmamış başka bir geçerli seeker bulursanız, SEEKER_ARGS
değişkenini ayarlayarak yine de kullanabilirsiniz:
Block this, EDRs.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)