2017年10月4日水曜日

さくらVPS 512MBメモリでハニーポットをやってみる


ノリで借りてしまいました。さくらインターネットの現時点で一番安いVPS。512MBメモリ20GBSSDの構成で700円程のやつです。

とりあえずハニーポットを触ってみたかったので、設定してみることに。


ハニーポットを選ぶ

 「低対話型サーバ側ハニーポット」として、ssh特化のハニーポットソフトウェア「Cowrie」を選択しました。 始めは「Dionaea」を検討していたのですが、リンク切れを起こしていたのでちょっと保留(forkはあった)。


サーバー準備

勢いで借りたサーバーの起動準備ができたらスタート。CentOS7が乗っていたので、そのままCentOSで行くことに。

rootログイン、sshd_configでのrootログイン禁止、adduserでの別ユーザー生成くらいをやってから、CowrieのINSTALL.mdを参考に作業開始。

説明だとapt-getなのですが、CentOSだとapt-getが無いのでyumで。libssl-devが無いので調べるとopenssl-develが代用できそうなので、そちらをインストール。

また、Cowrie専用のユーザが必要ということで、そちらも用意。
virtualenvは色々設定した後にdesactivateで抜けます。

設定ファイルcowrie.cgfは、ポート番号の設定くらいで。
転送先のポートなどの設定が決まったら、firewall-cmdを利用してファイアウォールでポート転送の設定を。

このタイミングで何回か自分の環境からssh接続で応答なしが出ましたが、Cowrieを起動していないのにポート転送の設定を適用してしまっていたとか、そういう情けないミスが原因でした。

ダミーユーザについてはそのままに(後からログ見るとユーザ名adminが多かったのでそれも追加してもいいかもしれない)

ポート設定後は、~/cowrie/bin/cowrie startで起動。エラーが出ましたがメッセージを確認すると、いくつかパッケージ導入を失敗していたことが原因だったのですぐに解決。

起動後は、確認の為にログイン。偽のログイン先にあるディレクトリが「Richard」で面白味に掛けたので、~/cowrie/data/fs.pickleを調べると偽ディレクトリの設定があったので、適当なものに変更。


ログを見る

ログは~/cowrie/log/cowrie.logです。
設置してからすぐにユーザ名rootでアクセスがあり、入るなり「/gweerwe323f」というものを打ってきました。感染済みかどうかを調べているのでしょうか。
あの手この手で/gweerwe323fを探した後は、\x47\x72\x6f\70(Grop)という指定で色々書いたり消したりしているみたいです。

他には、ユーザ名adminで何回が接続しに来ていました。adminの方が数が多そうに見えるので、こちらも開放して何をするのか見てみるつもりです。

最安プラン雑感

応答が悪いだとか、処理が遅いだとか、そういうものはまだ感じていません。OSとCowrieを動かすためのもの達で、20GBの40%は埋まっています。ログがどれくらいの速度で増えていくのかまだ分かりませんが、そんなに悪くはないのかなと。

2017年7月16日日曜日

Pebble TimeでWatchfaceを作った時の色々

色々終わってしまってて遅いのですが。ここ数日でまたPebble TimeのWatchfaceを作っていました。どうせなので作業手順を晒しておこうという感じです。ドット絵を用意して、アニメーションとしてWatchfaceに組み込んでみた話になります。



0. 環境
WindowsでPebbleの開発を行うなら、やはり公式ガイドで説明されているように仮想マシンを用意するのが一番良い手ですね。重いのは仕方ないとして。

使った環境はVirtual boxでのUbuntu 16.04で、割り当てメモリは1024MB、ストレージは16GBです。
動きが貧弱なので、基本的にWindows側で素材を作ってから仮想OSを立ち上げて、設定しておいた共有フォルダ経由で移動させて…という形を取っていました。


以前、Window10のBash on Ubuntu on Windowsを使ってPebble開発ができるというネタを書きましたが、いくつかWatchfaceを使ってみて止めておいたが良いなと感じました。
SDKを突っ込んで作ることはできますが、折角Pebbleに用意されている「Pebbleと接続している端末のIPアドレスを指定してインストール」の機能や「実機のログを取得」が使えないというのが勿体無いです(このあたりは、SSLErrorとあるのでネット周りが改善すれば使えそうですが)。後はQEMUで用意されているエミュレータが使えないというのも若干痛いというのも。





