Başlangıçta programı terk edemeyeceğinizi düşünmüştüm, ancak anlaşıldı ki, bu cevabın ikinci bölümüne bakın.
Programı çalıştırma
Normal yöntemlerin çoğu çalışmaz çünkü çalıştırılabilir setuid. Programı normal olarak başlatırsanız, yükseltilmiş ayrıcalıklarla (euid-ruid) çalışır ve çoğu hata ayıklama olanağı kök için ayrılmıştır. Örneğin, programa
ptrace ile eklenmeye dayanan her şey köke ayrılmıştır. Bu, bir hata ayıklayıcıda yapabileceğiniz hemen hemen her şeyi içerir. Linux, çalışan bir sürecin belleğini (
ptrace ile veya
/ proc / $ pid / maps ve
/ proc / $ pid / mem aracılığıyla) boşaltmanıza izin verir ), ancak bu da çalıştırılabilir setuid için devre dışıdır.
strace ./bin komutunu çalıştırabilir ve programın hangi sistem çağrılarını yaptığını görebilirsiniz. . Ancak bu, programı herhangi bir ekstra ayrıcalık olmadan çalıştırır. Erken durabilir ve bir dosyayı okuyamadığından veya doğru kullanıcı olarak çalışmadığından şikayet edebilir.
CPU kullanımı, IO kullanımı, ağ kullanımı, bellek gibi istatistikleri görebilirsiniz.
/ proc / $ pid içindeki kullanım, vb .:
status ,
sched ve
net / netstat gibi dosyalar dünyadır -readable (program gerçekten ekstra ayrıcalıklarla başlatılmış olsun veya olmasın, setuid kısıtlamaları geçerlidir). Gördüğüm ilginç bir şey, programın ağ bağlantıları. Bellek içerikleri (
mem ) ve hatta açık dosyalar (
fd ) gibi gerçekten ilginç şeyler her iki şekilde de devre dışı bırakılır.
LD_PRELOAD ile bir kitaplığı önceden yüklemek veya programı farklı bir
LD_LIBRARY_PATH ile çalıştırmak da her iki şekilde de devre dışı bırakılır. Çekirdek dökümü de alamayacaksınız.
Peki ne işe yarıyor? Açık ağ bağlantılarını görebilirsiniz, belki bunlardan biri size bir ipucu verebilir veya yanıltıcı olabilir. Yapabildiğiniz zaman değiştirerek veya programı başka bir dizinden çalıştırarak (sembolik bir bağlantı oluşturmayı deneyin) programın hangi dosyalara eriştiğini anlamaya çalışabilirsiniz.
Makinede bir chroot hapishanesine erişiminiz varsa, programı oradan çalıştırmayı deneyin. Paylaşılan klasörleri (örneğin, VMware veya VirtualBox) uygulayan bir sanal makine çalıştırabilirseniz, programa buradan erişip erişemeyeceğinizi görün. Bu tamamen sistemin güvenliğini bozmakla ilgilidir: İzinler, görevinizde sizi engellemek için tasarlanmıştır.
Gelişmiş bir teknik, programı ağır yük altında gözlemlemek ve o zamandan beri ne yaptığını anlamaya çalışmaktır. alır. Disk önbelleklerini yok edin ve hangi dosyaların hızla erişilebilir hale geldiğini görün. Takas kullanımının programın ne yaptığına bağlı olarak nasıl değiştiğini görün (böylece sadece ne kadar toplam bellek kullandığı değil, çalışma kümesinde kaç farklı sayfa olduğuna dair bir fikir edinebilirsiniz). Çok fazla deneme yanılma gerekecek. Kodu bildiğiniz ve verileri elde etmeye çalıştığınız zaman, bu iyi bilinen bir yan kanal saldırısıdır. Kodu bilmediğinizde, bu şekilde yararlı bilgileri elde etmenin çok zor olacağını bekliyorum.
Hafıza içeriklerini boşaltmak
Başlangıçta, setuid bitinden dolayı programın belleği (bu genellikle bir sorun olmaz çünkü çalıştırılabilir dosyayı kopyalarsınız, ancak burada bu mümkün değildir çünkü çalıştırılabilir dosya okunabilir değildir). Bunun yanlış olduğu ortaya çıktı.
execve 'i çağırmadan önce
ptrace ile programa eklerseniz (
strace ./bin ' i çalıştırmanın yaptığı gibi),
erişiminiz vardır ptrace tüm ihtişamıyla,
PTRACE_PEEKDATA ve
PTRACE_PEEKEXEC dahil. Bu, setuid programını çalıştırmaz, dolayısıyla farklı davranabilir, ancak belleğe yüklenen kod ve statik veriler her iki şekilde de aynıdır.
Bunu işaret ettiği için samuirai tebrikler
Program belleğini nasıl atabileceğinize dair bir genel bakış:
- Fork ve
ptrace (PTRACE_TRACEME, ...) çağrısı yapın altta daha sonra programı çalıştırın (
execl ("./ bin", "./bin", NULL) ).
- Ebeveynde, çocuğun
execve 'den dönmesini beklemek için
waitpid ' i çağırın .
- Kodun yüklendiği adresi bulun . IP kaydının değeri (
PTRACE_GETREGS aracılığıyla elde edilir) bir ipucu vermelidir ve dosya formatı başlıklarını arayabilirsiniz.
- Çocuğun belleğini kelime kelime okuyun (
PTRACE_PEEKTEXT ,
PTRACE_PEEKDATA).
- Gerekirse dosya biçimini yeniden oluşturun (örneğin metin ve veri bölümlerinden bir ELF ikili dosyası yapın). Verileri bir dosyaya boşaltın.
- Çocuğu öldürün - hiçbir şeyi yürütemez.
Dougall çalışan bir kanıtı gösterdi- ELF yürütülebilir dosyaları için kavram aracı: xocopy.