
افحص قائمة عناوين URL للتحقق من الثغرة الأمنية Log4j CVE-2021-44228
يقوم بفحص قائمة عناوين URL بشكل متعدد الخيوط باستخدام طلبات POST وGET مع البارامترات.
مستوحى بشكل كبير من نسخة NortwaveSecurity.
يجب أن تكون قائمة عناوين URL للفحص بالتنسيق التالي (csv):
description,URL,method,parameters
production,example.com/login,POST,"username,password"
staging,example.com/search,GET,"q"
development,example.com/,GETNP,""
بعد ذلك، سيتم تنفيذ طلب POST على example.com/login حيث يتم إرسال النص الخام التالي:
username={jndi:ldap...}&password={jndi:ldap...}
وبالمثل، سيتم تنفيذ طلب GET التالي: example.com/search?q={jndi:ldap...}.
بدلاً من ذلك، يمكنك تحديد GETNP (GET No Parameters) لتنفيذ GET على الرابط مع إلحاق الحمولة به: example.com/new/{jndi:ldap...}.
بالإضافة إلى ذلك، يتم إدراج الحمولة أيضًا في ترويسات User-Agent وReferer وX-Forwarded-For وAuthentication لزيادة فرص نجاح الاستغلال.
إذا كنت تريد فحص عناوين URL لكل من GET وPOST أو GETNP، فيرجى تكرار الإدخال في ملف CSV.
للتجهيز دون أي إعدادات مسبقة، يمكنك استخدام https://canarytokens.org/generate وإنشاء CanaryToken من نوع Log4Shell:

بدلاً من ذلك، يمكنك إعداد خادم 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
قم بتشغيل log4jcheck باستخدام ملف urls.csv التالي:
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.