ラベル TryHackMe の投稿を表示しています。 すべての投稿を表示
ラベル TryHackMe の投稿を表示しています。 すべての投稿を表示

【TryHackMeウォークスルー】Networking Concepts

 

Introduction

ネットワークの基本概念 ― TryHackMe「Networking Concepts」

インターネットに接続するためにIPアドレスが必要なのはなぜでしょうか?
IPアドレスは本当にユーザーを一意に特定できるのでしょうか?
また、1つのパケットがどのようにやり取りされるのか気になったことはありませんか?

もし答えが「はい」なら、この学習ルームで一緒に探ってみましょう!

4部構成シリーズの第1ステップ

このルームは、ネットワークの重要な概念や代表的なプロトコルを学ぶためのシリーズの最初のステップです。

事前知識

このルームでは「IPアドレス」や「TCPポート番号」といった用語を知っていることを前提としています。
ただし、それらを専門的に説明できる必要はありません。
もし全く馴染みがない場合は、Pre Securityパスから始めるのがおすすめです。

学習目標

このルームを終える頃には、次の内容を理解できるようになります。

  • ISO/OSIネットワークモデル

  • IPアドレス、サブネット、ルーティングの基本

  • TCPとUDPの仕組み、ポート番号の役割

  • コマンドラインから開いているTCPポートに接続する方法


OSI Model

最初に断っておきますが、OSIモデルは一見すると複雑に思えるかもしれません。ですが安心してください。難解な略語に出会っても、このモジュールでは具体的な例を交えて解説しています。学習を終える頃には、OSIモデルの理解がぐっと身近なものになっているはずです。

OSIモデルとは?

OSI(Open Systems Interconnection)モデルは、ISO(国際標準化機構)が策定した「コンピュータネットワークで通信がどのように行われるべきか」を示す概念モデルです。
理論的な枠組みではありますが、ネットワークの基礎を深く理解するためには欠かせないものです。OSIモデルは次の7階層で構成されています。

  1. Physical Layer(物理層)

  2. Data Link Layer(データリンク層)

  3. Network Layer(ネットワーク層)

  4. Transport Layer(トランスポート層)

  5. Session Layer(セッション層)

  6. Presentation Layer(プレゼンテーション層)

  7. Application Layer(アプリケーション層)

下から順に番号が振られており、最下層の物理層がレイヤー1、最上層のアプリケーション層がレイヤー7です。





各レイヤーの解説

Layer 1: Physical Layer(物理層)
デバイス同士を物理的に接続する役割を担います。電気信号・光信号・無線信号などの伝送方式や、ビット(0と1)の定義がここで扱われます。
媒介となるのはイーサネットケーブル、光ファイバー、WiFiの電波帯(2.4GHz/5GHz/6GHz)などです。


Layer 2: Data Link Layer(データリンク層)
同一ネットワークセグメント内のノード間通信を規定します。例えば、オフィス内の10台のPCを1台のスイッチに接続した場合、それが1つのネットワークセグメントです。
代表例はEthernet(IEEE 802.3)やWiFi(IEEE 802.11)。アドレスとしてMACアドレスを使用します。MACアドレスは6バイト(48ビット)で構成され、左の3バイトはベンダー識別子です。実際の通信では送信元と宛先の2つのMACアドレスが含まれます。


Layer 3: Network Layer(ネットワーク層)
異なるネットワーク間でデータを転送します。論理アドレス(IPアドレス)とルーティングが中心の役割です。
例として、複数の都市や国に分散したオフィスを接続するのがこの層です。代表的なプロトコルはIP、ICMP、VPN(IPSec、SSL/TLSなど)。


Layer 4: Transport Layer(トランスポート層)
アプリケーション同士のエンドツーエンド通信を提供します。通信の信頼性確保や誤り訂正、分割と再構築を担当します。
代表的なプロトコルはTCPとUDPです。

Layer 5: Session Layer(セッション層)
アプリケーション間の通信セッションを確立・維持・同期します。データが正しい順序で届くよう管理し、障害時には回復手段を提供します。
例:NFS(Network File System)、RPC(Remote Procedure Call)。

Layer 6: Presentation Layer(プレゼンテーション層)
データをアプリケーション層が理解できる形式に変換します。エンコード、圧縮、暗号化がこの層の役割です。
例:文字コード(ASCII、Unicode)、画像形式(JPEG、PNG、GIF)、電子メールで利用されるMIME(Base64でのエンコード)。

Layer 7: Application Layer(アプリケーション層)
最上位層であり、ユーザーが直接利用するアプリケーションにサービスを提供します。
代表的なプロトコルはHTTP、FTP、DNS、POP3、SMTP、IMAPなどです。


まとめ

OSIモデルを初めて学ぶと難しく感じるかもしれませんが、ネットワークプロトコルを学習するうちに自然と理解が深まります。以下に各層を表で整理しました。

