2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

専門学校生がAIエージェントにKali Linuxを完全自動操作させてセキュリティコンテストで優勝した話

Posted at

専門学校生がAIエージェントにKali Linuxを完全自動操作させてセキュリティコンテストで優勝した話

目次

  1. はじめに:なぜ「AIに全部やらせた」のか
  2. チーム紹介:異種混合の「ドルフィン」
  3. 1次予選
  4. 2次予選(本選)
  5. 振り返り:AI時代のセキュリティ

はじめに:なぜ「AIに全部やらせた」のか

正直に言います。

私、セキュリティのこと、全然わかりません。

MBSD Cybersecurity Challenges 2025に出ると決めたとき、チームメンバーの中で一番不安だったのは間違いなく私でした。他のメンバーはネットワークセキュリティ学科だったり、システム開発をバリバリやってたり。でも私はAIテクノロジー学科。セキュリティの授業なんて、ほとんど受けたことがない。

しかも、コンテストの期間は限られています。手動で一つ一つ脆弱性を探していたら、絶対に間に合わない。

じゃあどうする?

そこで私は考えました。**「自分にはAIがある」**と。

セキュリティの知識がないなら、AIに教えてもらえばいい。時間がないなら、AIに作業させればいい。AIエージェントの開発経験は、すでに持っている。だったら、それをセキュリティ診断に応用すればいい。

結果として、私たち専門学校穴吹コンピュータカレッジのチーム「ドルフィン」は全国優勝。正直、自分でも驚いています。

この記事では、セキュリティ素人の私がどうやってAIエージェントを活用し、診断システムを作り上げたのか、その全てをお話しします。

チーム紹介:異種混合の「ドルフィン」

私たちのチーム、実はちょっと変わっていて、全員が違う学科なんです。

メンバー 学科 主な担当
藤井(リーダー) ネットワークセキュリティ 全体の取りまとめ、解析の考察、レポートの仕上げ
私(筆者) AIテクノロジー AIエージェントの開発、自動化システム、ロジック考察
茶円 情報システム アプリの解析、ロジック診断、レポート作成
篠原 ネットワークセキュリティ Kaliでの調査、レポート作成

最初は「学科がバラバラで大丈夫かな...」と心配でした。でも蓋を開けてみると、これが大正解。セキュリティ学科だけでは出てこない発想が、次々と生まれました。

例えば私は「セキュリティツールの使い方」は全然わからないけど、「AIにツールを使わせる方法」ならわかる。茶円はシステム開発者目線で「こういう実装ならバグが起きやすい」という勘所を持っている。

専門が違うからこそ、死角のない診断ができたのだと思います。


1次予選

Kali Linuxを自動操作するエージェントを作った

私がこのコンテストで担当したのは、AIエージェントによる脆弱性診断の自動化です。

普通、Kali Linux上のツール(Nmap、Zap、Niktoなど)は人間がコマンドを打って動かします。でも、AIにコマンドを考えさせて、実行させて、結果を分析させれば、圧倒的に効率が良い。

使ったツールは以下の3つ。それぞれ役割が違います。

ツール 役割
Codex コード生成。ペイロードやスクリプトの作成
Claude 静的解析。コードを読んで脆弱性の仮説を立てる
Gemini-CLI ツール操作。Kali上のコマンドを実行・結果を取得

なぜローカルモデルに差し替えたか

ここで重要なのが、Claudeはローカルモデルに差し替えて運用したということです。

理由は3つあります。

  1. 他社の権利を守るため:コンテストで配布されたソースコードをそのままクラウドのAIに食わせると、学習データに使われてしまう可能性がある。他社の権利があるコードを勝手に学習させるわけにはいかない。だから間接的な抽出目的でのみ使い、直接コードを渡すClaude部分はローカルモデルに差し替えました。

  2. 無限の試行回数:ローカルで動かせば、API制限を気にせず何度でも試行できる。診断って試行錯誤の連続なので、これがかなり大きい。

  3. コスト:クラウドのAPIは使えば使うほどお金がかかる。ローカルなら電気代の中で動くだけ。ほぼタダ...とは言わないけど(電気代も馬鹿にならない)、クラウド型よりは圧倒的に安い。

