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

タグアーカイブ: nslookup

システム

最近の投稿

アーカイブ

カテゴリー

bind9-dnsutils の nslookup でデバッグ表示

DNS関連の動作確認で動かしている script が変な表示を出すようになっている。

原因を探していくと、/usr/bin/nslookup コマンドで、検索オプションをつけると、デバッグ出力が表示されているみたい。出力先も標準エラー出力となっている。10/25リリースの 9.17.19-1 の問題??

$ ls -l /usr/bin/nslooup
-rwxr-xr-x 1 root root 105120 10月 25 21:29 /usr/bin/nslookup
$ dpkg -l | grep bind9-dnsutils
ii bind9-dnsutils 1:9.17.19-1 
$ nslookup -type=a tsaitoh.net
main parsing tsaitoh.net
addlookup()
make_empty_lookup()
make_empty_lookup() = 0x7ffa08b49000->references = 1

どうも、脆弱性問題が発生した対応時の debug モード付がリリースされたんじゃないのか?

ネットワーク関連の基本

なぜか家族チームで Micro Hardening のイベントに参加予定なので、ネットワーク関連の基礎の説明を家族向けにまとめる。以下の説明は基本的に、Linux 環境に login してのお話。

ネットワークの確認(ifconfig)

接続しているネットワークの状態を確認するには、ifconfig を使う。(Linuxの場合)
Windows であれば、cmd.exe を起動して、ipconfig を使う。

((( Linux の場合 )))
$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.2  netmask 255.255.255.0  broadcast 192.168.11.255
        :
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        :
$ ifconfig eth0   # 特定のインタフェースだけ確認
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.2  netmask 255.255.255.0  broadcast 192.168.11.255
        :
$ ip link    # 新しい Linux 系では、ifconfig が無い場合もある。
             # ip link がその代用

((( Windows の場合 )))
C:> ipconfig /all    # Linux の ifconfig -a と同じ

上記のコンピュータでは、IPアドレス(例:192.168.11.2)とサブネットマスクの値(255.255.255.0)が設定されている。IPアドレス AND サブネットマスクの値はネットワーク番号と呼ばれ、192.168.11.0 が同じであれば、同じサブネット内と判断できる。サブネットマスクは、上位bitの1の数で表現することもあり、192.168.11.2/24 という書き方もある。

こういったIPアドレスは、各コンピュータに対してあらかじめ決めた値を設定しておく方法(静的アドレス)と、IPアドレスを管理しているサーバにアドレスを一時的に貸し出してもらう方法(動的アドレス)があり、後者のアドレスを貸し出すサーバは、DHCPサーバと呼ばれる。(DHCPでは、アドレス貸し出しを頼んできた端末に、IPアドレス,サブネットマスク,ゲートウェイ,DNSサーバを通知してくれる。後述)

周囲のコンピュータの確認(arp/ping)

基本、インターネットでは IP アドレスで通信相手を判断するが、同じサブネット内では、各コンピュータに割り振られているMACアドレスでコンピュータを識別している。

arp

このため、同じサブネット内では、IPアドレスとMACアドレスの対照表が必要となってくる。この対照表の情報を交換するためのプロトコルが ARP であり、この対照表を確認・操作する命令が arp コマンド。

$ arp -an    # -a で全ての一覧を表示、-n でホスト名を調べない
? (192.168.11.24) at <不完全> on eth0
? (192.168.11.13) at 62:84:bd:28:xx:xx [ether] on eth0
? (192.168.11.36) at b8:27:eb:ee:xx:xx [ether] on eth0
:
$ ip neigh   # 新しい Linux 系では arp コマンドがない場合もある。
             # ip neigh が替わりになる。

ただし、コンピュータが「このMACアドレスは私のIPアドレスですよ」とアナウンスした結果を一定時間覚えているだけなので、かならずそのコンピュータが生きているかは別の話。サブネットの中で、偽のARPを流すことで他のコンピュータ宛のパケットを盗むことも可能(ARPスプーフィング)である。このため、セキュリティ対策としてMACアドレスとIPアドレスの対応(arp)を監視も重要となる。

ping

ping は、潜水艦のソナー音をイメージするコマンドで、ICMPプロトコルのパケットを、指定した IP アドレスor ホスト名に送って、返答の有無や応答時間を表示する。ping では通常、相手に連続してパケットを送る。ネットワークが不安定な場合には、パケットが相手に届かない場合もあるので、パケット欠落があると icmp_sec= の番号が不連続になる。

