Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86399790

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

0x01 SinkAdmin Historical脆弱性レビュー

相手のアプリの背景アドレスはThinkAdminであることがわかっているため、SinkAdminの歴史的な抜け穴を確認する必要があります。

CVE-2020-25540

https://github.com/zoujingli/thinkadmin/issues/244

次のようにPOCを使用してください

https://github.com/schira4396/cve-2020-25540

列ディレクトリ

post/?s=admin/api.update/noderules=['runtime/']ファイル読み取り

/?s=admin/api.update/get/encode/34392q302x2r1b37382p382x2r1b1a1a1b1a1a1a1b363932382x312t1bエッセンスは、おそらくサードパーティをサーバーのウェブファイルを比較する機能を可能にする機能を設計するためにおそらくエッセンスです。その結果、ディレクトリトラバーサルのために任意のディレクトリが読み取られます。特定の制限はありますが、害は依然として非常に非常に大きいため、この機能はその後の更新後に棚から削除されます。

また、CVEなしでは敏lialialiationizationの脆弱性もあります

https://github.com/zoujingli/thinkadmin/issues/238

2つのインターフェイスがあり、そのうちの1つは上記のディレクトリ関数のルールパラメーターです。

post/?s=admin/api.update/noderules=payload他の場所はそうです

post/?s=wechat/api.push/indexreceive=payload

0x02最初のソースコード

公式はソースコードの古いバージョンのダウンロードを提供しなくなったため、すぐに別の場所に行き、ThinkPhp5.1.38を使用してソースコードの古いバージョンを見つけました。検出後、次の脆弱性があります。

アプリケーション/wechat/controller/api/push.php

2つの脱必要度のうち1つだけが修正されました。

图片

Application/Admin/Controller/API/update.php

列のディレクトリと任意のファイルを読むためのルートはわずかに変更されており、列のディレクトリはルールパラメーターを渡すことで制御できないため、Web Rootディレクトリのみをリストできます。ただし、任意のファイルの読み取りにより、さまざまな制限が削除されます。つまり、config/database.phpを直接読み取ってデータベース構成を取得できます。

图片

データベース構成を取得した後、データベースを外部から接続できる場合、より深く使用できます。

Application/Admin/Controller/API/Plugs.php

图片

これは、ThinkAdminに付属するファイルアップロードインターフェイスです。設計された多くのCMSと同様に、そのホワイトリストStorage_local_extsはデータベースまたはシステムの背景で構成できます。通常、これを使用してGetShell操作を実行できますが、ホワイトリストにPHPを直接追加すると、4番目のIFを渡すことができず、バックグラウンドのシステム構成にもインターセプトがあります。

Application/Admin/Controller/config.php

图片

データベースを直接操作すると、バックグラウンド構成の制限をバイパスできますが、upload()制限をバイパスすることはできません。

明らかに、PHPのフィルタリングでは十分ではありません。相手がWindowsサーバーの場合でも、PHP: $データがオプションです。相手がApacheであり、間違った構成を行った場合、PHP3/PHP4/PHP5/PHP7/PHT/PHT/PHTML/PHARなどの解析サフィックスもあります。

0x03秒ソースコード

ただし、最初のソースコードは、ThinkAdminアーキテクチャに精通していることを除いて役に立ちません。ターゲットはthinkphp6.0.3であり、脆弱性は最初のものとは異なるため、脱介入はありません。ただし、まだ列のディレクトリとファイルの測定値があり、歴史的な脆弱性とまったく同じです。

App/Admin/Controller/API/update.php

图片

しかし、ディレクトリをリスティングするとき、私は問題に遭遇しました。

图片

これは、Web Rootディレクトリをリストしているためです。相手のプロジェクトが巨大である場合、またはフォルダーに許可がない場合、エラーが発生します。現時点では、主に./Appと./Runtime、ターゲットを絞った方法でディレクトリをリストする必要があります。

图片

图片

