【セキュリティ事件簿#2025-235】摂南大学 卒業・修了生(2017~2022年度)の個人情報流出について 2025/6/6

 

このたび、本学就職部職員1名が、Microsoft Teamsのチャットにて本学卒業生の個人情報を含んだファイルを誤って送信する事案が判明いたしました。

本学としては、被害に遭われた方の把握と事態の掌握に向けて迅速に対応しているところです。

現在のところ、本件に関する個人情報が不正に使用された事実は確認されておりませんが、引き続き不測の事態に備え、適切な対応を継続してまいります。

今後同様の事態が発生しないよう、教職員を対象とした個人情報保護および情報セキュリティに関する学内研修の強化を図るなど、再発防止に向けた取り組みを徹底してまいります。

1.経緯等

2023年7月に就職部で過去6年分の「先輩就職先情報リスト」を作成しました。リスト作成にあたり卒業・修了生(2017~2022年度)の個人情報を含むデータを用いましたが、個人情報を含むシートを削除しない状態のデータを誤って複数の学生に対して2023年8月~2025年5月の期間に提供してしまい、提供を受けた学生の相談を受け2025年5月30日に個人情報流出が発覚しました。

2.誤送信したファイルに含まれていた情報および送信先

①個人情報の項目

学籍番号、氏名、フリガナ、学部学科名、性別、生年月日、現住所、電話番号、携帯番号、メールアドレス、進路決定先、職種

②個人情報の流出数

 9,213人(2017~2022年度卒業・修了生)

③送信先

摂南大学の学生(既に卒業した学生含む)122人

3.該当する関係者への対応

  • 流出発覚後の5月31日に個人情報を含むシートを全て削除し、既に閲覧できない状況になっております。なお、この情報流出による被害の報告は現在のところありません(2025年6月5日現在)。
  • 個人情報が流出した 9,213人の卒業・修了生に対して、順次お詫びの文書を郵送予定です。
  • 送信先の在学生に対して、順次個別に状況を説明のうえ謝罪を行います。
  • 送信先の既卒生に対して、順次お詫びの文書を郵送予定です。
  • 個人情報保護委員会(内閣府委員会)へ報告(2025年6月4日報告済)

4.再発防止への取り組み

  • 教職員全員に改めて個人情報の管理の徹底について注意喚起を行います。
  • メール・チャット送信時に添付ファイルも含めて、適切な内容であるかの確認徹底とチェック体制の改善を図ります。
  • 今後も研修等を通じて、全教職員に対して適切な事務処理と個人情報の取扱いについて法令を遵守するよう周知徹底いたします。

【TryHackMeウォークスルー】Windows PowerShell

 

Introduction

ようこそ!

このページにたどり着いたということは、PowerShell の魅力を耳にして、もっと深く知りたいと思っているか、あるいは「コマンドラインモジュール」の第一章(Windowsコマンドライン)から航海してきたのかもしれません。

いずれにせよ、これからWindowsシステムの秘密を解き明かす旅が始まります。さあ、出航の時です!

学習目標

このルームは「コマンドラインモジュール」の第2章にあたります。PowerShell についての入門的な内容を扱っており、Windows向けに開発された2番目のコマンドラインツールです。

  • PowerShellとは何か、その機能を学ぶ
  • PowerShellの基本的な構文や構造を理解する
  • 基本的なPowerShellコマンドを実行してみる
  • PowerShellがサイバーセキュリティ分野でどのように活用されているかを知る

What Is PowerShell

PowerShellは、Microsoftが提供するタスク自動化と構成管理のためのツールです。コマンドラインシェル、スクリプト言語、構成管理フレームワークの3つの要素で構成されており、.NETフレームワークの上に作られています。

従来のコマンドラインツールとは異なり、PowerShellは「オブジェクト指向」で動作します。これにより、複雑なデータの操作やシステムとの連携がしやすくなっています。もともとはWindows専用でしたが、現在ではmacOSやLinuxにも対応しており、さまざまな環境で利用できます。

PowerShellの歴史

PowerShellは、従来のコマンド(cmd.exeやバッチファイル)では対応しきれなかった複雑な管理作業を効率化するために、2000年代初頭に開発されました。

開発の中心となったのは、MicrosoftのエンジニアであるJeffrey Snoverです。彼は、Windowsでは構造化データとAPIが中心である一方、Unixではテキストが中心であるという違いに注目しました。そして、.NETの機能を活かしつつ、スクリプトでも扱いやすい「オブジェクト指向のシェル」を作るという発想から、PowerShellが生まれました。

2006年に最初のバージョンがリリースされ、その後、IT環境の多様化に対応する形で、2016年にはWindows以外のOSでも動作する「PowerShell Core(オープンソース)」が登場しました。

PowerShellの特徴

PowerShellの特徴のひとつは「オブジェクトを扱えること」です。

たとえば、車を例にすると「色」「モデル」「燃料の量」などの情報がプロパティ(属性)で、「走る」「クラクションを鳴らす」「給油する」といった操作がメソッド(動作)になります。PowerShellでも同様に、ファイル名やサイズ、ユーザー情報などをプロパティとして持ち、コピーや削除といった操作をメソッドとして実行できます。

