<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>コマンド &#8211; セキュリティエンジニアの雑多ブログ</title>
	<atom:link href="https://cybermemo.blog/category/command/feed" rel="self" type="application/rss+xml" />
	<link>https://cybermemo.blog</link>
	<description>セキュリティエンジニアの学習記録</description>
	<lastBuildDate>Sun, 14 Dec 2025 08:10:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://cybermemo.blog/wp-content/uploads/2025/10/cropped-トップアイコン-32x32.jpg</url>
	<title>コマンド &#8211; セキュリティエンジニアの雑多ブログ</title>
	<link>https://cybermemo.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>外部結合ってどんな時に使うの？</title>
		<link>https://cybermemo.blog/when-to-use-outer-join</link>
					<comments>https://cybermemo.blog/when-to-use-outer-join#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 14 Dec 2025 08:09:43 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=584</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに SQLの勉強をしていて、外部結合をどんな時に使うのかイメージできなかったので調べてみた。 内部結合と外部結合の違い 内部結合（INNER JOIN） 両方のテーブルに 一致するデータがある行だけ 出す。「関係が [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p>SQLの勉強をしていて、外部結合をどんな時に使うのかイメージできなかったので調べてみた。</p>



<h2 class="wp-block-heading">内部結合と外部結合の違い</h2>



<h3 class="wp-block-heading">内部結合（INNER JOIN）</h3>



<p>両方のテーブルに <strong>一致するデータがある行だけ</strong> 出す。<br>「関係が成立しているものだけ見たい」</p>



<h3 class="wp-block-heading">外部結合（OUTER JOIN）</h3>



<p>一致しない行も <strong>欠けたまま（NULL）</strong>で出す。<br>「関係が成立していないものも把握したい」</p>



<p class="is-style-icon_pen"><strong>”存在していない事実<strong>”</strong>を確認したいとき</strong>が外部結合の出番。</p>



<h2 class="wp-block-heading">サンプルデータを用意</h2>



<h3 class="wp-block-heading">シナリオ</h3>



<p>登録だけして注文をしたことがない人を確認したい。</p>



<h3 class="wp-block-heading">usersテーブル</h3>



<p>登録ユーザーが記録されたテーブル。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>user_id</th><th>name</th></tr></thead><tbody><tr><td>1</td><td>Sato</td></tr><tr><td>2</td><td>Suzuki</td></tr><tr><td>3</td><td>Tanaka</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">ordersテーブル</h3>



<p>注文履歴が記録されたテーブル。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>order_id</th><th>user_id</th><th>amount</th></tr></thead><tbody><tr><td>101</td><td>1</td><td>3000</td></tr><tr><td>102</td><td>3</td><td>1500</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">外部結合でデータを抽出する</h2>



<h3 class="wp-block-heading">SQLで左外部結合</h3>



<pre class="wp-block-code"><code>SELECT
  u.user_id, u.name,
  o.order_id, o.order_date, o.amount
FROM users u
LEFT OUTER JOIN orders o
  ON u.user_id = o.user_id
ORDER BY u.user_id, o.order_id;</code></pre>



<h3 class="wp-block-heading">結果</h3>



<p>Suzukiさんは ordersテーブル に対応するデータがないため、注文していないことが分かる。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>user_id</th><th>name</th><th>order_id</th><th>order_date</th><th>amount</th></tr></thead><tbody><tr><td>1</td><td>Sato</td><td>101</td><td>2025-12-06</td><td>3000</td></tr><tr><td data-has-cell-bg="1" data-text-color="black"><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>2</td><td data-has-cell-bg="1" data-text-color="black"><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>Suzuki</td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td></tr><tr><td>3</td><td>Tanaka</td><td>102</td><td>2025-12-07</td><td>1500</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">解説</h3>



<p>左外部結合なので usersテーブル に ordersテーブル をくっつけている。<br>そのため、ordersテーブルに値がなくてもNULL表示される。<br>ordersテーブルの値がNULL = 注文をしたことがない人が分かる。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="476" height="309" src="https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1.jpg" alt="ベン図_左外部結合" class="wp-image-606" srcset="https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1.jpg 476w, https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1-300x195.jpg 300w" sizes="(max-width: 476px) 100vw, 476px" /></figure>



<h2 class="wp-block-heading">結論</h2>



<p>外部結合は「ある／ない」を確認したいときに使える。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/when-to-use-outer-join/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL構文メモ</title>
		<link>https://cybermemo.blog/mysql-sql-cheatsheet</link>
					<comments>https://cybermemo.blog/mysql-sql-cheatsheet#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 14 Dec 2025 06:33:52 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=582</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに 自分用のSQL構文メモ。MySQL用。 MySQLへのログイン データベース操作 データベース作成 データベース削除 データベース一覧確認 使用するデータベースの切り替え 現在使用中のデータベース確認 テーブル [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p>自分用のSQL構文メモ。<br>MySQL用。</p>



<h2 class="wp-block-heading">MySQLへのログイン</h2>



<pre class="wp-block-code"><code>mysql -u ユーザー名 -p</code></pre>



<h2 class="wp-block-heading">データベース操作</h2>



<h3 class="wp-block-heading">データベース作成</h3>



<pre class="wp-block-code"><code>CREATE DATABASE データベース名;</code></pre>



<h3 class="wp-block-heading">データベース削除</h3>



<pre class="wp-block-code"><code>DROP DATABASE データベース名;</code></pre>



<h3 class="wp-block-heading">データベース一覧確認</h3>



<pre class="wp-block-code"><code>SHOW DATABASES;</code></pre>



<h3 class="wp-block-heading">使用するデータベースの切り替え</h3>



<pre class="wp-block-code"><code>USE データベース名;</code></pre>



<h3 class="wp-block-heading">現在使用中のデータベース確認</h3>



<pre class="wp-block-code"><code>SELECT DATABASE();</code></pre>



<h2 class="wp-block-heading">テーブル操作</h2>



<h3 class="wp-block-heading">テーブル作成（基本）</h3>



<pre class="wp-block-code"><code>CREATE TABLE テーブル名 (
フィールド名1 データ型,
フィールド名2 データ型
);</code></pre>



<h3 class="wp-block-heading">プライマリーキー・AUTO_INCREMENT付きテーブル作成</h3>



<pre class="wp-block-code"><code>CREATE TABLE テーブル名 (
id INT AUTO_INCREMENT,
フィールド名 データ型,
PRIMARY KEY (id)
);</code></pre>



<h3 class="wp-block-heading">テーブル削除</h3>



<pre class="wp-block-code"><code>DROP TABLE テーブル名;</code></pre>



<h3 class="wp-block-heading">テーブル一覧確認</h3>



<pre class="wp-block-code"><code>SHOW TABLES;</code></pre>



<h3 class="wp-block-heading">テーブル定義確認</h3>



<pre class="wp-block-code"><code>SHOW FIELDS FROM テーブル名;</code></pre>



<h2 class="wp-block-heading">フィールド（カラム）操作</h2>



<h3 class="wp-block-heading">フィールド追加</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 ADD 追加フィールド データ型 AFTER 既存フィールド;</code></pre>



<h3 class="wp-block-heading">フィールド削除</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 DROP 削除対象フィールド;</code></pre>



<h3 class="wp-block-heading">フィールド名変更</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 CHANGE 旧フィールド名 新フィールド名 データ型;</code></pre>



<h3 class="wp-block-heading">フィールドのデータ型変更</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 MODIFY フィールド名 データ型;</code></pre>



<h3 class="wp-block-heading">NOT NULL 制約の設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
MODIFY フィールド1 データ型 NOT NULL,
MODIFY フィールド2 データ型 NOT NULL;</code></pre>



<h3 class="wp-block-heading">デフォルト値の設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
ALTER フィールド名 SET DEFAULT 'デフォルト値';</code></pre>



<h3 class="wp-block-heading">プライマリーキー設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 ADD PRIMARY KEY (フィールド名);</code></pre>



