a

よろしくのキワミ

1日1解析 part2

1日1解析 part2

下書きのままアップロードするのを忘れていたので公開。 6/15に書いた物です。供養。

今回のサンプル

https://malshare.com/sample.php?action=detail&hash=90c2c10001134ab2a1cc87ec4382b197

前回で全然実力がないことがわかったのでわからなくなった時に見返すことができるよう、解析つきのバイナリを選ぶことにした。

困ったら見る動画↓

www.youtube.com

動的解析

対象をデスクトップに置いて走らせると、場所と名前を変えて実行される。

f:id:toDo:20200615015323p:plain

移動後のpath

C:\Windows\System32\dnsagent.exe

デバッガで動かしても途中でプロセスが終了してしまうため、初めから上記の場所に置いておいた方が良さそう。 と思ったが、emotetはプロセス名をランダムに変更していた気がするので大人しく解析することにした。

ProcMonを見てみるとThreadExitでプロセスを終了しているので、そこにbreakpointを仕掛けることにする。

[symbols]→[kernel32]→[ExitThread]

f:id:toDo:20200615021301p:plain

F8で走らせるたびにModuleをimportしていくのがわかる。

これでpathを変更した新しい実行ファイル付近をみることができるはず...と思ったが、動画を見るとプロセスを作っている箇所にbreakpointを仕掛け、新しくpathを変更して実行している箇所を探していた。

のでそれをなぞることにした。

f:id:toDo:20200615024045p:plain

CreateProcessInternalWにbreakpointを仕掛け

f:id:toDo:20200615025214p:plain

memoryに読み取り書き込みの権限がある箇所を見てみると

f:id:toDo:20200615025253p:plain

MZと見える。

これはWindowsの実行ファイルの特徴なので、取り出したい部分をみることができた。

en.wikipedia.org

ちなみにCreateProcessにbreakpointを仕掛ける方が個人的にわかりやすいのでそっちでもやってみるとうまくいった。

やっぱりmoduleを追うのが最強や!

次の解析へ

新しい実行ファイルを切り出すことができた。

f:id:toDo:20200615031113p:plain

なので実行してみたが、エラーが出て実行できない。

f:id:toDo:20200615031119p:plain

どうやらバイナリが壊れているようだ。

動画をみる限り、memoryのセクションがおかしくなっているらしい。

PE-Bearで見てみると、Raw AddrVirtual Addrのアドレスにズレがある。

f:id:toDo:20200615034540p:plain

これが正常なバイナリだと合っている

f:id:toDo:20200615034606p:plain

のでこれを合わせてみる。

また、ImageBaseの値は実際のPEファイルが読み込まれたベースアドレスと一致するため、変更してやる。

f:id:toDo:20200615133343p:plain

f:id:toDo:20200615133345p:plain

しかしこれでもまだIATが壊れたままになってしまっているのでこれを直していく。 

f:id:toDo:20200615134300p:plain

IATの自動修復ツールの1つにScyllaがある。

github.com

x64dbgにもデフォルトでついているやつだ。

以下の記事を参考にしながらMemoryDumpを取得する。

ameblo.jp

これでemotetのメモリにある実行ファイルを取り出すことができた。

f:id:toDo:20200617101235p:plain

f:id:toDo:20200617101251p:plain

ただ、この取り出したバイナリも途中でクラッシュしてしまう...
仕方がないのでデバッガで追いながら確認していくことにしました。

動画内では、取り出したバイナリを配布しているのだが、それも走らないので謎...

f:id:toDo:20200617142348j:plain

取り出したバイナリの解析

ここまでで動画は終了になるのでここからは自力で解析することになる。

Stringsを見てみると何やら文字列が見える。

f:id:toDo:20200617142850p:plain

この文字列を検索してみるとZeus Pandaというmalwareが引っかかる。

malwareは上記のパスにファイルが存在しているかどうかのチェックをし、存在していたら動作を止めるらしい。

アセンブラを見てみるとファイルのチェックの処理が見える。

f:id:toDo:20200617150057p:plain

これがあるということはこのmalwareはemotetのなかにZeus Pandaが入ってるという認識で良さそう。

関数に名前をつけてこの関数を呼び出している箇所を見てみる。

f:id:toDo:20200617153351p:plain

この関数の呼び出し元は単純で、check_fileの戻り値をもとにとある処理を走らせているように見える。

f:id:toDo:20200617154047p:plain

1日1解析 part1

1日1解析 part1

Malwareの解析がしたくなったのとアセンブリを読む練習のために気になったやつを書いていこうと思います。

今回のサンプル

https://app.any.run/tasks/8ecca9e4-c541-4317-9001-1f5052060d24/

表層解析

importされた文字列を見てみると、気になる文字列がいくつか見える。

f:id:toDo:20200611153131p:plain

f:id:toDo:20200611153135p:plain

さらにsectionをみてみると以下のようになっている。

f:id:toDo:20200611153310p:plain

.symtabというセクションが存在する。これはGolangで書かれた実行ファイルにみられる特徴なのでこのmalwaregolangで書かれていることがわかる。

静的解析

アセンブリをみても訳がわからなかったので簡単なbinaryを読んでわかった気になることにする。

IDA Proにはgoのタイプ情報を解析するスクリプトがあるが、そんなリッチなものは持っていないのでゴリ押しで解くことになる。(何かいい方法があれば教えてください)

github.com

Hello Worldを表示するバイナリを作成して逆アセンブラにかけてみる。

package main
import "fmt"

func main() {
    fmt.Println("Hello World")
}

文字列一覧をみてみると文字列Hello Worldが表示されていないことがわかった。 普段は文字列やimportされているLibraryなどから解析を進めるようにしていたので困った。

