2
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?

CiscoオンラインコースであるEthical Hacker(倫理的ハッカー)で学んだ内容をまとめてみた(第3回)

Last updated at Posted at 2025-11-17

導入

本記事は以下の続編です。

この記事で得られること

  1. 能動的な偵察としてNmap、各種列挙、Scapyの概要把握
  2. Nmap / Scapy / Wireshark を用いた具体的なスキャン手法を、ログベースで把握

⚠️ 注意(必読)

本記事で学ぶ技術は、悪用すると法的問題や社会的被害を生む可能性があります。
学習・実験は必ず許可された環境(サンドボックス化された学習 VM など)で行ってください。無許可のハッキングは違法です。


🧭 第3章の概要

本章では、攻撃前段階にあたる「情報収集」と「脆弱性スキャン」について扱います。
攻撃者視点では「偵察」、防御者視点では「攻撃対象の特定・可視化」にあたる重要なフェーズです。

3章詳細:

  • 受動的な情報収集(Passive Reconnaissance)(3.1章)
  • 能動的な情報収集(Active Reconnaissance)(3.2章)👈本記事
  • 脆弱性スキャンの実行(3.3章)
  • スキャン結果の解析(3.4章)

3.2 能動的偵察(Active Reconnaissance)

● ポートスキャンの基礎

偵察フェーズの衝動ではホスト列挙(Host Enumeration)が実施され、これに続けてポートスキャンを行います。本節ではその基本動作を整理します。
特定ホストに対し、TCP/UDPプローブを送信し、以下の応答によりポート状態を判定します。

応答 判定内容
SYN/ACK ポートは LISTEN 状態
RST ポートは閉塞(Closed)
応答なし FW/ACL によるフィルタリングの可能性が高い

● Nmap の代表的スキャン手法

Nmapとは主にUNIX系OSで用いられるネットワーク調査ツールの一つです。

