shinobe179の日記

@shinobe179 の技術メモ・やらかし録

【Python】ファイルを作らずにデータをGzip圧縮する

はじめに

コード中で生成したデータを、Gzip圧縮してAWSのS3バケットにアップロードする必要がありました。ローカルにファイルを作ってそれを送るのが手っ取り早いんですが、ファイルを作らずに済むスマートな方法を模索していたら、こんな時間になってしまいました。記事にしたためて供養します。

方法

以下のように、 io.BytesIO() をバイト列のバッファとして宣言しておき、GzipFile() の書き込み先として指定します。バイト列の書き込みが済んだら、 io.BytesIO().read() を使ってバッファの中身をgzipファイルとして扱えばよいみたいです。

import io
from gzip import GzipFile

...

gz_io = io.BytesIO()
with GzipFile(fileobj=gz_io, mode='wb') as gz:
        gz.write(data.encode())
gz_io.seek(0)

# bucketはboto3.resource('s3').Bucket()
put_result = bucket.put_object(
    Body=gz_io.read(),
    Key=obj_key,
    ContentEncoding='gzip'
)

果たしてこれがスマートと言えるのかは追求しないことにします。ああしんどかった。

【Hack The Box二十五番勝負 Advent Calendar 2020】10日目 vs Tabby(●)

f:id:befs_anne:20201214003747p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 10日目の記事です。

adventar.org

サマリ

  • 対戦相手:Tabby
  • 対戦日時:2020年12月12日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
    • Tomcatについて無知であったがために、LFIを有効に使えなかった
  • 通算成績:10戦1勝9敗

対戦相手

今回の対戦相手は「Tabby」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
        • 公開鍵認証でのみログイン可能。
      • HTTP(80)
      • HTTP(8080)
        • ブラウザでアクセスすると、Tomcatのデフォルトページが表示された。
        • /manager はベーシック認証がかけられていた。
  • Dirbuster
    • ディレクトリ列挙をSmallサイズの辞書で実行したが、特段ヒントとなるようなものは見つからなかった。

侵入

  • HTTP(80)
    • トップページにリンクが貼られているニュースリリースのURLが /news.php?file=statement となっており、LFIを疑った。
    • パラメータを ../../../etc/passwd とすると、案の定 /etc/passwd の中身が表示された。一般ユーザーに ash がいることを確認した。
  • Hydra
    • ユーザー名を ash に固定し、 rockyou.txtTomcatのベーシック認証に対して辞書攻撃を実行したが、成功しなかった。

Writeup確認後

Writeupは公式のものを確認しました。

侵入

  • LFIを使って、Tomcatのユーザー定義ファイルである tomcat-users.xml を見る。パスは tomcat ubuntu installation directory などとググって確認する。
  • Tomcat/manager 配下のディレクトリをDirbusterなどで列挙すると、TomcatをHTTPで操作できる /text エンドポイントが見つかる。
  • ディレクトリ列挙もしくはググってサービスデプロイ用のエンドポイント /deploy の使用方法を確認し、Javaで書かれたウェブシェル(Githubで公開されている)をサービスとしてデプロイする(Javaでの開発をしたことがないので、一度Zipにしたり、jar コマンドでマニフェストを追加したり?といったお作法ははじめてだった。デプロイ方法の件も含めて後日要調査)。
  • ウェブシェル経由で nc/dev/tcp を使ったリバースシェルを試行するも失敗。- Writeupに従って、ローカルでなんやよう分からんワンライナーを書き下したテキストファイルを作り、リモートから wget して(chmod +xして)実行すると、tomcat ユーザーでのリバースシェルが確立した。何が違う……?

権限昇格(一般ユーザー)

  • /var/www/html/files 配下にバックアップと思しきパスワード付きZIPファイルを発見した。
  • (Writeupをちゃんと読んでいなかったので)この中にある raedme.md あたりに何か書いてあるんだろうと思い、 pkcrack (およびZIPファイルに含まれており、かつ実ファイルが手に入る logo.jpgファイル)を使った既知平文攻撃でパスワードを解除するも、中身は特に何もなかった。
  • Writeupを読むと、どうやら重要なのはZIPファイルの方だったらしい。リモートからローカルへのファイルの送信方法として、ZIPファイルのbase64ハッシュを作って、それをコピーしてローカル側でデハッシュするという手法がとられていた。こんな方法があるのか……(結局リモート側でウェブサーバーを作って、ローカルから wget してしまった)。
  • fcrackziprockyou.txt を使って辞書攻撃すると、パスワードが判明した。
  • このZIPのパスワードこそが ash ユーザーのパスワードであり、リモート側で su ash できた。ここで own user。

