Pythonで簡易版トロイの木馬を作ってみる
目的としては、勉強のためと、pythonを使ったらどれくらいのステップ数で作れるのかを試してみたかったからです。
実装した機能としては、
・「リモートシェル」
・「ファイルのアップロード・ダウンロード」
・「キーロガー」
・「システム情報取得」
・「リモートデスクトップ(ベータ版)」
などです。のちのち機能の一つ一つについてリンクを張っていく予定です。
トロイの木馬とは?
トロイの木馬とは他のexeのソフトにバインドされていたり、img.jpg.exeなど拡張子を隠したファイルであったりします。
トロイの木馬はダウンロードしただけでは実行されず、ユーザが直接実行させる必要があります。
たいていは気づかずに実行してしまいますが、よほどの新種でない限りウイルス駆除ソフトに引っかかると思います。
インターネットで拾ってきたトロイの木馬作成ツールなどの場合も生成したexeはほとんどの確率で引っかかります。
crypterなどで、生成したexeを難読化しても変わりませんでした。
起動されると遠隔操作や、ファイルの収集などいろいろな機能が備えられています。
トロイの木馬の動き:
トロイの木馬を実行し、制御するには2種類のソフトが必要になります。
まずは、ユーザ(対象ホスト)にしかけるためのserver.exe(トロイの木馬)
server.exeを操作するためのclient.exe(トロイの操作用)
流れ的には、
1.ユーザ(対象ホスト)にserver.exeがバインドされたソフトをダウンロードさせ実行させます
2.攻撃者はclient.exeを実行させておきserver.exeからの接続を待ちます。
3.コネクションが張れたら、任意の機能でリモートPC(対象ホストの)を操作するといった感じです。
簡易版としては、通信時の暗号化や、豊富な機能を備える必要はないので、簡単な処理になると思います。
server.exeからの接続を待つ理由としては、インターネットを介した通信をするとき(ルータ)ファイアーウォールが有効になっているので、
外部からの一方的なコネクションは張れません。攻撃者から感染PCは×。
なので、攻撃者側のポートをあらかじめ開けておき、そこに接続させると簡単にいきます。
これをreverse_tcpといいます。
上記例では、感染PCには外から接続することができないので、自分側のファイヤーウォールの1234番ポートを解放してます。
通信路が確立できたらその通信路を使いコマンドを感染PCに送り、やりとりします。
今回作成したトロイの木馬は「windows7・vista」と「windwos xp」では少し違った挙動をするようにしています。
windwos7・vistaでの問題点
windows7やvistaではアクセスコントロール(UAC) が機能しているため、管理者権限で実行しなければレジストリの書き換えなどができません。
そこで、実行させるときは管理者権限で実行しなければいけないソフトとバインドして実行させます。
管理者権限で実行させるソフトと一緒に実行させればserver.exeも管理者権限で実行されるので問題がなくなります。
実行され、レジストリに登録され、次回起動時もserver.exeを自動実行できるように設定したとしても、UACの機能のおかげで再起動後はユーザ権限での実行になってしまい、ユーザディレクトリより上の階層にはファイルのアップロードなどができません。
そこで、初回の実行時にレジストリ登録と一緒に、UACを無効に設定しておきます。
レジストリをいじってUACを無効にすると、ユーザには通知が行かないので、知らない間にUACが無効になっています。
UACを無効にしておけば、後はXPと変わりはなくやりたい放題になります。
自分的に、windows7のUACは結構機能しておりウイルス実行などに対して有効だなと思いました。
↓UACを無効にするときにいじるレジストリ↓
Software\Microsoft\Windows\CurrentVersion\Policies\System¥EnableLUA
※再起動後にEnableLUAは0(無効)になる。再起動後しなければ反映されない。
実行時の画像
server.exeからの接続待ち中。
・どれか一つのPCを選ぶと次の画面が開く。
・リモートシェルの実行画面
(ipconfigの結果画面)
・ファイルマネージャー
・キーロガー画面
以上のようになります。自作したトロイなのでFUD( Fully UnDetected(完全に未検出) )です。
このような自作プログラムはウイルス対策ソフトに検知されないので、なんらかの別の対策が必要だと思います。
怪しいプログラムは実行しないや、ハッシュを見てそのソフトウェアが正当なものかなど、いろいろやるべきだと思います。
これに関連して、レジストリの変更を通知・表示してくれるwindows7用のガジェットを作成しようかと思っています。
こったものでなくても、軽くガジェットとして変更を表示してくれれば、わかりやすそうです。
ステップ数:
server.exe(.py) 644行
client.exe(.py) 638行
合計 1282行