port scan

nmap

前回は新しいTVが来たものだから、パソコンと思ってpingなんてしちゃった。更にport scanかななんて思っちゃたんだけど、ちょと待て!

TVが外に向かってportなんて解放してるか? TVにssh出来るか? そんなサービスしてるか? ポートスキャンって、指定したホストでどんなサービスを提供してるか調べるものだ。サービスってのはサーバーが動いていてこそ、利用出来る。

ポートスキャンが出来る無料で使えるツールと言ったらnmap。Nmap Security Scanner が、その提供元。つらつらと能書きを見ると、一つのホストに絞って、どんなサービスが提供されてるか調べるのと、ネットワークを指定して、どんなホストが稼働してるか調べるのの2種に大別されるとな。

ぐぐるもこの分野へ進出。津波ですってさ。悪い冗談か。 Google、オープンソースのネットワークセキュリティスキャナー「Tsunami」を発表

取り合えず、OpenBSDにnmapを入れて、やってみるか。

first light

使い方は簡単。調べたいホストを指定するだけだ。こういう風に既知な観測点に初めて望遠鏡を向けて観測する事を、ファーストライトって言うらしい。天文学の本を読んでたら出てきた。

ob$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-27 13:56 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00038s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 997 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 18.16 seconds

ふむ、ssh,http,httpsのサービスが動いているとな。

詳細に

もう少し詳しく調べたい時は、オプションを与える

ob$ nmap -An localhost
 :
Not shown: 997 closed ports
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.3 (protocol 2.0)
80/tcp  open  http     OpenBSD httpd
|_http-title: Site doesn't have a title (text/html).
443/tcp open  ssl/http OpenBSD httpd
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=ob.local.jp/organizationName=Yama/stateOrProvinc
eName=Tokyo/countryName=JP
| Not valid before: 2020-06-08T00:01:17
|_Not valid after:  2021-06-08T00:01:17
|_ssl-date: TLS randomness does not represent time

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 32.15 seconds

見つかったサービスに対して、ちょいとアクセスしてみて、バージョン番号とかの基本情報を取り出してくれている。

原理はいかに?

サービスはポートを通じて提供される。65000あまりのポートが有るんで、しらみつぶしに調べていたら時間がかかってしょうがない。そこで、よく光ってそうなポートだけを集中して調べる。そこ数はざっと1000個とな。

どんなポートを対象に調べているか? tcpdumpでログし、炙り出してみた。

auth
bgp
ftp
ftp-data
8045
8080
8081
65129
65389

よく使われる通称名はそのままで、それ以外は番号でログしてた。

ob# tcpdump -i lo0 -w log
ob# tcpdump -r log | grep telnet
14:21:20.500266 localhost.43438 > localhost.telnet: S 3220890200:3220890200(0) win 16384 <mss 32728,nop,nop,sackOK,nop,wscale 6,nop,nop,timestamp 3373703531 0>(DF)
14:21:20.500319 localhost.telnet > localhost.43438: R 0:0(0) ack 3220890201 win0 (DF)

上記の調査には、こんなパケットログから拾い出したものを使った。

port 詐欺

防災無線で、注意を喚起してた。不動産業者を語る人から、あなたに老人ホームへの特別入居資格が当選しました。契約金が必要ですので、速やかに入金くださいですってさ。入居難だから、つい騙されちゃう人が居るんだろうね。それにしてもネタが尽きないねぇ。

オイラーもネタを思い付いたぞ。port 443 で開いているhttpsなサーバーを、telnetなポートで開いたら、どうなる?

ob$ nmap localhost
  :
PORT   STATE SERVICE
22/tcp open  ssh
23/tcp open  telnet
80/tcp open  http

簡単な観測だと、コロリと騙されましたねぇ。急いでいると騙されちゃう訳だ。

ob$ nmap -An localhost
  :
PORT   STATE SERVICE  VERSION
22/tcp open  ssh      OpenSSH 8.3 (protocol 2.0)
23/tcp open  ssl/http OpenBSD httpd
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=ob.local.jp/organizationName=Yama/stateOrProvinc
eName=Tokyo/countryName=JP
| Not valid before: 2020-06-08T00:01:17
|_Not valid after:  2021-06-08T00:01:17
|_ssl-date: TLS randomness does not represent time
80/tcp open  http     OpenBSD httpd
|_http-title: Site doesn't have a title (text/html).

こちらは精密観測した場合。httpsですとズバリな発言は無いけど、推定は当たっているね。httpsなんて言うよりも、むしろこちらの ssl/http って言い回しの方が的確だな。 年寄りも、冷静沈着に判断したいものだのう。

