ホーム » コンピュータ » Linux (ページ 2)

Linux」カテゴリーアーカイブ

サーバ⚙

アーカイブ

カテゴリー

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

Perl CPAN更新溜まってた

Perl の CPAN モジュールが溜まってた。

過去メモに沿って、更新

(( アップデート可能なモジュールを一覧 ))
# perl -MCPAN -e 'CPAN::Shell->r'
(( 全部をアップデート ))
# perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'

EdgeRouter-X EdgeOS v2.0.6

Edgerouter-X の最新 OS EdgeOS v2.06 が 7/17 より公開となっていたので、更新。

WiFi中継器の先につながる有線デバイス

WiFiルータの更新で、WEX-733Dを再利用した。

WiFi-router – – – WEX733D=(ether)-REGZA+Raspberry-Pi

当初、中継器WEX 733D の先につながる TV,ラズパイが最初は繋がっていたけど、接続が切れる。確認をしてみると、ルータ配下から中継器の先のデバイスは、どれも中継器のMACアドレスに見える。このため、我が家でのDHCPでMACアドレスに紐づけた固定アドレスを割り振る方式では、中継器でアドレスがすり替えられているために、MACアドレスが DHCP サーバ側で正しく把握できない。このため、正しくIPアドレスが取れない。

しかたがないので、中継器の先の有線デバイスは固定IPアドレスを割り振る。中継器をWiFiアダプターとして使う場合、DHCPで動的アドレスを振ったとしても、IPアドレスは変な状態になるだろうなぁ。固定IPアドレスにしないかぎりは、使い物にならないだろうなぁ。

WEX733DのMACアドレスが変化

メッシュネットワークも一通り設定が終わり、安定して使えるように…と思ったら、1F居間と2FをつなぐWEX733Dから返答がない。(icingaを使って主要なデバイスの生死監視をしている)

確かめてみると、親機に設定した際のMACアドレスと、違ったMACアドレスになっている。このため、こちらが想定しているWEX733DのIPアドレスと異なるため、ping などが取れなかった。

WEX733D-前 60:xx:xx:29:xx:xx
WEX733D-後 62:xx:xx:28:xx:xx

この症状は、他の Buffalo のルータでも確認していて、WZR-1166DHP2では、

WZR1166DHP2 B0:xx:xx:xx:xx:xx
WZR1166DHP2 B2:xx:xx:xx:xx:xx

のような値が取れていた。今回 WEX733D には、DHCP の fixed-address の設定を使っているため、これを正しく登録しておかないと、IPアドレスが変化してしまう。

今回のMACアドレスを確認すると、第1オクテットのBit1は、グローバルアドレスとローカルアドレスを区別するビットみたい。

そこで、60…と62…では、それぞれ違うIPアドレスを対応づけて、死活管理で以下のように設定した。

確認用の script では、2つの check_ping を || で連結し、本来のIPアドレスで返答がなければ、予備のIPアドレスの返答を確認することとした。

define command{
  command_name check_host_alive_multi
  command_line /usr/lib/nagios/plugins/check_ping
                  -H '$HOSTADDRESS$' -w 5000,100% -c 5000,100% -p 1
            || /usr/lib/nagios/plugins/check_ping
                  -H '$ARG1$' -w 5000,100% -c 5000,100% -p 1
  }

define host{
  use            generic-host
  host_name      wex733d
  alias          wex733d
  address        192.168.xx.xx
  check_command  check_host_alive_multi!192.168.xx.yy
  }

Windows Terminal preview 版

Microsoft による Windows Terminal が Microsoft Store で公開された。

さっそく立ち上げてみたけど、PowerShell にて端末が起動した。早速 ssh にて Linux に login して emacs を立ち上げてみる。以前のターミナルだと、漢字幅などで表示が崩れたけど、このバージョンはさすがに問題なし….

と思ったけど、M-x のつもりで、ESC→x と入力すると、ESC-M-x と表示される。普通に、alt-x と入力すれば M-x になるんだけど、レガシーなヤツは ESC-x が染みついている。

TH-D74でNoraGateway

D-STARのアクセスポイントをNoraGatewayで構築しようと、チャレンジしていたが無線機側をどう設定すればいいのか解らず、四苦八苦。

ようやく解ってきた。ポイントは、TH-D74をデジタルモードにしたうえで、DVモード。さらに、データモードに設定すれば動き出した。

{CAPTION}

