Linux Serverのオフラインアップデート

わけがあり、オフラインのCentOSをアップデートをすることになりました。

ここでまずやらないといけないことは、

オフラインのCentOSの構成情報と、パッチ取得用の構成情報を合わせないといけないことです。

#yum list updated

コマンドを実行したが、コマンドの性質上オンラインリポジトリに確認しにいき、ダメだったらそのまま処理が終わるというyumの仕様だった。

#yum -C list updated

次はこれを実行だが、結果が期待通りでない。おそらくだが、UPDATE対象のCentOSyumで一回もUPDATEをしていない処女CentOSだったのだ。


ムムム。と思いつつ。RPMでとりあえずリストを取ることにした。

#rpm -qa --qf "%{NAME}-%{VERSION}¥n" > src_rpm.txt

こんな感じで、名前とバージョンを取る。なぜパッケージ名ーバージョンという形にするかというと、YUMでバージョンを指定してインストールする場合は、バージョン情報がいるからだ。


これで取得した。そして、USBに先ほど取得したデータを入れパッチ取得用PCにマウントさせてLet's Update!

さっき取得したファイルは、
rpm-XXXXXXX
yum-XXXXXXX

みたいな感じでパッケージ-バージョンで1行ずつに書かれている。

バッチを作って一括で適用!!
ここで注意するのは、オフラインリポジトリを作るために、パッケージをダウンロードするということだ。


ちなみにCentOS6.2では、最初からインストールされていなかったので下記のコマンドでインストール

#yum install yum-plugin-downloadonly

#!bin/bash
while read line
yum install --downloadonly $line
do < /mnt/usb/src_rpm.txt


これでとりあえず、ダウンロード完了したってことで /etc/cache/yum/のなかにあるパッケージを見てみよう。

見てみると、CentOSの系統>ビット表示>パッチデータとなっている。

baseとかupdateとか書いてある。

ここまで確認したら、次はローカルリポジトリを作成する。

インストールされていない場合は、下記のコマンドでインストール

#yum install createrepo

これで、リポジトリを作成

#createrepo .


実行した後、lsでディレクトリをみるとrepoっていうディレクトリができている。


これでうまくできたので、今度はyumの設定を変えていく。
/etc/yum_/repos.d/centos.repo

今回は、CentOSにしているが.repoの名前はなんでもいい。自動的にyumが読み込んでくれる。

#vi /etc/yum_/repos.d/centos.repo

ファイルの中身は、こんな感じ

name=CENTOS
baseurl=file:// ←ここにリポジトリのあるパスを絶対パスで書く
metadata_expire=-1
gpgcheck=0
enabled=1


これが終わったら

#yum install

これでとりあえず、構成情報はオフラインのものと同じものが入った。

そしたら、今度は、さっき作ったファイルをリネームかして一回ローカルリポジトリを無効にしよう。

#rename /etc/yum_/repos.d /etc/yum/reposss.d

そしたら、ダウンロードのみでupdateコマンド実行

#yum update --downloadonly


updateが終わったらもう一回、名前を直す。

#rename /etc/yum/reposss.d /etc/yum_/repos.d 


そして、

#yum update


これで ついに終わった。


あとは、オフライン機にも適用をして


コングラッチレーション!!

GREMを目指す

GREMを目指すということを決めた。

なんでGREMかというとリバースエンジニアリングにものすごい魅力を感じたからだ。

リバースエンジニアリングは、ソースコードを読むことも入るが自分がいうのは、実行可能ファイルからソースを考察する逆アセンブルの方だ。


色々調べてみると、

Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation
https://repo.zenk-security.com/Reversing%20.%20cracking/Practical%20Reverse%20Engineering.pdf

Practical Malware Analysis
http://venom630.free.fr/pdf/Practical_Malware_Analysis.pdf


上記の二つで勉強して受かったという方がいるみたいです。

なので、来年度取得目標でコツコツやっていきたいと思います。

ddコマンドでHDD丸ごとバックアップ[Windows]

HDD丸ごとバックアップすることになったのでここに記す。

※この方法でOS動かなくなっても一切責任はとりません。

1.準備

・起動用USBを用意する。
(1)CentOS projectからCentOSをダウンロードする。
isoredirect.centos.org
 この中から、当初描いた時はCentOS7が最新。URLの中から適当なURLを選んでダウンロードする。

(2)USBの確保
起動用のUSBだが、32GBくらいあれば十分。セキュリティのことを考えるなら、テンキー式のUSBが好ましい。