./Appを読んで、コントローラーパスを取得します。元のThinkAdminでは、多くのブレークスルーはありませんが、これらのプログラムの多くは2位にオープンしています。元のThinkAdminにないコントローラーと比較して、脆弱性を直接監査することができます。監査の脆弱性は、任意のファイルで読む必要があります。詳細については、前のものを確認してください。要するに、CVE-2020-25540では、ソースコードの取得に相当します。

このプログラムは、SQLインジェクションを簡単に見つけることができます。

/app/admin/controller/api/main.php

图片

图片

ただし、パスワードを呼び出した後、ログインがOTP検証に必要であることがわかったため、監査を続けることができませんでした。

/app/admin/controller/posting.php

图片

非常に愚かなコマンドスプライシング、同じ場所に3つの場所がありますが、すべて背景の権限が必要です。最終的に、exec()がdisabled_functionsであることがわかったため、使用できません。

/app/admin/controller/api/upload.php

图片

最後の場所は、友人のリマインダーによって発見されました。一見、これはSinkAdminによってもたらされたアップロードではありませんか?私はそれを利用するために特定の環境が必要であることを前に分析しました。そのため、私はそれを直接スキップしました。その結果、この名前を完全に制御できる追加のXkeyパラメーターがあります。これがバックドアであると疑うのは難しいです。最終的に、GetShellはこのようなものです。

图片

しかし、このアップロードインターフェイスにはバックグラウンド許可も必要です。どうすればよいですか?この時点で、それはshinkphpの変わり目であり、頻繁に./runtimeで使用されます。

ファイルのRuntime/admin/log/single_error.logを読むことは、一連のセッションエラーを記録することを簡単に見つけることができます。

图片

また、このプログラムが元のPHPセッションを使用していることがわかり、/TMPまたは/var/lib/php/sessions/ではなく、ランタイム/セッションに配置されています。それは簡単です。列ディレクトリを直接使用して、すべてのセッションをリストし、爆破します。

图片

このようにして、背景を直接入力してOTP制限をバイパスできます。次に、Xkey Backdoor Getshellを使用します。

图片

0x04代替心

裏口がない場合はどうなりますか?このシステムはLinux+Nginxであり、SinkAdminの元のアップロード制限をバイパスすることはできません。

しかし、後続のコード監査では、グラフベッドサーバーがあることがわかりました。

图片

このGetShell Server(a)は、file_pathsパラメーターを使用してグラフベッドサーバー(b)のインターフェイスにアクセスできます。目的は、サーバーBがサーバーA上の写真を順番にダウンロードし、バックアップできるようにすることです。なぜ私はこれを知っているのですか?

サーバーBはさらに穴があふれているため、このインターフェイスに直接アクセスすることでわかります。

图片

ソースコードはデバッグのためにリークするだけでなく、このコマンドのスプライシングが裸であまりにも裸であり、シェルとしても使用できます。

图片

したがって、サーバーAを倒さずに、任意のファイルの読み取りおよびコード監査を介してサーバーBを完全に倒すことができます。

サーバーBを取得することの使用は何ですか?サーバーAはカールを使用してサーバーBを要求します。この場合、サーバーBのコードを改ざんし、インターフェイスを302に変更してジャンプしてからGopherに変更し、サーバーAのローカルポートAを押すことができます。

FPM 9000ポートと6379 RedisポートがサーバーAにローカルに存在する場合、SSRF GetShellをこの方法で実行できます。このケースは、多くの場合、DiscuzのSSRF脆弱性で悪用される可能性があります。

今回は9000 fpmはありませんが、Redisがあります。 Redisキーとポートはconfig/cache.phpにも保存されており、Webディレクトリには777の権限があり、GopherがローカルRedisにヒットする条件を完全に満たしています。

もちろん、私は最終的には試していませんでしたが、理論には問題はありませんでした。

元のリンクから転載:https://mp.weixin.qq.com/s/buhjuqh3lyaq1smy2xkl3g