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.