ob$ grep -c match nmap-service-probes
11868

nmapには、こんなに沢山の判定方法が用意されてる。これをポートが見つかる度にスキャンしてるのかなあ。

try scan

それじゃ、いよいよアンドロドイドTVを観測してみる。結果は空振りになるか興味津々。

ob$ nmap -Pn xxx.xxx.xxx.xxx
  :
PORT      STATE SERVICE
8008/tcp  open  http
8009/tcp  open  ajp13
8443/tcp  open  https-alt
9000/tcp  open  cslistener
10002/tcp open  documentum

意に反して、サービスが提供されてるぞ。もう少し解像度を上げて観測。

ob$ nmap -Pn -A xxx.xxx.xxx.xxx
   :
PORT      STATE SERVICE    VERSION
8008/tcp  open  tcpwrapped
8009/tcp  open  tcpwrapped
8443/tcp  open  tcpwrapped
| ssl-cert: Subject: commonName=-103723034478443323/organizationName=Google Inc/stateOrProvinceName=Washington/countryName=US
| Not valid before: 2020-06-23T23:31:54
|_Not valid after:  2040-06-23T23:31:54
9000/tcp  open  tcpwrapped
10002/tcp open  tcpwrapped

ふむ、8443ってのは、簡易観測の通りにhttpsなサーバーだった。ググル様のオレオレ証明書が提供されてる。証明書の寿命は2040年って、その前にTVを買い替えるから十分だな。

それにしても何のためにこんなサーバーを動かしているの? ブラウザーから/にアクセスしても何の返答も無い。 エラーになるような要求を出しても(これ常套手段ね)、何も応答無し。お前はブラックホールか。だったら、地球規模の電波望遠鏡で、ブラックホールの影を捉えてやろう。若し撮影に成功すれば、ノーベル賞ものだぞ。(なんて事が書かれていた、天文学の本を読んでいたのさ)

もしかして特殊なページにアクセスした時だけ、セッションを張れるようになってるのかな?

マニュアルによるとインターネットを通じてOSをアップデート出来るなんて事が書かれているけど、それならTVがクライアントで動けばいいだけで、サーバーになる必要は無いしね。

それよりajpl13って思わせぶりなポートとかは何だ?

ob$ grep 8009 /etc/services
ob$ grep 9000 /etc/services
ob$ grep 10002 /etc/services

我サービス台帳には、登録が無いぞ。と言う事はnmap自身が持ってる台帳を見てるんだろうね?

サービス台帳

nmapのパッキングリストを見てたら、詳しくは /usr/local/share/nmapって、配置表が載ってたぞ。早速現場へ急行します。

ob$ cd /usr/local/share/nmap/
ob$ ls
nmap-mac-prefixes          nmap-rpc                   nmap.xsl
nmap-os-db                 nmap-service-probes        nse_main.lua
nmap-payloads              nmap-services              nselib/
nmap-protocols             nmap.dtd                   scripts/

美味しそうなものが並んでますなあ。幸いテキストファイルだ。どこかの馬鹿アプリみたいにUnixの禁を破っていないのは有り難い事です。簡単にgrepしてみると、注目すべきは、nmap-services*って判明しました。

どうやら、nmap-servicesは、/etc/servicesの拡張版。nmap-service-probesは、個々のサービスの詳細を調べる時に使うみたい。

nmap-servicesを開いてみると

# Derived from IANA data and our own research
#
# Fields in this file are: Service name, portnum/protocol, open-frequency, optional comments
#
tcpmux  1/tcp   0.001995        # TCP Port Service Multiplexer [rfc-1078] | TCP Port Service Multiplexer
  :
ssh     22/tcp  0.182286        # Secure Shell Login

IANAって言う国際機関が定義したものと、足で集めたデータを合体させたサービスリストって事ですな。特徴的なのは、どの程度のサーバーでサービスしてるかって統計データが付いている事。こういうデータは有ると、ベストテンを見たいじゃないですか(ああ、つくづく日本人だなあ!)。

b$ cat nmap-services | awk '{print $3,$2,$1}' | sort -nr | head
0.484143 80/tcp http
0.450281 631/udp ipp
0.433467 161/udp snmp
0.365163 137/udp netbios-ns
0.330879 123/udp ntp
0.297830 138/udp netbios-dgm
0.293184 1434/udp ms-sql-m
0.253118 445/udp microsoft-ds
0.244452 135/udp msrpc
0.228010 67/udp dhcps

Webサービスは2台に1台の割合で稼働してますって事だな。後はudpな地味なサービスが幅を利かせている。tcpだけに絞ったらどうなるかな?