<h3 class="wp-block-heading">外部キー制約設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
ADD FOREIGN KEY (外部キー列)
REFERENCES 参照先テーブル (主キー列);</code></pre>



<h2 class="wp-block-heading">ユーザー・権限管理</h2>



<h3 class="wp-block-heading">ユーザー作成</h3>



<pre class="wp-block-code"><code>CREATE USER 'ユーザー名'@'localhost';</code></pre>



<h3 class="wp-block-heading">現在のユーザー確認</h3>



<pre class="wp-block-code"><code>SELECT USER();</code></pre>



<h3 class="wp-block-heading">パスワード設定・変更</h3>



<pre class="wp-block-code"><code>ALTER USER 'ユーザー名'@'localhost'
IDENTIFIED BY '新しいパスワード';</code></pre>



<h3 class="wp-block-heading">権限付与</h3>



<pre class="wp-block-code"><code>GRANT 権限 ON データベース名.* TO 'ユーザー名'@'localhost';</code></pre>



<h4 class="wp-block-heading">主要権限一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>権限名</th><th>対象</th><th>できること</th><th>実務での主な用途</th><th>危険度</th></tr></thead><tbody><tr><td>SELECT</td><td>データ</td><td>データ参照のみ</td><td>参照専用、分析、レポート</td><td>低</td></tr><tr><td>INSERT</td><td>データ</td><td>レコード追加</td><td>登録処理、ログ保存</td><td>中</td></tr><tr><td>UPDATE</td><td>データ</td><td>レコード更新</td><td>ステータス・数量更新</td><td>中</td></tr><tr><td>DELETE</td><td>データ</td><td>レコード削除</td><td>物理削除が必要な処理</td><td>高</td></tr><tr><td>CREATE</td><td>構造</td><td>テーブル作成</td><td>開発作業</td><td>高</td></tr><tr><td>DROP</td><td>構造</td><td>テーブル削除</td><td>管理作業</td><td><strong>非常に高</strong></td></tr><tr><td>ALTER</td><td>構造</td><td>テーブル定義変更</td><td>カラム追加・変更</td><td><strong>非常に高</strong></td></tr><tr><td>INDEX</td><td>構造</td><td>インデックス作成・削除</td><td>パフォーマンス調整</td><td>中</td></tr><tr><td>REFERENCES</td><td>構造</td><td>外部キー制約作成</td><td>リレーション設計</td><td>中</td></tr><tr><td>ALL / ALL PRIVILEGES</td><td>全体</td><td>そのスコープ内の全権限</td><td>管理者・開発環境</td><td><strong>非常に高</strong></td></tr><tr><td>GRANT OPTION</td><td>権限</td><td>権限を他人に付与</td><td>DBA</td><td><strong>非常に高</strong></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">データ操作</h2>



<h3 class="wp-block-heading">レコード追加</h3>



<pre class="wp-block-code"><code>INSERT INTO テーブル名 (フィールド1, フィールド2)
VALUES ('データ1', 'データ2');</code></pre>



<h3 class="wp-block-heading">レコード追加（全カラム指定）</h3>



<pre class="wp-block-code"><code>INSERT INTO テーブル名 VALUES ('データ1', 'データ2');</code></pre>



<h3 class="wp-block-heading">レコード更新</h3>



<pre class="wp-block-code"><code>UPDATE テーブル名
SET 更新方法<sup data-fn="8c6ba620-248a-45ad-b9b6-1dabe17cf914" class="fn"><a href="#8c6ba620-248a-45ad-b9b6-1dabe17cf914" id="8c6ba620-248a-45ad-b9b6-1dabe17cf914-link">1</a></sup>
WHERE 条件;</code></pre>



<h3 class="wp-block-heading">レコード削除</h3>



<pre class="wp-block-code"><code>DELETE FROM テーブル名 WHERE 条件;</code></pre>



<h2 class="wp-block-heading">SELECT文（検索）</h2>



<h3 class="wp-block-heading">全件取得</h3>



<pre class="wp-block-code"><code>SELECT * FROM テーブル名;</code></pre>



<h3 class="wp-block-heading">重複除外</h3>



<pre class="wp-block-code"><code>SELECT DISTINCT フィールド名 FROM テーブル名;</code></pre>



<h3 class="wp-block-heading">条件付き検索</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
WHERE フィールド名 比較演算子 '条件'
AND / OR / NOT フィールド名 比較演算子 '条件';</code></pre>



<h4 class="wp-block-heading">主要な比較演算子一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>演算子</th><th>意味</th><th>使用例</th><th>実務での主な用途</th></tr></thead><tbody><tr><td><code>=</code></td><td>等しい</td><td><code>age = 30</code></td><td>完全一致検索（ID、コードなど）</td></tr><tr><td><code>!=</code><code>&lt;&gt;</code></td><td>等しくない</td><td><code>status != '削除'</code></td><td>特定値を除外</td></tr><tr><td><code>&gt;</code></td><td>より大きい</td><td><code>score &gt; 80</code></td><td>閾値超過の判定</td></tr><tr><td><code>&lt;</code></td><td>より小さい</td><td><code>price &lt; 1000</code></td><td>上限チェック</td></tr><tr><td><code>&gt;=</code></td><td>以上</td><td><code>created_at &gt;= '2025-01-01'</code></td><td>開始日以降</td></tr><tr><td><code>&lt;=</code></td><td>以下</td><td><code>pdate &lt;= CURDATE()</code></td><td>今日以前など</td></tr><tr><td><code>BETWEEN</code></td><td>範囲指定（含む）</td><td><code>age BETWEEN 20 AND 29</code></td><td>年齢・期間指定</td></tr><tr><td><code>IN</code></td><td>いずれかに一致</td><td><code>status IN ('未処理','保留')</code></td><td>OR条件の簡略化</td></tr><tr><td><code>NOT IN</code></td><td>いずれにも一致しない</td><td><code>id NOT IN (1,2,3)</code></td><td>除外リスト</td></tr><tr><td><code>LIKE</code></td><td>部分一致</td><td><code>name LIKE '%山田%'</code></td><td>あいまい検索</td></tr><tr><td><code>NOT LIKE</code></td><td>部分一致しない</td><td><code>name NOT LIKE '%テスト%'</code></td><td>不要データ除外</td></tr><tr><td><code>IS NULL</code></td><td>NULL判定</td><td><code>deleted_at IS NULL</code></td><td>未設定データ抽出</td></tr><tr><td><code>IS NOT NULL</code></td><td>NULLでない</td><td><code>memo IS NOT NULL</code></td><td>入力済み判定</td></tr><tr><td><code>EXISTS</code></td><td>存在確認</td><td><code>EXISTS (SELECT 1 …)</code></td><td>サブクエリ存在チェック</td></tr><tr><td><code>NOT EXISTS</code></td><td>存在しない</td><td><code>NOT EXISTS (SELECT 1 …)</code></td><td>未対応データ抽出</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">よく一緒に使う論理演算子</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>演算子</th><th>意味</th><th>使用例</th></tr></thead><tbody><tr><td><code>AND</code></td><td>両方満たす</td><td><code>age &gt;= 20 AND age &lt; 30</code></td></tr><tr><td><code>OR</code></td><td>どちらか満たす</td><td><code>role = 'admin' OR role = 'user'</code></td></tr><tr><td><code>NOT</code></td><td>否定</td><td><code>NOT status = '削除'</code></td></tr></tbody></table></figure>



<h3 class="wp-block-heading">並び替え</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
ORDER BY フィールド名 ASC / DESC;</code></pre>



<h3 class="wp-block-heading">件数制限</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
ORDER BY フィールド名
LIMIT 件数;</code></pre>



<h2 class="wp-block-heading">集計・グループ化</h2>



<h3 class="wp-block-heading">GROUP BY + 集計関数</h3>



<pre class="wp-block-code"><code>SELECT フィールド名, 集計関数
FROM テーブル名
GROUP BY フィールド名;</code></pre>



