脆弱性攻撃テクニックで最も一般的なもの
バッファオーバーフロー攻撃(buffer overflow attack)
フォーマット文字列攻撃(format string attack)
suid(set user ID)
suid権限が設定されているファイルはだれが実行したとしても実行時に一時的に実効ID(euid(effective user ID))が所有者になって実行される。
特に、所有者がrootでsuid権限が設定されているプログラムは suid root プログラム という。
suid root プログラムに脆弱性があるとやばい。その脆弱性を利用してシェルを起動されたらつまりroot権限を奪取されたことになる。
メモリのアドレスひとつに記憶できるのは1byte、2進数で8桁、16進数で2桁
レジスター
x86のEIP(Extend Instruction Pointer)は他のCPUでよくあるPC(Program Counter)と同じ。
x86はリトルエンディアン。1byteずつ逆順にメモリに格納していく。
10byteの文字バッファを確保してもNULLbyteを入れる必要があるため、実際に使える文字数は9文字。
テキストセグメント text segment
マシン語で記述されたプログラムが格納される。書き込み不可。固定長。
データセグメント data segment
初期化されたグローバル変数や静的変数を格納。書き込み可能。固定長。
bssセグメント bss(Block Started by Symbol) segment
初期化されていないグローバル変数や静的変数を格納。書き込み可能。固定長。
ヒープセグメント heap segment
動的に割り当てられる変数を格納。メモリアドレスの低位から高位に伸びる。
スタックセグメント stack segment
関数内のローカル変数、関数へ引き渡す引数、退避させておくEBPや戻りアドレスを保持。メモリアドレスの高位から低位へ伸びる。
--------------------- 低位アドレス
| テキストセグメント |
|---------------------|
| データセグメント |
|---------------------|
| bssセグメント |
|---------------------|
| ヒープセグメント |
| ↓ |
| |
| |
| |
| ↑ |
| スタックセグメント |
--------------------- 高位アドレス
stack
----------------- 低位アドレス
| ローカル変数 |
|-----------------|
| SFP |
|-----------------| ←EBP
| RET |
|-----------------|
| 引数 |
----------------- 高位アドレス
SFP(Saved Frame Pointer) 保存されたフレームポインターつまり元のEBPのこと。
Frame Pointer = EBP(Extended Base Pointer)
引数が
void func(int a, int b, int c, int d)
のようになっていたら、d, c, b, a の順にpushされる。
call 命令
現在のEIPをスタックにプッシュし、EIPを指定された値に書き換える。
ret 命令
スタックからポップした値をEIPに設定する。
NOPスレッド(NOP sled)
threadじゃない。sled。そり。
脆弱性をもったプログラムのバッファが小さすぎてシェルコードを挿入できないときは、シェルコードを環境変数に仕込むこともできる。
ASLR(Address Space Layout Ramdomization)
スタックやヒープなどのアドレスをランダム化して特定されにくくすることによりセキュリティを高める。
Ubuntuでは
/proc/sys/kernel/randomize_va_space
の値を変更することにより設定を行う。
0 無効
1 ヒープ以外有効(たぶん)
2 有効
デフォだと2だった。
現在の値を確認するには
cat /proc/sys/kernel/randomize_va_space
または
sysctl -n kernel.randomize_va_space
値を変更するには
sudo echo 0 > /proc/sys/kernel/randomize_va_space
または
sudo sysctl -w kernel.randomize_va_space=0
などとする。
sniffing くんかくんか
spoofing なりすまし、偽装
内部で使えるIPアドレス
10.XXX.XXX.XXX
172.16.XXX.XXXから172.31.XXX.XXX
192.168.XXX.XXX
$1$で始まる文字列はmd5のハッシュ値であることを示す。
$6$で始まる文字列はsha512のハッシュ値であることを示す。
unix系OSのパスワード格納の際に使われる。
DEP (Data Execute Prevention)
データ実行防止
Windows XP SP2~、Vista、7 などに搭載されている。
データ領域の実行を禁止する。
Linuxのほぼ同様な機能は Exec Shield や PaX など。
DEPの設定などに関して
http://www.atmarkit.co.jp/fsys/kaisetsu/045dep/dep.html
仮想関数テーブル
virtual method table, vftable, vtable
ヒープスプレー(heap spraying)
ASLRの回避手法の1つ。
ヒープ上にやたらとシェルコードをロードしまくって攻撃の成功率を上昇させる。
ブラウザの攻略によく使われるようである。その際、ヒープを構築するためによくJavascriptが利用されるようである。
http://journal.mycom.co.jp/column/itsecurity/011/index.html
http://en.wikipedia.org/wiki/Heap_spraying
PoC(Proof of Concept)
概念実証
脆弱性を利用した攻撃が可能であることを実際のコードを作成することで示すこと。
meterpreter
Metasploitで指定できるペイロード。
色々できる。
StackGuard
戻りアドレスの前にカナリア値(canary value)を挿入する。もし、戻りアドレスがバッファオーバーフローなどにより書き換えられてしまうとおそらくカナリア値も変更され、システムが停止する。
ただし、これによりバッファオーバーフローが他の値を上書きするのを防ぐことはできない点に注意。上書きされたその値はシステムへの攻撃のためにまだ使えるかもしれない。
StackGuardの手法の変形としては、ProPoliceと名づけられたIBMのスタック破壊防御(stack-smashing protector. ssp)がある。
Visual C++ ではコンパイルオプションに /GS をつけるとカナリア値を有効にできる。
http://www.ibm.com/developerworks/jp/linux/library/l-sp4/index.html
サイドチャネル攻撃
暗号の実装上の脆弱性をついた攻撃
http://ja.wikipedia.org/wiki/サイドチャネル攻撃
ランダムオラクル
あらゆる問い合わせに対して真にランダムな応答を返すが、同じ問い合わせに対しては毎回同じ応答をするもの。
http://ja.wikipedia.org/wiki/ランダムオラクル
DPI
ディープパケットインスペクション
匿名システム
Anonymizer、Torなど
ソフトウェアブレークポイントを利用したデバッグを阻止したい
→メモリ上の自身のコードのCRCチェックサムの変更をチェック。変更されていたら自殺(自分をkill)。