権限昇格(root)

  • uname -a すると lxd というグループに所属している。どうやら lxdlxc というコマンドでコンテナをデプロイできるみたい。
  • Writeupいわく、「root権限を持ったコンテナに、ホストOSのファイルシステムを丸ごとマウントして起動する」ということらしい。そんなことできるんだな……。
  • lxd用のAlpine Linuxイメージを以下のリポジトリを利用して作成し、リモートへ送信する。
  • 以下のコマンドを実行してown root。
### デーモンの起動?
### ウィザード形式で、ストレージプールを作っておく以外は全部noでよさそう(作っておかないとこのあとコンテナが作れない
$ lxd init

### イメージのインポート
$ lxc image import ./alpine-v3.12-x86_64-20201106_2000.tar.gz --alias alpine

### 管理者権限を付与(なぜ一般ユーザーでこれが可能なのか……?
$ lxc init alpine mycontainer -c security.privileged=true

### ホストOSのファイルシステムを /mnt/root にマウントする
$ lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true

### コンテナの起動
$ lxc start mycontainer

KPT(Keep-Problem-Try)

Keep

  • LFIまでさっと辿り着けた。

Problem

  • Tomcatのデフォルトパス、たぶん全く気づかなかったわけではなくて調べるのが面倒だったんだと思う。

Try

  • 時間内は横着せず、調べる(時間になったら答えを見ればいい)。

さいごに

TomcatやLXDなど、技術的な学びの多い箱でした。ちょっと遅れをとっているので最終日までには追いつきたいです。

参考

qiita.com

【Hack The Box二十五番勝負 Advent Calendar 2020】9日目 vs Help(●)

f:id:befs_anne:20201212183558p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 9日目の記事です。

adventar.org

サマリ

  • 対戦相手:Help
  • 対戦日時:2020年12月10日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
    • GraphQLのエッセンスを時間中に習得できなかった
    • エクスプロイトの中身を理解できなかった
  • 通算成績:9戦1勝8敗

対戦相手

今回の対戦相手は「Help」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
      • HTTP(80)
        • Apache、利用できそうな脆弱性は特になし。
        • ブラウザで閲覧するとApacheのデフォルトページが表示される。
      • HTTP(3000)
        • ブラウザでアクセスするとJSONが返ってきた。この時点で「GraphQLというやつでは」と思ったが、クエリの書き方も分からず、なすすべなし。早くも敗北を悟る。
  • Dirbuster
    • ディレクトリ列挙をSmallサイズの辞書で実行し、/support/ を発見した。
    • /support/ 配下はHelpDeskZというオープンソースの問い合わせ管理システム的なソフトウェアだった。
    • ポート3000に対しても実行したが、何も見つからず。

侵入

  • HelpDeskZ
    • searchsploit で調べるとエクスプロイトが2件。現時点でクレデンシャルは判明していないので、クレデンシャルが不要な Arbitrary File Upload (チケットに添付したファイルをログインせずに閲覧・実行できるという脆弱性。チケットを切る行為はログインしていなくても可能)を実行しようとしたが、そもそもPHPスクリプトファイルのアップロードが禁止されていたため実施する意味がなく、断念。

Writeupの冒頭を確認 - 1

やはりポート3000はGraphQLでした。しかし /graphql に対してクエリを投げなければならず、これは事前のディレクトリ列挙で見つかりませんでした。パラメータのキーも含め、常識なのか、guessingなのか……。とりあえず、以下のリクエストを投げることでユーザー情報が1件返ってきました。

curl -s -G http://10.10.10.121:3000/graphql --data-urlencode 'query={user{username, password}}'

memo: -G-XGET の違い

これらは同じ挙動をするのだと思っていましたが、どうやら以下の違いがあるみたいです。 man の記述と、WireSharkで実際に両パターンのパケットをみて確認しました。

  • -G: --data-urlencode で指定したデータを、 クエリストリングとして 送信する。
  • -XGET: --data-urlencode で指定したデータを、 ボディとして(ポストパラメータのように) 送信する。

