ホーム » 「telnet」タグがついた投稿

タグアーカイブ: telnet

サーバ⚙

アーカイブ

カテゴリー

ユーザとリモート処理

Linux ではユーザを切替えながら処理を実行したり、ネットワークを越えて命令を実行することができる。外部から攻撃を受けてバックドアが仕掛けられていて不正侵入をうけているのか確認する時に、どういったユーザの処理を実行しているのか把握し、リモート接続で処理ができるような状態なのか知ることが重要。

ユーザとユーザの切り替え

ユーザ,グループの管理

unix では、ユーザ情報は /etc/passwd , /etc/group で管理している。passwdファイル先頭の、ユーザ番号 0 は、なんでもできる権限を持つシステム管理者 root となっている。ユーザ番号 1~999 は、システムを動かすための特殊なユーザとなっている。1000以上は、実際のユーザに割り当てることが多い。

((( /etc/passwd )))
root:x:0:0:root:/root:/bin/bash
sshd:x:111:65534::/var/run/sshd:/usr/sbin/nologin
tsaitoh:x:1000:1000:Tohru Saitoh,,,:/home/tsaitoh:/bin/zsh
| tsaitoh = ユーザ名
| x       = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000    = ユーザ番号
| 1000    = グループ番号
| Tohru Saitoh,,, = ユーザの名前など
| /home/tsaitoh   = ホームディレクトリ
| /bin/zsh        = シェル
  
((( /etc/group )))
root:x:0:
ssh:x:112:
home:x:1000:tsaitoh
| home = グループ名
| x    = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000 = グループ番号
| tsaitoh = グループに所属するユーザ名(コンマ区切り)

ただし、/etc/passwd, /etc/group は、全ユーザが読めるファイルで、暗号化されたパスワードを覚えるには不向きなので、/etc/shadow , /etc/gshadow に保存されている。

ユーザの確認

自分の情報を確認するには、whoamiid , finger コマンドを用いる。

$ whoami    # ユーザ名を表示
tsaitoh

$ id        # UIDやGIDなどの情報を表示
uid=1000(tsaitoh) gid=1000(home) ....

$ finger    # ユーザの詳しい情報を表示
Login    Name           Tty      Idle  Login Time   Office          Office Phone
tsaitoh  Tohru Saitoh   pts/0          Feb 17 22:47 (192.168.11.xx) 12-3456

su コマンド

ユーザを切り替えるには、su コマンドを用いる(Set User)。別ユーザで命令を実行することもできる。ただし、その別ユーザのパスワードが必要。

$ su root
Password: ●●●●●●●●
# exit

$ su -c whoami root
Password: ●●●●●●●●
root

システム管理者での作業は、危険な命令も実行できる状態なので、作業ミスを減らすためにプロンプトが、# に切り替わる。

ただし、su コマンドは、切り替えるユーザのパスワードが必要である。システム管理作業を複数人で行う場合、管理者パスワードを複数人に教えることになり、セキュリティ的に危険である。

sudo コマンド

そこで、管理者などに登録した人であれば、自分のパスワードで管理者権限を得ることができる sudo (set user do) コマンドを使うのが一般的である。

$ sudo bash
Password: ●●●●●●●● 自分のパスワード
# exit
$ sudo whoami     # 管理者で whoami を実行
root

$ sudo -u foobar  # ユーザ foobar に変更
$ whoami
foobar
$ exit
$ whoami
tsaitoh

システム管理者になれるユーザの設定は、/etc/sudoers に記載されている。一般的に、sudo グループに所属していれば、管理者になれるように設定されていることが多い。

su id bit / スティッキービット