レイヤー番号レイヤー名主な役割代表的なプロトコル・規格
Layer 7Application layerアプリケーションへのサービス提供HTTP, FTP, DNS, POP3, SMTP, IMAP
Layer 6Presentation layerデータの変換・暗号化・圧縮Unicode, MIME, JPEG, PNG, MPEG
Layer 5Session layerセッションの確立・維持・同期NFS, RPC
Layer 4Transport layerエンドツーエンド通信・分割/誤り訂正TCP, UDP
Layer 3Network layer論理アドレスとルーティングIP, ICMP, IPSec
Layer 2Data link layer同一セグメント内の通信制御Ethernet (802.3), WiFi (802.11)
Layer 1Physical layer物理的なデータ伝送媒体電気信号、光信号、無線信号

Answer the questions below


Which layer is responsible for end-to-end communication between running applications?
4

Which layer is responsible for routing packets to the proper network?
3

In the OSI model, which layer is responsible for encoding the application data?
6

Which layer is responsible for transferring data between hosts on the same network segment?
2

TCP/IP Model

ISO OSIモデルという概念的なモデルを学んだので、今度は実際に実装されたモデルである TCP/IP Model を見ていきましょう。
TCP/IPとは Transmission Control Protocol / Internet Protocol の略で、1970年代に米国国防総省(DoD)によって開発されました。軍がなぜこのようなモデルを作ったのか、不思議に思うかもしれません。その理由のひとつは、ネットワークの一部が停止しても全体が機能し続けられる仕組みを実現するためです。例えば戦時中の攻撃によって一部が破壊されても、ルーティングプロトコルがネットワーク構成の変化に適応し、通信が継続できるよう設計されているのです。


OSIモデルとの違い

OSIモデルはレイヤー1からレイヤー7まで下から上に積み上げる形で説明しましたが、ここでは逆に上から順に見ていきます。TCP/IPモデルでは次のように整理されます。

  • Application Layer: OSIモデルのアプリケーション層・プレゼンテーション層・セッション層(レイヤー5〜7)をまとめたもの

  • Transport Layer: OSIモデルのトランスポート層(レイヤー4)

  • Internet Layer: OSIモデルのネットワーク層(レイヤー3)に相当

  • Link Layer: OSIモデルのデータリンク層(レイヤー2)


対応関係の表

レイヤー番号ISO OSI ModelTCP/IP Model (RFC 1122)主なプロトコル
7Application LayerApplication LayerHTTP, HTTPS, FTP, POP3, SMTP, IMAP, Telnet, SSH
6Presentation Layer
5Session Layer
4Transport LayerTransport LayerTCP, UDP
3Network LayerInternet LayerIP, ICMP, IPSec
2Data Link LayerLink LayerEthernet (802.3), WiFi (802.11)
1Physical Layer

4層モデルと5層モデル

RFC 1122ではTCP/IPは上記のように4層モデルとして説明されますが、近年のネットワーク教科書では5層モデルとして紹介されることも多くなっています。

  • Application

  • Transport

  • Network

  • Link

  • Physical


Answer the questions below


To which layer does HTTP belong in the TCP/IP model?
Application Layer

How many layers of the OSI model does the application layer in the TCP/IP model cover?
3

IP Addresses and Subnets

IPアドレスとは?

「IPアドレス」と聞いて、192.168.0.1172.16.159.243 といった数字を思い浮かべる人も多いでしょう。どちらも正解で、これは IPv4アドレス の例です。

ネットワーク上のすべてのホスト(PCやスマホなど)は、他のホストと通信するために一意の識別子が必要です。もし識別子がなければ、誰が誰なのか分からず通信が成り立ちません。TCP/IP環境では、この識別子が「IPアドレス」になります。

IPアドレスは郵便住所に例えると分かりやすいでしょう。住所があるからこそ世界中から手紙や荷物を受け取れます。住所がなければ、ネットショッピングもできませんよね。

現在は IPv4IPv6 の2種類がありますが、一般的に「IP」といえばIPv4を指すことが多いです。


IPv4アドレスの仕組み

IPv4アドレスは 32ビット(4オクテット) で構成され、それぞれのオクテットは0〜255までの数値を表します。


例:

  • 192.168.1.0 → ネットワークアドレス

  • 192.168.1.255 → ブロードキャストアドレス(ネットワーク全体宛て)

この仕組みから、IPv4アドレスは理論上約42億個(2³²)までしか作れません。


IPアドレスの確認方法

自分のIPアドレスは簡単に確認できます。

  • Windows: ipconfig