<h4 class="wp-block-heading">主要な集計関数一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>集計関数</th><th>意味</th><th>使用例</th><th>実務での主な用途</th></tr></thead><tbody><tr><td><code>COUNT(*)</code></td><td>行数を数える（NULL含む）</td><td><code>COUNT(*)</code></td><td>件数集計、レコード数確認</td></tr><tr><td><code>COUNT(フィールド)</code></td><td>NULLを除いた件数</td><td><code>COUNT(score)</code></td><td>入力済み件数の把握</td></tr><tr><td><code>SUM(フィールド)</code></td><td>合計値</td><td><code>SUM(amount)</code></td><td>売上合計、数量合計</td></tr><tr><td><code>AVG(フィールド)</code></td><td>平均値</td><td><code>AVG(score)</code></td><td>平均点、平均金額</td></tr><tr><td><code>MIN(フィールド)</code></td><td>最小値</td><td><code>MIN(price)</code></td><td>最安値、最古日付</td></tr><tr><td><code>MAX(フィールド)</code></td><td>最大値</td><td><code>MAX(price)</code></td><td>最高値、最新日付</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">別名（エイリアス）</h3>



<pre class="wp-block-code"><code>SELECT フィールド名 AS 別名
FROM テーブル名;</code></pre>



<h2 class="wp-block-heading">JOIN（結合）</h2>



<h3 class="wp-block-heading">内部結合（INNER JOIN）</h3>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
INNER JOIN テーブル2 AS t2
ON 条件<sup data-fn="d14036d2-dfad-4ab0-afb3-e980869f2a60" class="fn"><a href="#d14036d2-dfad-4ab0-afb3-e980869f2a60" id="d14036d2-dfad-4ab0-afb3-e980869f2a60-link">2</a></sup></code></pre>



<h3 class="wp-block-heading">外部結合（LEFT / RIGHT JOIN）</h3>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
LEFT / RIGHT OUTER JOIN テーブル2 AS t2
ON 条件;</code></pre>



<h3 class="wp-block-heading">完全外部結合（FULL OUTER JOIN）</h3>



<p>MySQLでは FULL OUTER JOIN は未対応</p>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
FULL OUTER JOIN テーブル2 AS t2
ON 条件;</code></pre>



<p>MySQLでの代替方法（UNION）</p>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
LEFT JOIN テーブル2 AS t2
ON 条件
UNION
SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
RIGHT JOIN テーブル2 AS t2
ON 条件;</code></pre>



<p>※ UNION は重複行を除外する。重複を許可したい場合は UNION ALL を使用する。<br>※ WHERE 句で結合先テーブルの条件を指定すると、外部結合の意味が失われることがあるため注意。</p>



<h2 class="wp-block-heading">インデックス</h2>



<h3 class="wp-block-heading">インデックス作成</h3>



<pre class="wp-block-code"><code>CREATE INDEX インデックス名 ON テーブル名 (フィールド名);</code></pre>



<h3 class="wp-block-heading">インデックス削除</h3>



<pre class="wp-block-code"><code>DROP INDEX インデックス名 ON テーブル名;</code></pre>



<h3 class="wp-block-heading">インデックスの利用状況確認</h3>



<pre class="wp-block-code"><code>EXPLAIN SELECT 文;</code></pre>



<h2 class="wp-block-heading">トランザクション</h2>



<h3 class="wp-block-heading">トランザクション開始</h3>



<pre class="wp-block-code"><code>BEGIN;</code></pre>



<h3 class="wp-block-heading">確定</h3>



<pre class="wp-block-code"><code>COMMIT;</code></pre>



<h3 class="wp-block-heading">取り消し</h3>



<pre class="wp-block-code"><code>ROLLBACK;</code></pre>



<h2 class="wp-block-heading">SQLファイルの実行（データ展開）</h2>



<pre class="wp-block-code"><code>SOURCE ファイルパス;</code></pre>


