Soru:
Okuma izni olmayan bir yürütülebilir dosyayı nasıl analiz edebilirim?
samuirai
2013-03-21 02:22:29 UTC
view on stackexchange narkive permalink

Linux'ta (Kernel 2.6) çalıştırabildiğim, ancak okuyamadığım (chmod 0711) bir ikili dosyam var. Bu nedenle statik analiz mümkün değildir.

  kullanıcı1: $ ls -l bin -rs - x --- kullanıcı2 kullanıcı1 binuser1: $ dosya binsetuid çalıştırılabilir, normal dosya, okuma izni yok  

Mümkün olduğunca çok bilgi toplamak için farklı dinamik teknikler arıyorum.

Örneğin strace bu çalıştırılabilir dosyayla çalışıyor.


GÜNCELLEME: Sorunu çözebildim. Cevabı görün.

Bu yeni tersine mühendislik topluluğu harika <3'e teşekkürler!

Yalnızca dinamik bir analiz tekniği mi arıyorsunuz yoksa genel olarak bir çözüm mü arıyorsunuz?
Sanırım burada sadece dinamik analiz teknikleri işe yarıyor. Ancak yürütülebilir dosyanın ne yaptığını anlamaya yardımcı olabilecek her şeye açığım. Dosya sistemine vb. "Fiziksel" erişimim yok.
"Strace" çalışıyorsa, GDB ile eklemeyi ve belleği boşaltmayı deneyin ([buraya] bakın (http://serverfault.com/a/174027))
@IgorSkochinsky, Makinemde denedim, şans yok. GDB şununla bağlanmayı reddediyor: `İşleme eklenemedi. ... kök kullanıcı olarak tekrar deneyin.` Bu, "ptrace" e bağlıdır (aynı hatayı verir), bu nedenle "ltrace" de çalışmaz.
"Strace" nasıl çalışıyor acaba? Yoksa setuid mi?
@IgorSkochinsky `strace. / Bin` çalıştırırsanız, programı ekstra ayrıcalıklar olmadan çalıştırır. Programı normal olarak başlatırsanız, yükseltilmiş ayrıcalıklarla çalışır ve daha sonra, ayrıcalıkları yükseltmeden onu takip edemezsiniz.
Beş yanıtlar:
#1
+27
Gilles 'SO- stop being evil'
2013-03-21 05:28:53 UTC
view on stackexchange narkive permalink

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.

Aslında "ptrace" i root olarak kullanamayacağımı düşünüyorum. gdb, diğer çalıştırılabilir dosyalar ile sorunsuz çalışır. Sorun, yürütülebilir dosyanın okunabilir olmaması ve bu nedenle gdb'nin dosyayı yüklememesidir. Bunu çalıştırabildiğim için, yetkilerim altında çalıştırıp bu şekilde hata ayıklayabileceğimi düşündüm (ve setuid ile çalıştırmak için gereken ayrıcalıkların işe yaramayacağını kabul ediyorum). Ama yine. gdb okunabilir olmadığı için çalışmaz.
@samuirai: çalıştıktan sonra sürece eklenemez misiniz?
@IgorSkochinsky: Denedim ama çok yavaşım. Çalıştırılabilir dosya çok hızlı bitiyor.
@IgorSkochinsky Yükseltilmiş ayrıcalıklarla çalışıyorsa "ptrace" ile sürece bağlanamazsınız. "Strace, / bin" komutunu çalıştırırsanız, program "execve" sistem çağrısı sırasında izlendiğinden, sıradan ayrıcalıklarla çalışır. Ardından izini sürebilirsiniz, ancak daha sonra ona yeniden bağlanamazsınız ve program farklı davranabilir. Gdb, yürütülebilir dosyayı okuyamazsa programı çalıştırmayı reddeder.
@samuirai Yürütülebilir dosya setuid olduğundan, başlattıktan sonra ona bağlanamazsınız (tüm soruyu tartışmalı hale getirecek kök ayrıcalıklarına sahip olmadığınız sürece).
@Gilles, ayrıcalıklarım altında çalışmaya zorlayamaz mıyım? "Ptrace" ile yürütüldüğünde olduğu gibi (burada temel bir şeyi yanlış anlarsam özür dilerim)
@samuirai Normalde, evet yapabilirsin. Ancak normal teknikler dosyayı okuyabilmeye dayanır. Şu anda "strace" den başka bir yol düşünemiyorum. Bu soruyu [unix.se] üzerinde sormak ve diğer insanların farklı fikirleri olup olmadığını görmek isteyebilirsiniz.
Tamam, öyleyse başka bir hata ayıklayıcıyla mümkün olmalı? Ayrıca, "semboller" için hata ayıklayıcıya yüklemek için bir dosya kullanabilirsiniz, ancak çalıştırılacak gerçek programı belirtmek için "exec-file" komutunu kullanabilirsiniz.
@Gilles süreç haritasıdır, ptrace erişiminiz varsa / proc / pid / maps'i okuyabilmelisiniz.
@IgorSkochinsky Genellikle evet, ama burada değil. `/ proc / $ pid / maps`, işlem aslında yükseltilmiş ayrıcalıklarla çalışmadığında bile program setuid olduğundan sınırsızdır. Siz de sürece bağlanamazsınız. Ancak süreç, "execve" çağrılmadan önce "PTRACE_TRACE_ME" çağrıldıysa üst öğe bağlı kalır.
Çalışma PoC https://gist.github.com/Samuirai/5217680 ve sorumda küçük bir güncelleme
@samuirai Kayıtlardan ilginç adresler çıkarmak iyi bir fikir. Kodumu bu hafta sonunda çalışan bir şeye yükseltmeye çalışacağım.
#2
+10
samuirai
2013-03-21 07:15:14 UTC
view on stackexchange narkive permalink

Başka bir programı çalıştıran çatallı bir çocuktan tek adımlı talimatlara ptrace kullanan küçük bir araç buldum:

http://pastebin.com/yHbkc0Je

Bu mükemmel çalıştı. Kullanılan tüm talimatların bir dökümünü aldım. Setuid ayrıcalıklarıyla çalışmadığını biliyorum, ancak muhtemelen yine de bana yardımcı olacaktır. Şimdi sadece talimat izini sökmek için bir şeye ihtiyacım var.


PoC ( https://gist.github.com/Samuirai/5217680) buna göre.

  / * Bu araç, reverseengineering.stackexchange.com'daki harika topluluk çabasıyla geliştirilmiştir. Konu: http://reverseengineering.stackexchange.com/questions/98/how-can-i-analyse-an -executable-with-no-read-izniÖzel teşekkürler: + bu Phrack makalesine işaret eden ve ilk fikri veren igor-skochinsky: http://www.phrack.com/issues.html?issue=63&id=12&mode=txt + bu soru ve kod girişimi hakkındaki angajmanı ve coşkusu için gilles + ve dahil olan tüm diğerleri Bu yeni yığın değiş tokuş tersine mühendislik topluluğu F ** KRAL HARİKA !!! <3 * / # <stdio.h> # <sys / ptrace.h> # <sys içermekte; / types.h> # <sys / wait.h> # <sys / user.h> # <sys / syscall.h>int main () içermekte; {pid_t PID; pid = çatal (); eğer (pid == 0) {ptrace (PTRACE_TRACEME, 0, NULL, NULL); execl ("./ bin", "./bin", NULL); } else {int durumu; struct user_regs_struct kayıtları; // gerçek kod segmentine ulaşana kadar tek adımlama while (1) {wait (&status); (WIFEXITED (durum)) kesilirse; // ptrace (PTRACE_GETREGS, pid, NULL, &regs) komut işaretçisi için kayıtlar alın; // strace ./bin // brk (0) = 0x804a000 if (regs.eip>0x804a000) {
printf ("EIP'deki kod bölümünde =% lx \ n", regs.eip); işaretsiz int i; // (i = 0; i<0x1000; i + = 4) {long data = ptrace (PTRACE_PEEKTEXT, pid, regs.eip + i, 0); printf ("% lx", veri); }} // çocuk süreç takibinde tek adım (PTRACE_SINGLESTEP, pid, NULL, NULL); }} return 0;}  

Gilles'in belirttiği gibi, kod alanının adreslerini almak için / proc / <pid> / maps okuyamazsınız, ancak strace 'in bu güzel tek satıra sahip olduğunu fark ettim brk (0) = 0x804a000 .

EIP bunun etrafında olana kadar alt süreçte tek adım değer; sonra, 0x1000 bayt döküyorum.

Neden onu takip etmek yerine hafızayı boşaltacak şekilde değiştirmiyorsunuz? Zaten `PTRACE_PEEKTEXT` kullanılarak bir okuma var, tüm işlem belleğini okumak için onu değiştirmeniz yeterlidir. Bazı örnek kodlara bakın [burada] (http://unix.stackexchange.com/a/9068)
SE'de, genellikle (çok uzun olmayan) kodları yalnızca yanıtta görmek isteriz, bir bağlantının arkasında değil. Bunun nedeni, pastebin'in kodları saklamayı garanti etmemesidir. Cevabınıza kodu ekleyebilir misiniz lütfen?
Soru güncellememdeki kodla aynı. Referansı ekleyeceğim
#3
+8
Dougall
2013-03-22 13:36:04 UTC
view on stackexchange narkive permalink

Suid ikili dosyalar üzerinde ptrace tabanlı dinamik analiz araçlarının kullanılması, bunların ayrıcalıklar olmadan çalışmasını sağlar. Bu nedenle, kullanıcınız olarak çalışan dosyanın bir kopyası muhtemelen analiz amaçları için yeterlidir.

Bunu yapmak zorunda olduğumda, xocopy aracını kullandım, Başlık belleğe eşlendiğinde ELF dosyalarını yeniden yapılandırmak için ptrace (çoğu derleyici bunu muhtemelen dinamik bağlayıcı tarafından kullanılmak üzere yapar). Aracı ASLR ile test etmedim, ancak onu diğer yanıtlarda anlatılan bazı tekniklerle birleştirebilirsiniz. Dosya döküldükten sonra statik olarak analiz edilebilir veya herhangi bir dinamik analiz aracıyla çalıştırılabilir.

Bu aracın 64 bit sürümü var mı? 64 bit elf dosyalarında çalışmıyor gibi görünüyor. : /
#4
+5
Igor Skochinsky
2013-03-21 02:52:39 UTC
view on stackexchange narkive permalink

Çalışabilecek veya çalışmayabilecek bazı araçlar şunlardır:

Bunlardan herhangi birinde başarılı olup olmadığınızı merak edeceğim.

Bunların hiçbiri bir setuid çalıştırılabilir dosyası üzerinde çalışmaz.
@Guiles bu setuid değil ve hiç demedi.
@cb88 adil olmak gerekirse, alıntılanan izinler "s" bayrağını gösterir. Sanırım açıkça belirtilmesi gerekiyordu.
#5
+1
cb88
2013-03-21 02:47:00 UTC
view on stackexchange narkive permalink
  1. Dosyayı kök okuma
  2. Dosya sistemini farklı bir sisteme kopyalayın ve izinleriniz varsa okuyun (fs'yi kök erişiminizin olduğu bir sisteme kopyalayın).
  3. İşlemin yürütülürken belleğini inceler. setuid ise ve siz o kullanıcı değilseniz işe yaramayacak.
  4. Sadece aptalca davranıyorum ama takas dolana kadar tekrar tekrar çalıştırabilir ve oradan kopyalayabilirsiniz: P Veya ana klasörünüzde sistem takasından daha yüksek önceliğe sahip bir takas dosyası oluşturun. Ve sonra yukarıdakileri yapın ... ve sistem değiş tokuşu dolmaya başladığında, kaydetmek için takas dosyanızı kopyalayın. Bunu bir komut dosyasında yapmanızı öneririm, aksi takdirde sisteminiz kilitlenebilir. Takas kullanımını ücretsiz olarak izleyebilirsin, inanıyorum ya da / proc kullanımının ayrıştırılmasında başarısız oluyor. Elbette, takas dosyanızı kopyaladıktan sonra oluşturulan tüm görevleri sonlandırın.

Muhtemelen bunların hiçbirini yapma izniniz yok: P. Bu, bu sistemde yapabilecekleriniz / yapamayacaklarınız hakkında muhtemelen daha fazla ayrıntı sağlamanız gerektiğini söyledi.

Doğru. Ben sadece normal bir kullanıcıyım ve / proc'a erişemiyorum. Gerçi "strace" işe yarıyor ve bilmediğim başka şeyler olduğunu düşündüm.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...