Terminal
user@TryHackMe$ ifconfig
[...]
wlo1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.66.89  netmask 255.255.255.0  broadcast 192.168.66.255
        inet6 fe80::73e1:ca5e:3f93:b1b3  prefixlen 64  scopeid 0x20<link>
        ether cc:5e:f8:02:21:a7  txqueuelen 1000  (Ethernet)
        RX packets 19684680  bytes 18865072842 (17.5 GiB)
        RX errors 0  dropped 364  overruns 0  frame 0
        TX packets 14439678  bytes 8773200951 (8.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • Linux / Unix系: ifconfig または ip address show(省略形 ip a s

Terminal
user@TryHackMe$ ip a s
[...]
4: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether cc:5e:f8:02:21:a7 brd ff:ff:ff:ff:ff:ff
    altname wlp3s0
    inet 192.168.66.89/24 brd 192.168.66.255 scope global dynamic noprefixroute wlo1
       valid_lft 36795sec preferred_lft 36795sec
    inet6 fe80::73e1:ca5e:3f93:b1b3/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

同じ情報を /24 のように表すこともあります。192.168.66.89/24 は「上位24ビットが同じネットワーク」を意味し、192.168.66.1192.168.66.254 が利用可能になります。


Private Addresses(プライベートアドレス)

IPアドレスには大きく分けて パブリックIPプライベートIP の2種類があります。

プライベートIPは外部インターネットから直接アクセスできない「閉じた空間」での通信に使われます。例えばマンションの部屋番号のように、内部では便利に使えるけれど外部からは直接届かないイメージです。

RFC 1918で定義されている範囲は以下の3つです:

  • 10.0.0.0 ~ 10.255.255.255 (10/8)

  • 172.16.0.0 ~ 172.31.255.255 (172.16/12)

  • 192.168.0.0 ~ 192.168.255.255 (192.168/16)

外部に出るときは、ルーターがパブリックIPを持ち、NAT(アドレス変換)によって通信します。


Routing(ルーティング)

ルーターは郵便局のようなものです。郵便物の宛先を見て「次はどこに送るか」を判断します。もし宛先が海外なら、地域の郵便局から中央の国際郵便局へ、そこから相手国へと渡されます。

同様に、ルーターはパケットのIPアドレスを確認し、目的地へ近づくように最適な経路に転送します。最終的に目的地へ届くまでに、パケットは複数のルーターを経由することが普通です。


Answer the questions below


Which of the following IP addresses is not a private IP address?
・192.168.250.125
・10.20.141.132
・49.69.147.197
・172.23.182.251
49.69.147.197

Which of the following IP addresses is not a valid IP address?
・192.168.250.15
・192.168.254.17
・192.168.305.19
・192.168.199.13
192.168.305.19

UDP and TCP

IPプロトコルによって、ネットワーク上の宛先ホストに到達できます。ホストはIPアドレスで識別されますが、実際にやり取りを行うのはホスト上の「プロセス同士」です。そのためにはトランスポート層のプロトコルが必要であり、代表的なのが UDPTCP です。


UDP

UDP(User Datagram Protocol) は、対象ホスト上の特定のプロセスにデータを届ける仕組みを提供します。トランスポート層(レイヤー4)で動作するシンプルなコネクションレス型プロトコルで、通信の前に接続を確立する必要がありません。さらに、送信したパケットが実際に届いたかどうかを確認する仕組みも持ちません。

ホストを識別するのはIPアドレスですが、どのプロセスに送るかを識別するにはポート番号を使います。ポート番号は2オクテットで表されるため範囲は 1〜65535 となり、0番は予約されています。

UDPは「普通郵便」のようなものです。荷物を送っても配達証明はなく、届いたかどうか分かりません。その代わり、安価で迅速に送れるのが利点です。同じようにUDPも、確認の仕組みがない分、高速に処理できるというメリットがあります。

ただし、「確実に届いたことを保証したい」場合はUDPではなくTCPを使います。


TCP

TCP(Transmission Control Protocol) は、コネクション型のトランスポート層プロトコルです。通信を始める前に接続を確立し、データを正確に届ける仕組みを備えています。UDPと同じくレイヤー4で動作しますが、TCPは信頼性を重視しているのが大きな違いです。

TCPでは、送信するデータの各オクテットにシーケンス番号を割り当てます。受信側はその番号を確認することで、データが欠落していないか、重複していないかを判断できます。また、受信側は「どこまで受け取ったか」を示す**ACK(確認応答番号)**を返します。

TCP接続は「3ウェイハンドシェイク」と呼ばれる3段階のやり取りで確立されます。

  1. SYNパケット: クライアントが接続要求を出し、自分の初期シーケンス番号をサーバに送る。

  2. SYN-ACKパケット: サーバが応答として、自分の初期シーケンス番号を含めて返す。

  3. ACKパケット: クライアントが受信確認を送り、接続が確立される。

この3つのパケット交換によって、安全に通信を始められる状態になります。

TCPでもプロセスの識別にはUDPと同じく**ポート番号(1〜65535、0は予約)**を使用します。


Answer the questions below


Which protocol requires a three-way handshake?
TCP

What is the approximate number of port numbers (in thousands)?
65

Encapsulation

最後にもう一つ重要な概念である Encapsulation(カプセル化) を説明しましょう。
ここでのカプセル化とは、各レイヤーが受け取ったデータにヘッダー(場合によってはトレーラーも)を付加し、下位のレイヤーへ渡す処理を意味します。

この仕組みによって、各レイヤーは自分の役割に専念できるようになります。以下のような流れで進みます。

  1. Application data
    ユーザーがアプリケーションにデータを入力するところから始まります。例えばメールやメッセージを送信する操作です。アプリケーションはデータを整形し、下位のトランスポート層へ渡します。

  2. Transport protocol segment or datagram
    トランスポート層(TCPまたはUDP)がヘッダーを追加し、TCPセグメント(またはUDPデータグラム)を生成します。そして下位のネットワーク層に渡します。

  3. Network packet
    ネットワーク層(インターネット層)は、受け取ったTCPセグメントまたはUDPデータグラムにIPヘッダーを付け、IPパケットを作成します。これをさらに下位のデータリンク層に渡します。

  4. Data link frame
    データリンク層(EthernetやWiFi)は、受け取ったIPパケットにヘッダーとトレーラーを追加して「フレーム」を作成します。


つまり、アプリケーションデータ → TCP/UDPセグメント → IPパケット → データリンクフレーム、という順にカプセル化されていきます。そして受信側では逆の手順でヘッダーやトレーラーを取り除き、最終的にアプリケーションデータが取り出されます。


The Life of a Packet(パケットの一生)

これまで学んだ内容をもとに、簡単な例でパケットがどのように流れるかを見てみましょう。
シナリオ:あなたがTryHackMeで部屋を検索するとき。

  1. ブラウザで検索ページにクエリを入力し、Enterを押す。

  2. ブラウザはHTTPSを利用し、HTTPリクエストを作成してトランスポート層に渡す。

  3. TCP層は、ブラウザとTryHackMeサーバの間で3ウェイハンドシェイクを行い接続を確立。その後、検索クエリを含むHTTPリクエストを送信する。各TCPセグメントはネットワーク層へ渡される。

  4. IP層は送信元(自分のPC)と宛先(TryHackMeサーバ)のIPアドレスを追加し、パケットをデータリンク層に渡す。

  5. データリンク層はヘッダーとトレーラーを付け、パケットをルーターに送る。

  6. ルーターはデータリンク層のヘッダーとトレーラーを取り除き、IPアドレスなどを確認して次の経路へ転送する。この処理を繰り返し、最終的に宛先サーバのルーターに到達する。

  7. 宛先のネットワークに着いた後は、逆の手順でカプセルを剥がし、HTTPリクエストがサーバのアプリケーションに届く。

この流れが、パケットが生きて動く「一生」の簡略版です。後の学習でさらに詳しいバージョンを扱っていきます。


Answer the questions below

On a WiFi, within what will an IP packet be encapsulated?
Frame

What do you call the UDP data unit that encapsulates the application data?
Datagram

What do you call the data unit that encapsulates the application data sent over TCP?
Segment

Telnet

まずは下の Start Machine ボタンを押して仮想マシンを起動しましょう。

続いて、画面上部にある Start AttackBox ボタンを押すと AttackBox が起動します。デフォルトではスプリット画面で表示されますが、見えない場合は上部の Show Split View ボタンをクリックしてください。

両方のマシンが起動するまでに約2分かかります。準備ができたら、AttackBox上でターミナルを起動し、telnet を試していきます。


Telnetとは

TELNET(Teletype Network) プロトコルは、リモート端末に接続するためのネットワークプロトコルです。簡単に言うと、telnetクライアントを使うと、リモートのシステムに接続してテキストコマンドを送信できるという仕組みです。

もともとはリモート管理に使われていましたが、実際には任意のサーバのTCPポートに接続して通信を試すことができます。

今回の演習では、ターゲット仮想マシン上で動作している以下のサービスに接続してみます。

  • Echoサーバ: 送信した内容をそのまま返すサーバ。デフォルトはポート7。

  • Daytimeサーバ: 現在の日付と時刻を返すサーバ。デフォルトはポート13。

  • Web (HTTP) サーバ: ウェブページを返すサーバ。デフォルトはTCPポート80。

※ EchoサーバとDaytimeサーバはセキュリティリスクとされ、通常は利用されませんが、ここでは学習目的で起動しています。


Echoサーバへの接続

次のコマンドでターゲットVMのEchoサーバ(ポート7)に接続します。終了する際は CTRL + Shift + ] を押してから quit と入力します。

Terminal
user@TryHackMe$ telnet 10.201.63.253 7
telnet 10.201.63.253 7
Trying 10.201.63.253...
Connected to 10.201.63.253.
Escape character is '^]'.
Hi
Hi
How are you?
How are you?
Bye
Bye
^]