従来のコマンドラインではすべての出力が文字列(テキスト)でしたが、PowerShellではコマンドを実行するとオブジェクトが返ってきます。そのため、余計な文字列の加工をせずに、効率的に情報を操作できます。

今後のセクションでは、PowerShellで使えるコマンド(cmdlet)について、より詳しく見ていきます。

What do we call the advanced approach used to develop PowerShell?

object-oriented

PowerShell Basics

PowerShellの学習を進める前に、ラボ環境に接続しましょう。

PowerShellの起動方法

PowerShellは、利用する環境や目的に応じて、いくつかの方法で起動できます。Windowsのグラフィカルユーザーインターフェース(GUI)から操作する場合、主な起動方法は以下の通りです。

・スタートメニューから

スタートメニューの検索バーに「powershell」と入力し、表示された「Windows PowerShell」または「PowerShell」をクリックします。

・「ファイル名を指定して実行」から

Windowsキー + R を押して「ファイル名を指定して実行」ダイアログを開き、「powershell」と入力して Enter キーを押します。

・エクスプローラーから

任意のフォルダーを開き、アドレスバーに「powershell」と入力して Enter キーを押すと、そのフォルダーをカレントディレクトリとしてPowerShellが起動します。

・タスクマネージャーから

タスクマネージャーを開き、「ファイル」→「新しいタスクの実行」を選択し、「powershell」と入力して Enter キーを押します。

また、コマンドプロンプト(cmd.exe)を使っている場合は、「powershell」と入力して Enter キーを押すことでPowerShellを起動できます。

Terminal
captain@THEBLACKPEARL C:\Users\captain>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows

PS C:\Users\captain> 

PowerShellが起動すると、現在の作業ディレクトリを示す「PS」プロンプトが表示されます(「PS」はPowerShellの略です)。

基本構文:動詞-名詞の形式

先述のとおり、PowerShellのコマンドは「コマンドレット(cmdlet)」と呼ばれます。従来のWindowsコマンドに比べて、cmdletはより強力で、複雑なデータの操作も可能です。

PowerShellのcmdletは、基本的に「動詞-名詞(Verb-Noun)」の形式で命名されています。この命名規則により、それぞれのコマンドが何をするのかが直感的に理解しやすくなっています。

・動詞(Verb):どのような動作を行うか

・名詞(Noun):その動作の対象となるもの

例:

Get-Content

→ ファイルの内容を取得し、コンソールに表示します。

Set-Location

→ 作業ディレクトリ(カレントディレクトリ)を変更します。

このように、PowerShellのコマンドは一貫した構文を持っており、学習しやすくなっています。

基本的なコマンドレット(cmdlet)

現在のPowerShellセッションで使用できるコマンドレット、関数、エイリアス、スクリプトを一覧表示するには、次のコマンドを実行します。

 Get-Command

このコマンドは、どのような操作が可能かを確認するための基本的な手段であり、PowerShellを使い始める際に非常に役立ちます。

Terminal
PS C:\Users\captain> Get-Command

CommandType     Name                                               Version    Source 
-----------     ----                                               -------    ------ 

Alias           Add-AppPackage                                     2.0.1.0    Appx                                                                                                                                       
Alias           Add-AppPackageVolume                               2.0.1.0    Appx                                                                                                                                       
Alias           Add-AppProvisionedPackage                          3.0        Dism                                                                                                                                       
[...]
Function        A:
Function        Add-BCDataCacheExtension                           1.0.0.0    BranchCache                                                                                                                                
Function        Add-DnsClientDohServerAddress                      1.0.0.0    DnsClient
[...]
Cmdlet          Add-AppxPackage                                    2.0.1.0    Appx
Cmdlet          Add-AppxProvisionedPackage                         3.0        Dism                                                                                                                                       
Cmdlet          Add-AppxVolume                                     2.0.1.0    Appx
[...]

このコマンドレットによって取得される各コマンド情報(CommandInfoオブジェクト)には、いくつかの基本的な情報(プロパティ)がコンソールに表示されます。

表示されたプロパティの値を使って、コマンドの一覧を絞り込むことも可能です。たとえば、「関数(function)」タイプのコマンドだけを表示したい場合は、以下のように入力します。

 Get-Command -CommandType “Function”

このように条件を指定することで、必要なコマンドだけを効率よく確認できます。

Terminal
PS C:\Users\captain> Get-Command -CommandType "Function"

CommandType     Name                                               Version    Source                                                                                                                                     
-----------     ----                                               -------    ------
Function        A:
Function        Add-BCDataCacheExtension                           1.0.0.0    BranchCache
Function        Add-DnsClientDohServerAddress                      1.0.0.0    DnsClient
Function        Add-DnsClientNrptRule                              1.0.0.0    DnsClient
[...]

今後の課題では、cmdletの出力をより効率的にフィルタする方法について学んでいきます。

もう一つ、ぜひ覚えておきたい重要なコマンドレットが「Get-Help」です。