<ol class="wp-block-footnotes"><li id="8c6ba620-248a-45ad-b9b6-1dabe17cf914">フィールド名 = フィールド名 + 1 など <a href="#8c6ba620-248a-45ad-b9b6-1dabe17cf914-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="d14036d2-dfad-4ab0-afb3-e980869f2a60">t1.フィールド = t2.フィールド など <a href="#d14036d2-dfad-4ab0-afb3-e980869f2a60-link" aria-label="脚注参照2にジャンプ">↩︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/mysql-sql-cheatsheet/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nmapでポートスキャンをしてみる</title>
		<link>https://cybermemo.blog/nmap-port-scan</link>
					<comments>https://cybermemo.blog/nmap-port-scan#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 07:50:12 +0000</pubDate>
				<category><![CDATA[TryHackMe]]></category>
		<category><![CDATA[コマンド]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[Nmap]]></category>
		<category><![CDATA[tshark]]></category>
		<category><![CDATA[Wireshark]]></category>
		<category><![CDATA[ポートスキャン]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=540</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに Nmapで実際にポートスキャンをしてみた。検証環境は TryHackMe の Nmap ルーム。 本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。必ず許可された演習環境でのみ実践してく [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p>Nmapで実際にポートスキャンをしてみた。<br>検証環境は TryHackMe の Nmap ルーム。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">TryHackMe</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://tryhackme-images.s3.amazonaws.com/room-icons/5d653d7a4e8a1a6d98379168cfc30ac0.png" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://tryhackme.com/room/furthernmap" target="_blank" rel="noopener noreferrer">Nmap</a>
						<span class="p-blogCard__excerpt">An in depth look at scanning with Nmap, a powerful network scanning tool.</span>					</div>
				</div>
			</div>
		</div>


<p class="is-style-icon_info"><strong>本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。必ず許可された演習環境でのみ実践してください。</strong></p>



<h2 class="wp-block-heading">TCPスキャン</h2>



<p>使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>TCPスキャン（-sT）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sT --top-ports 100 -vv -Pn target ip</code></pre>



<p>openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-23 23:57 JST
Initiating Parallel DNS resolution of 1 host. at 23:57
Completed Parallel DNS resolution of 1 host. at 23:57, 0.00s elapsed
Initiating Connect Scan at 23:57
Scanning target ip &#91;100 ports]
Discovered open port 3389/tcp on target ip
Discovered open port 135/tcp on target ip
Discovered open port 80/tcp on target ip
Discovered open port 21/tcp on target ip
Discovered open port 53/tcp on target ip
Completed Connect Scan at 23:57, 7.02s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.37s latency).
Scanned at 2025-10-23 23:57:10 JST for 7s
Not shown: 95 filtered tcp ports (no-response)
PORT     STATE SERVICE       REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">21/tcp   open  ftp           syn-ack
53/tcp   open  domain        syn-ack
80/tcp   open  http          syn-ack
135/tcp  open  msrpc         syn-ack
3389/tcp open  ms-wbt-server syn-ack</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 7.03 seconds</code></pre>



<p>tshark でログを取っていたので確認してみる。</p>



<pre class="wp-block-code"><code># tshark の結果を sT_result.txt へ出力
$ sudo tshark -i tun0 > sT_result.txt 
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
237 ^C</code></pre>



<pre class="wp-block-code"><code># cat で全体のログを確認
$ cat sT_result.txt             
    1 0.000000000   host ip → target ip TCP 60 34450 → 111 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    2 0.000013296   host ip → target ip TCP 60 47774 → 113 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    3 0.000018708   host ip → target ip TCP 60 38474 → 135 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    4 0.000025294   host ip → target ip TCP 60 55670 → 5900 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    5 0.000030624   host ip → target ip TCP 60 46124 → 25 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    6 0.000035786   host ip → target ip TCP 60 59490 → 554 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    7 0.000041544   host ip → target ip TCP 60 38960 → 3306 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    8 0.000048233   host ip → target ip TCP 60 57882 → 110 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    9 0.000052118   host ip → target ip TCP 60 42396 → 3389 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
   10 0.000059820   host ip → target ip TCP 60 37896 → 8888 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   12 0.377390839   host ip → target ip TCP 40 38474 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   13 0.378715797   host ip → target ip TCP 40 38474 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   14 0.378932212   host ip → target ip TCP 60 47616 → 23 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775114 TSecr=0 WS=128
   15 0.378957703   host ip → target ip TCP 60 43838 → 995 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775114 TSecr=0 WS=128
   16 1.027607473   host ip → target ip TCP 60 &#91;TCP Retransmission] 37896 → 8888 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775763 TSecr=0 WS=128
（省略）</code></pre>



<p>ログを絞って確認。</p>



<pre class="wp-block-code"><code># SYN 以外のログで絞ってみる
$ cat sT_result.txt | grep -v -F "&#91;SYN]"
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   12 0.377390839   host ip → target ip TCP 40 38474 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   13 0.378715797   host ip → target ip TCP 40 38474 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   28 2.268681269 target ip → host ip   TCP 52 135 → 38490 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   29 2.268724628   host ip → target ip TCP 40 38490 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   30 2.268783378   host ip → target ip TCP 40 38490 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   62 3.272698420   host ip → target ip TCP 40 43260 → 21 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   63 3.273334678 target ip → host ip   TCP 52 53 → 58022 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   64 3.273357934   host ip → target ip TCP 40 58022 → 53 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   65 3.273693028   host ip → target ip TCP 40 43260 → 21 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   66 3.274013386   host ip → target ip TCP 40 58022 → 53 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   77 3.274796974 target ip → host ip   TCP 52 80 → 49068 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   78 3.274865411   host ip → target ip TCP 40 49068 → 80 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   79 3.274951087   host ip → target ip TCP 40 49068 → 80 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   84 3.387604406 target ip → host ip   TCP 52 3389 → 42396 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
   85 3.387628199   host ip → target ip TCP 40 42396 → 3389 &#91;RST] Seq=1 Win=0 Len=0
  150 4.998246831 target ip → host ip   TCP 52 135 → 38502 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  151 4.998329872   host ip → target ip TCP 40 38502 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
  152 4.998587904   host ip → target ip TCP 40 38502 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
  232 6.277318520 target ip → host ip   TCP 52 3389 → 42398 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  233 6.277337412   host ip → target ip TCP 40 42398 → 3389 &#91;RST] Seq=1 Win=0 Len=0
  235 6.857444881 target ip → host ip   TCP 52 135 → 38504 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  236 6.857524021   host ip → target ip TCP 40 38504 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
  237 6.858089282   host ip → target ip TCP 40 38504 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0

# SYN/ACK（open）で絞ってみる
$ cat sT_result.txt | grep -F "&#91;SYN, ACK]"
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   28 2.268681269 target ip → host ip   TCP 52 135 → 38490 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   63 3.273334678 target ip → host ip   TCP 52 53 → 58022 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   77 3.274796974 target ip → host ip   TCP 52 80 → 49068 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   84 3.387604406 target ip → host ip   TCP 52 3389 → 42396 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  150 4.998246831 target ip → host ip   TCP 52 135 → 38502 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  232 6.277318520 target ip → host ip   TCP 52 3389 → 42398 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  235 6.857444881 target ip → host ip   TCP 52 135 → 38504 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM

# openポートの確認
$ cat sT_result.txt | grep -F "&#91;SYN, ACK]" | awk '{print $8}' | sort -n -u
21
53
80
135
3389</code></pre>



<p>SYN/ACK を返しているポートが open と判定されており、nmap のスキャン結果と tshark のログが一致していることが確認できた。</p>



<p>最後に、awk を使って TCP ハンドシェイク（SYN → SYN/ACK → ACK）が実際に成立しているかを確認してみる。</p>



<pre class="wp-block-code"><code>$ awk '    
  # 行中の「&lt;num> → &lt;num>」を1組だけ抜き出す
  match($0, /&#91;&#91;:space:]](&#91;0-9]+)&#91;&#91;:space:]]*→&#91;&#91;:space:]]*(&#91;0-9]+)&#91;&#91;:space:]]/, m) {
    if (m&#91;1]==21 || m&#91;2]==21) print  
  }      
' sT_result.txt
   52 2.896504834   host ip → target ip TCP 60 43260 → 21 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245777632 TSecr=0 WS=128
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   62 3.272698420   host ip → target ip TCP 40 43260 → 21 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   65 3.273693028   host ip → target ip TCP 40 43260 → 21 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0</code></pre>



<p>TCP ハンドシェイクが成立していることが分かる。</p>



<h2 class="wp-block-heading">SYNスキャン（ハーフオープンスキャン）</h2>



<p>使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>SYNスキャン（-sS）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sS --top-ports 100 -vv -Pn target ip</code></pre>



<p>openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 13:06 JST
Initiating Parallel DNS resolution of 1 host. at 13:06
Completed Parallel DNS resolution of 1 host. at 13:06, 0.00s elapsed
Initiating SYN Stealth Scan at 13:06
Scanning target ip &#91;100 ports]
Discovered open port 80/tcp on target ip
Discovered open port 21/tcp on target ip
Discovered open port 3389/tcp on target ip
Discovered open port 135/tcp on target ip
Discovered open port 53/tcp on target ip
Completed SYN Stealth Scan at 13:06, 6.14s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.34s latency).
Scanned at 2025-10-26 13:06:36 JST for 7s
Not shown: 95 filtered tcp ports (no-response)
PORT     STATE SERVICE       REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">21/tcp   open  ftp           syn-ack ttl 124
53/tcp   open  domain        syn-ack ttl 124
80/tcp   open  http          syn-ack ttl 124
135/tcp  open  msrpc         syn-ack ttl 124
3389/tcp open  ms-wbt-server syn-ack ttl 124</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 6.20 seconds
           Raw packets sent: 197 (8.668KB) | Rcvd: 7 (308B)</code></pre>



<p>今度は pcap でログを取ってみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -i tun0 -w /tmp/Ss_result.pcap                                 
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
211 ^C</code></pre>



<pre class="wp-block-code"><code># tshark で全体のログを確認
$ sudo tshark -r Ss_result.pcap                     
Running as user "root" and group "root". This could be dangerous.
    1 0.000000000   host ip → target ip TCP 44 63626 → 993 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    2 0.000010601   host ip → target ip TCP 44 63626 → 445 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    3 0.000011875   host ip → target ip TCP 44 63626 → 110 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    4 0.000012902   host ip → target ip TCP 44 63626 → 23 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    5 0.000013856   host ip → target ip TCP 44 63626 → 111 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    6 0.000014615   host ip → target ip TCP 44 63626 → 80 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    7 0.000015329   host ip → target ip TCP 44 63626 → 3389 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    8 0.000016047   host ip → target ip TCP 44 63626 → 113 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    9 0.000016757   host ip → target ip TCP 44 63626 → 21 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   10 0.000017461   host ip → target ip TCP 44 63626 → 587 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   11 0.338039856 target ip → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   12 0.338076236   host ip → target ip TCP 40 63626 → 80 &#91;RST] Seq=1 Win=0 Len=0
   13 0.338747181 target ip → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0
   15 0.339557912 target ip → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   16 0.339571791   host ip → target ip TCP 40 63626 → 3389 &#91;RST] Seq=1 Win=0 Len=0
(省略)</code></pre>



<p>ログを絞って確認。</p>



<pre class="wp-block-code"><code># SYN 以外のログで絞ってみる
$ sudo tshark -r sS_result.pcap -Y "not (tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==0)"
Running as user "root" and group "root". This could be dangerous.
   11 0.338039856 target ip8 → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   12 0.338076236   host ip → target ip8 TCP 40 63626 → 80 &#91;RST] Seq=1 Win=0 Len=0
   13 0.338747181 target ip8 → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip8 TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0
   15 0.339557912 target ip8 → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   16 0.339571791   host ip → target ip8 TCP 40 63626 → 3389 &#91;RST] Seq=1 Win=0 Len=0
   23 0.677269837 target ip8 → host ip   TCP 44 135 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   24 0.677332313   host ip → target ip8 TCP 40 63626 → 135 &#91;RST] Seq=1 Win=0 Len=0
   55 3.165016037 target ip8 → host ip   TCP 44 53 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   56 3.165076706   host ip → target ip8 TCP 40 63626 → 53 &#91;RST] Seq=1 Win=0 Len=0
   57 3.165703655 target ip8 → host ip   TCP 44 80 → 63631 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   58 3.165753573   host ip → target ip8 TCP 40 63631 → 80 &#91;RST] Seq=1 Win=0 Len=0
  173 4.863356730 target ip8 → host ip   TCP 44 80 → 63633 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
  174 4.863426175   host ip → target ip8 TCP 40 63633 → 80 &#91;RST] Seq=1 Win=0 Len=0

# SYN/ACK（open）で絞ってみる
$ sudo tshark -r sS_result.pcap -Y "tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==1"
Running as user "root" and group "root". This could be dangerous.
   11 0.338039856 target ip8 → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   13 0.338747181 target ip8 → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   15 0.339557912 target ip8 → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   23 0.677269837 target ip8 → host ip   TCP 44 135 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   55 3.165016037 target ip8 → host ip   TCP 44 53 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   57 3.165703655 target ip8 → host ip   TCP 44 80 → 63631 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
  173 4.863356730 target ip8 → host ip   TCP 44 80 → 63633 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288

# openポートの確認
$ sudo tshark -r sS_result.pcap -Y "tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==1" -T fields -e tcp.srcport | sort -n -u
Running as user "root" and group "root". This could be dangerous.
21
53
80
135
3389</code></pre>



<p>SYN/ACK を返しているポートが open になっているので、nmap の結果と tshark のログは一致している。</p>



<p>ハーフオープンスキャン（SYN→SYN/ACK→RST）を本当にしているか確認してみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -r sS_result.pcap -Y "tcp.port == 21"                            
Running as user "root" and group "root". This could be dangerous.
    9 0.000016757   host ip → target ip TCP 44 63626 → 21 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   13 0.338747181 target ip → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0</code></pre>



<p>SYN/ACK に対して RST で切断しているため、ハーフオープンスキャンの挙動。</p>



<h2 class="wp-block-heading">UDPスキャン</h2>



<p>使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>UDPスキャン（-sU）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sU --top-ports 100 -vv -Pn target ip</code></pre>



<p>openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:03 JST
Initiating Parallel DNS resolution of 1 host. at 14:03
Completed Parallel DNS resolution of 1 host. at 14:03, 0.00s elapsed
Initiating UDP Scan at 14:03
Scanning target ip &#91;100 ports]
Discovered open port 53/udp on target ip
Completed UDP Scan at 14:03, 12.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.36s latency).
Scanned at 2025-10-26 14:03:17 JST for 11s
Not shown: 99 open|filtered udp ports (no-response)
PORT   STATE SERVICE REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">53/udp open  domain  udp-response ttl 124</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 12.15 seconds
           Raw packets sent: 261 (16.044KB) | Rcvd: 4 (262B)</code></pre>