telnet> quit
Connection closed.

Daytimeサーバへの接続

次に、Daytimeサーバ(ポート13)に接続します。接続すると現在の日時が返され、自動的に切断されます。

Terminal
user@TryHackMe$ telnet 10.201.63.253 13
Trying 10.201.63.253...
Connected to 10.201.63.253.
Escape character is '^]'.
Thu Jun 20 12:36:32 PM UTC 2024
Connection closed by foreign host.

HTTPリクエストの送信

最後に、HTTPサーバ(ポート80)に接続してウェブページを取得してみます。接続後に以下のコマンドを入力してください。

GET / HTTP/1.1 Host: telnet.thm

その後、Enterを2回押して空行を送るとリクエストが完了します。応答例は以下の通りです(一部省略)。

Terminal
user@TryHackMe$ telnet 10.201.63.253 80
Trying 10.201.63.253...
Connected to 10.201.63.253.
Escape character is '^]'.
GET / HTTP/1.1
Host: telnet.thm

HTTP/1.1 200 OK
Content-Type: text/html
[...]

Connection closed by foreign host.

※ 応答が返らない場合は、コマンド入力後にもう一度 Enter を押してください。

Answer the questions below

Use telnet to connect to the web server on 10.201.63.253. What is the name and version of the HTTP server?
lighttpd/1.4.63