パスワードを変更するpasswdコマンドでは自分のパスワードを変更でき、/etc/passwd や /etc/shadow が書き換えられる。unixのr,w,xの権限だけの知識だと、通常ユーザ自身がpasswd,shadowファイルを書き換えられるのなら、同じファイルに記録されている他のユーザ情報(特にパスワードを変更できるはずである。であれば、他人のパスワードも変更できてしまうのではないのか? 当然、こんなことはできてはいけない。

実は、一時的に他のユーザ権限を借りて作業をするため(システム管理者の権限を借りて作業するため)に、su id bit (スティッキービット)という属性がある。

$ sudo bash
$ passwd
Password: ●●●●●●●
Re enter Password: ●●●●●●●

$ which passwd
/usr/bin/passwd

ls -al /bin/ls
-rwxr-xr-x 1 root root 138856  8月  7  2019 /bin/ls
$ ls -al /bin/passwd
-rwsr-xr-x 1 root root  63960  2月  7 23:54 /usr/bin/passwd

上記の passwd コマンドでは、ファイル属性が – rws r-x r-x となっている。(通常の ls コマンドでは、– rwx r-x r-x となっている。)

su id bit が ON になっているコマンドは、一時的に そのファイル所有者 (/usr/bin/passwd の所有者は root) の権限を借りて命令を実行できる。

ただし、スティッキービットが ON だと、管理者権限で命令を実行することができるが、そのコマンドに不備(脆弱性)があると、システムを乗っ取るためにクラッカーが悪用する場合がある。

((( suid ビットが ON のファイルを探す )))
$ find /usr/bin -perl /u=s -print
/usr/bin/password

リモート作業

ネットワークを越えて命令を実行するには、telnetrshssh コマンドを使う。telnet や rsh コマンドは、通信内容が暗号化されていないため、パケットキャプチャを使われると、パスワードなどを盗むこともできるため、通常は使ってはならない。

telnet (暗号化なしのリモート接続)

$ telnet remote-host   # remote-host という名前のコンピュータに telnet で接続
login: ユーザ名
password: パスワード
$ exit

ssh (暗号化されたリモート接続)

ssh は、通信内容を暗号化して安全にリモートコンピュータで命令を実行するコマンド。リモートコンピュータへの接続(slogin)、リモートコンピュータで命令の実行(ssh)、リモートコンピュータとのファイル転送(scp) などができる。

$ slogin remote-host   # 別コンピュータにlogin
Password: ●●●●●●●●
$ hostname             # 使っているコンピュータ名を調べるコマンド
remote-host
$ exit

$ slogin foobar@remote-host  # 指定したユーザ名(foobar)で接続
Password: foobarのパスワード
$ whoami
foobar
$ exit

$ ssh remote-host ls   # remote-host 上で ls を実行
Maildir

$ ssh foobar@remote-host whoami
foobar

$ scp test.c remote-host:~
  # ファイル test.c を remote-host のホームディレクトリにコピー(アップロード)

$ scp foobar@remote-host:hoge.txt dest-dir
  # リモートホストの hoge.txt を、dest-dir にコピー(ダウンロード)

Capture The Flags 講座のアフターケア

子供が Capture The Flags の講座に参加したけど、簡単な説明後いきなりミニCTF大会だったので、さっぱり分からないだろうから、少し解き方の説明。

ドメインの秘密

ドメイン名とは、IPアドレスは覚えられないのでコンピュータにつけた名前。そのドメイン名とIPアドレスのデータベースがDNS。通常は、コンピュータ名からIPアドレスを調べる時に使う。unix や windows で DNS 情報を調べるコマンドが、nslookup

最新の unix 環境では、nslookup ではなく、dig しか入っていないかもしれない。

その場合は、

$ sudo apt-get install dnsutils
((( 基本的使い方 )))
$ nslookup [オプション] ドメイン名 [DNSサーバ]
((( 問い合わせ例 )))
$ nslookup tsaitoh.net 8.8.8.8 # GoogleのDNSサーバに問い合わせる例(正引き)
$ nslookup 64.33.3.150 8.8.8.8 # (逆引き=IPアドレスからドメイン名を調べる)
$ nslookup -query=A    tsaitoh.net         # IPv4アドレスを調べる
$ nslookup -query=AAAA www.yahoo.com       # IPv6アドレスを調べる
$ nslookup -query=MX   tsaitoh.net 8.8.8.8 # メールサーバ情報を調べる
$ nslookup -query=TXT  tsaitoh.net 8.8.8.8 # SPF1というメールサーバの信頼性情報

我が家では、自宅専用のDNSサーバが動いている特殊な事例。インターネットのグローバルアドレス空間でどう見えているかを知りたい場合は、DNSサーバに 8.8.8.8 を使う。Google が、記憶しやすいIPアドレスで誰もが使っていい高速のDNSサーバを提供してくれている。

Webページを見つけろ

サーバとの通信では、IPアドレスで相手のコンピュータを見つけるけど、1台のコンピュータ内で複数のネットワークプログラムが動いていた時、どのプログラムと通信するのか区別する必要がある。そのための情報がポート番号IPアドレスを電話番号に例えるなら、ポート番号は内線電話番号みたいなもの。

このポート番号は、プログラムによって番号は◯◯を使うべき…という値が決まっている(よく知られたポート番号)Webサーバ(HTTP)は80番、Webサーバ暗号版(HTTPS)は443番、メールサーバ(SMTP)は25番….。

ポート番号で接続するサービスが決まるけど、学内だけで外に見せたくないWebサーバなどがある場合は、ファイアウォールで特定のポート番号を流通させないようにする場合もある。そういう場合には、通常のポート番号以外を使って通信することがある。

Webサーバに接続する時には、80番を使いたくない場合には、http://コンピュータ名:ポート番号/ と URL にポート番号付きで指定することもできる。

ポートスキャン

このポート番号が解らない時は、ポートスキャンというツールがある。ポート1番で通信してみる、ダメなら2番…という繰り返しをしてくれるツール。一番有名なツールが、nmap。ウィルスなどが仕掛けられて、外部からのネットワーク接続を受ける状態(バックドアが仕掛けられた状態)になったのを見つけるのが本来の使い方。

nmap は通常インストールされない(こんな危ないツール普通はシロートに使わせるものではない)。使いたい場合は、

$ sudo apt-get install nmap
((( 基本的使い方 )))
$ nmap [オプション] 接続先
$ sudo nmap tsaitoh.net     # サーバ tsaitoh.net を調べる
$ sudo nmap -A tsaitoh.net  # ソフトの種類も調べてくれる。

ポート番号が解って、そのサーバソフトに接続してみる場合、telnet がよく使われる。
本来は、ネットワークの先のコンピュータを操作するためのソフト(リモート接続23番ポート)だけど、通信を暗号化しないため、セキュリティ的には危険なので、リモート接続用途で使うことは少ない。

Windowsでは、telnetは初期状態でインストールされない。unix で telnet を使いたい場合は、

$ sudo apt-get install telnet
((( 基本的使い方 )))
$ telnet コンピュータ名 [ポート番号]
$ telnet tsaitoh.net 80       # 80番ポート(HTTP)に接続
GET /                         # トップページのHTMLが帰ってくる。
$ telnet tsaitoh.net 25       # 25番ポート(SMTP)に接続
QUIT                          # 接続を切る

隠れたデータ

ウィルスなどにコンピュータに感染させる場合、ファイル名などを偽っってあったりするので、ファイルの種別を調べたり、その中の命令を分析する必要がある。その場合によく用いる基本コマンド。

((( 基本的使い方 )))
$ file ファイル名     # 指定したファイルが何か簡単に調べてくれる。
$ file a.out        # a.out の中身を調べる

$ strings ファイル名  # ファイルの中身の文字として表示できるものを表示する。
$ strings a.out     # a.out の中の文字情報を抽出

$ nm ファイル名       # オブジェクトファイルのシンボル(関数名や変数名)を表示
$ nm a.out          # stripされたa.outでは抽出できない。

逆アセンブル

実行プログラムがどのような処理をしているのか内容を見たい場合は、逆アセンブル(機械語をアセンブリ言語に変換)する。ただし、一般的な実行プログラムでは、関数番地や変数名番地の情報が消されているので、OS の仕組みの知識が必要。

簡単に解析をするのであれば、objdump などを使うことが多い。ここでは、gdb を紹介する。
gdb(GNU Debugger)は、Cコンパイラ(gcc = GNU C Compiler)のためのデバッガ。linux だとプログラムが異常終了すると、coredump(実行時のメモリ内容を出力する機能) するので、この情報でプログラムの異常処理を探す時に使う。

デバッガは通常はインストールされないよな。

$ sudo apt-get install gdb
((( 基本的使い方 )))
   a.out は、何らかのC言語のソースで事前に作っておくこと。
   | // helloworld.c
   | #include <stdio.h>
   | int main() {
   |    printf( "Hello World¥n" ) ;
   |    return 0 ;
   | }
   $ gcc helloworld.c

$ gdb a.out
(gdb) break main      # main にブレークポイントを設置
(gdb) run             # プログラムを実行
(gdb) step 10         # 10行分処理を実行
(gdb) disas main      # main 以降を逆アセンブル
(gdb) quit

((( 異常処理とその場所を見つける )))
   異常終了するプログラムの例
   | // segv.c
   | #include <stdio.h>
   | int main() {
   |    *((int*)NULL) = 123 ;  # 0番地にデータを書き込む
   |    return 0 ;
   | }
$ gcc -g segv.c        # コンパイル時に名前情報を実行プログラムに埋め込む。
$ ulimit -c unlimited  # coredump 機能を有効にする
$ ./a.out
Segmentation fault (コアダンプ)
$ gdb a.out core       # 異常終了した行が表示される

macOSでtelnet

色々とネットワークの状況確認をする時には、telnet を使うけど、何気なく macOS で telnet を使ったら、command not found とな。which telnet しても、ダメ。

High Sierra 頃から、標準では消されたのを思い出し、”sudo port install inetutils”を動かし、インストールが終わったので改めて、”telnet…” 再び、command not found… なぜぇ〜。

MacPorts の使い方間違えたかと悩んだけど、結論は、”gtelnet” でインストールされている。”ls /opt/local/bin/g*”を実行したら、”gcat gcp gftp…” MacPorts でインストールした、GNU 物って、最近は全部”g*”になってるのね。
まあ、macOS標準物と混ざって誤動作ネタになることも多いだろうし、解らなくもないが、気づかなかった。

検索 🔎

  My Google     Yahoo

便利サイト