このコマンドは、各cmdletの使い方やパラメータ、実行例などの詳しい情報を表示してくれるもので、PowerShellの使い方を学ぶうえで欠かせない存在です。

PowerShellコマンドの使い方に迷ったときは、まずこのGet-Helpを使うのが基本です。

Terminal
PS C:\Users\captain> Get-Help Get-Date

NAME
    Get-Date

SYNOPSIS
    Gets the current date and time.

SYNTAX
    Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Format <System.String>] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-Year <System.Int32>] [<CommonParameters>]

    Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-UFormat <System.String>] [-Year <System.Int32>] [<CommonParameters>]

DESCRIPTION
        The `Get-Date` cmdlet gets a DateTime object that represents the current date or a date that you specify. `Get-Date` can format the date and time in several .NET and UNIX formats. You can use `Get-Date` to generate a date or time character string, and then send the string to other cmdlets or programs.
        
        `Get-Date` uses the current culture settings of the operating system to determine how the output is formatted. To view your computer's settings, use `(Get-Culture).DateTimeFormat`.

RELATED LINKS
    Online Version: https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1&WT.mc_id=ps-gethelp
    ForEach-Object
    Get-Culture
    Get-Member
    New-Item
    New-TimeSpan
    Set-Date
    Set-Culture xref:International.Set-Culture

REMARKS
    To see the examples, type: "get-help Get-Date -examples".
    For more information, type: "get-help Get-Date -detailed".
    For technical information, type: "get-help Get-Date -full".
    For online help, type: "get-help Get-Date -online".

前述の結果にあるように、Get-Help コマンドは、基本構文にオプションを追加することで、さらに有用な情報を得られることを教えてくれます。たとえば、「-examples」というオプションを付けることで、そのcmdletがどのように使われるかの具体的な例を確認できます。

PowerShellは、既存のWindowsユーザーやITエンジニアが移行しやすいように、「エイリアス(alias)」と呼ばれる別名(ショートカット)を多数用意しています。これは、従来のコマンドラインに慣れているユーザーにとって非常に便利な機能です。

エイリアスの一覧を確認するには、次のコマンドを使います。

 Get-Alias

たとえば、「dir」は「Get-ChildItem」のエイリアスであり、「cd」は「Set-Location」のエイリアスです。つまり、昔ながらのコマンドに近い書き方でもPowerShellを扱えるようになっています。

Terminal
PS C:\Users\captain> Get-Alias

CommandType     Name                                               Version    Source 
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           CFS -> ConvertFrom-String                          3.1.0.0    Microsoft.PowerShell.Utility
Alias           chdir -> Set-Location 
Alias           clc -> Clear-Content
Alias           clear -> Clear-Host
[...]

コマンドレットの入手方法とダウンロードについて

PowerShellの特徴のひとつに、オンラインリポジトリから追加のコマンドレットをダウンロードして、機能を拡張できる点があります。

※注意:このセクションで紹介するコマンドレットを使うには、インターネット接続が必要です。

PowerShell Galleryのようなオンラインリポジトリでモジュール(複数のコマンドレットを含むパッケージ)を検索するには、次のコマンドを使います。

 Find-Module

モジュール名がはっきり分からない場合は、部分的な名前でも検索できます。「Name」プロパティを指定し、モジュール名の一部のあとにワイルドカード(*)を付けて検索することで、似た名前のモジュールを探せます。

標準的なPowerShellの書き方は次のとおりです。

 コマンドレット名 -プロパティ名 "部分名*"

モジュール名をうろ覚えのときなどに便利な方法です。

Terminal
PS C:\Users\captain> Find-Module -Name "PowerShell*"   

Version    Name                                Repository           Description 
-------    ----                                ----------           ----------- 
0.4.7      powershell-yaml                     PSGallery            Powershell module for serializing and deserializing YAML

2.2.5      PowerShellGet                       PSGallery            PowerShell module with commands for discovering, installing, updating and publishing the PowerShell artifacts like Modules, DSC Resources, Role Capabilities and Scripts.                                                   
1.0.80.0   PowerShell.Module.InvokeWinGet      PSGallery            Module to Invoke WinGet and parse the output in PSOjects

0.17.0     PowerShellForGitHub                 PSGallery            PowerShell wrapper for GitHub API  

目的のモジュールが見つかったら、Install-Module コマンドを使ってリポジトリからダウンロードおよびインストールすることができます。これにより、そのモジュールに含まれる新しいコマンドレットが使用可能になります。

Terminal
PS C:\Users\captain> Install-Module -Name "PowerShellGet"

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): 

これらの基本的なツールを身につけたところで、いよいよPowerShellのさまざまな機能を探っていきましょう。

Answer the questions below

