Linux'ta Library Hooking Yöntemi


Selamlar,

Uzun zamandır yazılarımı canyoupwn.me de yazıyorum, burayı çok boşladığımın farkına vardım artık biraz da orayı boşlayayım :P
Şaka bir yana canyoupwnme'de gerçekten de çoğu insan için kaynak olacak nitelikte yazılar yayınlanıyor. Henüz bakmadıysanız göz atmanızı tavsiye ederim.
Neyse buralar fazla reklam kokmadan konuya girelim :D He bide canım sıkılıyor, biraz boş yapacağım hazırlıklı olun :D

Bir sisteme sızdıktan sonra bütün hekır abilerimizin ilk amacı sisteme daha sonradan erişebilmek adına bir arka kapı bırakmak olur. Arka kapı bırakmanın çok çeşitli yolları vardır. Bazı abiler "nc -l -p 31337 -e /bin/bash" şeklinde, çalıştırılacak ilk ps komutunda kabak gibi gözükmek suretiyle bırakanı anında ele verecek bir backdoor kullanmayı tercih etseler de biz onlara uymayalım.

Library hook denen olay en basit tabiriyle; bir kütüphanedeki fonksiyonla aynı özellikleri (isim, dönüş tipi, argüman sayısı/türü) taşıyan bir fonksiyon içeren bir shared object (kütüphane) dosyası oluşturup, bunu hafızaya önce yüklenecek şekilde ayarlayarak asıl kütüphanedeki fonksiyonları geçersiz kılmadır. Kafalar karıştı mı? Aşağıdaki görselle devam edelim.


Bir örnek ile durumu daha da basitleştirelim. C ile uğraşan 7'sinden 70'ine herkesin bildiği ve kullandığı puts() adlı bir fonksiyon var değilmi? Şimdi biz metin editörünü açtık ve puts() isminde, asılıyla aynı özellikleri taşıyan bir fonksiyon yazıp .so olacak şekilde derledik. Sonra da Linux'taki bir trick'ten faydalanarak bizim bu kütüphanemizin hafızaya diğerlerinden daha önce yüklenmesini sağladık. Şimdi herhangi bir program puts()'i çağırırsa ne olur? Doğru bildiniz hekır kardeş, bizim fonksiyonumuz çalışır (yanlış bildiyseniz sizi üç "hayır"la uğurluyoruz).

Hemen deneyelim madem;

hook2.c:
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>

int puts(const char *message)
{
// Fonksiyon pointer'ı tanımlıyoruz
 int (*new_puts)(const char *message);

// Fonksiyonun return değerini tutacak değişken
 int result;

// Fonksiyon pointer'ına asıl puts() fonksiyonunun adresini atıyoruz
 new_puts = dlsym(RTLD_NEXT, "puts");

// Pis işlerimiz...
 new_puts("Pwned so hard Ha ha ha!\n");

// Program akışını asıl fonksiyona devrediyoruz ki programın 
// çalışmasında bir anormallik sezilmesin
 return new_puts(message);
} 

Yukarıda puts()'u hook etmek üzere yazılmış çok basit bir fonksiyon var. Hook işlemi için Linux'un LD_PRELOAD adlı ortam değişkenini kullanacağız.

LD_PRELOAD ortam değişkeninde belirtilen kütüphane dosyaları hafızaya öncelikli yüklenir. Bu yöntem diğer kütüphanelerde yer alan fonksiyonları dolaylı yoldan değiştirmek için kullanılır.
Bunu da öğrendiğimize göre kaynak kodumuzu derleyip oluşturduğumuz kütüphaneyi LD_PRELOAD değişkenine ekleyelim.


Yukarıda hook işleminden önce ve sonra hedef program çalıştırdım. Programın kendisinde bir değişiklik olmadığı halde verdiği çıktının değiştiğini görüyoruz. Kendi kodumuzu başarılı bir şekilde çalıştırmış olduk. GCC opsiyonlarını google'da aratma zevkini size bırakıyorum :):):):)

Her ne kadar backdoor yöntemi olarak tanıtmış olsam da aslında bu teknikle yapılabilecekler hayalgücüyle sınırlı (sistemdeki yetkinize bağlı olarak tabi). Ofansif düşünmeyi bir süre kenara bırakalım, programda zafiyete neden olabilecek fonksiyonların bir listesini çıkartıp hepsine bu yöntemle hook atarak bir programda zafiyet araması yapabilecek bir sandbox benzeri ortam oluşturulabilir mesela (güzelmiş lan yaparım ki ben bunu (yine ofansif'e mi kaydık ne :P)). Neyse madem ofansife döndük yine bari işimizin hakkını verelim.


Library hook ile HTTPS Sniffing

 

Düşünün bir sisteme sızdınız ve ileriki aşamalar için trafiği dinleyerek bilgi toplama peşindesiniz. Ancak network admin çakal çıktı bütün trafiği ssl üzerinden koşturuyor. Sniffing, MitM falan o havalı CEH eğitimlerindeki taktiklerin hiçbiri yemiyor. İşte o zaman yardımınıza kim koşuyor dersiniz?


Bir sonraki yazıda görüşmek üzere :)

Kaynakça: 
  1. Function Hooking Part I: Hooking Shared Library Function Calls in Linux 

Yorumlar

Bu blogdaki popüler yayınlar

DKHOS - Rev300 Çözümü

Part 1: Tersinden Tersine Mühendisliğe Giriş

Bir Güvenlikçi, Virüs ile Karşılaşırsa