Ajenti 2.1.31 Command Execution Exploit


def authenticate(self, username, password):
       child = None
       try:
           child = pexpect.spawn('/bin/sh', ['-c', '/bin/su -c "/bin/echo SUCCESS" - %s' % username], timeout=5)
           child.expect('.*:')
           child.sendline(password)
           result = child.expect(['su: .*', 'SUCCESS'])
       except Exception as err:
           if child and child.isalive():
               child.close()
           logging.error('Error checking password: %s', err)
           return False
       if result == 0:
           return False
       else:
           return True

Yukarıdaki kod bloğunda Ajenti’nin 2.1.31 sürümünde kimlik doğrulaması için kullanılan fonksiyon verilmiştir.

Pexpect, Python üzerinden diğer yazılımları kontrol etmemize yardımcı olan bir modüldür. Pexpect çocuk süreç başlatmamızı, onları kontrol etmemizi ve beklenen kalıplarda cevap vermemizi sağlar. spawn sınıfı ile çocuk süreç oluşturulur. Expect ve sendline kullanılarak beklenen input’a cevap verilir.

  
child = pexpect.spawn('/bin/sh', ['-c', '/bin/su -c "/bin/echo SUCCESS" - %s' % username], timeout=5)
child.expect('.*:')
child.sendline(password)

kodu ile username değişkeninde alınan kullanıcının yetkileri ile su -c “/bin/echo SUCCESS” komutu çalıştırılmaya çalışılır. Parola doğru girilir ise ekrana SUCCESS mesajı basılır.

  
result = child.expect(['su: .*', 'SUCCESS'])

satırı ile Ekrana basılan çıktı result değişkenine atanır. Parola doğru girilmiş ise authenticate fonksiyonu True döndürür.

Backtick (`) arasına yazılanlar Linux’da komut olarak algılanır ve çalıştırılır. Örneğin komut satırı üzerinde echo `whoami` komutunu çalıştırırsanız çıktıda sizin kullanıcı adınızı ekrana bastıracaktır.

POST /api/core/auth HTTP/1.1
Host: 172.16.172.152:8000
Connection: keep-alive
Content-Length: 56
Accept: application/json, text/plain, */*
Origin: http://172.16.172.152:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: tr,tr-TR;q=0.9,en-US;q=0.8,en;q=0.7

{"username":"deneme","password":"12345","mode":"normal"}

Eğer giriş formunda kullanıcı adı yerine ` ` işaretleri içerisini bir komut yazarsak bu komut sistem üzerinde çalıştırılacaktır. Fakat ekranda bir çıktı gözükmeyecektir.

Yazmış olduğum exploit’e buradan erişebilirsiniz.




Onur ER
Onur ER
Onur ER
comments powered by Disqus