侵入

  • GraphQLで手に入ったクレデンシャルで、HelpDeskZにログインした。
  • searchsploit で出てきたもうひとつのエクスプロイト((Authenticated) SQL Injection / Unauthorized File Download)を実行するも発動せず。

Writeupの冒頭を確認 - 2

Writeupでも同じ脆弱性を利用していて、エクスプロイトのコードに誤りがあったようです。微調整を重ねてようやく成功。admin という管理者名とそのパスワードハッシュを入手し、ハッシュはCrackStationで平文を見つけました。

これまで入手したクレデンシャルを組み合わせてSSHログインを試みましたがどれも失敗。再びWriteupを確認すると、ユーザー名が help ……。サーバー名がヒントになっていることはあれど、こういうケースもあるんですね。この時点でown userです。

memo: ブラインドSQLインジェクション

SQLの結果をそのまま受け取れないまでも、アプリケーションの挙動からクエリ結果の判定ができる場合(HelpDeskZの場合、クエリの結果がtrueの場合200が、falseの場合404が返ってくる)、それを利用してDB内の情報を知ることができます。

権限昇格

  • /home/help/.bash_history にrootのパスワードらしき痕跡があったが、昇格できず。
  • linpeas.sh をローカルから持ってきて実行すると、 /usr/lib/s-nail-s-nail-privsep という見慣れないファイルがリストアップされていることを確認した。
  • searchsploit で調べると、1件だけLCEのエクスプロイトを発見した。
  • 上記をローカルから持ってきて実行するとrootに権限昇格できた。own root。

KPT(Keep-Problem-Try)

Keep

  • 列挙がうまくいってよかった。列挙モチベーションが維持できた。
  • ブラインドSQLインジェクションの仕組みが理解できてよかった。
  • curl-G-XGET の違いが分かってよかった(Keepは果たしてよかったことを書くんだったか)。

Problem

  • 時間内に新技術を要領良く学ぶことができなかった。
    • 「GraphQLを知らない」ことは大した問題ではなくて、戦闘中に見知った技術を短時間でラーニングしなければならない。
    • とはいえ、それが苦手だからこそ、事前に数こなしてそういうシチュエーションを減らそうとしている、というのもある。
  • サーバー名を甘くみていた。最大のヒント。

Try

  • 知らない技術に出くわしたら、Qiitaでもなんでもいいからざっと読んで動かしてみる。
  • サーバー名 = ユーザー名の可能性は常にあるものと心得る。

【Hack The Box二十五番勝負 Advent Calendar 2020】8日目 vs Bank(●)

f:id:befs_anne:20201210112645p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 8日目の記事です。

adventar.org

サマリ

  • 対戦相手:Bank
  • 対戦日時:2020年12月9日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
  • 通算成績:8戦1勝7敗

対戦相手

今回の対戦相手は「Bank」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
        • OpenSSH6.6.1p1にユーザー列挙の脆弱性があったので、 searchexploit で発見したコードと、SecListsの users.txt を使って実行。 binchris が存在することが分かった。
      • DNS(53)
        • DNSが開いているBoxを(HTB以外のプラットフォームを含め)はじめて見たので何かあるだろうと思って色々(と言ってもゾーン転送ぐらい)調べたが特に何も出てこなかった。
        • searchsploit bind はBind Shell的なものが出てきて邪魔だった。
      • HTTP(80)
  • Firefox
  • Dirbuster
    • IPアドレスに対して midiumサイズの辞書を使って実行したが、 index.htmlserver-status しか見つからなかった。

侵入

  • Hydra
    • ユーザーを chris に固定して、パスワードは rockyou.txt で実行したが、当たりなし。

Writeupの冒頭を確認 - 1

以降どう頑張っても糸口が見つからなかったため、ギブアップのつもりで公式Writeupの冒頭を確認しました。 /etc/hostsbank.htb を書け、とのこと。これ直近で試したやんけ……。とは言え、前回は証明書経由でドメインを確認できたからで、今回に関しては完全にノーヒントで /etc/hosts に書けというものでした。まあ理不尽と思わず、覚えておこう……。

以下、上記のみインプットした後にやったことです。

情報収集

  • Dirbuster
    • 今度は bank.htb に対して、midiumの辞書で試行しました。PHPアプリケーションのログイン画面が見つかった。

