大熱血!セキュリティ勉強会2回目

前回の復習 : ソースコード入手できないとアドレスわかんない問題の解決

NOPスレッドという技法がHacking : 美しき策謀で紹介されていた
とりあえずNOPで埋めまくる -> 戻り値アドレスで埋めまくるを行えばうまくいくのでは?
もちろんNX bitたっていると失敗する
NOPスレッドのサイズはfor文みたいなの組んで行うらしい
NOPスレッドを使わない方法としては, Linuxのプロセスフォーク + execve的に環境変数をスタックに格納するので、環境変数にシェルコードを注入して実行ファイル名の長さがわかれば正確に戻り値アドレスを計算できるらしい
-> よくわからん。やっぱりHacking : 美しき策謀本は難しい

Spectre/Meltdownとは

Spectre : ユーザーランドの投機実行・分岐予測の脆弱性
投機実行で本来実行しない条件の分岐が実行される -> キャッシュ
-> サイドチャネル攻撃でひたすらメモリアクセスしまくればメモリアクセス速度の計測でプログラムの秘密鍵のデータ抜き取れるのでは?(Androidゲーム(NDK実装の場合もあるので生バイナリの場合も)とかでは生書き実装などがあるので)
Meltdown : ユーザーランドからカーネルの投機実行・分岐予測の脆弱性
※システムコールはISR(ソフトウエア割り込み)で発生するが、なんと投機実行はCPU例外でも発生する -> なぜなら割り込みも分岐も突き詰めればPCのアドレスジャンプなので実装可能 -> システムコールの先の処理が投機実行される -> いろいろ見れる
※緩和策 : retpoline。ROPというハッキング手法を逆に用いて関数ジャンプをしまくる。これによって関数呼び出しアドレスのバッファ(キャッシュ)による投機実行に変更されるが、そのバッファはたったの12個しかない。なので12回投機実行が失敗するようなサブルーチンをROPを用いたアセンブラでコンパイル時に入れたら緩和されるよね
Linux Kernel 4.5ではこの緩和策がカーネルコンパイルオプションに導入されているらしい

実際にroot権限でサーバープログラムは実行されるのか

基本ないらしい。
Ubuntuはもちろんのこと、CentOSでもsudoersを使うらしいので基本サーバープログラムはrootで実行されない。
そのため、このコードサンプルはただ権限昇格のハッキングを省いたものだけっぽい。

WEB経由でもシェル取れる

WEBでもURLパラメータを用いてHTTP経由でシェル取れる(昔のApacheではあったらしい)
現在のApacheはそんなことは起こらないらしい

ユーザーランドでもシェル取れれば結構いけそう

権限昇格:ユーザーランドでもシェル取れればncやtelnet使えるので, unameでバージョン見てBoFで権限昇格できる(CVEの脆弱性とか見れば一発)
ワーム(自動で脆弱性をばらまくマルウエア)はネットワークスキャンで探索、脆弱性攻撃でシェルを取り、wget経由でBullet Proof Domain(政府にこのサーバー落としてくださいと言われても落ちないサーバー)に上がっているワームの本体をダウンロードし、OS等のバージョン固有の脆弱性(CVE)を利用して脆弱性のあるプログラムを実行することによって権限昇格して乗っ取る
パッチ当てれば解決できるが、パッチをすべての企業や個人が当てるわけではないので。。。。。。
※Botnetはさらに高度でウイルス検知ソフトから逃れるために何種類かの亜種を選んで送るらしい

ログ回避

WEB経由ではBoFどうなるの?

UTF-8 + URL Encodingがかかるっぽい
WEB以外のexploitとあまり変わらないらしいので、ログから解析する不審なデータの見え方は同じ

Nimbaウィルス

7shiさんがダイアルアップ時代のときに感染したウィルスで、sambaのパケットの脆弱性を突いたものらしい

Rootkit

GNU binutilsやcoreutilsなどのGNUシステムアプリケーションを書き換える = Rootkit?
Rootkitはなんでもありらしい
カーネル書き換えからコンパイラ、あるものなんでも

バックドアの話

PCのポート開放したらなんか勝手にtelnet/ftpが動いていた件

必死に権限昇格しようと試行を繰り返していたっぽい
日経Linuxでハニーポット特集が組まれており、バックドアの挙動が理解できるらしい
この本ではバックドアを仕込むのにFOSSのBinutils/coreutilsを使ったrootkitのことが紹介されていたが、クローズドソースでもrootkitは発生するらしく、クローズドをOSSにしたときにそのことが判明した

ポート開放をルーターが止めるのでは?という話

CVE等の脆弱性を突けば行けるらしい
ユーザー側から解放する分には問題ない

ポート開放の話

UPnPルーターでユーザー側から解放されたら終わりだよね
ルーターのグローバルIP - ポート : 個人PCのプライベートアドレスが対応しているが、ルーターのNAT Traversalがある程度予測できる
フルコーンNAT(最もNat TraversalできないNAT)もポート番号がある程度予測できるらしいので(2005年論文), ゲーミング業界はルーターのポート番号パターンDBを作ってP2PでNAT Traversalを行うらしい ※関連技術はWebRTCのTURN 2.0サーバー

多種アーキテクチャのセキュリティは果たして実用的なのか?

Pepperのセキュリティはヤバそう