What flag did you get when you viewed the page?
THM{TELNET_MASTER}

Conclusion

このルームでは、ISO OSIモデルTCP/IPモデル を比較しながら解説しました。さらに、IPアドレスとサブネット、そしてルーティングの基本について触れました。加えて、TCPとUDP の違いを学び、Encapsulation(カプセル化) の仕組みも整理しました。

実演としては、telnet を利用し、TCPを介してさまざまなサーバと通信する方法を試しました。

これで Networking Concepts を完了です。次はぜひ、ステップアップとして Networking Essentials に進みましょう。

【TryHackMeウォークスルー】Linux Shells

 

Introduction to Linux Shells


普段、私たちがパソコンやスマートフォンを操作するとき、多くの場合は グラフィカルユーザーインターフェース(GUI) を使っています。アイコンやメニューをクリックすれば、簡単に作業が完了します。

しかし、実はGUIを使わなくても、コマンドライン(CLI)に命令を入力することで、ほとんどの操作を実行することができます。シェルはCLIで入力したコマンドを解釈して実行してくれる仕組みであり、これにより効率的で軽量な操作が可能になります。


レストランの例え

Linuxシステムを理解するために、レストランを例に考えてみましょう。

  • GUIを使う場合 → メニューを見て料理を注文し、店員さんが持ってきてくれる。

  • CLIを使う場合 → 自分で厨房(OS)に入って料理を作る。

このときシェルは、料理を作るときの「レシピ」を教えてくれる存在です。CLIを通して操作すると、より自由度が高く、細かいコントロールができるようになります。


映画のハッカーシーンとの関係

映画やドラマで、黒い画面にコマンドが次々と流れる「ハッキングシーン」を見たことがあるかもしれません。これは多くのLinuxユーザーが、GUIよりもシェルを使ったCLI操作を好んで行っているためです。

このルームでは、実際にLinuxシェルと対話する方法を学び、利用可能なシェルの種類を知り、最後には簡単なシェルスクリプトを書けるようになることを目指します。


学習目標

  • Linuxシェルとの対話方法を学ぶ

  • 基本的なシェルコマンドを使えるようになる

  • Linuxで利用できるシェルの種類を知る

  • 簡単なシェルスクリプトを書けるようになる

Answer the questions below

Who is the facilitator between the user and the OS?

Shell


How To Interact With a Shell?


実習用マシンの起動

このルーム用に、演習で利用する仮想マシン(VM)が用意されています。
まずは下にある 「Start Machine」ボタン を押して、仮想マシンを起動しましょう。マシンは画面分割(split view)で表示されます。

もしマシンが表示されない場合は、画面上部にある青い 「Show Split View」ボタン を押してください。GUI付きの環境が開きます。
また、AttackBoxや自分のVPN接続済み端末から、以下のSSH認証情報を使って接続することも可能です。

THM 接続情報

  • ユーザー名: user

  • パスワード: user@Tryhackme

  • IP: MACHINE_IP

仮想マシンが起動すると、以下のようにシェルのプロンプトが表示され、コマンドを入力できる状態になります。

LinuxShell
user@tryhackme:~$ 

多くのLinuxディストリビューションでは、デフォルトのシェルとして Bash (Bourne Again Shell) が使われています。ただし、実際に起動するシェルはディストリビューションによって異なる場合があります。