しかし、何を試せどログイン画面を看破できず。

Writeupの冒頭を確認 - 2

またもスタックしたためWriteup確認。Dirbusterでディレクトリ列挙すると /balance-transfer/ が出てくる、とのこと。やったはずなのにな……という感じですが、回線が貧弱なこともあり満足に試行できていなかったのかもしれません。本当に悔やまれる。

以下、上記のみインプットした後にやったことです。

侵入

  • /balance-transfer の中には、決済トランザクションのログと思しきファイルが1000ファイル近くあった。
  • メールアドレスやパスワードは暗号化されており、ファイルの先頭行に暗号化の結果が書かれていた。
  • ブラウザで適当に数ファイル開くと、暗号化の結果はいずれも SUCCESS だった。
  • SUCCESS 以外のファイルがあると踏んで、ログファイルを全てローカルに落とし、ワンライナーSUCCESS 以外の結果になっているファイルを探すと、 --ERR ENCRYPT FAILED となっているファイルを発見した。中を見ると、メールアドレス(chris@bank.htb)とパスワードが平文で保存されていた。
  • 入手したメールアドレスとパスワードで、Webアプリにログインした。
  • サポートページにファイルアップロード機能があった。ウェブシェルのアップロードを複数手法で試したがいずれも失敗した。
    • PHPファイルをアップロードしようとしたが、バリデーションで弾かれた。
    • 上記のリクエストをBurpでインターセプトし、Content-Typeを image/jpeg に変更したが、またも弾かれた。拡張子をチェックしている模様。
    • exiftool を使って適当な画像ファイルにウェブシェルを埋め込んだ。アップロードは成功したがウェブシェルは動かず(そもそも、ファイルインクルージョン脆弱性と併用するものだった)。
  • ソースを見たら「 .htb 拡張子のファイルはPHPファイルとしてアップロードできるようにしてあるよ」的なことが書いてあった(どうかしている)。 先のPHPファイルの拡張子を .htb に書き換えると、アップロードが成功した。
  • ウェブシェルから nc でリバースシェルを確立した(ユーザーは www-data )。

権限昇格

  • MySQLが動いているようだったが、クレデンシャルは見つからなかった。
  • ローカルマシンから linpeas.shwget でダウンロードし実行。 /etc/passwdパーミッションが666になっていた(!)。
  • リバースシェルだとViの操作がうまくできないので、以下の手順でrootのパスワードを x から任意のパスワードハッシュに書き換えた。
    • cp -p /etc/passwd /tmp
    • sed -i -e 's/root:x/{{任意のパスワードハッシュ}}/' passwd
    • cp -p passwd /etc/passwd
      • cp: preserving times for '/etc/passwd': Operation not permitted というエラーがでるものの、書き換えは成功していた。
  • su rootできるようになるので、そのままown user / root。

KPT(Keep-Problem-Try)

Keep

  • /balance-transfer/ 発見後は自力でown rootまでいけた。リバースシェルや /etc/passwd の発見などはまあまあ手際がよかったと思う。

Problem

  • ディレクトリ列挙、こうなってくるとちょっとどうしたらいいか分からない……。

Try

  • ディレクトリ列挙に関しては、やるにはやるものの、Writeupを見たときここでつまづいていても、気にしないぐらいがいいのかもしれない……?

【Hack The Box二十五番勝負 Advent Calendar 2020】7日目 vs Teacher(●)

f:id:befs_anne:20201209012745p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 7日目の記事です。

adventar.org

サマリ

  • 対戦相手:Blocky
  • 対戦日時:2020年12月8日 20:50 - 23:59
  • 結果:敗北
  • 主な敗因:
    • 不自然だと感じたことの確認を放置した
    • MySQLの出力結果をちゃんと検証しなかった
  • 通算成績:7戦1勝6敗

対戦相手

今回の対戦相手は「Teacher」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • HTTP(80)
  • Dirbuster
    • midiumサイズの辞書を実行し、 /phpmyadmin (403)や /Moodle (200)を発見した。
  • Firefox
    • "Giovanni" という教師が作成したコースがあることを確認した。
    • /gallery.html で画像が1つ欠けていることを確認した。
      • /images の当該ファイルを確認すると、.jpg として読み込めないファイルだった。
      • 当該ファイルを wget して file コマンドした結果テキストファイルであることが判明(これをやったのが23:00ぐらい)。
      • 内容は「Giovanniがパスワードの最後の1文字を忘れた、覚えているのはTh4C00lTheacha までだから、あとはなんとかして欲しい」とのこと。