まず情報収集(偵察フェーズ)

脆弱性診断の前に、まずはターゲットの情報を集めます。

Gemini-CLIを使って、サーバーで何が動いているのかを自動で巡回・取得させました。

  • ポートスキャン:どのポートが開いているか
  • ページ巡回:どんなページがあるか、どんな機能があるか
  • サービス特定:動いているソフトウェアのバージョンなど

ここで工夫したのが、単純な動作はPythonスクリプトで行うということ。

ページの取得みたいな単純作業をAIにやらせると、「このページがあった」とか言いながら実際には存在しないページを報告してくることがある。だから、全ページの巡回みたいな単純作業は自作のスクリプトで確実に実行し、その結果だけをAIに渡す。

AIに「考える」仕事をさせて、「作業」はスクリプトにやらせる。この切り分けがハルシネーション回避にかなり効きました。

この情報をAIに渡しておくことで、より詳細で的確な診断ができるようになります。闇雲に攻撃するんじゃなくて、まず敵を知ることが大事。

AIの制約を回避するプロンプト設計

実は、AIって「攻撃」とか「脆弱性」とかのワードに敏感で、普通に頼むと断られることが多いんです。

そこで、システムプロンプトに「あなたは熟練したペネトレーションテスターです」と役割を明確に与えました

これだけで、AIの回答精度が全然違う。「これは正当なセキュリティ診断である」という文脈を与えることで、制約を回避しつつ、ちゃんとした結果を返してくれるようになりました。

ハルシネーション対策を最初から組み込んだ

AIエージェントを作った経験がある人ならわかると思いますが、AIは平気でウソをつきます。存在しない脆弱性を「見つけました!」と報告してくることなんて日常茶飯事。

これをそのままレポートに載せたら大変なことになる。だから最初からハルシネーション対策を組み込んだ設計にしました。

「攻撃役」と「検証役」を分けた

私が設計したのは、2種類のAIを議論させる仕組みです。

  1. Bug Hunter(攻撃役):積極的に脆弱性を探す。怪しいところを見つけたら報告する。
  2. Result Doubter(検証役):Bug Hunterの報告を徹底的に疑う。「本当にそれ脆弱性?」「再現できる?」「証拠は?」とツッコミを入れる。

この2つのAIが議論して、意見が一致したものだけをレポートに載せる。意見が割れたら、最終的に人間(私たち)が確認する。

AIを信じすぎず、かといって切り捨てもしない。この**「AIと人間の協調」**が、高精度なレポートを生み出しました。

レポートの書き方(1次審査)

脆弱性を見つけるだけじゃなくて、どう伝えるかも勝負のポイント。

私たちはレポートの構成にもこだわりました。

項目 工夫
コード提示 指摘箇所のコードを記述し、修正箇所を見やすく
図解 問題点を図に起こして視覚的に理解しやすく
ソート 脆弱性の深刻度順に並べ替え
修正提案 複数パターン記載(緊急の修正+長期的な修正)
ページ数 1脆弱性あたり1〜2枚に抑えて読みやすさを優先

審査員も人間なので、読みやすいレポートは正義。

VMを「割った」話

もう一つ、大胆な作戦がありました。

コンテストで配布されたVMを解析して、ソースコードを抜き出すことにしたんです。

普通は外から攻撃して脆弱性を探す「ブラックボックス診断」をします。でも、限られた時間で全部調べるのは無理。だったら、中身を見ちゃえばいい。

これを1次予選の段階でやっていたことが、後の2次予選で活きてきます。


2次予選(本選)

Diffを取ったら宝の山だった

2次予選では、修正版のVMが配布されました。