1. 素材の作成
アニメーションを付ける為、Edge(ドット絵を作れるエディタ)で必要なものを作り、透過やディレイを設定してからgifの形で保存。ちなみに使える色はColor Pickerで確認できます。なおこちらに乗っていない色も自動で補正してくれるので、あまり気にしなくても良い気がします。

ドット絵である必要がなければ、そのままGIMPから開始して良いと思います。


2. GIMPでgif読み込み、再保存
Edgeで作成したgifをそのまま持っていくと最終的にPebbleで実行時に「failed to load palette」で落ちるので、GIMPで形式を変更します。
そのまま対象のgifをインポートした上で、ツールバーから「画像」->「モード」を選択し、「RGB」に変更します。 多分変更前は「インデックス」になっていると思います。
変更後はgifとしてエクスポート。

3.gif2apngでapngを作成
Pebbleはgifには対応せず、apngという形式を要求しているので、そちらに変更します。
gif2apngは、http://gif2apng.sourceforge.net/ からダウンロード。公式ガイドではgif2apngはCUIで実行していますが、GUIでも問題ありません。ただし、必ず変換前に右下の設定ボタンから設定画面を開いて、
Compression Method: zlib
Optimization palette: unchecked
という設定をするのを忘れずに。CUIでは「-z0」のオプションを付ければOKです。
なお、apngの拡張子はpngです。


4.フォントの用意
システムフォント(デフォルトで用意されているフォント)を使いたくない場合は、拡張子がttfのフォントファイルを用意します。ただ、システムフォントの一覧を見ると結構数があるようです。

5. 仮想OSの起動とプロジェクト作成
ここで仮想OSの方を起動します。起動後はpebble new-project watchface <name>でプロジェクトを作成します。作成後は「resources」というディレクトリを作成して、そこに、ホストOSで作成した素材を保存します。
Virtual boxなら設定すればドラッグ&ドロップでホストOSからデータを持ち込めるはずなのですが、どうも上手くいってないので、共有フォルダの設定をした上で
sudo cp /media/<filename>/<data> <path>
と打ってデータをゲストOSに持ち込んで、chmodで権限を変更して使っています。

6. コードを書く,package.jsonの編集
普段からEmacsなので、ゲストOSで作っていますが、別にこれもホストOSで書いてからゲストOSに持ち込んでもいいのかなという気はしています。
package.jsonには、素材の分だけmediaに登録します。

7.ビルド,インストール
ビルド後は、buildディレクトリの中にpbwファイルが作成されます。これが本体です。
buildが正常に終了しているのであれば、pebble installします。
実機にインストールしたい場合は、実機と接続している端末(iPhone/Android)のPebbleアプリをsettingsからdeveloperを選択して、実機を通信待機状態にし、そのうえでpebble install --phone <IP address> します。
IPアドレスは、端末アプリのdeveloperを選択すれば確認できます。

エミュレータの場合は pebble install --emulator <version> とすれば動きます。ここではPebble Timeなので、pebble install --emulator basaltです。
(自分の環境だとかなり時間がかかってしまった為、これは実機でいいと思いました)
ちなみに、どちらの場合も--logsオプションを付けるとログが出力されます。実行時エラーは大体これで分かります。
動作確認ができ、ストアに登録する予定があるならば、この時点で
pebble screenshot <FILENAME>
と入力してスクリーンショットを取っておくと良いと思います。


8.ストアに登録
せっかくなのでストアに。 
固有のUUIDが必要なので、https://www.uuidgenerator.net/ でUUID(version 4)を生成。
(もともとpackage.jsonにUUIDは書いてあるのですが、自動生成されてるか分からなかったので念の為)
https://dev-portal.getpebble.com/developerにアクセスして、開発者用のアカウントを登録。後は書いてある通りに設定すれば簡単に登録できます。
なお、Package.jsonで指定した対応端末の分だけスクリーンショットが要求されます。面倒だったので、Basalt(Pebble Time)のスクリーンショットを使い回して登録しましたが。
Publishでストアに登録して、30分程で登録画面にストアへのリンクが表示されます。



2017年1月15日日曜日

pydbgをMSYS2環境で使いたいけどできない

未解決です。