$ ping 192.168.11.2
PING 192.168.11.2 (192.168.11.2) 56(84) bytes of data.
64 bytes from 192.168.11.2: icmp_seq=1 ttl=64 time=0.054 ms
^C
$ ping www.google.com
PING www.google.com (172.217.161.228) 56(84) bytes of data.
64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=1 ttl=54 time=5.62 ms
64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=2 ttl=54 time=5.89 ms
64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=3 ttl=54 time=5.93 ms
^C

ただし ping は、特殊な ICMP パケットを送ることで相手コンピュータを攻撃できた事例もあり、返答を返さないシステムもある。

ブロードキャストパケット(ping -b)

IPアドレスで、サブネットマスクとANDをとったネットワーク番号の残りの部分は、ホスト番号と呼ばれる。(例:192.168.11.2/24 であれば、2 の部分) IPアドレスでホスト番号の全bitが1のアドレス(この場合は、192.168.11.255)は、ブロードキャストアドレスと呼ばれ、同じサブネット内の全部のコンピュータにデータを送るときに使う。

((( pingでブロードキャストする場合は、-b オプションが必要 )))
$ ping -b 192.168.11.255
WARNING: pinging broadcast address
PING 192.168.11.255 (192.168.11.255) 56(84) bytes of data.
64 bytes from 192.168.11.19: icmp_seq=1 ttl=64 time=70.5 ms
64 bytes from 192.168.11.18: icmp_seq=1 ttl=64 time=70.8 ms (DUP!)

ルーティング

インターネットでは、コンピュータに固有のIPアドレスを割り振り、サブネットを越えて通信ができる。(インターネットプロトコルIP)

基本的に、通信相手のIPアドレス AND サブネットマスク で求まるネットワーク番号が異なれば、サブネットが異なるので直接通信ができない。この場合は、ルータにパケットの中継を依頼することになる。ルータはゲートウェイとも呼ばれる。

ルータは、複数のサブネットを中継する装置であり、どのネットワーク番号ならばどのルータに送る(ルーティングと呼ぶ)というテーブルを持っている。一般的に、下流の末端のネットワークでは、どのネットワークならこの装置、それ以外はこの装置に送る…といった一覧表を持っている。(静的ルーティング)

一方、様々な末端からのデータが集まる上流のルータでは、末端ネットワークの構成が変化することも多いので、RIPというプロトコルで、ルータが相互にルーティング情報を交換している。(動的ルーティング)

ルーティングの確認(netstat -r)

ルーティングの情報を調べるには、netstat -r コマンドを用いる。

$ netstat -rn   # -r ルーティング情報 -n ホスト名を調べない
カーネルIP経路テーブル
受信先サイト     ゲートウェイ    ネットマスク      フラグ   MSS Window  irtt インタフェース
0.0.0.0        192.168.11.1  0.0.0.0         UG        0 0          0 eth0
192.168.11.0   0.0.0.0       255.255.255.0   U         0 0          0 eth0

$ ip route      # 新しい Linux 系では、ip route を使う

この例では、192.168.11.0/255.255.255.0 というサブネットでは直接通信ができ(ゲートウェイが0.0.0.0)、それ以外のパケット(受信先サイトが0.0.0.0)は 192.168.11.1 のルータに送ることになっている。(デフォルトゲートウェイ)

ルートの確認 traceroute

どういった経路で相手コンピュータまでデータが届いているのかを確認するには、traceroute コマンドを用いる。

traceroute コマンドは、ルーティングを調べながら、各ルータに ping を送った結果を表示する。

((( Linux の場合 )))
$ traceroute www.fukui-nct.ac.jp
traceroute to www.fukui-nct.ac.jp (104.215.53.205), 30 hops max, 60 byte packets
 1  xxxx.xxxx.xxxx (192.168.xx.1)  0.299 ms  0.251 ms  0.354 ms
 2  yyyy.yyyy.yyyy (192.168.yy.254)  0.790 ms  1.976 ms  1.343 ms
 3  ttn103-198-212-1.ttn.ne.jp (103.198.212.1)  4.304 ms  5.127 ms  4.343 ms
 4  ftth-sw1-po-11.ntwk.ttn.ne.jp (202.127.81.33)  3.742 ms  5.580 ms  4.296 ms
 5  core-sw2-la-2.ntwk.ttn.ne.jp (202.127.81.29)  5.477 ms  4.692 ms  4.655 ms
 6  bbr2-2-4.ntwk.ttn.ne.jp (202.127.81.17)  4.895 ms  2.025 ms  1.904 ms
 7  103.246.232.116 (103.246.232.116)  6.707 ms  5.499 ms  6.583 ms
((( Windows の場合 )))
C:> tracert www.fukui-nct.ac.jp  # Windowsではコマンド名が違うので注意

DNSによる名前解決