と思ったが、以下の内容が引っかかった。

f:id:toDo:20200611225005p:plain

frame.sp=に代入?されている文字列の一部にHello Worldが見える。

他の文字列でも試してみることに

package main
import "fmt"

func main() {
    fmt.Println("SAMBA RYTHM")
}

これの結果は以下のようになった。

f:id:toDo:20200613223024p:plain

文字列がAから順に連なっているのがわかる。

What do you mean? ooh...

動的解析

動かしながらアセンブリを読んでいくことに。

人によっては

「どうして静的解析を頑張ってから動的解析しないの?練習にならないよ?」と思うかもしれませんが、

www.nicovideo.jp

動かしてみる

管理者権限で実行する。

すると、いくつかのファイルが暗号化され、閲覧できなくなる。

f:id:toDo:20200611232122p:plain

さらにデスクトップとC:¥にファイルが追加されていた。

f:id:toDo:20200611232239p:plain

textの内容を要約すると

  • 文書、データベース、写真を暗号化した
  • 複合してほしいならツールを売るからメールしてくれ
  • メールに3つのファイルを3MBまで添付してくれたら無料で複合する

ということらしい。

Malwareの流れ

ProcMonを見てみると大雑把に以下のような流れで動いていることがわかる。

  1. registoryを編集
  2. 各ファイルを暗号化
  3. 脅迫文を作成

C&Cサーバとの接続とかは特にしていないっぽいですね。

お手上げ

よくわからなかったのでGo のbuild idを検索対象に含めただけの簡単なyara ruleだけ作ってあとは調べることに。

golang.org

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という名前のマルウェアを解析している記事が見つかった。

medium.com

読んでいる限りだとEKANSとほぼ同じっぽい。

せっかくなので作ったyaraをかけてやるがどちらもチェックに引っかかった。

f:id:toDo:20200614074256p:plain

がhash値をとってみると違うので微妙に変更点とかがあるっぽい...

f:id:toDo:20200614074257p:plain

感想

ファイルを暗号化するってことがわかった段階で、複合するプログラム書こうと思ったのですがそもそも全く解析できなかったので難

こういうタイプのマルウェアは日本で有名なやつがあったのでそれで練習したいと思いました。。。。

精進します

Kioptrix: Level 1.2解く

Kioptrix: Level 1.2解く

いくつか解いてきたので流れが変わらないところは省略する。

Kioptrix: Level 1.2

IPアドレスを探す。

f:id:toDo:20200312002554p:plain

今回のマシンは名前解決させるためにhostsを書き換えないといけないっぽいので書いてやる

$ echo "192.168.56.105 kioptrix3.com" >> /etc/hosts

これでドメインを叩いて対象マシンにアクセスできる。

ポートスキャン

f:id:toDo:20200312002855p:plain

2280なのでsshとwebアプリっぽい

sshは適当なパスワード試してだめだったので後回し、webアプリの方を見てみる

f:id:toDo:20200312003130p:plain

いろいろ画面を遷移させてみると、phpの拡張子が見えたのでphpで動いていると予想。

ディレクトリを総当たりで検索してみる

f:id:toDo:20200312003605p:plain

出てきたpathの中で興味深いものだけピックアップする

path(host省略) status
/gallery 301
/core 301
/phpmyadmin 200

各pathをブラウザで開いてみると/coreは空白のページが開いただけだが、他2つは意味のありそうなページになった。

  • /gallery

f:id:toDo:20200312005348p:plain

f:id:toDo:20200312005353p:plain

この/galleryの方のpathだが、並び順を変更することができるようになっており、その時のURLは以下のようになっている。

(host省略)

/gallerry/gallerry.php?id=1&sort=photoid#photos

GETで渡すパラメータのうち、idは値をデータベースの検索に使用していそうなので脆弱性がないか調べる

クエリを発行している文字列は"もしくは'で囲っていると予想。

idに渡してみるとsyntax errorが返される。

f:id:toDo:20200312010513p:plain

DBがMySQLだとわかった。

勉強のためにもう少し手動で探索してみる。

最近下記のサイトで復習したので余裕でした😤

portswigger.net

  • レスポンスで返されるパラメータの数を確認
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でユーザ名とパスワードが表示された。

f:id:toDo:20200312020245p:plain

パスワードはmd5でhash化されていが、sqlmapが勝手に複合してくれた。便利だ

このユーザとパスワードはdevelopperのものっぽいのでsshphpmyadminでログインできると予想。

f:id:toDo:20200312020845p:plain

ログインできた。

しかし、特にできることがなさそうなのでもう一方のアカウントでもログインしてみる。

f:id:toDo:20200312021136p:plain

何かある。

CompanyPolicy.READMEを見るとPlease use the command 'sudo ht'と書いてあるのでやってみると以下のようなエラーが出る。

Error opening terminal: xterm-256-color

ググってxtermを使用するように設定

$ export TERM=xterm

再びsudo htを叩くとなんか出た。

f:id:toDo:20200312022018p:plain

htってのはテキストエディタらしいですね〜

これで何かの設定を書き換えれば良さそうだということがわかります。

権限を昇格するのに使用できる(細かくいうと違うかもしれないけど)コマンドで思い浮かぶものにsudoがある。

sudoコマンドについて調べると設定ファイルというものがあり、sudoersというものがある。

f:id:toDo:20200312064710p:plain

ここの権限設定を書き換えてやる

f:id:toDo:20200312070046p:plain

Macに慣れていないため、ファンクションキーの場所がわからず少し詰まってしまいました^^;

これでsudo suを叩いてやると

f:id:toDo:20200312070049p:plain

rootをとることができる

感想

テキストエディタにroot権限を渡してはいけない

プライバシーポリシー お問い合わせ