※次のタスクでは、Linuxで利用できるさまざまなシェルについて詳しく見ていきます。


基本的なLinuxコマンド

このルームの前提知識として紹介されている Linux Fundamentalsモジュール では、すでに基本的なコマンドを学んでいるはずです。ここでは、その中でも特によく使うコマンドを簡単におさらいしましょう。

1. 現在の作業ディレクトリを確認する (pwd)

シェルで作業する際は、「どのディレクトリで操作するか」が重要です。
ほとんどのLinuxディストリビューションでは、シェルを開くとデフォルトで自分のホームディレクトリに入ります。

現在の作業ディレクトリを確認するには、pwd(Print Working Directory)を実行します。

Check Current Working Directory
user@tryhackme:~$ pwd
/home/user

この例では、現在のディレクトリが /home/user であることが分かります。


2. ディレクトリを移動する (cd)

別のディレクトリに移動するには、cd(Change Directory)を使います。

Change Directory
user@tryhackme:~$ cd Desktop
user@tryhackme:~$/Desktop$

3. ディレクトリの中身を確認する (ls)

GUIではフォルダを開けば中身が見えますが、シェルでは ls コマンドを使います。

List Directory Contents
user@tryhackme:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

4. ファイルの内容を表示する (cat)

テキストファイルの中身を確認するには cat を使います。

Displaying File Contents
user@tryhackme:~$ cat filename.txt
this is a sample file
this is the second line of the file

5. ファイル内の特定の文字列を検索する (grep)

Linuxユーザーに非常に人気があるコマンドが grep です。ファイルの中から特定の単語やパターンを探し出すことができます。

例えば、大きなテキストファイルの中から「THM」という単語を検索する場合は以下のようにします。

Searching a Word In File
user@tryhackme:~$ grep THM dictionary.txt
The flag is THM

出力結果には、その単語を含む行が表示されます。


Answer the questions below

What is the default shell in most Linux distributions?

bash

Which command utility is used to list down the contents of a directory?

ls

Which command utility can help you search for anything in a file?

grep


Types of Linux Shells


Linuxのシェルの種類

Windows OSに「コマンドプロンプト」や「PowerShell」があるように、Linuxにも複数のシェルが存在し、それぞれ異なる機能や特徴を持っています。


現在使用中のシェルを確認する

Linuxディストリビューションには複数のシェルがインストールされています。
自分が今どのシェルを使っているか確認するには、次のコマンドを実行します。

Current Shell
user@tryhackme:~$ echo $SHELL
/bin/bash

利用可能なシェルを確認する

Linuxにインストールされているシェルは /etc/shells ファイルに一覧として記録されています。
以下のコマンドで確認できます。

Available Shells
user@tryhackme:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh

シェルを切り替える

利用可能なシェルは、名前を入力することで切り替えることができます。

Switch Shell
user@tryhackme:~$ zsh
tryhackme% 

デフォルトのシェルを恒久的に変更したい場合は、以下のコマンドを使用します。

chsh -s /usr/bin/zsh

これで次回以降、端末を開いたときに zsh が標準のシェルとして起動します。


主なLinuxシェルと特徴

Linuxには多くの種類のシェルがありますが、ここでは代表的な3つを紹介します。


1. Bourne Again Shell (Bash)

ほとんどのLinuxディストリビューションでデフォルトとして使われているシェルです。
古い shkshcsh などの機能を引き継ぎつつ改良され、多くの機能を備えています。

主な特徴

  • スクリプトの互換性が高く、豊富なドキュメントが存在する

  • タブ補完機能(Tabキーでコマンドを補完)

  • コマンド履歴機能(↑↓キーで過去のコマンドを呼び出し可能)

  • history コマンドで入力履歴を一覧表示できる


2. Friendly Interactive Shell (Fish)

多くのディストリビューションでは標準搭載されていませんが、名前の通りユーザーフレンドリーなシェルです。

主な特徴

  • シンプルな構文で初心者に分かりやすい

  • コマンドの自動スペル修正機能

  • カスタムテーマでプロンプトを自由に変更可能

  • 構文ハイライト機能により、コマンドの役割ごとに色分けされ、エラーも見つけやすい

  • Bashと同様にスクリプト、タブ補完、履歴機能をサポート


3. Z Shell (Zsh)

標準ではインストールされていない場合が多いですが、モダンなシェルとして人気があります。

主な特徴

  • 高度なタブ補完とスクリプト機能

  • Fishと同様のスペル修正機能

  • 豊富なカスタマイズ性(例:oh-my-zshフレームワーク)

  • コマンド履歴や補完など多彩な機能


Bash / Fish / Zsh の比較表