侵入

  • Hydra
    • giovanniGiovanni を含むユーザーリストと rockyou.txt-u オプションでパスワードスプレー方式(?)によるブルートフォースを試行していた。
    • 画像ファイルに見せかけたテキストファイルの件を受けて、Pythonstring.printable を使用してパスワードリストを作って実行した。
    • しかし、Hydraの出力では全て試行失敗。おそらくコマンドのどこかが誤っていた。
      • ログインボタンをクリックすると一度303リダイレクトされるような動きをしていたので、ここが考慮されていなかった可能性が高い。
  • Pythonスクリプト
    • Pythonでログイン試行スクリプトを作成しレスポンスサイズを確認しつつ、Wiresharkでパケットをチェックした。
    • たまたま成功時らしきレスポンスを発見した。パスワードが Th4C00lTheacha# であることが分かった。
  • エクスプロイト
    • searchsploitMoodleのRCEエクスプロイトを発見し実行。 www-data ユーザーでのリバースシェルを確立した。

このあたりでタイムアップしました。以降は時間切れ後(だがWriteupは見ていない)のトライです。

権限昇格(一般ユーザー)

  • ss -atn | grep LISTEN で、MySQLが動作していることを確認した。
  • /etc/passwd の内容から、 giovanni というユーザーが存在することを確認した。
  • /var/www/html/moodle/config.php 内に、MySQLのクレデンシャルがあることを確認した。
  • MySQL
    • SELECT * FROM moodle.mdl_user など確認するも特段の情報は得られず。
  • LinPEAS
    • wget でLinPEASを持ち込んで実行するも、特段の情報は得られず。

その他、PHPMyAdmin周りを確認するもめぼしいものは見つからず、ギブアップしました。

残りの手順

Writeupは公式のものを参考にしています。

権限昇格(一般ユーザー)

  • MySQL
    • mdl_user テーブルの内容をよく確認すると、 Giovannibak ユーザーのパスワードのみMD5だった。
  • デハッシュ(と言うとおこられることがあるらしいが)
    • hashcatjohn が正しく使えなかったので)外部のMD5レインボーテーブルで確認したところ、平文は expelled であるようだった。
  • giovanni での権限昇格
    • su giovanni してパスワードは expelled でログイン試行したところ成功した。own user。