ob$ cat nmap-services | awk '{print $3,$2,$1}' | grep /tcp | sort -nr | head
0.484143 80/tcp http
0.221265 23/tcp telnet
0.208669 443/tcp https
0.197667 21/tcp ftp
0.182286 22/tcp ssh
0.131314 25/tcp smtp
0.083904 3389/tcp ms-wbt-server
0.077142 110/tcp pop3
0.056944 445/tcp microsoft-ds
0.050809 139/tcp netbios-ssn

telnetが健在っていつのデータなんだろう? ftpもpop3もそのまま使うんじゃセキュリティー敵にやばいよね。

本題に戻って、9000って何よ? Port 9000(ポート9000) こんなのも公開されてた。番号が決まれば、サービスも決まるってのは実世界を知らないエンジニアって事だね。確かに、80番ポートでsshdが待ち受けていても、それはカラスの勝手でしょな訳だ。

だから、nmapはポート番号詐欺に遭わないように、用心してプローブに定義されてる方法でポートの先で動いてるサービスを独自に確認してるとな。

ob$ grep 'match http' nmap-service-probes | grep openbsd
match http m|^HTTP/1\.0 [345]\d\d (?:[^\r\n]*\r\n(?!\r\n))*?Date: [^\r\n]*\r\nSe
rver: [^\r\n]*\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length
: \d+\r\n.*\r\n<!DOCTYPE html>\n<html>\n<head>\n<title>[^<]*</title>\n<style typ
e="text/css"><!--\nbody \{ background-color: white; color: black; font-family: '
Comic Sans MS', 'Chalkboard SE', 'Comic Neue', sans-serif; \}|s p/OpenBSD httpd/
 cpe:/a:openbsd:httpd/
match http m|^HTTP/1\.0 [345]\d\d (?:[^\r\n]*\r\n(?!\r\n))*?Date: [^\r\n]*\r\nSe
rver: [^\r\n]*\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length
: \d+\r\n.*\r\n<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>\n<title>[^<]*</title>\n<style type="text/cs
s"><!--\nbody \{ background-color: white; color: black; font-family: 'Comic Sans
 MS', 'Chalkboard SE', 'Comic Neue', sans-serif; \}|s p/OpenBSD httpd/ cpe:/a:op
enbsd:httpd/
match http m|^HTTP/1.1 [126-9]\d\d (?:[^\r\n]*\r\n(?!\r\n))*?Server: OpenBSD htt
pd\r\n|s p/OpenBSD httpd/ cpe:/a:openbsd:httpd/

80番がhttpなら、こんな山程有る正規表現のどれかに引っかかるはず。これで色々な情報を取り出しているとな。苦労の賜物ですね。

この他、パケットの特徴を抽出してOSを推測するとか、UDPの荷物室の内容を見てプロトコルを推測する方法等、興味深いテクニックが詰まっている。

lua

scripts/の中は、盛り沢山なluaスクリプトが鎮座してた。サフィックスはnseってなってるけどね。これはnmap script engine の略らしい。nselib/の中は、nmapとのAPIを収めたものだ。このおかげで、lua語で、nmapをコントロール出来るとな。

確かYAMAHAのルーターもlua語を採用してなかったかな。軽量言語で、こういう用途にはうってつけとか。 本格的にいじるなら、 lua-modeを入れておくと吉。

もっと早くmrubyが出てたら、採用されてたかも。しょうがない、YAMAHA Lua教室で無料学習 しましょ。それから、Luaプログラミング入門 の、C語I/F部分も大いに参考になるな。

at debian

debian機でコンパイルしてみた。何のトラブルも無くインストール出来たよ。

debian:~$ nmap --version
Nmap version 7.80 ( https://nmap.org )
Platform: i686-pc-linux-gnu
Compiled with: nmap-liblua-5.3.5 openssl-1.1.1d nmap-libssh2-1.8.2 libz-1.2.11 libpcre-8.39 nmap-libpcap-1.9.0 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

例によってgdb出来るようにして、楽しんでみた。楽しいのはconfig時

Configuration complete.
   (  )   /\   _                 (
    \ |  (  \ ( \.(               )                      _____
  \  \ \  `  `   ) \             (  ___                 / _   \
 (_`    \+   . x  ( .\            \/   \____-----------/ (o)   \_
- .-               \+  ;          (  O                           \____
(__                +- .( -'.- <.   \_____________  `              \  /
(_____            ._._: <_ - <- _- _  VVVVVVV VV V\                \/
  .    /./.+-  . .- /  +--  - .    (--_AAAAAAA__A_/                |
  (__ ' /x  / x _/ (                \______________//_              \_______
 , x / ( '  . / .  /                                  \___'          \     /
    /  /  _/ /    +                                       |           \   /
   '  (__/                                               /              \/
                                                       /                  \

これって、昔活躍したモジラ君?

コンパイルは -g 付きで行われるんだけど、install時に大事な情報がstripされちゃう。折角用意したのにもったいない。コンパイルした環境でgdbを起動するなら、その情報を活かせる(gdbの俎上に乘る)。

普通にinstallしちゃうと、情報がstripされちゃうので、それを阻止してinstallしよう。やり方は簡単。TopにあるMakefileに、STRIP = /usr/bin/stripって行がある。これを、STRIP = に変更しちゃう。そしてinstallすればよい。gdb情報付きのnmapをインストール出来るぞ。

debian:~$ gdb -q nmap
Reading symbols from nmap...
(gdb) b nmap_main
Breakpoint 1 at 0x608a0: file nmap.cc, line 1801.
(gdb) r localhost
Starting program: /usr/local/bin/nmap localhost
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".

Breakpoint 1, nmap_main (argc=2, argv=0xbffff514) at nmap.cc:1801
1801      std::vector<Target *> Targets;
(gdb) bt
#0  nmap_main (argc=2, argv=0xbffff514) at nmap.cc:1801
#1  0x0043501c in main (argc=<optimized out>, argv=<optimized out>)
    at main.cc:237

cフラフラ語で書いてあって、眩暈がしそうだな。一応環境が出来たって事で、これで佳しとするか。それより、ついでにインストールされる物に、面白そうな奴が居たぞ。

zenmap

黒い画面のオペレーションが恐い人向けに、GUI版が提供されてる。して、その名はzenmap。

debian:~$ file /usr/local/bin//zenmap
/usr/local/bin//zenmap: Python script, ASCII text executable

正体は、見ての通り、パイスクリプトである。パイだけで満足に窓を出せるのか? 疑問に思って /usr/local/lib/python2.7/dist-packages/zenmapGUIを偵察に出かけてみたけど、パイ語のファイルが並んでいるだけで、さっぱり要領を得ない(見る気無しってのが真実)。

河岸を変えます。OpenBSDに入れたnmapはどうなってる? zenmapなんてのは無し。小僧用に別パッケージになってるんだな。

ob$ doas pkg_add nmap-zenmap
quirks-3.325 signed on 2020-06-19T15:08:06Z
nmap-zenmap-7.80p0:libglade2-2.6.4p17v0: ok
nmap-zenmap-7.80p0:py-gobject-2.28.7v0: ok
nmap-zenmap-7.80p0:py-setuptools-41.6.0v0: ok
nmap-zenmap-7.80p0:py-cairo-1.18.2: ok
nmap-zenmap-7.80p0:py-numpy-1.16.5: ok
nmap-zenmap-7.80p0:py-gtk2-2.24.0p7: ok
nmap-zenmap-7.80p0:py-sqlite2-2.8.3p0: ok
nmap-zenmap-7.80p0: ok
Running tags: ok

ピンポンでした。gtk2に草鞋を預けているとな。見知らぬlibgladeなんてのも入れてる。こいつはどんな特技が有るの? 画面構成をXMLでハンドリング出来るんで、より簡便にGUI出来るとな。

やっぱりGUIは使って極楽、作って地獄ってのを継承されてる。昔MACしてた頃、かっこいいGUIのアプリを作るんだと Inside MAC まで、用意したんだけど、ある人が言ってた、先の格言に触れ、無駄な努力は止めようと、心に誓ったのさ。以来GUI自身も余り好まなくなってしまった。

作る人は、地獄で頑張って下さい。素人はその上で、のほほんとしてますから。 Gladeを使う なんてのを見ると、MACのツールにも似たようなやつが有ったなと思っちゃう。未だと、iフォーンとか、アンドドロイドな表示器兼電話機なんかの、アプリを作るのにも活躍するのかな。 みんな、小金を稼ぎたくて、一生懸命になってるか。

いや、今のトレンドは、ユーチューバーだろう。世界をあっと言わせて、投げ銭を期待するって世の中だ。 そんなの設備が大変だろう。女優ライトとかビデオカメラ、ビデオ編集用にゴジラ・パソコン。年金生活者には無理。 これ面白い。ゴジラVSニッポンのITインフラ:スパコン編

10分でGladeを使って作るRuby/GTK3 GUIアプリ ぐらいが、丁度良いかな。


This year's Index

Home