機能BashFishZsh
正式名称Bourne Again ShellFriendly Interactive ShellZ Shell
スクリプト機能高い互換性、豊富なドキュメント機能は制限ありBash機能に加え追加要素
タブ補完基本的な補完過去コマンドに基づく高度な補完プラグインで大幅拡張可能
カスタマイズ基本的なカスタマイズのみインタラクティブツールで簡単に変更可能oh-my-zshなどで高度に可能
ユーザーフレンドリー標準的で慣れやすい最も初心者向けカスタマイズ次第で使いやすさ向上
構文ハイライトなし標準で搭載プラグイン導入で利用可能

まとめ

どのシェルを選ぶかは利用目的や好みによって異なります。
今回紹介した Bash / Fish / Zsh は、Linuxユーザーに特に人気の高いシェルです。
それぞれの特徴を理解し、自分の作業スタイルに合ったものを選びましょう。


Answer the questions below

Which shell comes with syntax highlighting as an out-of-the-box feature?

Fish

Which shell does not have auto spell correction?

Bash

Which command displays all the previously executed commands of the current session?

history


Shell Scripting and Components


シェルスクリプト入門

シェルスクリプトとは?

シェルスクリプトとは、複数のコマンドをまとめて記述したファイル のことです。
例えば、同じ処理を繰り返し行う場合、毎回コマンドを1つずつ入力すると時間がかかります。そこで、必要なコマンドをスクリプトとして保存しておけば、スクリプトを1回実行するだけでまとめて処理を行えます。

前のタスクで紹介したすべてのシェルにはスクリプト機能があります。スクリプトを使うことで、タスクの自動化が可能になります。


スクリプトの作成手順

まずはターミナルを開き、シェルを選択します。ここでは最も一般的な bash を使います。

通常のコマンドとは違い、スクリプトは テキストエディタでファイルを作成 します。拡張子は .sh を付けるのが慣例です。

Create Script File
user@tryhackme:~$ nano first_script.sh

シバン (Shebang)

すべてのスクリプトは シバン (shebang) から始める必要があります。
シバンは #! で始まり、続けてスクリプトを実行するインタプリタを指定します。

例:bashを使う場合

first_script.sh
#!/bin/bash

変数と入力

次の例は、ユーザーに名前を聞いて挨拶する簡単なスクリプトです。

# Defining the Interpreter 
#!/bin/bash
echo "Hey, what’s your name?"
read name
echo "Welcome, $name"
  • read name でユーザー入力を受け取り、変数 name に格納

  • echo で変数を展開し、メッセージを表示

保存は CTRL+X → Y → ENTER で行います。


実行権限の付与と実行

作成したスクリプトには、実行権限を与える必要があります。

Execution Permission to Script
user@tryhackme:~$ chmod +x first_script.sh

実行は ./ を付けて行います。

Script Execution
user@ubuntu:~$ ./first_script.sh
Hey, What's your name?
John
Welcome, John

./ を付けるのは、カレントディレクトリから実行することを明示するためです。


ループ (Loops)

ループとは「繰り返し処理」のことです。例えば、1から10までの数字を順に表示するスクリプトは以下のようになります。

# Defining the Interpreter 
#!/bin/bash
for i in {1..10};
do
echo $i
done
  • for i in {1..10} → 変数 i に1〜10を順に代入

  • do ... done → ループ内で実行する処理を囲む

実行すると以下のように出力されます。

Script Execution
user@tryhackme:~$ ./loop_script.sh
1
2
3

条件分岐 (Conditional Statements)

条件分岐は「特定の条件を満たす場合のみ処理を実行」する仕組みです。
以下は、特定のユーザー名を入力したときだけ秘密を表示する例です。

# Defining the Interpreter 
#!/bin/bash
echo "Please enter your name first:"
read name
if [ "$name" = "Stewart" ]; then
        echo "Welcome Stewart! Here is the secret: THM_Script"
else
        echo "Sorry! You are not authorized to access the secret."
fi

実行例(条件一致)

conditional_script.sh
user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Stewart
Welcome, Stewart! Here is the secret: THM_Script

実行例(条件不一致)

conditional_script.sh
user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Alex
Sorry! You are not authorized to access the secret.

コメント (Comments)

コードが長くなると分かりにくくなるため、コメント を入れて整理します。
コメントは # で始まり、その行は実行されません。

例:条件分岐スクリプトにコメントを追加

# Defining the Interpreter
#!/bin/bash

# Asking the user to enter a value.
echo "Please enter your name first:"

# Storing the user input value in a variable.
read name

# Checking if the name the user entered is equal to our required name.
if [ "$name" = "Stewart" ]; then

# If it equals the required name, the following line will be displayed.
echo "Welcome Stewart! Here is the secret: THM_Script"

# Defining the sentence to be displayed if the condition fails.
else
        echo "Sorry! You are not authorized to access the secret."
fi

コメントを入れることで、後から見返すときや他人に共有するときに理解しやすくなります。


