Shikata Ga Nai

Private? There is no such things.

XXE in Public Transport Ticketing Mobile APPを訳してみた

Hello there, ('ω')ノ

 

公共交通機関の発券モバイルAPPのXXEを。

 

脆弱性:

 XXE

 RCE

 

記事:

 https://infosecwriteups.com/xxe-in-public-transport-ticketing-mobile-app-81ae245c01a1

 

ターゲットの範囲は、発券Androidアプリ(Prod)で。

このアプリは、ドイツを拠点とする主要な公共交通機関のチケットアプリで。

 

Androidアプリにログインしてアカウント設定を行った後に。

「Change my data」オプションに出くわして。

 

f:id:ThisIsOne:20210916100718p:plain

 

次の画面で、個人データを変更する必要があって。

 

f:id:ThisIsOne:20210916100736p:plain

 

データを保存しているときに、下記のリクエストが。

サーバに送信されたことがわかって。

リクエストの形式は、下記のようで。

 062.6.26#{some long data}

 

f:id:ThisIsOne:20210916100755p:plain

 

次に、{some long data}をデコードしてみたところ、base64で。

デコードされたデータは、下記に示すようにXMLで。

 

f:id:ThisIsOne:20210916100815p:plain

 

次に、下記のXXEペイロードを挿入して。

 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///etc/passwd">]>

 

下記のように、本体から定義済みエンティティ&xxe;を呼び出すことに。

 

f:id:ThisIsOne:20210916100845p:plain


あとは、ペイロード全体をbase64形式にエンコードして。

 

f:id:ThisIsOne:20210916100907p:plain

 

最後に、元のリクエストをペイロードに置き換えて、リクエストをサーバに転送して。

/etc/passwdのコンテンツを取得できて。

 

f:id:ThisIsOne:20210916100925p:plain

 

アプリケーションはJavaを使用しているので。

下記のペイロードを使用してディレクトリを一覧表示することもできて。

 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file://">]>

 

f:id:ThisIsOne:20210916100948p:plain

 

主にSSH秘密鍵を探していたものの。

好奇心から/etc/shadowをフェッチしようとすると。

驚いたことに応答から、rootとして実行されていることがわかって。

 

f:id:ThisIsOne:20210916101005p:plain

 

さらに、SSH秘密鍵が/home/user/.ssh/で利用可能なこともわかって。

つまり、システムで完全なRCEを実行することもできるわけで。

 

f:id:ThisIsOne:20210916101025p:plain


Best regards, (^^ゞ