ちなみにPepperはintel Atomを使用し、OSはGentooベースを使っている
Pepper Developer/User版はバッファロールーターのように初期パスワードuser/userみたいなもので設定されており、sshで簡単にコンソールログインできた
nmap(ネットワークスキャン)でsshのサービスが立っていることが簡単に確認できる

ロボットのセキュリティ

ROSという有名なロボットのフレームワークがある(Pepperは使っていない)
いろいろなロボットがROSを使っているが、ROSはXML-RPCというHTTPベースRPCプロトコルで通信を行っている
ロボット分散システムの確立のため簡単にパケットスニファが作れる -> 分散システムの1ピア(クラウドでも可)のハッキングに成功すれば、ロボットを乗っ取れる
2017年12月にROS 2.0で産業用IoTプロトコルDDSを採用したことにより、SSL暗号化が可能になり、問題が解決しそうな方向性

ドローンのセキュリティ

無線はセキュリティ弱い
まずドローンのセキュリティというよりは、今までは信頼性の高い無線の開発で精一杯だった(長距離HD動画ストリーミングすごいね(10km以上)、というレベル)
そのため、ドローン無線の暗号化が全然進んでおらず、PWM/PCM/PPM変調を復号するだけでドローン通信が解読できる(周波数帯は2.4GHzか5.8-9GHz)
唯一力を入れているのがDJIで、SHA256で通信が暗号化されている(そして2.4GHz帯で無線免許なしでも飛ばせる10mWの出力を守りつつも10km圏内で720pのHD動画ストリーミング技術も伴う)
コントローラ、ドローン間にそれぞれ固有IDがついていて、ペアリングされているため結構セキュアと思われる
ただ、WEB関連のセキュリティがずさんでホワイトハッカーともめていた

工場IoTのセキュリティ

無線飛んでPLCのIoTできて、「やった!」という感じ
ドローンと非常に似ている
※ちなみにPLCはアセンブラと非常に似ていて興味深い

シミュレータ

シミュレータは今まで実用的じゃないと思っていたが....

ゲーミングではTASという分野がある。
これはゲームのエミュレータを用いて、動的解析や2倍速再生、メモリ解析を用いることでゲームのバグを発見して最短最速クリアを狙う遊び方
-> これがRTA(人間が実機ゲームで最短最速クリアを狙う)に応用される
-> 1F単位で入力できれば、マリオなどで敵を中途半端に倒して乱数調整することによって任意コード呼び出しが可能
-> 映画の世界でスーパーハッカーがすごい速度でタイピングしているのは非現実的だが、(実際はexploitする人、マルウェアの開発、自動化スクリプトの実行役などチームが分かれているらしくソフトウエア企業とあまり変わらなさそう)ゲームRTAの世界では動的解析・エミュレータツールの知見が逆輸入されてスーパーハッカーのように1F入力の世界での任意コード実行になっていて熱い!(ニコ動やtwitchなどでRTA/TAS勢がいる)
-> 枯れた技術というわけでもなく、最近スーファミが復刻し、FF6もスマホ移植されていて、esportsがオリンピック認定されたのでRTAスーパーハッカーオリンピック競技生まれそう
コンシューマーゲーム機などの界隈では多種アーキテクチャのセキュリティやエミュレータ技術が非常に役に立ちそう
※エミュレータ:Dolphin(GC, Wii)が有名, 64エミュレータはスマホでもある, Wii UはCEmu(ただしGTX1000系じゃないと快適に動作しない), switchのエミュレータも開発が進んでいる。ハッカーとしてはfail0verflowが有名

なぜputs/getsなの?

組み込みなので、標準Cライブラリを使っていないことを想定している
(Arduinoは標準Cライブラリを使っていない)
※Hello, hello worldの本にも書かれてあるが、glibcでもnewlibでもprintfの実装は可変長引数の実装がかなり冗長(マクロとgotoを使いまくる)
glibcは200KBなので、libcの中ではサイズが大きい方として有名

※コンピュータ・アーキテクチャとアセンブラの包括的な理解方法

CPU回路設計がわかっても、アセンブラは読めない場合がある
@ken_demuは特にx86の関数引数渡しのスタック経由ABIに苦戦(ARMからアセンブラを始めて、x86システムコールのアセンブラを見ていて,なぜx86アーキテクチャのABIの関数引数渡しがレジスタ経由じゃないのかわからなかった)

計算模型がスタックマシンか、アキュムレータマシンかレジスタマシン(2-3オペランド)か
スタックマシン : アセンブラなどで、スタックのみでデータを受け渡しする計算模型。必要なのは少数の専用レジスタのみで、レジスタファイルがいらないCPUアーキテクチャ。x86のFPUはこれにあたる気がする。他にはJVMや仮想機械など。ただし、仮想機械のハードウエア実装としてLISPマシンやJazelleなどのJavaハードウエア実行プロセッサなども存在するので、この計算模型は意外と一般的かも。
アキュムレータマシン : アセンブラで1オペランド命令のときはこれ。プログラムカウンタなどのアキュムレータを使用する命令が当てはまる。
レジスタマシン:2オペランド、3オペランド命令はこれ。RISC等。

※動的解析の入り口

TASなどのゲームエミュレータか、hello hello worldという本からhello worldを通してほとんどgdbを使って(一部静的解析)Linux Kernelのシステムコール実装まで解析する本がおすすめ
アセンブリの解析とC/C++プログラムのgdbデバッグはレベルが違う。 ゲームからバイナリ解析学べるのは一石二鳥だと思う

Report abuse