How would you retrieve a list of commands that start with the verb Remove? [for the sake of this question, avoid the use of quotes (" or ') in your answer]

Get-Command -Name Remove*

What cmdlet has its traditional counterpart echo as an alias?

Write-Output

What is the command to retrieve some example usage for the cmdlet New-LocalUser?

Get-Help New-LocalUser -examples

Navigating the File System and Working with Files

PowerShellには、ファイルシステムの移動やファイル操作に使えるコマンドレットが多数用意されています。これらの多くは、従来のWindowsコマンドライン(CLI)にあるコマンドと似た機能を持っています。

たとえば、コマンドプロンプトの「dir」や、Unix系システムの「ls」に相当するのが「Get-ChildItem」です。このコマンドレットは、-Path パラメータで指定した場所のファイルやフォルダーを一覧表示します。

ディレクトリの中身を確認したいときに使える便利なコマンドです。Pathを省略した場合は、現在の作業ディレクトリの内容が表示されます。

Terminal
PS C:\Users\captain> Get-ChildItem 

    Directory: C:\Users\captain

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-r---          5/8/2021   9:15 AM                Desktop
d-r---          9/4/2024  10:58 AM                Documents
d-r---          5/8/2021   9:15 AM                Downloads
d-r---          5/8/2021   9:15 AM                Favorites
d-r---          5/8/2021   9:15 AM                Links
d-r---          5/8/2021   9:15 AM                Music
d-r---          5/8/2021   9:15 AM                Pictures
d-----          5/8/2021   9:15 AM                Saved Games
d-r---          5/8/2021   9:15 AM                Videos

別のディレクトリへ移動したい場合は、「Set-Location」コマンドレットを使用します。これは現在の作業ディレクトリを変更し、指定したパスに移動するためのコマンドです。コマンドプロンプトで使う「cd」と同じような働きをします。

Terminal
PS C:\Users\captain> Set-Location -Path ".\Documents"
PS C:\Users\captain\Documents> 

従来のWindowsコマンドラインでは、ディレクトリやファイルなどの項目ごとに別々のコマンドを使って作成・管理していましたが、PowerShellではそれらをひとつのコマンドレットでシンプルに扱えるようになっています。

新しい項目を作成するには、「New-Item」コマンドレットを使用します。作成する項目のパスと、ファイルかディレクトリかといった種類を指定する必要があります。

Terminal
PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe" -ItemType "Directory"

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          9/4/2024  12:20 PM                captain-wardrobe

PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt" -ItemType "File"     

    Directory: C:\Users\captain\Documents\captain-cabin\captain-wardrobe

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/4/2024  11:46 AM              0 captain-boots.txt  

同様に、「Remove-Item」コマンドレットを使えば、ディレクトリとファイルの両方を削除できます。従来のWindowsコマンドラインでは、「rmdir」と「del」という別々のコマンドを使い分けていましたが、PowerShellではひとつのコマンドで対応できます。

Terminal
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt"
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe" 

ファイルやディレクトリをコピーしたり移動したりするには、それぞれ「Copy-Item」(copyコマンドに相当)と「Move-Item」(moveコマンドに相当)を使います。どちらもファイルとディレクトリの両方に対応しています。

Terminal
PS C:\Users\captain\Documents> Copy-Item -Path .\captain-cabin\captain-hat.txt -Destination .\captain-cabin\captain-hat2.txt
PS C:\Users\captain\Documents> Get-ChildItem -Path ".\captain-cabin\" 

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name 
----                 -------------         ------ ----
d-----          9/4/2024  12:50 PM                captain-wardrobe
-a----          9/4/2024  12:50 PM              0 captain-boots.txt
-a----          9/4/2024  12:14 PM            264 captain-hat.txt
-a----          9/4/2024  12:14 PM            264 captain-hat2.txt
-a----          9/4/2024  12:37 PM           2116 ship-flag.txt 

最後に、ファイルの内容を読み取って表示するには、「Get-Content」コマンドレットを使います。これは、コマンドプロンプトの「type」コマンドや、Unix系システムの「cat」に相当する動作をします。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-Content -Path ".\captain-hat.txt"
 _           _   
| |         | |
| |__   __ _| |_
| '_ \ / _ | __|
| | | | (_| | |_
|_| |_|\__,_|\__|

Don't touch my hat!

Answer the questions below

What cmdlet can you use instead of the traditional Windows command type?

Get-Content

What PowerShell command would you use to display the content of the "C:\Users" directory? [for the sake of this question, avoid the use of quotes (" or ') in your answer]

Get-ChildItem -Path C:\Users

How many items are displayed by the command described in the previous question?

4

Piping, Filtering, and Sorting Data

パイプ(piping)は、コマンドライン環境でよく使われるテクニックのひとつで、あるコマンドの出力結果を、次のコマンドの入力として渡す方法です。これにより、複数の処理を連続して実行することができ、データが一連のコマンドの中を流れていくような仕組みになります。パイプは「|」という記号で表され、WindowsのコマンドラインやUnix系のシェルでも広く使われています。

PowerShellでは、このパイプ処理がさらに強力になっており、単なるテキストではなく「オブジェクト」を渡すことができます。オブジェクトは、データだけでなく、そのデータに関する属性(プロパティ)や操作(メソッド)も含んでいます。

たとえば、あるディレクトリ内のファイル一覧を取得して、それをサイズ順に並べ替えたい場合は、次のようなコマンドをPowerShellで実行します。

 Get-ChildItem | Sort-Object Length

このように、パイプを使うことで処理の流れを効率的に構築できます。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Sort-Object Length

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/4/2024  12:50 PM              0 captain-boots.txt
-a----          9/4/2024  12:14 PM            264 captain-hat2.txt
-a----          9/4/2024  12:14 PM            264 captain-hat.txt
-a----          9/4/2024  12:37 PM           2116 ship-flag.txt
d-----          9/4/2024  12:50 PM                captain-wardrobe

この例では、Get-ChildItem がファイルをオブジェクトとして取得し、パイプ(|)を使ってそれらのオブジェクトを Sort-Object に渡します。Sort-Object は、そのオブジェクトの Length(サイズ)プロパティを基に並べ替えを行います。

このように、PowerShellではオブジェクトを扱うことで、より詳細で柔軟なコマンドの組み合わせが可能になります。

上記の例では、Sort-Object コマンドレットを使って、指定したプロパティを基準にオブジェクトを並べ替えました。PowerShell にはこれ以外にも、パイプと組み合わせて使える便利なコマンドレットが多数用意されており、高度なデータ操作や分析が可能です。

特定の条件に合致するオブジェクトだけを抽出(フィルタ)したい場合は、「Where-Object」コマンドレットを使います。

たとえば、あるディレクトリ内の .txt ファイルだけを一覧表示したい場合は、次のように入力します。

 Get-ChildItem | Where-Object {$_.Extension -eq ".txt"}

このように、条件を指定することで、目的のファイルやデータだけを効率よく抽出できます。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Extension" -eq ".txt" 

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/4/2024  12:50 PM              0 captain-boots.txt
-a----          9/4/2024  12:14 PM            264 captain-hat.txt
-a----          9/4/2024  12:14 PM            264 captain-hat2.txt
-a----          9/4/2024  12:37 PM           2116 ship-flag.txt

上記の例では、Where-Object コマンドレットがファイルの Extension プロパティ(拡張子)を基にフィルタを行い、拡張子が ".txt" のファイルだけを表示しています。

ここで使われている「-eq」演算子は、「等しい(equal)」という意味で、Bash や Python など他のスクリプト言語にも共通する比較演算子のひとつです。

PowerShellのフィルタ機能の幅広さを示すために、よく使われる比較演算子をいくつか紹介します。

 -ne:等しくない(not equal)
  指定した条件に合わないオブジェクトを除外するときに使います。

 -gt:より大きい(greater than)
  指定された値より大きいオブジェクトだけを抽出します。等しいものは含まれません(厳密な比較)。

 -ge:以上(greater than or equal to)
  -gt と -eq の組み合わせで、指定値以上のオブジェクトを抽出します(非厳密)。

 -lt:より小さい(less than)
  指定された値より小さいオブジェクトだけを抽出します。等しいものは含まれません。

 -le:以下(less than or equal to)
  -lt と -eq の組み合わせで、指定値以下のオブジェクトを抽出します。

さらに、特定のパターンに一致するプロパティを基にフィルタすることもできます。その際は「-like」演算子を使います。以下にその例を示します。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Name" -like "ship*"  

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/4/2024  12:37 PM           2116 ship-flag.txt

次に紹介するフィルタ用のコマンドレット「Select-Object」は、オブジェクトから特定のプロパティだけを抜き出したり、出力されるオブジェクトの数を制限したりするために使います。

必要な情報だけを表示したいときに、出力内容を絞り込むのに便利なコマンドレットです。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Select-Object Name,Length 

Name              Length
----              ------
captain-wardrobe
captain-boots.txt 0
captain-hat.txt   264
captain-hat2.txt  264
ship-flag.txt     2116

PowerShellのパイプラインは、2つのコマンドレットだけでなく、さらに多くのコマンドをつなげて拡張することができます。

練習として、次のような課題にチャレンジしてみましょう。

C:\Users\captain\Documents\captain-cabin フォルダー内で、最もサイズの大きいファイルを表示するようなコマンドレットのパイプラインを作ってみてください。

この課題では、並べ替えやフィルタを活用して、出力結果を目的の情報に絞り込む練習になります。

課題の答え
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 1

    Directory: C:\Users\captain\Documents\captain-cabin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/4/2024  12:37 PM           2116 ship-flag.txt

今回紹介するフィルタ系コマンドレットの最後は「Select-String」です。

このコマンドレットは、ファイル内のテキストパターンを検索するために使われます。Unix系システムの「grep」や、Windowsのコマンドプロンプトにある「findstr」と同じような働きをします。

ログファイルやドキュメントの中から特定の内容を探したいときによく使われる便利なコマンドレットです。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Select-String -Path ".\captain-hat.txt" -Pattern "hat" 

captain-hat.txt:8:Don't touch my hat!

Select-String コマンドレットは、正規表現(regex)に完全対応しています。

この高度な機能を使うことで、より複雑なパターンでの検索が可能になり、ファイル内のテキストデータを柔軟かつ強力に調査・分析することができます。

Answer the questions below

How would you retrieve the items in the current directory with size greater than 100? [for the sake of this question, avoid the use of quotes (" or ') in your answer]

Get-ChildItem | Where-Object -Property Length -gt 100

System and Network Information

PowerShellは、システム管理者やIT技術者のために、より強力な自動化および管理ツールが必要とされていたことを背景に開発されました。

そのため、システムの構成やネットワーク設定などに関する詳細な情報を取得できるコマンドレットが数多く用意されています。

その中のひとつ「Get-ComputerInfo」は、オペレーティングシステムの情報、ハードウェアの仕様、BIOSの詳細など、システム全体の構成情報を一括で取得できるコマンドレットです。

従来の「systeminfo」コマンドも似た機能を持ちますが、取得できる情報は限定的であり、「Get-ComputerInfo」の方がはるかに多くの詳細を提供します。

Terminal
PS C:\Users\captain> Get-ComputerInfo

WindowsBuildLabEx                                       : 20348.859.amd64fre.fe_release_svc_prod2.220707-1832
WindowsCurrentVersion                                   : 6.3
WindowsEditionId                                        : ServerDatacenter
WindowsInstallationType                                 : Server Core
WindowsInstallDateFromRegistry                          : 4/23/2024 6:36:29 PM
WindowsProductId                                        : 00454-60000-00001-AA763
WindowsProductName                                      : Windows Server 2022 Datacenter
[...]

ローカルユーザーアカウントの管理や、システムのセキュリティ設定を把握するうえで重要なのが「Get-LocalUser」コマンドレットです。

このコマンドを使うと、システム上に存在するすべてのローカルユーザーアカウントを一覧表示できます。

標準の出力では、各ユーザーについて「ユーザー名」「アカウントの状態」「説明」などの情報が表示されます。

Terminal
PS C:\Users\captain> Get-LocalUser

Name               Enabled Description 
----               ------- -----------
Administrator      True    Built-in account for administering the computer/domain
captain            True    The beloved captain of this pirate ship.
DefaultAccount     False   A user account managed by the system.
Guest              False   Built-in account for guest access to the computer/domain
WDAGUtilityAccount False   A user account managed and used by the system for Windows Defender Application Guard scenarios.

従来の「ipconfig」コマンドと同様に、システムのネットワーク構成に関する詳細な情報を取得するためのコマンドレットがいくつか用意されています。

そのひとつが「Get-NetIPConfiguration」です。このコマンドレットを使うと、IPアドレス、DNSサーバー、デフォルトゲートウェイなど、ネットワークインターフェースに関する詳細な情報を確認することができます。

Terminal
PS C:\Users\captain> Get-NetIPConfiguration

InterfaceAlias       : Ethernet
InterfaceIndex       : 5
InterfaceDescription : Amazon Elastic Network Adapter
NetProfile.Name      : Network 3
IPv4Address          : 10.10.178.209
IPv6DefaultGateway   :
IPv4DefaultGateway   : 10.10.0.1
DNSServer            : 10.0.0.2

ネットワークインターフェースに割り当てられているIPアドレスの詳細を確認したい場合は、「Get-NetIPAddress」コマンドレットを使用します。

このコマンドレットを実行すると、現在アクティブでないものも含めて、システムに設定されているすべてのIPアドレスの情報が表示されます。

Terminal
PS C:\Users\captain> Get-NetIPAddress

IPAddress         : fe80::3fef:360c:304:64e%5
InterfaceIndex    : 5
InterfaceAlias    : Ethernet
AddressFamily     : IPv6
Type              : Unicast
PrefixLength      : 64
PrefixOrigin      : WellKnown
SuffixOrigin      : Link
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : ::1
InterfaceIndex    : 1
InterfaceAlias    : Loopback Pseudo-Interface 1
AddressFamily     : IPv6
[...]

IPAddress         : 10.10.178.209
InterfaceIndex    : 5
InterfaceAlias    : Ethernet
AddressFamily     : IPv4
[...]

IPAddress         : 127.0.0.1
InterfaceIndex    : 1
InterfaceAlias    : Loopback Pseudo-Interface 1
AddressFamily     : IPv4
[...]

これらのコマンドレットを使うことで、IT担当者は重要なシステム情報やネットワーク情報をコマンドラインから素早く取得できます。

その結果、ローカルマシンだけでなく、リモートマシンの監視や管理もより効率的に行えるようになります。

Answer the questions below

Other than your current user and the default "Administrator" account, what other user is enabled on the target machine?

p1r4t3

This lad has hidden his account among the others with no regard for our beloved captain! What is the motto he has so bluntly put as his account's description?

A merry life and a short one.

Now a small challenge to put it all together. This shady lad that we just found hidden among the local users has his own home folder in the "C:\Users" directory. 

Can you navigate the filesystem and find the hidden treasure inside this pirate's home?

THM{p34rlInAsh3ll}

Real-Time System Analysis

より高度なシステム情報、特に実行中のプロセスやサービス、アクティブなネットワーク接続といった動的な情報を取得するには、静的なマシン情報とは異なる一連のコマンドレットを活用することができます。

そのひとつ「Get-Process」は、現在実行中のすべてのプロセスを詳細に表示し、CPU使用率やメモリ使用量なども確認できます。システムの監視やトラブルシューティングに非常に便利なコマンドレットです。

Terminal
PS C:\Users\captain> Get-Process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName 
-------  ------    -----      -----     ------     --  -- -----------
     67       5      872        500       0.06   2340   0 AggregatorHost
     55       5      712       2672       0.02   3024   0 AM_Delta_Patch_1.417.483.0
    309      13    18312       1256       0.52   1524   0 amazon-ssm-agent
     78       6     4440        944       0.02    516   0 cmd
     94       7     1224       1744       0.31    568   0 conhost
[...]

同様に「Get-Service」コマンドレットを使うと、システム上のサービスの状態に関する情報を取得できます。たとえば、どのサービスが実行中か、停止中か、一時停止中かといった情報が確認できます。

このコマンドは、システム管理者によるトラブルシューティングに広く使われているだけでなく、フォレンジックの現場でも、異常なサービスがインストールされていないかを調べる目的で活用されています。

Terminal
PS C:\Users\captain> Get-Service

Status   Name               DisplayName                           
------   ----               -----------
Stopped  Amazon EC2Launch   Amazon EC2Launch
Running  AmazonSSMAgent     Amazon SSM Agent
Stopped  AppIDSvc           Application Identity
Running  BFE                Base Filtering Engine
Running  CertPropSvc        Certificate Propagation
Stopped  ClipSVC            Client License Service (ClipSVC)
[...]

アクティブなネットワーク接続を監視するには、「Get-NetTCPConnection」コマンドレットを使います。

このコマンドレットは、現在のTCP接続を一覧表示し、ローカルおよびリモートの接続先情報を確認することができます。

インシデント対応やマルウェア解析の場面でも非常に役立つコマンドで、外部の攻撃者が管理するサーバーとの隠れた接続やバックドアの存在を発見する手がかりになります。

Terminal
PS C:\Users\captain> Get-NetTCPConnection

LocalAddress        LocalPort RemoteAddress       RemotePort State       AppliedSetting OwningProcess 
------------        --------- -------------       ---------- -----       -------------- -------------
[...]
::                  22        ::                  0          Listen                     1444          
10.10.178.209       49695     199.232.26.172      80         TimeWait                   0
0.0.0.0             49668     0.0.0.0             0          Listen                     424
0.0.0.0             49667     0.0.0.0             0          Listen                     652
0.0.0.0             49666     0.0.0.0             0          Listen                     388
0.0.0.0             49665     0.0.0.0             0          Listen                     560
0.0.0.0             49664     0.0.0.0             0          Listen                     672           
0.0.0.0             3389      0.0.0.0             0          Listen                     980
10.10.178.209       139       0.0.0.0             0          Listen                     4
0.0.0.0             135       0.0.0.0             0          Listen                     908
10.10.178.209       22        10.14.87.60         53523      Established Internet       1444
0.0.0.0             22        0.0.0.0             0          Listen                     1444

さらに、ファイルのハッシュ値を生成するための便利なコマンドレットとして「Get-FileHash」も紹介しておきます。

このコマンドは、ファイルの整合性を確認したり、改ざんの有無を調べたりするのに役立つため、インシデント対応や脅威ハンティング、マルウェア解析などの場面で特に有用です。

Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-FileHash -Path .\ship-flag.txt    

Algorithm       Hash                      Path 
---------       ----                      ----
SHA256          54D2EC3C12BF3D[...]       C:\Users\captain\Documents\captain-cabin\ship-flag.txt

これらのコマンドレットを組み合わせて使うことで、リアルタイムなシステム監視や分析に必要なツール群が揃います。

特に、インシデント対応や脅威ハンティングを行う担当者にとって、非常に有用な手段となります。

Answer the questions below

In the previous task, you found a marvellous treasure carefully hidden in the target machine. What is the hash of the file that contains it?

71FC5EC11C2497A32F8F08E61399687D90ABE6E204D2964DF589543A613F3E08

【補足】

Get-FileHashの出力が途中で省略されてしまう場合、Format-List を使って出力を縦表示にするのが良い。

(例)Get-FileHash -Path .\big-treasure.txt | Format-List

What property retrieved by default by Get-NetTCPConnection contains information about the process that has started the connection?

OwningProcess

It's time for another small challenge. Some vital service has been installed on this pirate ship to guarantee that the captain can always navigate safely. But something isn't working as expected, and the captain wonders why. Investigating, they find out the truth, at last: the service has been tampered with! The shady lad from before has modified the service DisplayName to reflect his very own motto, the same that he put in his user description.

With this information and the PowerShell knowledge you have built so far, can you find the service name?

p1r4t3-s-compass

Scripting

スクリプティングとは、シェル(ここではPowerShell)の中で通常手動で行っていた操作を、自動化するためにテキストファイル(スクリプト)として一連のコマンドを書き、実行することを指します。

簡単に言えば、スクリプトはコンピューターに渡す「やることリスト」のようなもので、スクリプトの各行は実行するタスクを意味します。これにより、作業の手間が省けるだけでなく、ヒューマンエラーのリスクも減り、手作業では難しい処理も自動で実行できるようになります。

スクリプトやシェルの知識を深めるにつれて、スクリプトがシステム管理やデータ処理など、さまざまな場面で非常に強力なツールとなることがわかってきます。

このルームではPowerShellスクリプトの書き方までは扱いませんが、その強力さから、サイバーセキュリティ分野では非常に重要なスキルであることは理解しておくべきです。

【Blue Team(防御側)の活用例】

インシデントレスポンダー、マルウェア解析者、脅威ハンターなどのBlue Team担当者にとって、PowerShellスクリプトは以下のような作業を自動化する手段になります。

  • ログの分析
  • 異常検出
  • 攻撃の痕跡(IOC)の抽出
  • マルウェアのリバースエンジニアリング
  • システム全体のスキャン処理など

【Red Team(攻撃側)の活用例】

ペネトレーションテスターや倫理的ハッカーなどのRed Teamにとっても、PowerShellは有効です。

  • システム情報の列挙(エニュメレーション)
  • リモートコマンドの実行
  • 防御回避のための難読化スクリプトの作成
  • システムの耐性テストや模擬攻撃

【システム管理者の活用例】

システム管理者にとっても、PowerShellスクリプトは以下のような場面で役立ちます。特にリモート環境や大規模ネットワークでその力を発揮します。

  • システム整合性のチェック自動化
  • 構成管理やネットワークの保護
  • セキュリティポリシーの適用
  • システムの状態監視やインシデント対応の自動化

このように、防御・攻撃どちらの立場でも、PowerShellスクリプティングはサイバーセキュリティにおける必須スキルの一つです。

【Invoke-Commandの紹介】

スクリプティングの話題を締めくくる前に、もうひとつ重要なコマンドレットを紹介しておきます。それが「Invoke-Command」です。

Invoke-Command は、リモートマシンでコマンドを実行するためのコマンドレットです。

システム管理者、セキュリティエンジニア、ペネトレーションテスターなどにとって不可欠な機能であり、複数のマシンに対して一括で処理を実行したり、スクリプトと組み合わせて自動化したりすることができます。

ペネトレーションテストや攻撃の現場では、ターゲットマシン上でのペイロードやコマンドの実行にも使われます。

それでは、次にこの強力な Invoke-Command の使用例を、Get-Help コマンドの "examples" ページで確認してみましょう。

Terminal
PS C:\Users\captain> Get-Help Invoke-Command -examples

NAME
    Invoke-Command
    
SYNOPSIS
    Runs commands on local and remote computers.
    
    ------------- Example 1: Run a script on a server -------------
    
    Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01
    
    The FilePath parameter specifies a script that is located on the local computer. The script runs on the remote computer and the results are returned to the local computer.

    --------- Example 2: Run a command on a remote server ---------

    Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }

    The ComputerName parameter specifies the name of the remote computer. The Credential parameter is used to run the command in the security context of Domain01\User01, a user who has permission to run commands. The ScriptBlock parameter specifies the command to be run on the remote computer.

    In response, PowerShell requests the password and an authentication method for the User01 account. It then runs the command on the Server01 computer and returns the result.
[...]

Get-Help コマンドの "examples" ページにある最初の2つの例だけでも、Invoke-Command コマンドレットのシンプルさと強力さを理解するには十分です。

最初の例では、Invoke-Command を任意のスクリプトと組み合わせて使うことで、リモートコンピューター上での処理を簡単に自動化できることが示されています。

2つ目の例では、スクリプトを書く技術がなくても Invoke-Command を使えることが示されています。コマンドに -ScriptBlock { ... } を追加することで、リモートマシン上で任意のコマンドやコマンドの連続実行が可能になります。

その結果は、リモートマシンの PowerShell セッションで直接コマンドを入力した場合と同じように動作します。

Answer the questions below

What is the syntax to execute the command Get-Service on a remote computer named "RoyalFortune"? Assume you don't need to provide credentials to establish the connection. [for the sake of this question, avoid the use of quotes (" or ') in your answer]

Invoke-Command -ComputerName RoyalFortune -ScriptBlock { Get-Service }

Conclusion

お見事です、諸君!
PowerShellという荒波を無事に乗り越え、TheBlackPearl号に隠された財宝や謎のサービスを見つけ出すことに成功しました。

ここまで習得したツールがあれば、どんなWindowsシステムの奥深くも探検する準備は万端です。

覚えておいてください。真の探求者(海賊)は、決して学びを止めません。これからもスキルを磨き続けていけば、きっと次の冒険でも新たな「真珠」が見つかるはずです。

それでは、コマンドレットが鋭く、スクリプトが素早く動作することを祈っています。
よい航海を。そして、さらなる発見を!

このままコマンドラインスキルを高めたい方は、次の学習ステップである「Linuxコマンドライン」ルームへ進んでください。

出典:Windows PowerShell