
trueseeing v2.2.11
गैर-डीकंपाइलिंग iOS/Android ऐप भेद्यता स्कैनर (DC25 डेमो लैब, CB17)
README
trueseeing iOS/Android ऐप्स के लिए एक तेज़, सटीक और लचीला भेद्यता स्कैनर है। हम Android के लिए Dalvik VM स्तर पर काम करते हैं - अर्थात हमें इस बात से कोई फर्क नहीं पड़ता कि लक्ष्य ऐप अस्पष्ट है या नहीं।
क्षमता
वर्तमान में हम यह कर सकते हैं:
- ऐप में भेद्यताओं के लिए स्वचालित रूप से स्कैन करें, HTML/JSON/टेक्स्ट प्रारूप में रिपोर्ट करें (नीचे देखें)
- आसान विश्लेषण के लिए ऐप में हेरफेर करें: जैसे डीबग बिट सक्षम करना, पूर्ण बैकअप सक्षम करना, TLS पिनिंग अक्षम करना, लक्ष्य API स्तर में हेरफेर करना, frida-gadget इंजेक्ट करना, आदि।
- सामान्य जानकारी के लिए ऐप की जांच करें
- डीबग इंटरफ़ेस के माध्यम से ऐप डेटा अंदर/बाहर कॉपी करें
- कुछ कॉल/कॉन्स्ट/स्पुट/आईपुट खोजें
- op के तर्कों के लिए स्थिरांक/प्रकार सेट का अनुमान लगाएं
- नेटिव कोड के लिए API/निजी कॉल स्कैन करें (नोट: आपको ts2-disasm-ghidra की आवश्यकता है)
- बुनियादी भेद्यताओं के लिए iOS ऐप्स स्कैन करें (नोट: आपको ts2-disasm-ghidra की आवश्यकता है)
- frida स्क्रिप्ट्स संलग्न करें
- frida इंटरैक्टिव सत्र प्रदान करें
- कॉल्स ट्रेस करना
- आदि।
स्थापना
कंटेनर
नोट:
- 2.1.9 के अनुसार, हम ghcr.io पर हैं। (Docker Hub कुछ हद तक अप्रचलित है)
- उपकरणों को नियंत्रित करने के लिए होस्ट में adbd की आवश्यकता होती है।
हम कंटेनर प्रदान करते हैं ताकि आप निम्नानुसार तुरंत उपयोग कर सकें; अब यह अनुशंसित तरीका भी है, और यदि आप Windows पर हैं तो चलाने का एकमात्र तरीका है:
$ docker run --rm -v $(pwd):/out -v ts2:/cache ghcr.io/alterakey/trueseeing
यदि आप स्टेटलेस रूप से चलाना चाहते हैं तो आप /cache पर वॉल्यूम माउंट करना छोड़ देते हैं (हालांकि दैनिक उपयोग के लिए अनुशंसित नहीं है; #254 भी देखें):
$ docker run --rm -v $(pwd):/out ghcr.io/alterakey/trueseeing
uv के साथ स्थापित करें
वैकल्पिक रूप से, आप हमारे पैकेज को uv के साथ निम्नानुसार स्थापित कर सकते हैं। विशेष रूप से uv tool install स्थापना का रूप एक्सटेंशन (नीचे देखें) के लिए उपयोगी हो सकता है, क्योंकि यह उन्हें सबसे अधिक स्वतंत्रता प्रदान करता है। बस याद रखें कि आपको JRE और Android SDK की आवश्यकता है (वैकल्पिक रूप से; उपकरणों के साथ छेड़छाड़ करने के लिए):
$ uvx trueseeing
$ uv tool install trueseeing
$ trueseeing
pip के साथ स्थापित करें (अप्रचलित)
बेशक यदि आपको जरूरत हो तो आप हमेशा अच्छे पुराने pip का उपयोग कर सकते हैं:
$ pip install trueseeing
उपयोग
इंटरैक्टिव मोड
आप इंटरैक्टिव रूप से ऐप्स को स्कैन/विश्लेषण/पैच आदि कर सकते हैं - जो मैन्युअल विश्लेषण के लिए आदर्श विकल्प बनाता है:
$ trueseeing target.apk
[+] trueseeing x.y.z
ts[target.apk]> ?
...
ts[target.apk]> i # सामान्य जानकारी दिखाएं
...
ts[target.apk]> pf AndroidManifest.xml # मेनिफेस्ट फ़ाइल दिखाएं
...
ts[target.apk]> a # संसाधनों का भी विश्लेषण करें
...
ts[target.apk]> /s something # टेक्स्ट खोजें
...
ts[target.apk]> as # स्कैन करें
...
[+] done, found 6403 issues (174.94 sec.)
ts[target.apk]> gh report.html
बैच मोड
हम प्रॉम्प्ट देने से पहले चलाने के लिए एक इनलाइन कमांड (-c) या स्क्रिप्ट फ़ाइल (-i) स्वीकार करते हैं, साथ ही प्रॉम्प्ट करने के बजाय तुरंत बाहर निकलना (-q; हमें इस मोड में tty की आवश्यकता नहीं है!)।
आप बैच स्कैन करने के लिए सुविधाओं का उपयोग कर सकते हैं, जैसे कि निष्कर्षों को सीधे stderr पर डंप करने के लिए:
$ trueseeing -eqc 'as' target.apk
HTML प्रारूप में रिपोर्ट फ़ाइल जनरेट करने के लिए:
$ trueseeing -eqc 'as;gh report.html' target.apk
JSON प्रारूप में रिपोर्ट फ़ाइल जनरेट करने के लिए:
$ trueseeing -eqc 'as;gj report.json' target.apk
stdout पर रिपोर्ट प्राप्त करने के लिए, अंतिम g* कमांड से फ़ाइल नाम हटाएं:
$ trueseeing -eqc 'as;gh' target.apk > report.html
$ trueseeing -eqc 'as;gj' target.apk > report.json
गैर-इंटरैक्टिव स्कैन मोड (अप्रचलित)
परंपरागत रूप से, आप निम्न कमांड लाइन के साथ ऐप्स को स्कैन कर सकते हैं ताकि stderr में निष्कर्ष सूचीबद्ध हों:
$ trueseeing --scan target.apk
HTML प्रारूप में रिपोर्ट जनरेट करने के लिए:
$ trueseeing --scan --scan-output report.html target.apk
$ trueseeing --scan --scan-report=html --scan-output report.html target.apk
JSON प्रारूप में रिपोर्ट जनरेट करने के लिए:
$ trueseeing --scan --scan-report=json --scan-output report.json target.apk
stdout पर रिपोर्ट प्राप्त करने के लिए, फ़ाइल नाम के रूप में '-' निर्दिष्ट करें:
$ trueseeing --scan --scan-output - target.apk > report.html
$ trueseeing --scan --scan-report=html --scan-output - target.apk > report.html
$ trueseeing --scan --scan-report=json --scan-output - target.apk > report.json
उन्नत उपयोग
एक्सटेंशन
आप अपने स्वयं के कमांड और सिग्नेचर को एक्सटेंशन के रूप में लिख सकते हैं। एक्सटेंशन /ext (कंटेनर) या ~/.trueseeing2/extensions/ (uv/pip) के अंतर्गत रखे जाते हैं। वैकल्पिक रूप से आप अपने एक्सटेंशन को व्हील के रूप में वितरित कर सकते हैं। हम प्रकार की जानकारी प्रदान करते हैं ताकि आप न केवल zuban के साथ अपने एक्सटेंशन की प्रकार-जांच कर सकें बल्कि IDE से अच्छी सहायता भी प्राप्त कर सकें। विवरण के लिए विवरण अनुभाग देखें।
निर्माण
आप इसे निम्नानुसार बना सकते हैं:
$ docker build -t trueseeing https://github.com/alterakey/trueseeing.git#main
व्हील बनाने के लिए आप flit के साथ कर सकते हैं, निम्नानुसार:
$ flit build
इसे हैक करने के लिए, आपको एक उचित निर्माण वातावरण बनाने की आवश्यकता है। uv के साथ आप बस यह कर सकते हैं:
$ git clone https://github.com/alterakey/trueseeing.git wc
$ uv sync --locked --dev
$ (... हैक ...)
$ uv run trueseeing ... # चलाने के लिए
$ uv run zuban check trueseeing && uv run ruff trueseeing # मान्य करने के लिए
Success: no issues found in XX source files
$ uv run flit build # बनाने के लिए (wheel)
$ docker build -t trueseeing . # बनाने के लिए (container)
pip के साथ, एक बनाने के लिए, पहले एक venv सेट करें, उसमें flit और सत्यापन टूलचेन (zuban और ruff) स्थापित करें, और flit को निर्भरताएं खींचने दें। संक्षेप में, कुछ इस प्रकार करें:
$ git clone https://github.com/alterakey/trueseeing.git wc
$ python3 -m venv wc/.venv
$ source wc/.venv/bin/activate
(.venv) $ pip install flit zuban ruff
(.venv) $ flit install --deps=develop -s
(.venv) $ (... हैक ...)
(.venv) $ trueseeing ... # चलाने के लिए
(.venv) $ zuban check trueseeing && ruff check trueseeing # मान्य करने के लिए
Success: no issues found in XX source files
(.venv) $ flit build # बनाने के लिए (wheel)
(.venv) $ docker build -t trueseeing . # बनाने के लिए (container)
विवरण
भेद्यता वर्ग
वर्तमान में हम निम्नलिखित प्रकार की भेद्यताओं का पता लगा सकते हैं, जो काफी हद तक OWASP Mobile Top 10 - 2016 में शामिल हैं:
-
अनुचित प्लेटफ़ॉर्म उपयोग (M1)
- डीबग करने योग्य
- गतिविधियों, सेवाओं, ContentProviders, BroadcastReceivers का अनजाने में प्रकाशन
-
असुरक्षित डेटा (M2)
- बैकअप करने योग्य (अर्थात बैकअप हमले के लिए संदिग्ध)
- असुरक्षित फ़ाइल अनुमतियाँ
- लॉगिंग
-
असुरक्षित संचार (M3)
- पिनिंग की कमी (अर्थात TLS अवरोधन हमले के लिए संदिग्ध)
- स्पष्ट टेक्स्ट HTTP का उपयोग
- छेड़छाड़ योग्य WebViews
-
अपर्याप्त क्रिप्टोग्राफी (M5)
- हार्डकोडेड पासफ़्रेज़/गुप्त कुंजियाँ
- स्थिर कुंजियों के साथ वर्नम सिफर
- ECB मोड का उपयोग
-
क्लाइंट कोड गुणवत्ता के मुद्दे (M7)
- प्रतिबिंबित करने योग्य WebViews (अर्थात ऐसे दृश्यों में XSS को JS प्रतिबिंब के माध्यम से दूरस्थ कोड निष्पादन तक बढ़ाया जा सकता है)
- मिश्रित सामग्री पर असुरक्षित नीति का उपयोग
-
कोड छेड़छाड़ (M8)
- हार्डकोडेड प्रमाणपत्र
-
रिवर्स इंजीनियरिंग (M9)
- अस्पष्टता का अभाव
एक्सटेंशन API
हमारा एक्सटेंशन API trueseeing.api पैकेज के अंतर्गत स्थित है। चूंकि हम इसके साथ प्रकार की जानकारी प्रदान करते हैं, इसलिए आपका IDE आपको एक्सटेंशन लिखने में सहायता करेगा। बस सुनिश्चित करें कि इसका (या इसके भाषा सर्वर का) PYTHONPATH उस venv को कवर करता है जहां हमारा पैकेज है; यदि आपने इसे uv tool install के साथ स्थापित किया है तो uv tool list --show-paths देखें। यदि आपने uvx के साथ स्थापित किया है, तो इसे uvx install के साथ पुनः स्थापित करने पर विचार करें। यदि आपने pip के साथ स्थापित किया है, तो आप पहले से जानते हैं कि यह कहां है।
कमांड
नए कमांड परिभाषित करने के लिए, trueseeing.api.Command को लागू करें और उनका विज्ञापन करें।
निम्नलिखित वर्ग t के रूप में एक नमूना कमांड प्रदान करेगा, उदाहरण के लिए:
from typing import TYPE_CHECKING
from trueseeing.api import Command
from trueseeing.core.ui import ui
if TYPE_CHECKING:
from trueseeing.api import CommandMap, CommandPatternMap, ModifierMap, OptionMap, ConfigMap
class MyCommand(Command):
@staticmethod
def create() -> Command:
return MyCommand()
def get_commands(self) -> CommandMap:
return {'t':dict(e=self._test, n='t', d='sample command')}
def get_command_patterns(self) -> CommandPatternMap:
return dict()
def get_modifiers(self) -> ModifierMap:
return dict()
def get_options(self) -> OptionMap:
return dict()
def get_configs(self) -> ConfigMap:
return dict()
async def _test(self) -> None:
ui.info('hello world')
सिग्नेचर
नए सिग्नेचर परिभाषित करने के लिए, trueseeing.api.Signature को लागू करें और उनका विज्ञापन करें।
निम्नलिखित वर्ग my-sig के रूप में एक नमूना डिटेक्टर प्रदान करेगा, उदाहरण के लिए:
from typing import TYPE_CHECKING
from trueseeing.api import Signature
if TYPE_CHECKING:
from trueseeing.api import SignatureMap, ConfigMap
class MySignature(Signature):
@staticmethod
def create() -> Signature:
return MySignature()
def get_sigs(self) -> SignatureMap:
return {'my-sig':dict(e=self._detect, d='sample signature')}
def get_configs(self) -> ConfigMap:
return dict()
async def _detect(self) -> None:
self._helper.raise_issue(
self._helper.build_issue(
sigid='my-sig',
title='hello world',
cvss='CVSS:3.0/AV:P/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N/',
)
)
फ़ाइल प्रारूप
नए फ़ाइल प्रारूप परिभाषित करने के लिए, पहले अपने प्रारूपों के लिए Contexts (ABC) लागू करें, फिर उनके इंस्टेंस बनाने और वापस करने के लिए trueseeing.api.FileFormatHandler लागू करें, और उनका विज्ञापन करें।
निम्नलिखित वर्ग apk2 नामक प्रकार के तहत APK फ़ाइल समर्थन प्रदान करेगा, उदाहरण के लिए:
from typing import TYPE_CHECKING
from trueseeing.api import FileFormatHandler
from trueseeing.core.android.context import APKContext
if TYPE_CHECKING:
from typing import Optional, Set
from trueseeing.api import FormatMap, ConfigMap
from trueseeing.core.context import Context, ContextType
class MyAPKContext(APKContext):
# Use a different context type
def _get_type(self) -> Set[ContextType]:
return {'apk2'}
class APKFileFormatHandler(FileFormatHandler):
@staticmethod
def create() -> FileFormatHandler:
return APKFileFormatHandler()
def get_formats(self) -> FormatMap:
return {'apk2':dict(e=self._handle, r=r'\.apk$', d='sample file format', t=None)} # if this handler can suggest device context type, advertise at t
def get_configs(self) -> ConfigMap:
return dict()
def _handle(self, path: str) -> Optional[Context]:
return MyAPKContext(path)
फिर सुनिश्चित करें कि आप अपने सिग्नेचर में संदर्भ के प्रकार की जांच करते हैं, उन्हें असमर्थित संदर्भों पर अनदेखा करते हैं:
context = self._helper.get_context().require_type('apk2')
सफल जांच पर, require_type(...) आपकी सुविधा के लिए उन्हें उपयुक्त प्रकारों में डाउनकास्ट करने का प्रयास करेगा।
लेकिन डिज़ाइन के अनुसार यह केवल ज्ञात प्रकारों (वर्तमान में, apk) के लिए काम करता है। इसलिए यदि आप अपने नए संदर्भ वर्गों में कुछ विस्तृत इंटरफ़ेस परिभाषित कर रहे हैं जैसा कि हम apk प्रकार के लिए करते हैं, तो आपको यहां एक डाउनकास्ट करने की आवश्यकता है अर्थात:
context: MyAPKContext = self._helper.get_context().require_type('apk2') # type:ignore[assignment]
एक ही पैटर्न से मेल खाने वाले कई प्रारूपों को परिभाषित करना संभव है। हम पैटर्न का मूल्यांकन सबसे कठोर (यानी लंबे) से कम से कम के क्रम में करते हैं। आप लक्ष्य फ़ाइल के साथ कुछ प्रारूप का उपयोग करने के लिए -F स्विच का उपयोग करते हैं, उदाहरण के लिए:
$ trueseeing -F apk2 target.apk
पैकेज आवश्यकताएँ
एक्सटेंशन या तो: a) /ext (कंटेनर) या ~/.trueseeing2/extensions (pip) के अंतर्गत रखा गया कोई भी पैकेज, या b) trueseeing_ext0_ उपसर्ग के साथ नामित कोई भी स्थापित मॉड्यूल हो सकता है।
परियोजना के नाम की उत्पत्ति?
D&D का जादू, True Seeing।