Skip to content

Commit 798bcf7

Browse files
committed
info leaks: added regex to find credentials in urls
1 parent 9ebbfcd commit 798bcf7

File tree

2 files changed

+42
-13
lines changed

2 files changed

+42
-13
lines changed

src/plugins/analysis/information_leaks/code/information_leaks.py

+24-12
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pathlib import Path
55

66
from analysis.PluginBase import AnalysisBasePlugin
7-
from typing import TYPE_CHECKING
7+
from typing import Any, TYPE_CHECKING
88

99
if TYPE_CHECKING:
1010
from objects.file import FileObject
@@ -19,6 +19,12 @@
1919
'any_history': re.compile(rb'.+_history'),
2020
}
2121

22+
URL_REGEXES = {
23+
'credentials_in_url': re.compile(
24+
rb'([a-zA-Z]{3,10}://[a-zA-Z0-9]{3,20}:[^/\s:@]{3,20}@[A-Za-z0-9._/:%?&${}=-]{7,100})["\'\s\x00]?'
25+
)
26+
}
27+
2228
PATH_ARTIFACT_DICT = {
2329
'.git/config': 'git_config',
2430
'.svn/entries': 'svn_entries',
@@ -83,25 +89,31 @@ class AnalysisPlugin(AnalysisBasePlugin):
8389
'application/x-sharedlib',
8490
'text/plain',
8591
]
86-
VERSION = '0.1.4'
92+
VERSION = '0.2.0'
8793
FILE = __file__
8894

8995
def process_object(self, file_object: FileObject) -> FileObject:
90-
file_object.processed_analysis[self.NAME] = {}
9196
if file_object.processed_analysis['file_type']['result']['mime'] == 'text/plain':
92-
self._find_artifacts(file_object)
93-
file_object.processed_analysis[self.NAME]['summary'] = sorted(file_object.processed_analysis[self.NAME])
97+
result, summary = _find_artifacts(file_object)
9498
else:
9599
result, summary = _find_regex(file_object.binary, PATH_REGEX)
96-
file_object.processed_analysis[self.NAME].update(result)
97-
file_object.processed_analysis[self.NAME]['summary'] = summary
100+
101+
url_result, url_summary = _find_regex(file_object.binary, URL_REGEXES)
102+
result.update(url_result)
103+
summary.extend(url_summary)
104+
105+
file_object.processed_analysis[self.NAME] = result
106+
file_object.processed_analysis[self.NAME]['summary'] = summary
98107
return file_object
99108

100-
def _find_artifacts(self, file_object: FileObject):
101-
# FixMe: after removal of duplicate unpacking/analysis, all VFPs will only be found after analysis update
102-
for virtual_path_list in file_object.virtual_file_path.values():
103-
for virtual_path in virtual_path_list:
104-
file_object.processed_analysis[self.NAME].update(_check_file_path(virtual_path))
109+
110+
def _find_artifacts(file_object: FileObject) -> tuple[dict[str, Any], list[str]]:
111+
# FixMe: after removal of duplicate unpacking/analysis, all VFPs will only be found after analysis update
112+
result = {}
113+
for virtual_path_list in file_object.virtual_file_path.values():
114+
for virtual_path in virtual_path_list:
115+
result.update(_check_file_path(virtual_path))
116+
return result, sorted(result)
105117

106118

107119
def _check_file_path(file_path: str) -> dict[str, list[str]]:

src/plugins/analysis/information_leaks/test/test_plugin_information_leaks.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44

55
from test.common_helper import MockFileObject
66

7-
from ..code.information_leaks import AnalysisPlugin, _check_file_path, _check_for_directories, _check_for_files
7+
from ..code.information_leaks import (
8+
_find_regex,
9+
AnalysisPlugin,
10+
_check_file_path,
11+
_check_for_directories,
12+
_check_for_files,
13+
URL_REGEXES,
14+
)
815

916
TEST_DATA_DIR = Path(__file__).parent / 'data'
1017

@@ -74,3 +81,13 @@ def test_check_file_path():
7481
svn_path = '/home/user/project/.svn/entries'
7582
assert _check_for_files(svn_path) and _check_for_directories(svn_path), 'both rules should match' # noqa: PT018
7683
assert _check_file_path(svn_path) == {'svn_entries': ['/home/user/project/.svn/entries']}
84+
85+
86+
def test_find_creds_in_urls():
87+
content = b'\0\0http://username:[email protected]/foo/bar\0\0"ftp://user:[email protected]"\0\0'
88+
result, summary = _find_regex(content, URL_REGEXES)
89+
assert result['credentials_in_url'] == [
90+
'ftp://user:[email protected]',
91+
'http://username:[email protected]/foo/bar',
92+
]
93+
assert summary == ['credentials_in_url']

0 commit comments

Comments
 (0)