「リバースエンジニアリング Pythonによるバイナリ解析技法/Justin Seitz 著,安藤慶一 訳」を触っていたのですが、途中でpyDbgが必要になったのでメモです。

MSYS2の環境で、python2.7を利用しました。
初めはmingw64でコード書いていたのですが、CPUのレジスタ確認のコードあたりで、エラーが出てないのにすべての値が0x0になるという事態が起きていて、不安だなと思っていたところ、
https://github.com/OpenRCE/pydbg のpyDbgを導入したらpyDbg内のwindows_h.pyのでassert文によるエラーが出てしまいました。


AssertionError: 8

windows_h.pyを見るとsizeofによる構造体のサイズ確認だったようで、MSDNの方で確認すると32bit環境と64bit環境でサイズが違うからそのエラーなんだろうと思い、適当にassertを全部コメントアウトして動くか確かめたところ、windows_h.pyを抜けた先で、

import pydasm
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。

となりました。

pydasmに関しては、本でもpython26.dllをpython27.dllに書き換えるなどの指示があったのでそのあたりをいじったのですが、駄目でした。
pydasm.pydが32bit用だからということで、64bit環境のものを探せばいいだろうと思ってもうまく動かず。


諦めてmingw32にpython2.7入れることにしてpyDbg(今度はhttps://github.com/reider-roque/pydbg-pydasm-paimeiから)を用意したところ、pydasmで「指定されたモジュールが見つかりません」に。
(確かこのときsetup.py installでpydasmのインストールでMINGW用のpydasm.pydがないとかいうエラーが出ますが新しくmingw-2.7とかフォルダを作って、内部にwin向けのpydasmを入れたら成功します、動きませんが)
dependency walkerとかを使って色々調べていたのですが、全然わからず諦めようかと思っていたところ、


Now, go to C:\Python27\Lib\site-packages\pydbg and delete the pydasm.pyd file (it’s compiled for an older python version and it causes the pydbg library not to load)

という内容を発見。試しにpydasm.pydをpydasm_tmp.pydなどにリネームしたところ、実行中のプロセスを列挙するテストコードが動きました。


dbgObj = pydbg()  # Create PyDbg object
print dbgObj.enumerate_processes()
これでとりあえず行けるだろうと思ってそのまま進めていたのですが、今度はpyDbgを利用してprintfが実行されるタイミングでメモリを書き換える(printf__random.py)という部分でまたこけました。
Traceback (most recent call last):

  File "printf_random.py", line 27, in <module>

    dbg.run()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 2900,in  run

    self.debug_event_loop()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 942,in  debug_event_loop

    self.debug_event_iteration()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 875,in  debug_event_iteration

    continue_status = self.event_handler_load_dll()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 1458,in event_handler_load_dll

    dll = system_dll(self.dbg.u.LoadDll.hFile,self.dbg.u.LoadDll.lpBaseOfDll)

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/system_dll.py", line 96, in __init__

    self.path = os.sep + filename.value.split(os.sep, 3)[3]

IndexError: list index out of range

[1]+  終了 3                  python printf_loop.py
 なんでpyDbgの中でインデックス超えるエラー出てくるんだと数時間戦ったのですが、printなどで出力してみると、system_dll.pyの自身のパスを格納する作業でパスの切り分けがうまいこと出来てないようでした。
#system_dll.py line96周辺
 self.path = os.sep + filename.value.split(os.sep, 3)[3]
ここに出てくるos.sepというのは、OS毎のパスの区切り文字のようで、Winであれば\ であるはずのものです。ここの区切り文字とfilenameのパスで使われている区切り文字が異なっていた為にうまいこと切り分けが出来ず、インデックスのエラーが起きたと思われます。MinGW環境なのが失敗だったのでしょうか。
とりあえず該当部分を
self.path = os.sep + filename.value.split("\\", 3)[3]                             
に変更。
 これでIndexErrorは消えたぞと思ったら、今度はメモリの読み書きを行う
#printf_random.py内
counter=dbg.read_process_memory(parameter_addr,4)
dbg.write_process_memory(parameter_addr,random_counter) 

が変な動きをしているようで読めないし書き込めないしでsegmentation falutを起こしてました。
未解決なので、気が向いたら調べてみようと思います。どうすればいいんだ…。 
というか大人しくMSYS2とか使わないで進めればこんなことにならなかったような…。