<p>pcap でログを取ってみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -i tun0 -w /tmp/sU_result.pcap                                            
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
273 ^C</code></pre>



<p>今回は Wireshar でログを確認してみる。</p>



<pre class="wp-block-code"><code>$ sudo wireshark sU_result.pcap  </code></pre>



<p>ip.src == target ip で応答のあったものだけ絞る。</p>



<pre class="wp-block-code"><code>ip.src == target ip &amp;&amp; not icmp</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="85" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1024x85.png" alt="Wireshark UDPスキャンの画像" class="wp-image-548" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1024x85.png 1024w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-300x25.png 300w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-768x64.png 768w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1536x128.png 1536w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark.png 1564w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>DNS のみ表示されたので、nmap の結果と一致。<br></p>



<h2 class="wp-block-heading">特殊スキャン（NULL／FIN／Xmas）</h2>



<p>検証環境でopenポートが見つからなかったので、今回はフラグだけ確認。</p>



<h3 class="wp-block-heading">NULLスキャン</h3>



<pre class="wp-block-code"><code># NULLスキャン
$ sudo nmap -sN --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:57 JST
Initiating Parallel DNS resolution of 1 host. at 14:57
Completed Parallel DNS resolution of 1 host. at 14:57, 0.00s elapsed
Initiating NULL Scan at 14:57
Scanning target ip &#91;100 ports]
Completed NULL Scan at 14:57, 21.11s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:57:12 JST for 22s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.15 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p>フラグはすべて0。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="502" height="204" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL.png" alt="Wireshark NULLスキャンのフラグ画像" class="wp-image-550" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL.png 502w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL-300x122.png 300w" sizes="(max-width: 502px) 100vw, 502px" /></figure>



<h3 class="wp-block-heading">FINスキャン</h3>



<pre class="wp-block-code"><code># FINスキャン
$ sudo nmap -sF --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:52 JST
Initiating Parallel DNS resolution of 1 host. at 14:52
Completed Parallel DNS resolution of 1 host. at 14:52, 0.00s elapsed
Initiating FIN Scan at 14:52
Scanning target ip &#91;100 ports]
Completed FIN Scan at 14:52, 21.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:52:08 JST for 21s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.18 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p>FIN = 1。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="510" height="193" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN.png" alt="Wireshark FINスキャンのフラグ画像" class="wp-image-551" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN.png 510w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN-300x114.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></figure>



<h3 class="wp-block-heading">Xmasスキャン</h3>



<pre class="wp-block-code"><code># Xmasスキャン
$ sudo nmap -sX --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:52 JST
Initiating Parallel DNS resolution of 1 host. at 14:52
Completed Parallel DNS resolution of 1 host. at 14:52, 0.01s elapsed
Initiating XMAS Scan at 14:52
Scanning target ip &#91;100 ports]
Completed XMAS Scan at 14:53, 21.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:52:53 JST for 21s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.16 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p>FIN = 1、PSH = 1、URG = 1。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="558" height="206" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas.png" alt="Wireshark Xmasスキャンのフラグ画像" class="wp-image-552" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas.png 558w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas-300x111.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></figure>



<h2 class="wp-block-heading">おまけ</h2>



<p>UDPスキャンでホストIPとターゲットIP以外に 239.255.255.250（SSDP<sup data-fn="674d942b-b510-49bd-81d1-861c1e2af7cc" class="fn"><a href="#674d942b-b510-49bd-81d1-861c1e2af7cc" id="674d942b-b510-49bd-81d1-861c1e2af7cc-link">1</a></sup>用マルチキャストアドレス）への通信を発見。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="870" height="69" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP.png" alt="Wireshark 239.255.255.250充ての画像" class="wp-image-554" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP.png 870w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP-300x24.png 300w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP-768x61.png 768w" sizes="(max-width: 870px) 100vw, 870px" /></figure>



<p>nmapはスキャン中に「このネットワーク内にUPnP<sup data-fn="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1" class="fn"><a href="#01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1" id="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1-link">2</a></sup>デバイスがいるか？」を自動的にチェックすることがあり、その時にこの宛先へ M-SEARCH * HTTP/1.1 パケットを送信するそう。</p>