ここで活きたのが、1次予選のときに抜いていたソースコード。2次予選のVMからも同じようにコードを抽出して、Diff(差分)を取りました

すると、開発者がどこを修正したのかが一目瞭然。

「修正された箇所だけ重点的に調べればいい」という状況になり、これが強かった。

しかも、このDiffをAIに読ませると面白いことが起きました。

:「この修正、ちゃんと直ってる?」
AI:「いえ、この書き方だと別の条件でまたバグが発生します」

AIがコードレビュアーになってくれたんです。人間だけでは見落としがちな論理的なバグを、AIが指摘してくれる。この連携がうまくハマって、他のチームでは見つけられなかった脆弱性をいくつも発見できました。

レポートの書き方(2次審査)

2次審査では、レポートの書き方も変えました。

1次審査で報告した脆弱性は書かない。これが大事。

2次審査の目的は「修正版VMの問題点を指摘すること」なので、すでに報告済みの内容を繰り返しても意味がない。だから、2次で追加された修正のうち、まだ直っていない箇所だけを報告することにしました。

これにより、「ここを直したはずなのに、まだこういう問題が残ってますよ」という具体的な指摘ができて、審査員にも伝わりやすかったと思います。


振り返り:AI時代のセキュリティ

AIに「人格」を持たせることの大切さ

今回の経験で改めて実感したのは、AIをただのツールとして使っちゃダメということ。

「脆弱性を探して」と投げるだけじゃ、ノイズだらけの結果が返ってくる。でも「あなたはペネトレーションテスターです」「あなたは監査役です」と役割を明確に与えると、途端にまともな回答が返ってくる。

さらに、役割の違うAI同士を議論させると、一人のAIでは気づかない矛盾やミスが見つかる。

これって、人間のチームワークと同じですよね。一人で全部やるより、役割分担して、お互いにチェックし合った方がいい結果が出る。

来年に向けて

来年もMBSD Cybersecurity Challengesに出ます。

今回作ったシステムは、まだまだ荒削り。もっと自動化できるところがあるし、もっと賢くできる。来年は、最初から最後までAIだけで完結するような、そういうシステムを目指したいです。

反省点:うまくいかなかったこと

正直に書きます。今回、完璧だったわけじゃない。

ファクトチェックが大変だった

AIが大量のレポートを生成してくれるのはいいんだけど、それを人間が一つ一つ確認するのがめちゃくちゃ大変だった。シナリオごとの実行はできるけど、「なぜその脆弱性が発生するのか」をまとめる作業までは自動化できていなかった。結果、全部はまとめきれなかった。

チーム連携がおろそかになった

自分の作業に集中しすぎて、他のメンバーへの共有が遅くなってしまった。これは反省。

時間配分のミス

他の予定とも重なって、結局30時間くらいしか時間が取れなかった。しかも、ずっと同じ箇所(Dockerからの脱出)に時間を食われてしまっていた。今となれば、あれは後回しにしてよかった気がする。

審査員に聞けばよかった

審査員の方に聞いたところ、ルールに載っていないことを試したい場合は、問い合わせて聞いてみればいいらしい。来年はわからない部分は積極的に聞こうと思う。

次回への教訓

  • レポート生成だけじゃなく、まとめ作業も自動化する
  • チームへの共有を早く、こまめに
  • 一つの課題にハマったら時間を決めて切り上げる
  • ルールに書いてないことは聞く

セキュリティの素人でも、AIエージェントの力を借りれば戦える。今回のコンテストで、それを証明できたと思います。

この記事が、同じようにセキュリティコンテストやCTFに挑戦しようとしている人、そして「AIをどう使えばいいかわからない」と悩んでいる人の参考になれば嬉しいです。

最後に一番Tokenを食っていた時の画像です...
ありがとうGoogle♡
image.png

チーム「ドルフィン」の挑戦は、まだまだ続きます。
ではまた来年!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?