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アプリ ぐらいが、丁度良いかな。