しかし、動き出したのはいいけど、アクセスポイントに接続する無線機に付けたコールサインと、ゲートウェイに設定するコールサインが、別の免許状が必要。自宅の設備を自分が使えないのは不便だし、所属している社団コールサインの利用を検討してみよう。

TH-D74でaprxを動かす

以前、TH-D72 で aprx を動かしてみたけど、APRSとD-STARを兼ねた TH-D74 で運用をためしてみた。

initstring に何を設定すべきか悩んだけど、TH-D74はコマンドモードとKISSモードを切り替えながらという使い方はできない?みたいなので、設定は不要みたい。

# /etc/aprx.conf
mycall JR9PVZ-10
myloc  lat 3553.48N lon 13613.33E
<aprsis>
   passcode 22202
   server   rotate.aprs2.net
</aprsis>
<logging>
   pidfile /var/run/aprx.pid
   rflog   /var/log/aprx/aprx-rf.log
   aprxlog /var/log/aprx/aprx.log
   dprslog /var/log/aprx/dprs.log
</logging>
<interface>
   serial-device /dev/ttyACM0 9600 8n1 KISS
   # initstring  "" THD74は基本KISSモードなので初期化無し
   alias       RELAY,WIDE,TRACE
   callsign    $mycall # callsign defaults to $mycall
   tx-ok       true # transmitter enable defaults to false
   telem-to-is false # set to 'false' to disable
</interface>
<beacon>
   beaconmode both
   cycle-size 60m
   beacon     symbol "I#" $myloc comment "Tx-iGate + Digipeater"
</beacon>
<digipeater>
   transmitter $mycall
   <source>
      source   $mycall
   </source>
</digipeater>

TH-D74の設定

[F]-[LIST],[F]-[LIST] KISSモード
パケットスピード 9600 bps
無線周波数 144.640 MHz

 

後で、TH-D72 で動作検証するかもしれないので、設定ファイルを2つ別に分けて切り替える設定を追加。

iphoneの検知難しい

大学でアパート住まいの子供が、帰っているのか確認するために、LINE beacon を置いて検知を試したけど、bluetooth を切って既読スルーなヤツなので、ほとんど検知することができない。

そこで、アパートでは無線LANルータを使ってるし Raspberry-Pi で、arpalert を使えば簡単に検知できるだろうと、実験中。でも iPhone はセキュリティ対策なのか、 arp の返答は必要最小限なので同じサブネットとはいえ、そのままでは通信の必要の無い raspberry-pi には、ARP 情報が送られてこない。また ping には返答しないようで、単純に ping で確認も困難。ということで単純な arpalert では検知が難しいなぁ。

定時処理で、”arping -c 1 -I wlan0 IPHONEのIPアドレス” を実行させて、強制的に ARP を送ってもらうか…

cec-clientのデバイス番号とアドレス番号

自宅では、テレビやケーブルテレビチューナーやレコーダを赤外線リモコンで制御できるようにしているが、電源はトグル動作でON→OFFかOFF→ONという制御ができない。そこで、HDMI端子経由のチャンネル制御を行っている。

この際に、デバイス番号とcecのアドレス番号を使うが、デバイス番号が時々変化している。

しかたがないので、cecのscan処理でデバイス番号とアドレス番号の対応情報を保存するようにしてみた。

#!/usr/bin/perl

my $cec = "/usr/bin/cec-client -d 1 -s" ;

open( my $fd , "/bin/echo 'scan' | $cec |" )
    || die( "Can't open $cec\n" ) ;
open( my $ft , "> /home/xxxxxxxx/lib/cec-table.sh" )
    || die( "Can't open cec-table.sh\n" ) ;

my $device  = "" ;
my $dev_str = "" ;
my $address = "" ;
my $osd_str = "" ;

print $ft "#!/bin/bash\n" ;

while( my $line = <$fd> ) {
    if ( $line =~ /^device\s+#(\d+):\s+(.*?)$/ ) {
        $device  = $1 ;
        $dev_str = $2 ;
    } elsif ( $line =~ /^address:\s+(\d+)\.0\.0\.0$/ ) {
        $address = $1 ;
    } elsif ( $line =~ /^osd\s+string:\s+(.*?)$/ ) {
        $osd_str = $1 ;

        print $ft "DEV[$address]=$device\n" ;
        print $ft "OSD[$address]=\"$osd_str\"\n" ;
    }
}
close( $fd ) ;
close( $ft ) ;

検索 🔎

  My Google     Yahoo

便利サイト

Secured By miniOrange