1日1解析 part2
1日1解析 part2
下書きのままアップロードするのを忘れていたので公開。 6/15に書いた物です。供養。
今回のサンプル
https://malshare.com/sample.php?action=detail&hash=90c2c10001134ab2a1cc87ec4382b197
前回で全然実力がないことがわかったのでわからなくなった時に見返すことができるよう、解析つきのバイナリを選ぶことにした。
困ったら見る動画↓
動的解析
対象をデスクトップに置いて走らせると、場所と名前を変えて実行される。
移動後のpath
C:\Windows\System32\dnsagent.exe
デバッガで動かしても途中でプロセスが終了してしまうため、初めから上記の場所に置いておいた方が良さそう。 と思ったが、emotetはプロセス名をランダムに変更していた気がするので大人しく解析することにした。
ProcMonを見てみるとThreadExit
でプロセスを終了しているので、そこにbreakpointを仕掛けることにする。
[symbols]→[kernel32]→[ExitThread]
F8
で走らせるたびにModuleをimportしていくのがわかる。
これでpathを変更した新しい実行ファイル付近をみることができるはず...と思ったが、動画を見るとプロセスを作っている箇所にbreakpointを仕掛け、新しくpathを変更して実行している箇所を探していた。
のでそれをなぞることにした。
CreateProcessInternalW
にbreakpointを仕掛け
memoryに読み取り書き込みの権限がある箇所を見てみると
MZ
と見える。
これはWindows
の実行ファイルの特徴なので、取り出したい部分をみることができた。
ちなみにCreateProcess
にbreakpointを仕掛ける方が個人的にわかりやすいのでそっちでもやってみるとうまくいった。
やっぱりmoduleを追うのが最強や!
次の解析へ
新しい実行ファイルを切り出すことができた。
なので実行してみたが、エラーが出て実行できない。
どうやらバイナリが壊れているようだ。
動画をみる限り、memoryのセクションがおかしくなっているらしい。
PE-Bear
で見てみると、Raw Addr
とVirtual Addr
のアドレスにズレがある。
これが正常なバイナリだと合っている
のでこれを合わせてみる。
また、ImageBaseの値は実際のPEファイルが読み込まれたベースアドレスと一致するため、変更してやる。
しかしこれでもまだIATが壊れたままになってしまっているのでこれを直していく。
IATの自動修復ツールの1つにScylla
がある。
x64dbgにもデフォルトでついているやつだ。
以下の記事を参考にしながらMemoryDumpを取得する。
これでemotetのメモリにある実行ファイルを取り出すことができた。
ただ、この取り出したバイナリも途中でクラッシュしてしまう...
仕方がないのでデバッガで追いながら確認していくことにしました。
動画内では、取り出したバイナリを配布しているのだが、それも走らないので謎...
取り出したバイナリの解析
ここまでで動画は終了になるのでここからは自力で解析することになる。
Stringsを見てみると何やら文字列が見える。
この文字列を検索してみるとZeus Panda
というmalwareが引っかかる。
malwareは上記のパスにファイルが存在しているかどうかのチェックをし、存在していたら動作を止めるらしい。
逆アセンブラを見てみるとファイルのチェックの処理が見える。
これがあるということはこのmalwareはemotetのなかにZeus Pandaが入ってるという認識で良さそう。
関数に名前をつけてこの関数を呼び出している箇所を見てみる。
この関数の呼び出し元は単純で、check_fileの戻り値をもとにとある処理を走らせているように見える。
1日1解析 part1
1日1解析 part1
Malwareの解析がしたくなったのとアセンブリを読む練習のために気になったやつを書いていこうと思います。
今回のサンプル
https://app.any.run/tasks/8ecca9e4-c541-4317-9001-1f5052060d24/
表層解析
importされた文字列を見てみると、気になる文字列がいくつか見える。
さらにsectionをみてみると以下のようになっている。
.symtab
というセクションが存在する。これはGolangで書かれた実行ファイルにみられる特徴なのでこのmalwareはgolangで書かれていることがわかる。
静的解析
アセンブリをみても訳がわからなかったので簡単なbinaryを読んでわかった気になることにする。
IDA Proにはgoのタイプ情報を解析するスクリプトがあるが、そんなリッチなものは持っていないのでゴリ押しで解くことになる。(何かいい方法があれば教えてください)
Hello World
を表示するバイナリを作成して逆アセンブラにかけてみる。
package main import "fmt" func main() { fmt.Println("Hello World") }
文字列一覧をみてみると文字列Hello World
が表示されていないことがわかった。
普段は文字列やimportされているLibraryなどから解析を進めるようにしていたので困った。
と思ったが、以下の内容が引っかかった。
frame.sp=
に代入?されている文字列の一部にHello World
が見える。
他の文字列でも試してみることに
package main import "fmt" func main() { fmt.Println("SAMBA RYTHM") }
これの結果は以下のようになった。
文字列がA
から順に連なっているのがわかる。
What do you mean? ooh...
動的解析
動かしながらアセンブリを読んでいくことに。
人によっては
「どうして静的解析を頑張ってから動的解析しないの?練習にならないよ?」と思うかもしれませんが、
動かしてみる
管理者権限で実行する。
すると、いくつかのファイルが暗号化され、閲覧できなくなる。
さらにデスクトップとC:¥
にファイルが追加されていた。
textの内容を要約すると
- 文書、データベース、写真を暗号化した
- 複合してほしいならツールを売るからメールしてくれ
- メールに3つのファイルを3MBまで添付してくれたら無料で複合する
ということらしい。
Malwareの流れ
ProcMonを見てみると大雑把に以下のような流れで動いていることがわかる。
- registoryを編集
- 各ファイルを暗号化
- 脅迫文を作成
C&Cサーバとの接続とかは特にしていないっぽいですね。
お手上げ
よくわからなかったのでGo のbuild idを検索対象に含めただけの簡単なyara ruleだけ作ってあとは調べることに。
Yara rule
rule EkansRansome { meta: Description = "Ekans Ransomeware rule" strings: $a = "Go build ID: \"X6lNEpDhc_qgQl56x4du/fgVJOqLlPCCIekQhFnHL/rkxe6tXCg56Ez88otHrz/Y-lXW-OhiIbzg3-ioGRz\"" condition: all of them }
すると下記のブログでSnakeという名前のマルウェアを解析している記事が見つかった。
読んでいる限りだとEKANSとほぼ同じっぽい。
せっかくなので作ったyaraをかけてやるがどちらもチェックに引っかかった。
がhash値をとってみると違うので微妙に変更点とかがあるっぽい...
感想
ファイルを暗号化するってことがわかった段階で、複合するプログラム書こうと思ったのですがそもそも全く解析できなかったので難。
こういうタイプのマルウェアは日本で有名なやつがあったのでそれで練習したいと思いました。。。。
精進します
Kioptrix: Level 1.2解く
Kioptrix: Level 1.2解く
いくつか解いてきたので流れが変わらないところは省略する。
Kioptrix: Level 1.2
IPアドレスを探す。
今回のマシンは名前解決させるためにhosts
を書き換えないといけないっぽいので書いてやる
$ echo "192.168.56.105 kioptrix3.com" >> /etc/hosts
これでドメインを叩いて対象マシンにアクセスできる。
ポートスキャン
22
と80
なのでsshとwebアプリっぽい
sshは適当なパスワード試してだめだったので後回し、webアプリの方を見てみる
いろいろ画面を遷移させてみると、php
の拡張子が見えたのでphpで動いていると予想。
ディレクトリを総当たりで検索してみる
出てきたpathの中で興味深いものだけピックアップする
path(host省略) | status |
---|---|
/gallery | 301 |
/core | 301 |
/phpmyadmin | 200 |
各pathをブラウザで開いてみると/core
は空白のページが開いただけだが、他2つは意味のありそうなページになった。
- /gallery
この/gallery
の方のpathだが、並び順を変更することができるようになっており、その時のURLは以下のようになっている。
(host省略)
/gallerry/gallerry.php?id=1&sort=photoid#photos
GETで渡すパラメータのうち、id
は値をデータベースの検索に使用していそうなので脆弱性がないか調べる
クエリを発行している文字列は"
もしくは'
で囲っていると予想。
idに渡してみるとsyntax errorが返される。
DBがMySQLだとわかった。
勉強のためにもう少し手動で探索してみる。
最近下記のサイトで復習したので余裕でした😤
- レスポンスで返されるパラメータの数を確認
d=1 order by 6--
- table一覧
id=1 union select 1, table_name, null, null, null, null where information_schema.tables--
出てきたテーブルの中から重要そうな情報を含んでいるテーブルを探す
私はuser
とかaccount
とかで検索している
最初からあるテーブルを除くとuser
,gallarific_user
,dev_accounts
の3つが見つかるので順番に見てけば良さそうだ
sqlmap
で調べるとdev_accounts
でユーザ名とパスワードが表示された。
パスワードはmd5でhash化されていが、sqlmapが勝手に複合してくれた。便利だ
このユーザとパスワードはdevelopperのものっぽいのでsshかphpmyadminでログインできると予想。
ログインできた。
しかし、特にできることがなさそうなのでもう一方のアカウントでもログインしてみる。
何かある。
CompanyPolicy.README
を見るとPlease use the command 'sudo ht'
と書いてあるのでやってみると以下のようなエラーが出る。
Error opening terminal: xterm-256-color
ググってxterm
を使用するように設定
$ export TERM=xterm
再びsudo ht
を叩くとなんか出た。
ht
ってのはテキストエディタらしいですね〜
これで何かの設定を書き換えれば良さそうだということがわかります。
権限を昇格するのに使用できる(細かくいうと違うかもしれないけど)コマンドで思い浮かぶものにsudo
がある。
sudo
コマンドについて調べると設定ファイルというものがあり、sudoers
というものがある。
ここの権限設定を書き換えてやる
Macに慣れていないため、ファンクションキーの場所がわからず少し詰まってしまいました^^;
これでsudo su
を叩いてやると
rootをとることができる
感想
テキストエディタにroot権限を渡してはいけない