権限昇格(rootユーザー)

  • giovanni のホームディレクトリ内にある work/tmp にバックアップを作成するスクリプト/usr/bin/backup.shroot ユーザーのcronジョブで作成されているらしい(Writeup中には具体的な確認方法について記載がなかったが、 pyps64 などで分かりそうだ)。
  • /usr/bin/backup.sh の中身を見ると、バックアップ元は courses/* と指定されているため、 courses という名前の /root へのシンボリックリンクファイルを作ってしまえば、/root/* がバックアップされる ということになる(悪いことを考える人がいるものだ、と思った)。
  • この方法で root.txt が生成され、own root。

KPT(Keep-Problem-Try)

Keep

Problem

  • 画像の欠けについて、もっと早く確認するべきだった。
  • MySQLの出力を見逃した。

Try

  • 気づいた不自然な点はあらゆる確認をおこなう。具体的には、表示できない画像ファイルはその形式を確認する。
  • MySQLのテーブルは、めぼしいフィールドに絞って出力する( SELECT * としていたために見逃したふしがある)。

【Hack The Box二十五番勝負 Advent Calendar 2020】6日目 vs Blocky(●)

f:id:befs_anne:20201207065742p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 6日目の記事です。

adventar.org

サマリ

  • 対戦相手:Blocky
  • 対戦日時:2020年12月6日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
  • 通算成績:6戦1勝5敗

対戦相手

今回の対戦相手は「Blocky」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • FTP(21)
        • ProFTPdだが既知の脆弱性には該当せず。anonymousログインも不可。
      • SSH(22)
      • HTTP(80)
        • Wordpress4.8。
  • Wpscan
    • Coreの脆弱性多数。一方でプラグインはakismetのみで、脆弱性があるバージョンではなかった。
    • ユーザー列挙で notch というユーザーがいることを確認した。
  • Dirbuster
    • midiumサイズの辞書で実行。recursiveな実行にしていたからか index.php の下を掘ってばかりになっていたっぽい(敗因)。

侵入

その他、Wpscanで見つかった脆弱性を色々試すも全て失敗しました。

残りの手順

Writeupは公式のものを参考にしています。

侵入

  • Dirbusterを使って /plugins を発見する。- 2つの .jar ファイルがある。
  • 一方を jd-gui (はじめて使った!)でデコンパイルすると、MySQLのクレデンシャルが出てくる。
  • ユーザー notch 、パスワードは .jar ファイルに含まれているものを使ってSSHログインすると notch でログインできる。own user。

権限昇格

  • sudo -s できた。own root。

KPT(Keep-Problem-Try)

Keep

Problem

  • がんばってブルートフォースしたが、やり方が悪かった。
  • 土日あんまりちゃんとやらない。

Try

  • ブルートフォース、最初は再帰実行せずに浅めに探して、その後必要に応じて掘るようにする。
  • 家にいるとやらないから、外出るか…?

【Hack The Box二十五番勝負 Advent Calendar 2020】5日目 vs Valentine(●)

f:id:befs_anne:20201205235617p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 5日目の記事です。

adventar.org

サマリ

  • 対戦相手:Valentine
  • 対戦日時:2020年12月4日 21:00 - 22:45
  • 結果:敗北
  • 主な敗因:
  • 通算成績:5戦1勝4敗

対戦相手

今回の対戦相手は「Valentine」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
      • HTTP(80)
        • ブラウザで見るとHeartbleedのロゴ画像が出てきた。
      • HTTPS(443)

上記の結果から、Heartbleedが侵入経路であると確信しました(してしまいました)。この判断が性急でした。

ちなみに、証明書のSubjectを見て valentine.htb であることを確認しました。どこかよそのWriteupで見たことがあったので、 /etc/hosts をいじって valentine.htb10.10.10.79 に解決されるようにして、ブラウザで valentine.htb へアクセスを試行しました。結果的にはIPアドレスでアクセスした時と同じコンテンツが表示されたので、この問題には全く関係ありませんでした。

侵入

  • Heartbleed
    • tcpdump -w でパケットを取得しつつ、Metasploitの auxiliary/scanner/ssl/openssl_heartbleed モジュールを実行した。
    • Wiresharkでパケットを見ると、サーバーからのHTTPレスポンスパケットに、メモリ上に残存していると思われるHTTPリクエスト情報が含まれていた。
  • http://127.0.0.1/decode.php に対して、Base64でハッシュ化された文字列をPOSTしているようだった。
  • 文字列をハッシュすると heartbleedbelievethehype という文字列が出現した。
  • 取得したパケットに他にも情報が含まれていないか調べてみたが、特段見つからなかった。時間を費やし過ぎた。
  • hypeというのが「誇大広告」という意味のようで、もしかしてフェイクということか?などと考えていた。

残りの手順

Writeupは公式のものを参考にしています。

侵入

  • Dirbusterを使って /dev を発見する。
    • hype_key というファイルがある。
  • Writeupによるとそれが hype というユーザーでSSHログインできる秘密鍵のようだが、そのままでは使えなかったので、Cyberchefで変換(from hex)すると、見慣れた秘密鍵ファイルになった。
  • パスフレーズがかかっていて、それが heartbleedbelievethehype だった。
  • ホームディレクトリに user.txt がなくてちょっと焦ったが、 find . -name "user.txt" してデスクトップにあることを確認した。own user。

権限昇格

  • ps aux すると、rootのtmuxセッションプロセスがあることが分かる。
  • tmux -S /.devs/dev_sess/ してセッションにアタッチする。 whoami すると、rootユーザーだった。own root。

KPT(Keep-Problem-Try)

Keep

  • Heartbleed→パケットを取りながらエクスプロイトする、が割にスムーズにできたのは良かったと思う。

Problem

  • またもディレクトブルートフォースが甘かった。列挙系はやはり心理的障壁があった(かかる時間の割に徒労に終わる経験が多かったので)が、これで勝ち星を取り落としているので、認識を改めなければいけない。

Try

  • 週末にもう1回チャレンジする。
  • 次はぜったいディレクトリ列挙を、Dirbusterでする。