
Log4j भेद्यता CVE-2021-44228 के विरुद्ध URL सूची की जाँच करें
बहु-थ्रेडेड रूप से POST और GET अनुरोधों के साथ पैरामीटरों के संयोजन में URL की सूची की जाँच करता है।
यह NortwaveSecurity संस्करण से काफी प्रेरित है।
जाँचने के लिए URL की सूची निम्नलिखित प्रारूप (csv) में होनी चाहिए:
description,URL,method,parameters
production,example.com/login,POST,"username,password"
staging,example.com/search,GET,"q"
development,example.com/,GETNP,""
यह बाद में example.com/login पर एक POST अनुरोध चलाएगा जहाँ निम्नलिखित रॉ बॉडी पोस्ट की जाएगी:
username={jndi:ldap...}&password={jndi:ldap...}
इसी प्रकार, यह निम्नलिखित GET अनुरोध चलाएगा: example.com/search?q={jndi:ldap...}।
वैकल्पिक रूप से आप GETNP (GET बिना पैरामीटर) निर्दिष्ट कर सकते हैं ताकि पेलोड के साथ URL पर GET किया जा सके: example.com/new/{jndi:ldap...}।
इसके अतिरिक्त, पेलोड को हिट की संभावना बढ़ाने के लिए User-Agent, Referer, X-Forwarded-For, Authentication हेडर में भी डाला जाता है।
यदि आप GET, POST या GETNP दोनों के लिए URL जाँचना चाहते हैं, तो कृपया CSV में प्रविष्टि की नकल बनाएँ।
बिना किसी पूर्व कॉन्फ़िगरेशन के सेट-अप करने के लिए आप https://canarytokens.org/generate का उपयोग कर सकते हैं और एक Log4Shell CanaryToken बना सकते हैं:

वैकल्पिक रूप से, आप अपना स्वयं का DNS सर्वर सेट-अप कर सकते हैं।
pip install -r requirements.txt का उपयोग करके निर्भरताएँ स्थापित करें। अपने पसंदीदा कैनरी टोकन के लिए निम्नलिखित पंक्ति को बदलने के लिए स्क्रिप्ट को संपादित करें:
usage: log4jcheck.py [-h] -f FILE -u URL [-w WAIT] [-t TIMEOUT] [-p PREFIX] [-q THREADS] [-d DONE]
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE The CSV filename containing the URLs
-u URL, --url URL DNS subdomain URL on which th callback is performed
-w WAIT, --wait WAIT Number of seconds to wait before next request (default: 1)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
-p PREFIX, --prefix PREFIX
Type of prefix, see prefixes_injects for options. (default: 0, options 0-3)
-q THREADS, --threads THREADS
Number of threads to distribute the work
-d DONE, --done DONE File where we can keep track of items that are done
लॉग आउटपुट करने के लिए फ़ोल्डर बनाएँ: /run/logs। यहाँ आप प्रगति को ट्रैक कर सकते हैं, कुछ भी stdout पर नहीं भेजा जाएगा।
अब स्क्रिप्ट चलाई जा सकती है, स्क्रिप्ट को पहले बनाई गई CSV पर इंगित करते हुए जिसमें जाँचने के लिए URL हैं।
python3 .\log4jcheck.py --file .\urls-example.csv --threads 2 --url "L4J.ujz5sgvgo7xuvn03ft9qrws5w.canarytokens.com/a" -w 0 -t 1
स्क्रिप्ट पूर्ण होने के बाद जाँचें कि क्या टोकन ट्रिगर हुआ है। आप उत्पन्न UUID4 और इंजेक्ट किए गए पैरामीटर के संयोजन के आधार पर यह पारस्परिक रूप से सहसंबंधित कर पाएंगे कि किस एप्लिकेशन ने ट्रिगर किया, उदा.: 40852c3b-2d6b-4bd5-a91f-4416aa730619-username।
log4shell-vulnerable-app के विरुद्ध परीक्षण किया गया। MainControll.java को निम्नानुसार संशोधित करें:
package fr.christophetd.log4shell.vulnerableapp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@RestController
public class MainController {
private static final Logger logger = LogManager.getLogger("HelloWorld");
@GetMapping("/")
public String index(@RequestHeader("X-Api-Version") String apiVersion) {
logger.info("Received a request for API version " + apiVersion);
return "Hello, world!";
}
@GetMapping("/test")
public String testGet(@RequestParam String test) {
logger.info("Received a request for test " + test);
return "Test world!";
}
@PostMapping("/test")
public String test(@RequestBody String test) {
logger.info("Received a request for test " + test);
return "Test world!";
}
}
संकलित करें और चलाएँ:
gradle bootJar --no-daemon
java -jar .\build\libs\log4shell-vulnerable-app-0.0.1-SNAPSHOT.jar
निम्नलिखित urls.csv फ़ाइल के साथ log4jcheck चलाएँ:
description,URL,method,parameters
test,http://localhost:8080/test,POST,"test"
test,http://localhost:8080/test,GET,"test"
निम्नलिखित जानकारी कैनरी टोकन लॉग में दिखाई देनी चाहिए:

निम्नलिखित HTTP हेडर कवर किए गए हैं:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptप्रत्येक इंजेक्शन के लिए, निम्नलिखित JNDI प्रीफिक्स संभव हैं:
jndi:dnsjndi:${lower:l}${lower:d}apjndi:rmijndi:ldapध्यान दें कि स्क्रिप्ट केवल जाँच करती है: User Agent और कोई भी पैरामीटर जो आप POST या GET अनुरोध में निर्दिष्ट करते हैं। यह उन मामलों में गलत नकारात्मक परिणाम देगा जहाँ भेद्यता को ट्रिगर करने के लिए अन्य हेडर, छूटे हुए इनपुट फ़ील्ड, आदि को लक्षित करने की आवश्यकता होती है। बेझिझक स्क्रिप्ट में अतिरिक्त जाँचें जोड़ें।
Log4jcheck MIT लाइसेंस के तहत लाइसेंस प्राप्त ओपन-सोर्स सॉफ्टवेयर है।