まとめ

  • 変数 を使って値を保存・利用できる

  • ループ で繰り返し処理を自動化できる

  • 条件分岐 で状況に応じた処理を実行できる

  • コメント を使えば、スクリプトの可読性が向上する

シェルスクリプトを使えば、Linuxでの作業を効率的に自動化できます。


Answer the questions below

What is the shebang used in a Bash script?

#!/bin/bash

Which command gives executable permissions to a script?

chmod +x

Which scripting functionality helps us configure iterative tasks?

loops


The Locker Script


総合演習:ロッカースクリプトの作成

前回のタスクでは、変数ループ条件分岐 を学びました。
ここでは、それらを組み合わせて一つの実用的なシェルスクリプトを作成してみましょう。


要件

銀行のロッカーを利用するユーザーを想定します。
ロッカーにアクセスするには本人確認が必要です。
スクリプトを実行すると、以下の3つの入力を求めます。

  • ユーザー名

  • 会社名

  • PINコード

入力が以下と一致した場合のみ、認証を成功としロッカーを開けられるようにします。

  • Username: John

  • Company name: Tryhackme

  • PIN: 7385


スクリプト例

# Defining the Interpreter 
#!/bin/bash 

# Defining the variables
username=""
companyname=""
pin=""

# Defining the loop
for i in {1..3}; do
# Defining the conditional statements
        if [ "$i" -eq 1 ]; then
                echo "Enter your Username:"
                read username
        elif [ "$i" -eq 2 ]; then
                echo "Enter your Company name:"
                read companyname
        else
                echo "Enter your PIN:"
                read pin
        fi
done

# Checking if the user entered the correct details
if [ "$username" = "John" ] && [ "$companyname" = "Tryhackme" ] && [ "$pin" = "7385" ]; then
        echo "Authentication Successful. You can now access your locker, John."
else
        echo "Authentication Denied!!"
fi

実行例

認証失敗のケース:

Executing the Locker Script
user@tryhackme:~$ ./locker_script.sh
Enter your Username:
John
Enter your Company name:
Tryhackme
Enter your PIN:
1349
Authentication Denied!!

正しい情報を入力した場合は、次のように認証が成功します。

Executing the Locker Script
user@tryhackme:~$ ./locker_script.sh
Enter your Username:
John
Enter your Company name:
Tryhackme
Enter your PIN:
7385
Authentication Successful. You can now access your locker, John.


👉 このスクリプトは、変数の利用(入力値の保持)、ループ処理(複数回の入力受付)、条件分岐(入力内容の検証)を組み合わせた実践的な例です。


Answer the questions below

What would be the correct PIN to authenticate in the locker script?

7385


Practical Exercise


付属Ubuntuマシン上のスクリプトについて

このルームに付属のUbuntuマシンでは、デフォルトユーザーのホームディレクトリ/home/user)にスクリプトを配置しています。
このスクリプトは、指定ディレクトリ内の .log 拡張子のファイルを対象に、特定のキーワードを検索します。

※実行前に、スクリプト内にいくつか修正が必要です。


権限について(root推奨)

Task #2 の手順でマシンを起動すると、通常ユーザー権限でシェルに入れます。
ただし、指定ディレクトリ配下のすべてのファイルを確実に検索するため、rootユーザーになることを推奨します。

以下のコマンドでrootへ昇格し、パスワードを入力してください(認証情報は Task 2 を参照)。

Become Root User
user@tryhackme:~$ sudo su
[sudo] password for user: 
root@tryhackme:/home/user#

スクリプト修正のヒント(必読)

  • Flagthm-flag01-script

  • 検索対象ディレクトリ/var/log

  • ヒント:スクリプト内に空の二重引用符"")があります。

    • その中を正しい値で埋めてください。

    • 引用符の内側にスペースは入れないでください(例:"thm-flag01-script""/var/log")。

例:grep -R "thm-flag01-script" /var/log --include="*.log" のような形に近づけるイメージです(実際のスクリプトの構成に合わせて置き換えてください)。


推奨手順(サマリ)

  1. /home/user にあるスクリプトをテキストエディタで開く

  2. "" の中を FlagDirectory の値で埋める

  3. 必要なら実行権限を付与:chmod +x script_name.sh

  4. root になって実行:

    user@tryhackme:~$ sudo su root@tryhackme:/home/user# ./script_name.sh
  5. /var/log 配下の .log ファイルから thm-flag01-script を検索できればOK


Answer the questions below

Which file has the keyword?

authentication.log

Where is the cat sleeping?

under the table


Conclusion

このルームでは、シェルの重要性を学び、Linuxシェルの世界に触れながら主要な種類を探索しました。

また、シェルスクリプトの役割とタスク自動化への活用について理解を深めました。

最後には、いくつかの実用的なシェルスクリプトを作成し、複数のディレクトリから「謎のフラグ」を探し出す実践的なラボにも取り組みました。


出典:Linux Shells