ここまでの話の中で、IPアドレスは、192.168.11.123 といった値であったが、極めて覚えにくい。このために、コンピュータそれぞれに名前をつけることができる。これをホスト名という。ホスト名も組織化されていると、組織を区別する名前が必要でドメイン名と呼ぶ。ホスト名とドメイン名の全体を単純にホスト名とかコンピュータ名と呼ぶことも多いが、正式には、FQDN と呼ぶ。

FQDN = www.fukui-nct.ac.jp (コンピュータ名とかドメイン名と呼ぶことも多い)
ホスト名 = www
ドメイン名 = fukui-nct.ac.jp

コンピュータ名とIPアドレスの情報を管理するのが、DNS(Domain Name Service) であり、下流の DNS の情報を調べながら 上流の DNS と組み合わされて管理されている。

nslookup or dig

この DNS に問い合わせを行うのが nslookup コマンドや dig コマンドである。コンピュータ名からIPアドレスを調べるには、一般的には nslookup コマンドを用いる。(正引き)

$ nslookup www.fukui-nct.ac.jp
Server:		192.168.11.xxx
Address:	192.168.11.xxx#53

Non-authoritative answer:
Name:	www.fukui-nct.ac.jp
Address: 104.215.53.205

$ dig www.fukui-nct.ac.jp   # もっと詳しい情報を調べる場合はdigを使う

利用者が多いサービスでは、1台のコンピュータで処理するのは大変なので、負荷分散を行うために、同じサービスを提供するコンピュータを何台も並べ、コンピュータ名を調べる度に、その複数のコンピュータのIPアドレスを返す場合もある。(ラウンドロビンDNS)

逆引き

迷惑メールを大量に送ってくるとか、クラッキングをしてくるようなコンピュータの中には、きちんと管理されていない怪しいネットワーク組織からの接続の場合がある。こういう場合には、IPアドレスに対して名前が割り振られていない場合も多い。また、攻撃の踏み台に使われている場合、どういった組織のコンピュータが悪用されているのか調べる必要がある。こういう場合には、IPアドレスからコンピュータ名を調べることも多い。(逆引き)

$ nslookup 192.156.146.100
100.146.156.192.in-addr.arpa	name = sv1.ip.fukui-nct.ac.jp.

$ dig -x 192.156.146.100      # dig で逆引きするときは、-x オプションが必要

逆引きでホスト名が調べられないとか、逆引きしたホスト名で再びIPアドレスを調べるとホスト名が異なる場合は、IPアドレスとドメイン名の管理が怪しい危険なコンピュータの可能性がある。場合によっては、DNSサーバが汚染されていて、コンピュータ名でアクセスしたら悪意のあるサーバに接続される危険性もある。(DNSポイズニング)

パブリック DNS

末端組織のDNSの場合、IPアドレスは組織内でしか使えないプライベートアドレス(例:10.xx.xx.xx , 192.168.xx.xx)の場合、組織内専用の DNS が動いていることが多い。この場合、組織内の DNS と組織外の DNS では、異なる情報が得られる場合もある。

こういう場合は、DNS に問い合わせをする場合に、外部の DNS を指定する。特に、Google パプリック DNS は、DNSサーバのIPアドレスが 8.8.8.8 という覚えやすい値が使われている。

$ nslookup 192.156.146.100 8.8.8.8
100.146.156.192.in-addr.arpa	name = sv1.ip.fukui-nct.ac.jp.

$ dig @8.8.8.8 192.156.146.100      # dig でDNSサーバを指定するときは、@の後ろで指定

DNS の特殊な情報

DNS には、IPアドレスとホスト名以外にも、様々な情報が登録されている。この情報を調べるには、タイプを指定する。(-query=タイプ のオプションをつける)

$ nslookup -query=a www.google.com 8.8.8.8     # IPv4 アドレスを調べる
Name:	www.google.com
Address: 216.58.199.228

$ nslookup -query=aaaa www.google.com 8.8.8.8  # IPv6アドレスを調べる
Name:	www.google.com
Address: 2404:6800:400a:80c::2004

$ nslookup -query=mx fukui-nct.ac.jp 8.8.8.8   # メールを送るサーバを調べる  
fukui-nct.ac.jp	mail exchanger = 10 ews.ip.fukui-nct.ac.jp.

$ nslookup -query=txt tsaitoh.net 8.8.8.8      # その他のTXT情報を調べる
tsaitoh.net	text = "v=spf1 +ip4:xx.xx.xx.xx..."
  # この例では、メールサーバの検証方法 SPF の情報が見れた。

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       # 異常終了した行が表示される

Google 検索

My Google   Yahoo

Microsoft

ファンサイト