(3)USBにisoデータを書き込む。
USBにisoデータを書き込むソフトの中で、「Rufus」というソフトがある(Windows用)
rufus-usb.jp.uptodown.com

f:id:sonic_bin:20180623104707p:plain

[1][Show advanced drive properties]をクリックする(おそらくここをクリックしないと、Deviceに表示されない
[2]対象のUSBを選ぶ
[3](1)でダウンロードしたCentOSのデータを選ぶ。
[4][start]をクリック。

2.backup取得

Let's get backup!

まずはじめに、backupするWindowsパソコンの電源を入りきりし、BIOSの画面を開く。BIOSの画面に行く前に、USBを接続しておく。USB
を起動の1番目に設定する。

その後、下記の様な画面が出たら、[Troubleshooting]をクリックする。
f:id:sonic_bin:20180623105124p:plain

f:id:sonic_bin:20180623105201p:plain

次に「Rescue a CentOS system」をクリックする。

この後、CentOS7のレスキューモードの準備が始まるのだが、USBによって途中でアンマウントされることがある。途中で読み込みが終わってしまうので、USB状態を確認しながらもう一回マウントしよう。

次に入力を求められたら[1],最後にまた、....って出たらエンターおそう。

ここでようやく、レスキューモードに立ち上がった。
(1)マウント先のディレクトリを作成

#mkdir /mnt/BACKUP

(2) バックアップ用HDDが/dev/なんで読み込まれているか確認

#dmesg

HDDが一個の場合大抵、/dev/sdcで読まれることが多い←念のため確認して。

(3)ファイルシステムext3にする。
よくあるのが、「exFAT」や「NTFS」でフォーマットされているやつ。最近は、vfatとかでなってるやつはあまり見たことない。レスキューモードでは、当然「exFat」や「NTFS」はマウントできないから、そういう場合は、ext3でフォーマットしとこう。

#mkfs.ext3 /dev/sdc

1TBの場合、フォーマットに15分〜20分にかかった。

(4)バックアップ用HDDをマウントする。

#mkfs.ext3 /dev/sdc

(5)マウントされたか確認する。

#df -a

バイスと、マウントポイントが表示される。今回の場合は、[/dev/sdc ・・・・・/mnt/BACKUP]

(6)バックアップ先HDDを確認する。

#ldisk -l

各ディスクの容量が表示される。自分がやった時は、/dev/sdaでパーテーションで/dev/sda1,/dev/sda2で分けられていた。バックアップするのは、/dev/sdaのみで良い。バックアップするHDDの決め方はWindowsに表示されている各ドライブ(C:やD:など)の合計値を見て判断する。

(7)ddコマンドによるバックアップ

#dd if=/dev/sda of=/mnt/BACKUP/BACKUP.dmp bs=5MB

ifとofを間違えると悲惨なことになるので注意を・・・。

ここで、圧縮して容量も減らすとなるがそれなりに時間がかかる。1.5倍くらい時間がかかると思って良い。
300GBの場合は、約200分近くかかった。それに、リストアする際に解凍していると時間がかかる。それは、あまりよろしくない。

3.Restore

リストアは、ただddコマンドで書き込むだけ!

#dd if=/mnt/BACKUP/BACKUP.dmp of=/dev/sda bs=5MB

Xcode8.2→Xcode9への移植作業[Swift3→Swift4]

Xcode8.2からXcode9への移植。なぜXcodeをUpdateとしたかというと、無線実機でバックができるということと、セキュリティ的に最新バージョンを使った方がいいと思ったから。

まず、Xcodeをversionupした後に画面を開いたら、次のような画面がでた。

f:id:sonic_bin:20180620041231p:plain

とりあえず、Update to recommended settingを行ってみる。

1.Update to recommended setting

エラーマークをクリックし、[Update to recommended setting]をクリックする。

f:id:sonic_bin:20180620041847p:plain

[Perform to Changed]をクリックする。

2.ライブラリについて

SwiftyJSONを使用していたが、Xcode8.2が要件みたいなので使わないようにした。
代わりにSwift4で提供されている「COdableプロトコル」を利用することにした。

dev.classmethod.jp

3.Swift3→SWift4へのコンバート

エラーマークをクリックし、[Conversion to Swift4 is available]をクリックする。

f:id:sonic_bin:20180620042836p:plain


[Next]をクリックする。

f:id:sonic_bin:20180620043539p:plain

[Minimize Inference]をクリックする。


f:id:sonic_bin:20180620043211p:plain

[OK]をクリックする。

f:id:sonic_bin:20180620043213p:plain

実行中の画面が出るので待機。

f:id:sonic_bin:20180620043358p:plain

ライブラリのSwift4への変更箇所等が出るので、「Save」をクリック。

IPアドレスが重複した場合

IPアドレスが、重複する場合にはどんなことが起きるのでしょう。


例えば、下記のようなネットワーク構成があったとする。

PCA:131.162.34.3
PCB:131.162.34.5
FW :131.162.34.254
PCD:131.162.40.7
PCE:131.162.40.9


f:id:sonic_bin:20180419224024p:plain

例えば、PCAのアドレスがPCDのものになったとしよう。
そうした場合、PCBのARPテーブルは下記のようになります。

131.162.40.7・・・・・・(1)
MAC A

OR

131.162.40.7・・・・・・(2)
MAC X

ARPテーブルは、時間が経つと消えます。その後、(1)からarpの応答が来た場合arpテーブルは(1)となり、
PCDに送るはずのパケットがPCBから送る場合は、PCAに届いてください。また、次に(2)の場合は通常
通り行われます。つまり、通信が来たりこなかったり不安定になります。

また場合によっては、クリティカルになるので気おつけましょう。


参考画像URL:
リダイレクトの警告
リダイレクトの警告

リバースエンジニアリング入門

1.Cのメイン関数と引数

マルウェアは、よくcで記される。だから、cプログランをアセンブリに変換するメインメソッドがどんなものか知るという事は、重要である。
知識は、c言語からアセンブリに変更するときにどのようなオフセットが異なるか理解するのに役に立つ。
一般的なc言語は、メイン関数に2つの引数を持っている。下記は、典型的な例。

int main(int argc, char* argv[])
{
if (argc != 3) {return 0;}
if (strncmp(argv[1], "-r", 2) == 0){
            DeleteFileA(argv[2]);
}
return 0;
 }

これをアセンブリに言語に直すと、、、

f:id:sonic_bin:20180418203716p:plain

①の所が、cでいう
if(argc[3]==3)
になる。しかし次の行で「jz short loc_4113D8」が来ている。これは、cmpの結果が真じゃない場合となる。この二つを合わせるとつまり、、、

if(argc[3]!=3){


}

次に、004113D8の処理を見てみると。

move psi,espは、特に言語の仕様なので気にしないでください。

push 2
push offset str2
mov eax, [ebp+argv4]
mov ecx, [eax+4]
puch ecx

となっています。そのあとに、strcmpがcallされています。こちらをcに直すと、

strcmp(argv[1],"-r",2);

になります。はじめの引数は後にpushされるということを忘れないでください。

次を読むと
test eax eax
jnz short loc_411412
これをstrcmpと組み合わせるとこうなります。

if(strcmp(argv[1],"-r",2)!=0)

ここで注目して欲しいのは、test eax eaxです。これはeax とeaxが同じ値だったら0という意味です。eaxには、処理の結果が格納されるので必然ときに「0」が当たり前です。test eax eax とjnz が組み合わせでくると、if(==0)となるので覚えておこう。

00411412を見てみると、この中にアドレスはありませんね。ということで、ループから抜けたということになります。
ループ先がなかったので、次を読み進んでみると、

mov esi, esp
mov eax, [ebp+argv]
mov ecx,[eax+8]
push ecx
call DeleteFIileA

まず、eatにebp+argvを入れeax+8をecxに入れpushしている。これは、第二引数を DeleteFileAに渡している。

DeleteFile(argv[2]);

となる。



最後にまとめると、

int main(int argc, char* argv[])
{
if (argc != 3) {return 0;}
if (strncmp(argv[1], "-r", 2) == 0){
            DeleteFileA(argv[2]);
}
return 0;
 }

になるのだ。

H30年度 春 午後2 問2の解答予想を載せてみた

H30年度 情報安全確保支援士 午後2 問2解答


設問1
(1)特殊な文字列を含んだ、HTTPリクエストを用いた攻撃の場合
(2)a:WEBサイトYの全ファイルと比較
(3)公開鍵認証方式

設問2
b:WEBサイトの運用・保守で使う機器の構成

設問3
c:ディレクト
d:クロスサイト
e:HTTP
f:ジャンキング

設問4
(1)g:100
(2)h:70
(3)j:画面遷移(c)の限定商品一覧画面で商品を選び、”選択ボタン”をクリックする。
(4)k:一般会員と有料会員
l:仕様通り利用ができること

設問5
最新のWEBセキュリティサイトに従って開発がされている事 

設問6
診断で見つかった脆弱性の対策と検討する事により、よりセキュアな実装が見込める