トリコロールな猫/セキュリティ

思いついたことをぼちぼち書いてます。

セキュリティエンジニアとして勉強しておいてよかったこと

はじめに

歳をとってきたからか、「セキュリティエンジニアとしてやっていくには何を勉強すればいいのか」ということを聞かれるようになりました。 正直私は体系だった勉強をしておらず言えることがその場ではあまりなかったため、自分が勉強しておいてよかったことをここで改めて思い返してみようと思います。

シェルコード作成

要はアセンブリ言語の勉強です。シェルコードを作る、という目的があったのが私にはよかったです。

学生時代はCのポインタはさっぱり理解できませんでしたが、アセンブリ言語をやってよく理解できました。メモリの使い方とかもここで学んだ。私はSPARCが好きだったので、Delayed Slotやビッグエンディアン、メモリのウインドウシステムの美しさに感動したのを覚えています。便利なツールなぞない時代だったので、ひたすらgdbでbreakしてsiしてxです。 ちなみに、当時超役に立った本で「Panic!―UNIXシステムクラッシュの追求と対策 」(サンソフトプレスシリーズ)というのがあるんですがもう売ってないみたいですね・・。

今だとARMかx86かしか選択肢がほぼないのかな。ARMは命令が固定長ですし、スマホのようなメモリ容量が限られるマシン用な分シンプルに作ってあるはずなので、やるならARMがいいのかも(実態を知らないので違ったらすいません)。x86はアセンブリ言語を初めて勉強するには複雑すぎますが、環境を準備するのは楽だし情報は多いからx86でもいいのかな。pwnable.twで初心者用の問題を解いたやつがあるのでよかったらどうぞ。

security.nekotricolor.com

netcatもどきの実装

シェルコードを作る過程で、カスタマイズできるバックドアが欲しくなったので作りました。指定したポートをListen状態にし、受信したコマンドを実行してその結果を返すだけのシンプルなプログラムです。言語は、当時唯一まともな開発環境が使えたVisual C++だったと思います。.NETが出る直前でした。こんな感じ↓

実装したPCで:

$ ./myBackdoor -p 8080         ← 8080/tcpをListen状態に

別のPCから:

$ ns 192.168.1.100 8080    ← netcatで8080番ポートにアクセス
>>> cat /etc/passwd  ← /etc/passwdをcatする
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

参考にした本は、学生時代の教科書でもあった「The UNIX Super Text」です。今は改訂増補版が出ているようです・・いやこれも2003年だから相当古いな。 I/Oまわりやプロセス間通信を学ぶのにとてもよかったです。

ファイアウォールの構築

ネットワークの知識はこれでものすごく付きました。NIC三枚挿し・四枚挿しで、それを介してネットワークをつなげるだけでも最初は大変でした。構成としては今ではあり得ないくらいシンプルなものが多かったので、勉強するにはちょうどよかったです。

F/W構築

とりあえずつないでデフォルトゲートウェイを設定するだけだと、社内LANからインターネットは行けても、インターネットからWebサーバにはつなげません。DMZ上のメールサーバから社内のメールサーバにもつなげない。これを、必要な通信のみ通すように設定していきます。もちろんNATもします。余計なブロードキャストが発生しないように、F/Wには各種サーバの静的なARPテーブルも設定します。

こういうのを信じられないほど早い納期で連続してやっていた時期があり、この時にネットワークの知識とともに段取り八分を叩き込まれました。納期があまりに早いと、走りながら考えるというのは通用せず、腰を据えてマニュアルを読み込み、どこをどう設定するのかを事前に決めてスケジュールを立ててから本番機を触るようにしないと間に合いません。他機で設定ファイルを作り込み、分単位の線表を引いて何とかやり切った記憶。

DNSサーバの構築

一番複雑なやつでマスター一台、スレーブ五台とかだったかな。いまはプライマリとセカンダリというそうですが。A、NS、MXレコードに加え、大量のサブドメインがあったので大量のCNAMEを設定。当然ゾーン転送も。今は自前ではあんまりやらないですよねえ。インターネットの仕組みみたいなものを理解するのによかったです。メールサーバもたくさん構築しました。qmailってまだあるのかな。

こんな課題はどうですか

これら自宅でも学べる課題を考えてみました。

たとえばこんな課題
Raspberry Pi Zero アイコン by Icons8

ラズパイを三台とハブを二台用意し、それぞれF/W、DMZ上のWebサーバ、DNSサーバという超シンプルな構成で、ラップトップからWebサーバの名前解決ができるようにする。できれば全部有線がシンプルでいいですがNIC三枚はラズパイでは難しいのかな。であればラップトップは無線接続で。

WebサーバはNXやASLRのような攻撃に邪魔な機能は全てオフ。なんでもいいのでroot権限で動く脆弱なプログラムと、実装したnetcatもどきを置いて、ラップトップからWebサーバ上でバックドアを作って/etc/passwdをcatする。

さすがに静的なARPテーブルやメールサーバはいらない気がしますが、ARPに関してはブロードキャストされているところをパケットキャプチャで見てみてほしいなあ。間違ったARPテーブルを設定してみて、なんも通信できねーっていう経験もしてほしいです(やった)。なお、おすすめする書籍は古典にして名著「マスタリングTCP/IP 入門編」です。一度読んでみて、さっぱり分からんとキレながらこの課題をなんとかこなして、「最初っからこう書いてくれれば分かったのに・・」と思いつつもう一度読んで、「いや書いてあるじゃん」てなってください(なった)。

おわりに

今は全てがリッチすぎて、基礎を学ぶのは逆に難しくなっている気がします。ネットワーク構築はクラウドばかりだし、マルウェア解析もデコンパイルしてソースコードを読むことの方が多いみたいだし。業務では意識することはあまりないかもしれませんが、つまづくことがあるとすれば、この手の基礎を押さえていないことが原因かもしれません。

特にネットワークはもうちょっとやると良くて、たとえばVPNとWifiのAESとTLSの違いとかはぜひパケットを見て実感してほしいし、HTTPとQUICの違いを見てほしいし、IPフラグメンテーションも実際のパケットを見て感動してほしい。課題のARPのブロードキャストもそうですけど、要はパケットを眺めることでOSIの七階層をきちんと理解してほしいというか。元気な人ならイベントのNOCとかやってみるといいかもしれませんね。