■ TCP Connect Scan(-sT

  • デフォルトのスキャン方式
  • 3-way ハンドシェイクを完了するため IDS/IPS に検知されやすい
応答 判定内容
SYN/ACK ポートは LISTEN 状態
RST ポートは閉塞(Closed)
応答なし FW/ACL によるフィルタリングの可能性が高い

■ UDP Scan(-sU

  • DNS / SNMP / DHCP など UDP サービス列挙に使用
  • ICMP Unreachableに依存するため レート制限で遅延しやすい
応答 判定内容
ICMP Port Unreachable ポート閉塞(closed)
応答なし ポート開放またはフィルター(open/filterd)
UDPの応答 ポート開放(open)

■ TCP FIN Scan(-sF

  • ステルス性の高いスキャン
  • FIN パケット送信後の応答差異を利用しポート状態を推定
    ※BSD系OSで有効ですが、WindowsはすべてRSTのため利用は限定的
応答 判定内容
ICMP到達不能エラー FW/ACL によるフィルタリングまたはタイムアウト
RSTを受信 ポートは閉塞(Closed)
応答なし ポートは開放(Open)されている可能性がある

■ Host Discovery(-sn

  • ICMP Echo / Timestamp 等を用いた生存ホスト調査

■ Timing Templates(-T0-T5

  • 6つのタイミングテンプレートを使い分けたスキャンが可能
テンプレート 特徴
T0 Paranoid 最低速。IDS 回避を目的とした超低速設定
T1 Sneaky Paranoid より高速だが依然として低速
T2 Polite 帯域節約。デフォルトの約10倍遅い
T3 Normal デフォルト設定
T4 Aggressive 低遅延環境向けの高速スキャン
T5 Insane 極めて高速。誤判定・検知リスクが高い

列挙(Enumeration)

偵察で収集した情報をもとに、システムから実データを体系的に抜き出す工程(詳細な情報収集)


● ホスト列挙

  • ホスト(主にIPアドレス)を収集する行為
  • 外部ネットワークでは IP レンジ指定、内部ではサブネット全体を対象として収集
  • Nmap / Masscan など高速スキャナが利用される

コマンドと抜粋結果例

$namp -sn 192.168.0.0/16
Starting Nmap 7.80 ( https://nmap.org ) at 20XX-XX-XX 14:32 EDT
~略~
Nmap scan report for 192.168.0.1
Host is up (0.00094s latency).
~略~

● SMB/Windows ユーザー列挙

SMB(Server Message Block)はWindowsで利用されるファイルやプリンターを共有される通信プロトコルのことです。

■ SMB_COM_NEGOTIATE

クライアントからサーバーに対して送信されるネゴシエーション
サーバー応答から以下が判別可能:

  • メッセージ署名(SMB Signing)の有無
  • 認証方式(ユーザー/共有レベル)
  • 平文パスワード利用可否
  • サーバー時刻・タイムゾーン

→ ミスコンフィグにより "内部メタデータなど" が露呈するケースあり

■ SMB_COM_SESSION_SETUP_ANDX

ネゴシエーション後の認証プロセス

  • 認証フェーズでユーザー名・パスワード・ドメイン情報を送信
    • 暗号化されていない場合には簡単に盗聴される
  • 暗号されていても、Lanman/NTLM などのツールによるオフライン総当たり攻撃が可能なこともある

SMB/Windowsのユーザー列挙に関するコマンドと抜粋結果例

$namp --script smb-enum-users.nse 192.168.XXX.YYY
Starting Nmap 7.80 ( https://nmap.org ) at 20XX-XX-XX 14:32 EDT
~略~
Host script results:
| smb-enum-users:
|    VULNHOST-1\user (RID: 1200) 
|      Full name:
|      Description:
~略~

● グループ列挙(SID/RID ベース)

RIDは相対識別子を表し、SIDという絶対識別子(キュリティ識別子)の一部を表す。
RID から以下のデフォルトロールが推定可能:

  • Administrator/Guest/Domain Users など

コマンドと抜粋結果例

$nmap --script smb-enum-groups.nse --script-args smbusername=user,smbpass=user 192.168.XXX.YYY
Starting Nmap 7.80 ( https://nmap.org ) at 20XX-XX-XX 14:32 EDT
~略~
| smb-enum-groups:
|   Builtin\Administrators (RID: 500): Administrator
~略~

● ネットワーク共有列挙

SMBを利用しファイル、フォルダ、プリンタの共有しているシステムを洗い出し、横展開攻撃の起点を発見することが目的です。

コマンドと抜粋結果例

$nmap --script smb-enum-shares.nse -p 445 192.168.XXX.YYY
Starting Nmap 7.80 ( https://nmap.org ) at 20XX-XX-XX 14:32 EDT
~略~
Host script results:
| smb-enum-shares:
~略~
|   \\192.168.XXX.YYY\secret_folder:
|     Type: STYPE_DISKTREE
|     Comment: Extremely sensitive information
~略~

● SMB 列挙ツール

更なる列挙のためのSMBのツールをいくつか補足で紹介。

■ Nmap NSE(-sC

NSEとはNmap Scripting Engineの略で、Nmapツールが持つスクリプトエンジンのこと。
NSEスクリプトと呼ばれ要はスクリプトが動作するイメージ。

  • -sCはデフォルトカテゴリに属するNSEスクリプト群を実行
  • Samba バージョン検出やOSverの確認が可能

コマンドと抜粋結果例

$nmap -sC 445 192.168.XXX.YYY
Starting Nmap 7.80 ( https://nmap.org ) at 20XX-XX-XX 14:32 EDT
~略~
| smb-os-discovery:
|   OS: Windows 6.1 (Samba 4.9.5-Debian)
|   Computer name: user-1
|   NetBIOS computer name: user-1\x00
|   Domain name: user.org
|   FQDN: user-1.user.org
~略~

■ enum4linux / enum4linux-ng

enum4linuxは、WindowsとSamba/CIFSサーバー上の情報を列挙(列挙)するためのLinuxコマンドラインツール

  • ユーザー/グループ/共有等を一括列挙
  • ng版は Python 実装で高速・可読性良好

enum4linuxのコマンドと抜粋結果例

$enum4linux 192.168.XXX.YYY
Starting enum4linux v0.8.9 ( http://labs.portcullis.co.uk/application/enum4linux/ )
~略~
 =============================================
|    Getting domain SID for 192.168.XXX.YYY   |
 =============================================
Domain Name: WORKGROUP
Domain Sid: (NULL SID)
~略~
 ========================================
|     OS information on 192.168.XXX.YYY    |
 ========================================
 ・・・
[+] Got OS info for 192.168.XXX.YYY from srvinfo:
    user-1     Wk Sv PrQ Unx NT SNT Samba 4.9.5-Debian
~略~
 ===============================
|    Users on 192.168.XXX.YYY    |
 ===============================
index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: user Name:  Desc:
user:[user] rid:[0x3e8]
 ===========================================
|    Share Enumeration on 192.168.XXX.YYY    |
 ===========================================
    Sharename       Type      Comment
    ---------       ----      -------
    print$          Disk      Printer Drivers
    secret_folder   Disk      Extremely sensitive information
[+] Attempting to map shares on 192.168.XXX.YYY
//192.168.XXX.YYY/print$ Mapping: DENIED, Listing: N/A
//192.168.XXX.YYY/secret_folder Mapping: DENIED, Listing: N/A
~略~
=======================================================
|    Users on 192.168.XXX.YYY via RID cycling (RIDS: 500-550, 1000-1050)    |
=======================================================
 ・・・
[+] Enumerating users using SID S-1-22-1 and logon username '', password ''
S-1-22-1-1000 Unix User\user (Local User)
~略~

■ smbclient

  • 対話形式で共有リソースへ接続し詳細確認が可能

コマンドと抜粋結果例

$smbclient -L \\\192.168.XXX.YYY
   Sharename       Type       Comment
   ---------       ----       -------
   print$                      Disk       Printer Drivers
   secret_folder             Disk        Extremely sensitive information

● Web アプリケーション列挙

前述のホスト列挙などで対象のサーバーが稼働中であることを前提に実施する内容。

NmapのNSEスクリプトで:

  • ディレクトリ/ファイルのブルートフォース
  • Apache/Tomcat のデフォルト管理ページ検出

コマンドと抜粋結果例

$nmap -sV --script=http-enum -p 80 \\\192.168.XXX.YYY
~略~
| http-enum:
|   /admin/: Possible admin folder
|   /admin/index.html: Possible admin folder
|_  /s/: Potentially interesting folder
|_http-server-header: nginx/1.17.2
~略~

Niktoで:
NiktoはオープンソースのWeb脆弱性スキャナーツール。
Nmapとの違いとしてはスキャンが体系的で網羅的だが、
結果が冗長で誤検知も一定数含まれる

コマンドと抜粋結果例

$nikto -h 192.168.XXX.YYY
- Nikto v2.1.6
-----------------------------------------------------------------------
+ Target IP:           192.168.XXX.YYY
+ Target Hostname:    192.168.XXX.YYY
+ Target Port:         80
-----------------------------------------------------------------------
+ Server: nginx/1.17.2
~略~
+ OSVDB-3092: /admin/: This might be interesting...
+ /admin/index.html: Admin login page/section found.
+ /wp-admin/: Admin login page/section found.
+ /wp-login/: Admin login page/section found.
~略~

● サービス列挙(Windows Services)

NmapのNSEスクリプトのうち smb-enum-processes により、サービス一覧を収集可能。

コマンド例

$nmap --script smb-enum-processes.nse --script-args smbusername=user 、smbpass=user -p445 192.168.XXX.YYY

● パケットクラフティング(Scapy)

Scapy は Pythonベースのパケット生成ツール。

できること:

  • 任意プロトコルパケット生成
  • SYN スキャン
  • カスタムペイロード埋め込み

SYNスキャンのコマンド例

>>> ans, unans = sr1(IP(dst='192.168.XXX.YYY')/TCP(dport=445,flags='S'))

🔍実践学習①Nmap による列挙

Nmapの基本的な使い方を実際の偵察/列挙の流れに沿って確認していきます。

1. ネットワークインターフェース確認

  • br-internalのインターフェース(サブネット)を確認します。
  • br-internalを対象とするのは、当該サブネット上にスキャン対象のサーバーを立てているためです。
┌──(kali㉿Kali)-[~]
└─$ ifconfig
br-internal: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.6.6.1  netmask 255.255.255.0  broadcast 10.6.6.255
        inet6 fe80::42:dff:fe45:516b  prefixlen 64  scopeid 0x20<link>
        ether 02:42:0d:45:51:6b  txqueuelen 0  (Ethernet)
        RX packets 640  bytes 36608 (35.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 46  bytes 4182 (4.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:9eff:febc:6bea  prefixlen 64  scopeid 0x20<link>
        ether 02:42:9e:bc:6b:ea  txqueuelen 0  (Ethernet)
        RX packets 338  bytes 58366 (56.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 125  bytes 9095 (8.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 3952  bytes 8966417 (8.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3952  bytes 8966417 (8.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-internalが10.6.6.1/24であることが3行目から確認できます。

2. Nmap バージョン確認

  • 今回使用するNmapのバージョンを確認します。
┌──(kali㉿Kali)-[~]
└─$ nmap -V
Nmap version 7.94 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.4.4 openssl-3.0.9 libssh2-1.10.0 libz-1.2.13 libpcre-8.39 libpcap-1.10.4 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

3行目よりバージョンを確認してます。(あまり意識してません。)

3. Discovery Scan

  • 偵察対象特定のためにbr-internalのサブネット上のホストを探索します。
    ※ICMP/TCP SYN/ACK/Timestamp を併用し生存ホストを特定しています。
┌──(kali㉿Kali)-[~]
└─$ nmap -sn 10.6.6.0/24                                                                                  
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:18 UTC
Nmap scan report for 10.6.6.1
Host is up (0.00034s latency).
Nmap scan report for webgoat.vm (10.6.6.11)
Host is up (0.00044s latency).
Nmap scan report for juice-shop.vm (10.6.6.12)
Host is up (0.00039s latency).
Nmap scan report for dvwa.vm (10.6.6.13)
Host is up (0.00011s latency).
Nmap scan report for mutillidae.vm (10.6.6.14)
Host is up (0.000051s latency).
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00035s latency).
Nmap scan report for 10.6.6.100
Host is up (0.00032s latency).
Nmap done: 256 IP addresses (7 hosts up) scanned in 2.52 seconds

今回は対象ホストを10.6.6.23として以降のスキャニングを実行します。

4. デフォルトスキャン

  • nampのデフォルトでスキャンを実行し、どういったプロトコルが動作しているかを確認します。
┌──(kali㉿Kali)-[~]
└─$ nmap 10.6.6.23
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:21 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00016s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT    STATE SERVICE
21/tcp  open  ftp
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds

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

8行目あたりのログより、ftp,ssh,DNS,HTTP,SMB(139,445)が動作していることが確認できます。

5. OS Detection

  • 同様のホストに-Oのオプションを付けて動作するOSを確認します。
┌──(kali㉿Kali)-[~]
└─$ sudo nmap -O 10.6.6.23                                                                                
[sudo] password for kali: 
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:22 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.000069s latency).
Not shown: 994 closed tcp ports (reset)
PORT    STATE SERVICE
21/tcp  open  ftp
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address: 02:42:0A:06:06:17 (Unknown)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.51 seconds

19行目より、OSバージョンがLinux 4.15 - 5.8であることが確認できます。

6. 詳細スキャン(-v -p -sV -T4

  • 一部おさらいですが、-v -p -sV -T4のオプションを利用し、詳細モードでポートを指定しサービス/バージョン情報を確認しながら高速スキャンを実行します。
  • FTPにあたりを付けてスキャンしてます。
──(kali㉿Kali)-[~]
└─$ nmap -v -p21 -sV -T4 10.6.6.23                                                                        
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:25 UTC
NSE: Loaded 46 scripts for scanning.
Initiating Ping Scan at 11:25
Scanning 10.6.6.23 [2 ports]
Completed Ping Scan at 11:25, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 11:25
Scanning gravemind.vm (10.6.6.23) [1 port]
Discovered open port 21/tcp on 10.6.6.23
Completed Connect Scan at 11:25, 0.00s elapsed (1 total ports)
Initiating Service scan at 11:25
Scanning 1 service on gravemind.vm (10.6.6.23)
Completed Service scan at 11:25, 0.00s elapsed (1 service on 1 host)
NSE: Script scanning 10.6.6.23.
Initiating NSE at 11:25
Completed NSE at 11:25, 0.00s elapsed
Initiating NSE at 11:25
Completed NSE at 11:25, 0.00s elapsed
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00016s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
Service Info: OS: Unix

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

FTP(21番)のバージョン情報が3.0.3であることが24行目からわかります。
※本記事では扱ってませんが、このFTPバージョンで脆弱性がある場合エクスプロイト(脆弱性の悪用)の恐れがあります。

7. 高度スキャン(-A

  • FTPにおける脆弱性の追加調査のため-Aオプションを利用しより多くの情報(OS検出、スクリプトスキャン、tracerouteなど)を取得していきます。
┌──(kali㉿Kali)-[~]
└─$ nmap -p21 -sV -A 10.6.6.23                                                                            
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:51 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00020s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r--    1 0        0              16 Aug 13  2021 file1.txt
| -rw-r--r--    1 0        0              16 Aug 13  2021 file2.txt
| -rw-r--r--    1 0        0              29 Aug 13  2021 file3.txt
|_-rw-r--r--    1 0        0              26 Aug 13  2021 supersecretfile.txt
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 10.6.6.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 1
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

10行目より4つのアクセス可能ファイルを検出できます。

参考. フルスキャン

  • 最初から対象指定せずフルスキャンも可能ですが、今回のローカル環境での探索でも20秒程度時間を必要とします。
┌──(kali㉿Kali)-[~]
└─$ nmap -A 10.6.6.23                                                                                     
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:53 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00010s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT    STATE SERVICE     VERSION
21/tcp  open  ftp         vsftpd 3.0.3
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 10.6.6.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 3
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r--    1 0        0              16 Aug 13  2021 file1.txt
| -rw-r--r--    1 0        0              16 Aug 13  2021 file2.txt
| -rw-r--r--    1 0        0              29 Aug 13  2021 file3.txt
|_-rw-r--r--    1 0        0              26 Aug 13  2021 supersecretfile.txt
22/tcp  open  ssh         OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 7f:9d:b7:59:47:74:0e:8e:90:83:24:2a:33:6c:06:30 (RSA)
|   256 52:a2:29:69:72:54:dc:47:ab:9f:0f:ce:b9:79:e1:c1 (ECDSA)
|_  256 cd:4b:02:54:ea:60:df:a7:2d:a2:05:7f:e1:df:af:9d (ED25519)
53/tcp  open  domain      ISC BIND 9.11.5-P4-5.1+deb10u5 (Debian Linux)
| dns-nsid: 
|_  bind.version: 9.11.5-P4-5.1+deb10u5-Debian
80/tcp  open  http        nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: Home
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open  �w?(hU      Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
Service Info: Host: GRAVEMIND; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.9.5-Debian)
|   Computer name: gravemind
|   NetBIOS computer name: GRAVEMIND\x00
|   Domain name: \x00
|   FQDN: gravemind
|_  System time: 2025-09-15T11:53:40+00:00
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-time: 
|   date: 2025-09-15T11:53:40
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 19.53 seconds

🔍SMB サービス列挙

Nmapによる偵察結果をもとにSMBサービスの列挙方法を理解します。

● ユーザー列挙

  • SMBサービスの脆弱性探索のためポート139及び445のスキャンを実行します。
┌──(kali㉿Kali)-[~]
└─$ nmap -A -p139,445 10.6.6.23
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 11:58 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00021s latency).

PORT    STATE SERVICE     VERSION
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open  netbios-0   Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
Service Info: Host: GRAVEMIND

Host script results:
| smb2-time: 
|   date: 2025-09-15T11:58:39
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.9.5-Debian)
|   Computer name: gravemind
|   NetBIOS computer name: GRAVEMIND\x00
|   Domain name: \x00
|   FQDN: gravemind
|_  System time: 2025-09-15T11:58:38+00:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.44 seconds

20行目あたりからSambaが4.9.5-Debianで動作していることやComuputer nameがgraveminであることなどがわかります。

  • SMBユーザーを偵察するために、以下NSEスクリプトを利用して列挙します。
┌──(kali㉿Kali)-[~]
└─$  nmap --script smb-enum-users.nse -p139,445 10.6.6.23                                                 
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 12:09 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00014s latency).

PORT    STATE SERVICE
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds

Host script results:
| smb-enum-users: 
|   GRAVEMIND\arbiter (RID: 1001)
|     Full name:   
|     Description: 
|     Flags:       Account disabled, Normal user account, Password not required
|   GRAVEMIND\masterchief (RID: 1000)
|     Full name:   
|     Description: 
|_    Flags:       Account disabled, Normal user account, Password not required

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

13,17行目からarbiterとmasterchidefというSMBユーザーがいることがわかり、16,20行目からそれぞれパスワードが不要であることもわかります。

● 共有フォルダ列挙

  • NSEスクリプトを利用しセキュリティホールとなりうる公開された共有ディレクトリを列挙
┌──(kali㉿Kali)-[~]
└─$ nmap --script smb-enum-shares.nse -p445 10.6.6.23                                                     
Starting Nmap 7.94 ( https://nmap.org ) at 2025-09-15 12:10 UTC
Nmap scan report for gravemind.vm (10.6.6.23)
Host is up (0.00025s latency).

PORT    STATE SERVICE
445/tcp open  microsoft-ds

Host script results:
| smb-enum-shares: 
|   account_used: <blank>
|   \\10.6.6.23\IPC$: 
|     Type: STYPE_IPC_HIDDEN
|     Comment: IPC Service (Samba 4.9.5-Debian)
|     Users: 1
|     Max Users: <unlimited>
|     Path: C:\tmp
|     Anonymous access: READ/WRITE
|   \\10.6.6.23\print$: 
|     Type: STYPE_DISKTREE
|     Comment: Printer Drivers
|     Users: 0
|     Max Users: <unlimited>
|     Path: C:\var\lib\samba\printers
|     Anonymous access: READ/WRITE
|   \\10.6.6.23\workfiles: 
|     Type: STYPE_DISKTREE
|     Comment: Confidential Workfiles
|     Users: 0
|     Max Users: <unlimited>
|     Path: C:\var\spool\samba
|_    Anonymous access: READ/WRITE

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

13行目以降からIPC$,print$,workfilesという3つの共有フォルダが確認できます。


:computer:実践演習②Scapyによるスニッフィング及びPacket作成

Scapyの基本的な使い方を理解します。

1.Scapyの起動

  • Scapyを起動し対話モードに移行したことを確認します。
┌──(kali㉿Kali)-[~]
└─$ sudo su                                                                                                
[sudo] password for kali: 

┌──(root㉿Kali)-[/home/kali]
└─# scapy                                                                                                  
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
                                      
                     aSPY//YASa       
             apyyyyCY//////////YCa       |
            sY//////YSpcs  scpCY//Pp     | Welcome to Scapy
 ayp ayyyyyyySCP//Pp           syY//C    | Version 2.5.0
 AYAsAYYYYYYYY///Ps              cY//S   |
         pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapy
         SPPPP///a          pP///AC//Y   |
              A//A            cyP////C   | Have fun!
              p///Ac            sC///a   |
              P////YCpc           A//A   | Craft packets like I craft my beer.
       scccccp///pSP///p          p//Y   |               -- Jean De Clerck
      sY/////////y  caa           S//P   |
       cayCyayP//Ya              pY/Ya
        sY/PsY////YCc          aC//Yp 
         sc  sccaCY//PCypaapyCP//YSs  
                  spCPY//////YPSps    
                       ccaacs         
                                       using IPython 8.14.0
>>> 

2.利用可能なプロトコル一覧

  • ls()関数を用いると利用できるプロトコルや指定したプロトコルのナビゲートをしてくれます。
TIP: You may use explore() to navigate through all layers using a clear GUI
>>> ls(IP)
version    : BitField  (4 bits)                  = ('4')
ihl        : BitField  (4 bits)                  = ('None')
tos        : XByteField                          = ('0')
len        : ShortField                          = ('None')
id         : ShortField                          = ('1')
flags      : FlagsField                          = ('<Flag 0 ()>')
frag       : BitField  (13 bits)                 = ('0')
ttl        : ByteField                           = ('64')
proto      : ByteEnumField                       = ('0')
chksum     : XShortField                         = ('None')
src        : SourceIPField                       = ('None')
dst        : DestIPField                         = ('None')
options    : PacketListField                     = ('[]')
>>> 

3.スニッフィング

実際にスニッフィングする方法を確認していきます。

  • sniff()でスニッフィングを開始し、途中で強制終了させます。その間に通ったトラフィックを収集します。
  • pythonベースのため一度変数aへ直前に実行された関数を「_(アンダースコア)」で呼び出しその結果をsummary関数を介して表示します。。
>>> sniff()
^C<Sniffed: TCP:0 UDP:17 ICMP:10 Other:7>
>>> a=_
>>> a.summary()
Ether / IPv6 / ICMPv6ND_RA / ICMPv6NDOptSrcLLAddr / ICMPv6 Neighbor Discovery Option - Prefix Information fd00::/64 On-link 1 Autonomous Address 1 Router Address 0
Ether / fe80::a00:27ff:fe4a:f36e > ff02::16 (0) / IPv6ExtHdrHopByHop / ICMPv6MLReport2
Ether / fe80::a00:27ff:fe4a:f36e > ff02::16 (0) / IPv6ExtHdrHopByHop / ICMPv6MLReport2
Ether / IP / UDP / DNS Qry "b'www.cisco.com.'" 
Ether / IP / UDP / DNS Ans "b'www.cisco.com.akadns.net.'" 
Ether / IP / UDP / DNS Qry "b'www.cisco.com.'" 
Ether / IP / UDP / DNS Ans "b'www.cisco.com.akadns.net.'" 
Ether / IP / ICMP 10.0.2.15 > 184.28.244.116 echo-request 0 / Raw
Ether / IP / ICMP 184.28.244.116 > 10.0.2.15 echo-reply 0 / Raw
Ether / IP / UDP / DNS Qry "b'116.244.28.184.in-addr.arpa.'" 
Ether / IP / UDP / DNS Ans "b'a184-28-244-116.deploy.static.akamaitechnologies.com.'" 
Ether / ARP who has 10.0.2.3 says 10.0.2.15
Ether / ARP is at 52:55:0a:00:02:03 says 10.0.2.3 / Padding
>>> 

ここではwww.cisco.comにpingを打っている最中にスニッフィングをしていますが、その様子が12行目あたりで確認できます。

インターフェース指定:

  • 当然のことですが、特定のインターフェースを指定してスニッフィング可能です。
>>> sniff(iface="br-internal")
^C<Sniffed: TCP:93 UDP:0 ICMP:0 Other:0>
>>> a=_
>>> a.summary
<bound method _PacketList.summary of <Sniffed: TCP:93 UDP:0 ICMP:0 Other:0>>
>>> a.summary()
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http S
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 SA
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http A
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http PA / Raw
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 A
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 PA / Raw
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http A
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 PA / Raw
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http A
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 PA / Raw
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http A
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http PA / Raw
Ether / IP / TCP 10.6.6.23:http > 10.6.6.1:56584 PA / Raw
Ether / IP / TCP 10.6.6.1:56584 > 10.6.6.23:http A
Ether / IP / TCP 10.6.6.1:56594 > 10.6.6.23:http S

br-internalからローカルサーバーに対してhttpで接続していますがその様子が見て取れます。

ICMPのみスニッフィング:

  • フィルタリング機能を利用してICMP10回上限としてスニッフィングします。
  • また、nsummary()関数を用いて番号を付与し、指定したパケットを呼び出します。
>>> sniff(iface="br-internal", filter="icmp", count=10)
<Sniffed: TCP:0 UDP:0 ICMP:10 Other:0>
>>> a=_
>>> a.nsummary()
0000 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0001 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
0002 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0003 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
0004 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0005 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
0006 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0007 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
0008 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0009 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
>>> a[2]
<Ether  dst=02:42:0a:06:06:17 src=02:42:0d:45:51:6b type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=84 id=10634 flags=DF frag=0 ttl=64 proto=icmp chksum=0xf0fb src=10.6.6.1 dst=10.6.6.23 |<ICMP  type=echo-request code=0 chksum=0x1217 id=0xc2e9 seq=0x2 unused='' |<Raw  load='\\xab\x1d\\xc8h\x00\x00\x00\x00\\xe9\\xa3\x07\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567' |>>>>
>>> 

ここではbr-internalからローカルサーバーへpingし続けてますが、10個のみスニッフィングされておりトラフィックの中身まで見えていることがわかります。

4.pcap 保存

  • wrpacap関数で結果を保存しwiresharkなどで表示可能です。
>>> wrpcap("capture1.pcap",a)

image.png
ここでは先ほどのping10回スニッフィングした結果をpcapファイルに保存した結果を表示してます。

5.ICMP 生成

  • scapyを二つのターミナルで起動し、片方でスニッフィング、他方でパケット生成可能です。
###Terminal A.

>>> sniff(iface="br-internal")
^C<Sniffed: TCP:0 UDP:0 ICMP:2 Other:4>
>>> a=_
>>> a.nsummary()
0000 Ether / ARP who has 10.6.6.23 says 10.6.6.1
0001 Ether / ARP is at 02:42:0a:06:06:17 says 10.6.6.23
0002 Ether / IP / ICMP 10.6.6.1 > 10.6.6.23 echo-request 0 / Raw
0003 Ether / IP / ICMP 10.6.6.23 > 10.6.6.1 echo-reply 0 / Raw
0004 Ether / ARP who has 10.6.6.1 says 10.6.6.23
0005 Ether / ARP is at 02:42:0d:45:51:6b says 10.6.6.1
>>> a[2]
<Ether  dst=02:42:0a:06:06:17 src=02:42:0d:45:51:6b type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=41 id=1 flags= frag=0 ttl=64 proto=icmp chksum=0x5ab0 src=10.6.6.1 dst=10.6.6.23 |<ICMP  type=echo-request code=0 chksum=0x90c0 id=0x0 seq=0x0 unused='' |<Raw  load='This is test.' |>>>>                                       
>>> 
###Terminal B.

>>> send(IP(dst="10.6.6.23")/ICMP()/"This is test.")
.
Sent 1 packets.
>>> 

Linux上で実行するICMPとほぼ同等ですが、ここではThis is test.という文字列を送っておりTerminal Aの14行目のRaw loadの中身がThis is test.となっていることがわかります。

6.TCP SYN 生成

  • TCP SYNをポート445で送付した際のサーバーからのSYN/ACKがa[3]から確認できます。
### Teminal A.

>>> sniff(iface="br-internal")
^C<Sniffed: TCP:3 UDP:0 ICMP:0 Other:2>
>>> a=_
>>> a.nsummary()
0000 Ether / ARP who has 10.6.6.23 says 10.6.6.1
0001 Ether / ARP is at 02:42:0a:06:06:17 says 10.6.6.23
0002 Ether / IP / TCP 10.6.6.1:ftp_data > 10.6.6.23:microsoft_ds S
0003 Ether / IP / TCP 10.6.6.23:microsoft_ds > 10.6.6.1:ftp_data SA
0004 Ether / IP / TCP 10.6.6.1:ftp_data > 10.6.6.23:microsoft_ds R
>>> a[2]
<Ether  dst=02:42:0a:06:06:17 src=02:42:0d:45:51:6b type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=40 id=1 flags= frag=0 ttl=64 proto=tcp chksum=0x5aac src=10.6.6.1 dst=10.6.6.23 |<TCP  sport=ftp_data dport=microsoft_ds seq=0 ack=0 dataofs=5 reserved=0 flags=S window=8192 chksum=0x6dee urgptr=0 |>>>                        
>>> a[3]
<Ether  dst=02:42:0d:45:51:6b src=02:42:0a:06:06:17 type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=44 id=0 flags=DF frag=0 ttl=64 proto=tcp chksum=0x1aa9 src=10.6.6.23 dst=10.6.6.1 |<TCP  sport=microsoft_ds dport=ftp_data seq=257883859 ack=1 dataofs=6 reserved=0 flags=SA window=64240 chksum=0x2042 urgptr=0 options=[('MSS', 1460)] |>>>                                                                                               
>>> 
### Teminal B.

>>> send(IP(dst="10.6.6.23")/TCP(dport=445, flags="S"))
.
Sent 1 packets.
>>> 

⇒一つ手前の任意のICMP pingと合わせて様々なトラフィックを作成して偵察が可能なことがわかります。


:dolphin:実践演習:Wireshark によるスニッフィング

Wiresharkはtsharkやtcpdumpといったツールと並んでパケット解析に利用されるアプリやツールですが、ここではWiresharkを中心にスニッフィングでの使われ方を学びます。

● 前準備

  • 現在のディレクトリをはじめ、NIC / MAC / GW / DNS の確認です。
┌──(kali㉿Kali)-[~]
└─$ pwd
/home/kali

┌──(kali㉿Kali)-[~]
└─$ ifconfig

br-internal: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.6.6.1  netmask 255.255.255.0  broadcast 10.6.6.255
        inet6 fe80::42:dff:fe45:516b  prefixlen 64  scopeid 0x20<link>
        ether 02:42:0d:45:51:6b  txqueuelen 0  (Ethernet)
        RX packets 13342  bytes 2334531 (2.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13738  bytes 1377181 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:9eff:febc:6bea  prefixlen 64  scopeid 0x20<link>
        ether 02:42:9e:bc:6b:ea  txqueuelen 0  (Ethernet)
        RX packets 376  bytes 68151 (66.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 125  bytes 9095 (8.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0                              

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500                                                
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255                                       
        inet6 fd00::5218:d382:a626:3654  prefixlen 64  scopeid 0x0<global>                                
        inet6 fe80::a00:27ff:fe4a:f36e  prefixlen 64  scopeid 0x20<link>                                  
        inet6 fd00::a00:27ff:fe4a:f36e  prefixlen 64  scopeid 0x0<global>                                 
        ether 08:00:27:4a:f3:6e  txqueuelen 1000  (Ethernet)                                              
        RX packets 87770  bytes 84171256 (80.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40914  bytes 6137308 (5.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4439  bytes 9008361 (8.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4439  bytes 9008361 (8.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

┌──(kali㉿Kali)-[~]
└─$ ip route
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100 
10.6.6.0/24 dev br-internal proto kernel scope link src 10.6.6.1 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 

┌──(kali㉿Kali)-[~]
└─$ cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.2.3

● パケットキャプチャ

  • tcpdumpを利用してパケットをキャプチャします。
  • 今回はgoogle.comやnetacad.comにアクセスしてその振る舞いを確認します。
┌──(kali㉿Kali)-[~]
└─$ sudo tcpdump -i eth0 -s 0 -w packetdump.pcap
[sudo] password for kali: 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
^C6212 packets captured
6212 packets received by filter
0 packets dropped by kernel
  • CLIまたはデスクトップからWiresharkを起動し先ほどのキャプチャを開きます。
    image.png

● DNS 解析

  • DNSの文字列を指定してgoogle.comやnetacad.comに接続したことを確認します。
    image.png

  • netacad.comのパケットに注目すると、L2レイヤではVMのMACアドレスからデフォゲのMACアドレスに飛んでいることが確認できます。
    image.png

  • 同パケットのDNSクエリに注目すると、返答のパケットや具体的なIPアドレスが確認できます。
    image.png
    クエリの中身からキャッシュポイズニングが発生していることがわかる場合もあります。

● HTTP解析

  • ここでは先ほどのtcpdumpではなく、Wiresharkから直接パケットキャプチャします。
  • br-internal(10.6.6.1)のIFを指定し、DWDAのサイト(10.6.6.13)にHTTPで接続した際の挙動を確認します。

image.png
image.png
username/password が平文で中身が見えることが2枚目の画像からわかります。
⇒盗聴されればそのまま悪用されます。

  • 302 Foundに該当するパケットを探すとSet-Cookieの中身が見え、GETのリクエストとレスポンスで同一であることが確認できます。
    image.png
    image.png
    → 乗っ取られるとセッションハイジャックにつながることがあります。

🧾 本記事のまとめ

能動的偵察(Active Recon)について、
その概要と共に以下の3点について実践を通じながら理解を深めた。

① 各種列挙(Enumeration)方法の実践

Nmap と各種 NSE スクリプトを用いて、以下を取得するプロセスの体得

  • 稼働中サービスの抽出
  • SMB のユーザー/共有/セキュリティ設定の可視化
  • バージョン情報のフィンガープリンティング

② Scapyの実践

Scapy を活用して、以下の初歩的な使い方を把握

  • ICMP/TCP の手動生成
  • sniff によるトラフィック捕捉
  • sr1 を利用したレスポンス解析

③ Wireshark による実トラフィック分析

Wireshark/tcpdump を活用し、以下の実トラフィック分析の手法を理解

  • DNS 解析
  • HTTP/HTTPS のセッション動作
  • Cookie/認証トークンの挙動

📍次回予告
→ 「脆弱性スキャン」、「スキャン結果の分析」についてまとめる予定です。(3章は次回で完了を予定してます。)


次の記事はこちら

2
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
2
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?