<ol class="wp-block-footnotes"><li id="674d942b-b510-49bd-81d1-861c1e2af7cc">家庭内ネットワークなどで機器同士が自動的に見つけ合うための通信プロトコル。UPnPの一部として定義されており、主にUDPの1900番ポートを使う。 <a href="#674d942b-b510-49bd-81d1-861c1e2af7cc-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1">Universal Plug and Play。家庭やオフィス内のネットワーク機器が自動的に見つけ合い、設定なしで通信できるようにする仕組み。 <a href="#01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1-link" aria-label="脚注参照2にジャンプ">↩︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/nmap-port-scan/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nmapの基礎</title>
		<link>https://cybermemo.blog/nmap-basics</link>
					<comments>https://cybermemo.blog/nmap-basics#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 07:05:12 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[Nmap]]></category>
		<category><![CDATA[ポートスキャン]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=526</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>Nmapとは Nmap（Network Mapper）は、ネットワーク上の機器やサービスを調べるための最もポピュラーなツール。IPアドレスの“生死確認（ホストが生きているか）”から、どのポートでどんなサービスが動いている [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">Nmapとは</h2>



<p>Nmap（Network Mapper）は、ネットワーク上の機器やサービスを調べるための最もポピュラーなツール。IPアドレスの“生死確認（ホストが生きているか）”から、どのポートでどんなサービスが動いているか、さらに一部の脆弱性の有無まで発見できる。</p>



<h2 class="wp-block-heading">スキャンの種類</h2>



<p>実際にスキャンを実行した記事はこちら。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">セキュリティエンジニアの雑多ブロ&#8230;</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://cybermemo.blog/nmap-port-scan" target="_blank" rel="noopener noreferrer">Nmapでポートスキャンをしてみる | セキュリティエンジニアの雑多ブログ</a>
						<span class="p-blogCard__excerpt">はじめに Nmapで実際にポートスキャンをしてみた。検証環境は TryHackMe の Nmap ルーム。 本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。&#8230;</span>					</div>
				</div>
			</div>
		</div>


<h3 class="wp-block-heading">TCPスキャン</h3>



<p>何をするか：TCP接続（SYN→SYN/ACK→ACK）を完了させる。<br>返ってくるもの：SYN/ACK（open）／RST（closed）／無応答（filtered）。<br>長所：確実で簡単（OS 標準の接続なので結果は信頼できる）。<br>短所：ログに残りやすく検出されやすい。<br>オプション：-sT</p>



<h3 class="wp-block-heading">SYNスキャン</h3>



<p>何をするか：SYNを送り、SYN/ACKを受けたら自分はRSTで接続を切る（3ウェイを完了させない）。<br>返ってくるもの：SYN/ACK（open）、RST（closed）、無応答（filtered）。<br>長所：早くてステルス寄り（ログに残りにくい）。多くの場合デフォルトで使われる。<br>短所：root権限が必要。IDSに検出される可能性はある。<br>オプション：-sS</p>



<h3 class="wp-block-heading">UDPスキャン</h3>



<p>何をするか：UDPパケットを送って応答（ICMP unreachable や UDP 応答）を待つ。<br>返ってくるもの：UDP応答（open|filtered判定）、ICMP Port Unreachable（closed）、無応答（open|filtered）。<br>長所：TCP以外のサービス（DNS, SNMP 等）を見つけられる。<br>短所：遅い（再送や ICMP 制限のため）、ファイアウォールやICMPレート制限で誤判定しやすい。<br>オプション：-sU</p>



<h3 class="wp-block-heading">NULLスキャン</h3>



<p>何をするか：TCPフラグをすべて 0 にしたパケットを送る（SYN/ACK/FIN/… いずれも 0）。<br>返ってくるもの（一般）：<br>Linux/UNIX系：何も返さない（open）かRSTで返す（closed）など実装差がある。<br>Windows系：通常すべてのポートで RST を返す（これだと区別つかない）。<br>長所：一部のOSでステルスに振る舞う。<br>短所：実装依存で結果が解釈しづらい。ファイアウォールで無効化されることが多い。<br>オプション：-sN</p>



<h3 class="wp-block-heading">FINスキャン</h3>



<p>何をするか：TCPの FIN フラグのみを立てたパケットを送る。<br>返ってくるもの：TCP 実装により、閉じているポートは RST を返し、開いているポートは無応答（特定OSでは）→ これで判別する。<br>長所：一部の環境で検出されにくい。<br>短所：Windows系は常に RST を返すため無意味。ファイアウォールでドロップされると判別不能。<br>オプション：-sF</p>



<h3 class="wp-block-heading">Xmasスキャン</h3>



<p>何をするか：TCPの FIN, PSH, URG フラグを同時に立てた「派手な」パケットを送る（ツリーが光るから Xmas）。<br>返ってくるもの：FIN と同様、ある実装では無応答＝open、RST＝closed。<br>長所：NULL/FIN と同じく、一部OSでステルスに有効。<br>短所：同じく実装依存で不確実。Windowsでは通用しないことが多い。<br>オプション：-sX</p>



<h3 class="wp-block-heading">ICMPスキャン</h3>



<p>何をするか：ICMP Echo Request（ping）や他のICMP型を使ってホストがオンラインかを調べる。<br>返ってくるもの：Echo Reply（Up）／無応答（Down or filtered）／ICMP unreachable（到達不可）など。<br>長所：ホストの存在確認が速く簡単。<br>短所：多くのホストやファイアウォールがICMPをブロックするため誤判定が起きやすい。ARP ping はローカルで有効。<br>オプション：-sn -PE（ICMP echo）、&#8211;disable-arp-ping 等で挙動調整</p>



<h2 class="wp-block-heading">TCPフラグ</h2>



<p>フラグ、ビット、フラグの意味を記載。<br>ビット(値)は tshark のフィルターとかで結構使う。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ビット(値)</th><th>フラグ</th><th>意味</th></tr></thead><tbody><tr><td>0 (0x01)</td><td>FIN</td><td>コネクション終了</td></tr><tr><td>1 (0x02)</td><td>SYN</td><td>コネクション開始要求</td></tr><tr><td>2 (0x04)</td><td>RST</td><td>リセット（接続拒否/異常終了）</td></tr><tr><td>3 (0x08)</td><td>PSH</td><td>受信側にデータを即座に渡す（push）</td></tr><tr><td>4 (0x10)</td><td>ACK</td><td>応答番号を有効にする（確認応答）</td></tr><tr><td>5 (0x20)</td><td>URG</td><td>緊急ポインタ有効（ほぼ使われない）</td></tr><tr><td>6 (0x40)</td><td>ECE</td><td>ECN related（輻輳制御）</td></tr><tr><td>7 (0x80)</td><td>CWR</td><td>ECN related（輻輳制御）</td></tr></tbody></table></figure>



<p>視覚的ビット列図（よく見る組み合わせ）</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>フラグ</th><th>ビット</th><th class="has-text-align-left" data-align="left">値</th></tr></thead><tbody><tr><td>FIN</td><td>0000 0001</td><td class="has-text-align-left" data-align="left">0x01</td></tr><tr><td>SYN</td><td>0000 0010</td><td class="has-text-align-left" data-align="left">0x02</td></tr><tr><td>RST</td><td>0000 0100</td><td class="has-text-align-left" data-align="left">0x04</td></tr><tr><td>PSH</td><td>0000 1000</td><td class="has-text-align-left" data-align="left">0x08</td></tr><tr><td>ACK</td><td>0001 0000</td><td class="has-text-align-left" data-align="left">0x10</td></tr><tr><td>URG</td><td>0010 0000</td><td class="has-text-align-left" data-align="left">0x20</td></tr><tr><td>ECE</td><td>0100 0000</td><td class="has-text-align-left" data-align="left">0x40</td></tr><tr><td>CWR</td><td>1000 0000</td><td class="has-text-align-left" data-align="left">0x80</td></tr><tr><td>SYN+ACK</td><td>0001 0010</td><td class="has-text-align-left" data-align="left">0x12</td></tr><tr><td>FIN+ACK</td><td>0001 0001</td><td class="has-text-align-left" data-align="left">0x11</td></tr><tr><td>SYN only</td><td>0000 0010</td><td class="has-text-align-left" data-align="left">0x02</td></tr><tr><td>RST only </td><td>0000 0100</td><td class="has-text-align-left" data-align="left">0x04</td></tr><tr><td>Xmas scan (FIN+PSH+URG)</td><td>0000 1001 + 0000 0001 <br>+ 0010 0000 = 0010 1001</td><td class="has-text-align-left" data-align="left">0x29</td></tr><tr><td>NULL scan</td><td>0000 0000</td><td class="has-text-align-left" data-align="left">0x00</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">代表的なオプション</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>オプション</th><th>何をするか（短く）</th><th>使い方の例</th><th>備考</th></tr></thead><tbody><tr><td><code>-sS</code></td><td>SYNスキャン</td><td><code>sudo nmap -sS -p1-1000 10.0.0.5</code></td><td>速くて一般的。root権限推奨。</td></tr><tr><td><code>-sT</code></td><td>TCPスキャン</td><td><code>nmap -sT -p22,80 10.0.0.5</code></td><td>root不要だがログに残りやすい。</td></tr><tr><td><code>-sU</code></td><td>UDPスキャン</td><td><code>sudo nmap -sU --top-ports 20 10.0.0.5</code></td><td>非常に遅い。<code>--top-ports</code> 推奨。</td></tr><tr><td><code>-p</code></td><td>ポート指定（単一／範囲／複数）</td><td><code>-p80,443</code> <code>-p1-65535</code></td><td>明示的にポートを限定。</td></tr><tr><td><code>-Pn</code></td><td>ホスト発見をスキップ（ping無視）</td><td><code>sudo nmap -sS -p1-1000 -Pn 10.0.0.5</code></td><td>Pingがブロックされた環境で必須。</td></tr><tr><td><code>-sn</code></td><td>ホスト発見のみ（ポートスキャンしない）</td><td><code>sudo nmap -sn 10.0.0.0/24</code></td><td>ping sweep 用。</td></tr><tr><td><code>-sV</code></td><td>サービス／バージョン検出</td><td><code>sudo nmap -sS -sV -p80,22 10.0.0.5</code></td><td>サービス名・バージョン推定。</td></tr><tr><td><code>-O</code></td><td>OS 推定</td><td><code>sudo nmap -O 10.0.0.5</code></td><td>root権限が必要な場合あり。誤判定もある。</td></tr><tr><td><code>-A</code></td><td>総合検出（sV + O + script 等）</td><td><code>sudo nmap -A 10.0.0.5</code></td><td>強力だが騒がしい（検出されやすい）。</td></tr><tr><td><code>--script</code></td><td>NSE スクリプト実行</td><td><code>sudo nmap --script=vuln -p445 10.0.0.5</code></td><td>カテゴリ指定や複数指定が可能。</td></tr><tr><td><code>--script-args</code></td><td>スクリプトへ引数を渡す</td><td><code>--script http-put --script-args http-put.url='/dav',http-put.file=./f</code></td><td>スクリプト固有の引数。</td></tr><tr><td><code>-oN</code> / <code>-oG</code> / <code>-oX</code> / <code>-oA</code></td><td>出力保存（通常/Grep/XML/全形式）</td><td><code>-oA scan1</code></td><td><code>-oA</code> で N,G,X を一括出力。</td></tr><tr><td><code>-v</code> / <code>-vv</code></td><td>冗長（詳細）出力</td><td><code>sudo nmap -sS -p1-1000 -Pn -vv 10.0.0.5</code></td><td>進捗や reason が見やすくなる。</td></tr><tr><td><code>--reason</code></td><td>各判定の理由を表示</td><td><code>sudo nmap --reason -p80 10.0.0.5</code></td><td><code>no-response</code> / <code>syn-ack</code> 等を表示。</td></tr><tr><td><code>-T0</code> &#8230; <code>-T5</code></td><td>タイミングテンプレート（速度）</td><td><code>-T4</code>（速め）</td><td>高速ほどノイズ大・検出されやすい。</td></tr><tr><td><code>--stats-every</code></td><td>定期的な進捗表示</td><td><code>--stats-every 10s</code></td><td>長時間スキャン時に便利。</td></tr><tr><td><code>-F</code></td><td>fast（/etc/services に基づく上位ポート）</td><td><code>sudo nmap -F 10.0.0.5</code></td><td>手早くスキャンしたいとき。</td></tr><tr><td><code>--top-ports</code></td><td>使用頻度上位 N ポートのみ</td><td><code>sudo nmap --top-ports 100 10.0.0.5</code></td><td>UDPスキャン時に特に有用。</td></tr><tr><td><code>--open</code></td><td>open のポートだけ表示</td><td><code>sudo nmap -sS -p1-1000 --open 10.0.0.5</code></td><td>出力ノイズを減らす。</td></tr><tr><td><code>-sN</code> / <code>-sF</code> / <code>-sX</code></td><td>NULL / FIN / Xmas スキャン</td><td><code>sudo nmap -sN -p1-1000 10.0.0.5</code></td><td>OS依存（Windowsでは効果薄）。</td></tr><tr><td><code>-6</code></td><td>IPv6 スキャン</td><td><code>sudo nmap -6 -sS -p80 fd00::1</code></td><td>IPv6 ネットワーク用。</td></tr><tr><td><code>-oG -</code></td><td>grep しやすい stdout 出力</td><td><code>sudo nmap -oG - -p1-1000 10.0.0.5</code></td><td>パイプで <code>grep</code> に加工しやすい。</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">最後に</h2>



<p>色々まとめたけど <a href="https://nmap.org/man/ja/index.html" data-type="link" data-id="https://nmap.org/man/ja/index.html">リファレンスガイド</a> を見るのが正確で早い。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/nmap-basics/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>初心者向けawkコマンドの使い方</title>
		<link>https://cybermemo.blog/awk-beginner-guide</link>
					<comments>https://cybermemo.blog/awk-beginner-guide#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 12 Oct 2025 15:07:28 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[SOC]]></category>
		<category><![CDATA[ログ分析]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=465</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>awkコマンドとは awk（オーク）はテキストを1行ずつ読みながら、1行をくつかの列（フィールド）に分けて読む・抜き出す・加工するためのコマンド。たとえば、ログの「3列目だけ取りたい」時にawkが便利。 awkの基本構文 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">awkコマンドとは</h2>



<p>awk（オーク）はテキストを1行ずつ読みながら、1行をくつかの列（フィールド）に分けて読む・抜き出す・加工するためのコマンド。<br>たとえば、ログの「3列目だけ取りたい」時にawkが便利。</p>



<h2 class="wp-block-heading">awkの基本構文</h2>



<p>awk の基本構文は以下。</p>



<pre class="wp-block-code"><code>awk 'パターン { アクション }' ファイル名</code></pre>



<p>パターン＝どんな行を選ぶか<br>アクション＝その行で何をするか<br><br>ざっくり言うと 「ファイルの中で、〇〇な行があったら、△△をする」。</p>



<h2 class="wp-block-heading">awkの基本をサンプルから覚える</h2>



<h3 class="wp-block-heading">サンプル</h3>



<p>サンプルとして使用するファイルの内容。<br>各行は「名前・年齢・都市・職業」の4つのフィールドで構成されている。</p>



<pre class="wp-block-code"><code># sample.txt
Alice   25  Tokyo     Engineer
Bob     30  Osaka     Manager
Charlie 28  Nagoya    Designer
David   35  Fukuoka   Engineer
Eve     22  Tokyo     Intern</code></pre>



<h3 class="wp-block-heading">サンプルファイルの分解</h3>



<p>タブやスペースごとに awk が自動で以下表のように読み込んでくれる。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>フィールド番号</th><th>内容（意味）</th><th>awkで書くと</th></tr></thead><tbody><tr><td><code>$1</code></td><td>名前（Name）</td><td>Alice</td></tr><tr><td><code>$2</code></td><td>年齢（Age）</td><td>25</td></tr><tr><td><code>$3</code></td><td>都市（City）</td><td>Tokyo</td></tr><tr><td><code>$4</code></td><td>職業（Job）</td><td>Engineer</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">実際に動かしてみる</h3>



<h4 class="wp-block-heading">行全体を表示</h4>



<p>print で出力し、$0 でその行全体（すべてのフィールド）を指定。</p>



<pre class="wp-block-code"><code>$ awk '{print $0}' sample.txt</code></pre>



<p>ファイル全体を見たいなら cat でいい気がするので、実務では使わないかも。</p>



<pre class="wp-block-code"><code># sample.txt
Alice   25  Tokyo     Engineer
Bob     30  Osaka     Manager
Charlie 28  Nagoya    Designer
David   35  Fukuoka   Engineer
Eve     22  Tokyo     Intern</code></pre>



<h4 class="wp-block-heading">1列目（名前）だけ表示</h4>



<p>$1 で名前フィールドを出力。</p>



<pre class="wp-block-code"><code>$ awk '{print $1}' sample.txt</code></pre>



<p>これだけだとコメント（#）まで出力されてしまうので、実務ではもう少し条件を絞った方がよさそう。</p>



<pre class="wp-block-code"><code>#
Alice
Bob
Charlie
David
Eve</code></pre>



<h4 class="wp-block-heading">コメント（#）を除外</h4>



<p>! = ～でない、/文字列/ = 正規表現の始まりと終わりを示す囲み記号、^ = 先頭行 の意味。 <br>先頭行がコメント（#）でない名前フィールドを出力。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {print $1}' sample.txt</code></pre>



<p>コメント（#）が除外され、名前のフィールドだけが出力される。</p>



<pre class="wp-block-code"><code>Alice
Bob
Charlie
David
Eve</code></pre>



<h4 class="wp-block-heading">名前と都市を表示</h4>



<p>$1 で名前フィールド、$3 で都市フィールドを指定。</p>



<pre class="wp-block-code"><code>$ awk '{print $1, $3}' sample.txt</code></pre>



<p>それぞれのフィールドが正しく抽出されている。</p>



<pre class="wp-block-code"><code># 
Alice Tokyo
Bob Osaka
Charlie Nagoya
David Fukuoka
Eve Tokyo</code></pre>



<h4 class="wp-block-heading">Tokyo に住んでいる人だけ表示</h4>



<p>$3 を == で Tokyo 指定。</p>



<pre class="wp-block-code"><code>$ awk '$3 == "Tokyo" {print $0}' sample.txt</code></pre>



<p>Tokyo に住んでいる人だけが抽出される。</p>



<pre class="wp-block-code"><code>Alice   25  Tokyo     Engineer
Eve     22  Tokyo     Intern</code></pre>



<h4 class="wp-block-heading">年齢が30歳以上の人だけ表示</h4>



<p>$2 >= 30 で指定。ついでにコメントも &amp;&amp; でつなげて除外しておく。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ &amp;&amp; $2 >= 30 {print $1, $2}' sample.txt</code></pre>



<p>30歳以上の人だけが抽出される。</p>



<pre class="wp-block-code"><code>Bob 30
David 35</code></pre>



<h4 class="wp-block-heading">Engineerの人数を数える</h4>



<p>$4 == &#8220;Engineer&#8221; で エンジニアを指定、{count++} で条件が真なら count を 1 増やす、END {print count} でファイルを全部読み終わったあとに出力。</p>



<pre class="wp-block-code"><code>$ awk '$4 == "Engineer" {count++} END {print count}' sample.txt</code></pre>



<p>きちんとカウントされている。</p>



<pre class="wp-block-code"><code>2</code></pre>



<h4 class="wp-block-heading">平均年齢を計算</h4>



<p>{sum += $2; count++} で 2 列目（年齢）の値を合計し、行数を 1 増やす。<br>END {print sum/count} でファイルをすべて読み終えたあとに平均を出力する。<br>※今回はカウント処理を行うため、コメント（#）のスキップが必須。<br><br>; は改行と同じ意味。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {sum += $2; count++} END {print sum/count}' sample.txt</code></pre>



<p>平均年齢が出力される。</p>



<pre class="wp-block-code"><code>28</code></pre>



<p>このコマンドの動きは以下の通り。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>行</th><th>$2（年齢）</th><th>条件 <code>!/^#/</code></th><th>sumの値</th><th>countの値</th></tr></thead><tbody><tr><td># sample.txt</td><td>&#8211;</td><td>False</td><td>0</td><td>0</td></tr><tr><td>Alice 25 Tokyo Engineer</td><td>25</td><td>True</td><td>25</td><td>1</td></tr><tr><td>Bob 30 Osaka Manager</td><td>30</td><td>True</td><td>55</td><td>2</td></tr><tr><td>Charlie 28 Nagoya Designer</td><td>28</td><td>True</td><td>83</td><td>3</td></tr><tr><td>David 35 Fukuoka Engineer</td><td>35</td><td>True</td><td>118</td><td>4</td></tr><tr><td>Eve 22 Tokyo Intern</td><td>22</td><td>True</td><td>140</td><td>5</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">都市ごとの人数を集計</h4>



<p>{city[$3]++} で 3 列目（都市名）をキーとしてカウントする。<br>END { … } はファイルをすべて読み終えたあとに 1 回だけ実行される処理。<br>for (c in city) ですべての都市（キー）を順に処理し、<br>print c, city[c] で都市名と人数を出力する。<br>※今回はカウントをしているのでコメントのスキップは必須。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {city&#91;$3]++} END {for (c in city) print c, city&#91;c]}' sample.txt </code></pre>



<p>都市ごとの人数が出力される。</p>



<pre class="wp-block-code"><code>Osaka 1
Fukuoka 1
Nagoya 1
Tokyo 2</code></pre>



<p>このコマンドの動きは以下の通り。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>行</th><th>$3（都市）</th><th>条件 !/^#/</th><th>city[$3] の動作</th><th>city配列の内容（内部状態）</th></tr></thead><tbody><tr><td># sample.txt</td><td>―</td><td>False</td><td>実行されない</td><td>（何もない）</td></tr><tr><td>Alice 25 Tokyo Engineer</td><td>Tokyo</td><td>True</td><td><code>city["Tokyo"]++</code> → 1</td><td>Tokyo:1</td></tr><tr><td>Bob 30 Osaka Manager</td><td>Osaka</td><td>True</td><td><code>city["Osaka"]++</code> → 1</td><td>Tokyo:1, Osaka:1</td></tr><tr><td>Charlie 28 Nagoya Designer</td><td>Nagoya</td><td>True</td><td><code>city["Nagoya"]++</code> → 1</td><td>Tokyo:1, Osaka:1, Nagoya:1</td></tr><tr><td>David 35 Fukuoka Engineer</td><td>Fukuoka</td><td>True</td><td><code>city["Fukuoka"]++</code> → 1</td><td>Tokyo:1, Osaka:1, Nagoya:1, Fukuoka:1</td></tr><tr><td>Eve 22 Tokyo Intern</td><td>Tokyo</td><td>True</td><td><code>city["Tokyo"]++</code> → 2</td><td>Tokyo:2, Osaka:1, Nagoya:1, Fukuoka:1</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">疑問に思ったこと</h2>



<h3 class="wp-block-heading">文章ベースのファイルにはawkコマンドは使えないのか</h3>



<p>たとえば、</p>



<pre class="wp-block-code"><code>Aliceは東京で働いています。
Bobは大阪に住んでいます。
Charlieは28歳です。</code></pre>



<p>という文章ファイルがあった場合、awk の使いどころがあるのか気になった。</p>



<p>awk の動きとしては「スペースやタブで明確に区切られていない」文章だと、</p>



<pre class="wp-block-code"><code>$1 Aliceは東京で働いています。
$1 Bobは大阪に住んでいます。
$1 Charlieは28歳です。</code></pre>



<p>となり、すべて $1 になるのでフィールド分けができず、awk の長所は活かせない。</p>



<p>一応、grep のように抽出することは可能。</p>



<pre class="wp-block-code"><code>$ awk '/東京/ {print $0}' sample_text.txt
Aliceは東京で働いています。

$ awk '/&#91;0-9]+歳/ {print $0}' sample_text.txt
Charlieは28歳です。</code></pre>



<p>行番号を付けることもできる。</p>



<pre class="wp-block-code"><code>$ awk '{print NR, $0}' sample_text.txt
1 Aliceは東京で働いています。
2 Bobは大阪に住んでいます。
3 Charlieは28歳です。</code></pre>



<p>結論としては、awk でも文章ファイルの操作はある程度できるけど、本来の用途とは離れており、わざわざ awk で文章ファイルを操作する必要はなさそう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/awk-beginner-guide/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
