ddの由来は、 “data duplicator” 。 要はコピーするコマンドです。
コピーコマンド: ” cpコマンド” との違い
コピーするコマンドと言えば真っ先に ” cpコマンド” が思い浮かびます。
例えば下の例はファイルAをファイルBにコピーするコマンドですが、
cp ファイルA ファイルB
ddコマンドは同じコピーでも、cpコマンドとは違ってディスクの領域全てをコピーします。
違いを分かりやすく言うと、ファイルとファイルの隙間の空白部分までをも全部コピーします。(低レベルコピーと呼ばれます)
空白部分の重要性
そしてこの空白部分(ノートで言うと白紙部分)こそが実は重要で、そこには “既に削除されたファイル” などが埋まっていたりする訳です。
よく “削除されたファイルを復旧(復元)する” などと言われてますが、アレです。
ハッキングされたマシンのハードディスクなどを検査・検証する作業をフォレンジクスと言います。
この作業では、まずは下準備として検査対象のディスク(メディア・ストレージなど)を、空白部分を含めて全て丸々コピーしてくる過程が必要です。
重要な証拠物のコピーですね。
その際のコピーコマンドが “ddコマンド” です。
ddコマンドと同機能・同系統の進化版ツールに “dcfldd” や “dc3dd” があります。これらは次回以降にて。
逆に、空白部分も含めて、コピー機能を利用して丁寧に丹念に上書き(全部ゼロで埋めたりします)して、(もはや復旧できないように)証拠隠滅する完全消去する作業も “ddコマンド” で出来ます。
コピー元の選択
本番では、ハッキングされたマシンのストレージ(ハードディスク・メディア等)を、そっくりそのまま証拠としてコピーします(そしてそれを後で解析しますが)
そのようなものは無いので、今回使用するのは32GBの古いUSBメモリにしました。

これ20年くらい前に使っていたもので、最近15年くらいは殆ど使っていません(普段のデータ移動はcloud経由のデータ受け渡しで事足りてますので)
あまり容量の大きいメモリだと時間がかかり過ぎるので、出来るだけ小さいものを探しましたがこれが最小でした。
これをラズパイのUSBポートに差し込みます。
するとデスクトップにアイコンが現れます。

丁度、中身のファイルはゼロの状態です。(しかし過去には無数に書き込みと消去を繰り返しています)

パスは “/media/kali/TRANSCEND”
ddコマンドの設定と実行
このコマンドの基本的な設定は下記の通り。入力ファイルから出力ファイルへとコピーします。
dd if=入力ファイル of=出力ファイル bs=入出力ブロックサイズ count=ブロック数
出力先には当然、入力される容量よりも大きな容量が必要です。
入力ファイルの指定の仕方
入力ファイルとなってますが、空白部分までコピーするので基本的にはディスク・メディア全部(又はそのパーティション)が入力対象となります。
その為特殊な指定方法となります。
lsblkコマンド
lsblkコマンドは、システム下のデバイスとパーティションをツリー形式で表示するコマンドです。
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL,MODEL
上記コマンドで得られた情報を元に、ターゲットのデバイス名(パーティション名)を確認、特定します。

sda, sdb, sdc, …がデバイス名、sda1, sda2, sda3 …がパーティション名です。
上記の例では “sda” を選択します。( “mmcblk0” の方はラズパイ本体のストレージです)
ddでの “io= ” オプションには ” /dev/” の後にこの名称を使用します。
自動マウントされた場合のアンマウント
マウントされていない状態にして読み取りを行います。
umount /dev/sd*
“unmount” ではなく “umount”
実行例では、マウントはされていませんでした。

でもGUIではマウントされているという不思議な状況になっています。
この謎解きも面白そうですが、今は拘らないことにします。
ちなみにGUIからのアンマウントは無効で、ディスク取り出しにするとデスクトップから消えまして、その時のlsblkは下記でした。
読取専用化
hdparmは “HardDisk Parameter Modifier” の略。ディスク管理ツール。
このコマンドを使用して、読取専用に設定します。
sudo hdparm -r1 /dev/sd*
“-r” オプションはread onlyフラグを設定します。デフォルトは0、read onlyなら1

実行前のチェックリスト
- White Blockerで書き込み防止
- lsblkで対象デバイスを確認(sda, sdbなど)
- 容量・メーカー・対象パーティション(sda1, sda2など)を確認
- unmount /dev/sd* で対象デバイスをアンマウント
- hdparm -r1 /dev/sd* で読取専用化
- if=/dev/sd* 指定してddを実行
コピーの実行
では実際に実行してみましょう。
下記オプションを付加します。
- 進行経過をモニタするオプション “status=progress”
- 読み取りエラー時もゼロで補完して継続するオプション “conv=sync,noerror”
書き込みファイルは、 “/mnt/forensics/transcend01.dd” としました。
sudo dd if=/dev/sda of=/mnt/forensics/transcend01.dd bs=4M conv=sync,noerror status=progress
コピーが始まります。

コピーが完了しました。

32GBのファイルが作成されています。

ハッシュの作成
フォレンジクス作業の場合には取得したコピーのハッシュを記録しておきます。
以下、各種ハッシュの作成例。
MD5ハッシュ
md5sum ファイル名.dd

ハッシュログの保存

SHA1ハッシュ
sha1sum ファイル名.dd
SHA256ハッシュ
sha256sum ファイル名.dd
まとめ
今回はddコマンドについて、フォレンジックの準備段階としてのコピー作業の使用に絞って取り上げました。
なお作成されたコピーは証拠物となり、次の段階として “autopsy” などのツールで解析されます。
補足:ゼロで埋める方法
参考までに、証拠隠滅セキュリティ保持の為に、過去に削除したファイルも含めて全て消したい時。
入力ファイルはゼロを生み出す ” /dev/zero” を設定して、出力ファイルの方をゼロで埋めたいディスク・メディアにします。
dd if=/dev/zero of=出力ファイル bs=入出力ブロックサイズ count=ブロック数
ランダム数字で埋める方法
全部ゼロだと偽装工作がわざとらしいので、ランダムな数字で埋めたい場合はこちら。
入力を ” /dev/urandom” にします。
dd if=/dev/urandom of=出力ファイル bs=入出力ブロックサイズ count=ブロック数
途中に出てきた “hdparmコマンド” でもデータの完全消去が出来るようです。(機会あれば取り上げます)
コメント