From d76bb03d55adf13937b15244dee9120c9e1ccfc4 Mon Sep 17 00:00:00 2001 From: Shiying Tu Date: Fri, 11 Mar 2022 13:20:48 -0800 Subject: [PATCH 1/9] PAPP-24791 Support defanged URL's starting with hxxp extraction - Background: Many suspicious or malicious URL's are shared in a defand'g format and a common method is changing http to hxxp at the start of the address. Currently Parser only support parsing for URI starting with http and https - Fix: Add defang'g hxxp and hxxps to regex pattern --- parser_email.py | 2 +- parser_methods.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/parser_email.py b/parser_email.py index 3bde93c..73a0964 100644 --- a/parser_email.py +++ b/parser_email.py @@ -101,7 +101,7 @@ PROC_EMAIL_JSON_EMAIL_HEADERS = "email_headers" PROC_EMAIL_CONTENT_TYPE_MESSAGE = "message/rfc822" -URI_REGEX = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" +URI_REGEX = r"h[tt|xx]+p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" EMAIL_REGEX = r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" EMAIL_REGEX2 = r'".*"@[A-Z0-9.-]+\.[A-Z]{2,}\b' HASH_REGEX = r"\b[0-9a-fA-F]{32}\b|\b[0-9a-fA-F]{40}\b|\b[0-9a-fA-F]{64}\b" diff --git a/parser_methods.py b/parser_methods.py index 2ea6f4d..44fc651 100644 --- a/parser_methods.py +++ b/parser_methods.py @@ -50,7 +50,7 @@ } -URI_REGEX = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" +URI_REGEX = r"h[tt|xx]+p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" EMAIL_REGEX = r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" EMAIL_REGEX2 = r'".*"@[A-Z0-9.-]+\.[A-Z]{2,}\b' HASH_REGEX = r"\b[0-9a-fA-F]{32}\b|\b[0-9a-fA-F]{40}\b|\b[0-9a-fA-F]{64}\b" From a9ed84c1d83821130546fa9847da8381b62168f5 Mon Sep 17 00:00:00 2001 From: Shiying Tu Date: Mon, 14 Mar 2022 15:23:19 -0700 Subject: [PATCH 2/9] Refang URL in cleaning stage --- LICENSE | 2 +- parser.json | 2 +- parser_email.py | 14 ++++++++++++++ parser_methods.py | 16 +++++++++++++++- .../typing_extensions-4.0.1-py3-none-any.whl | Bin 22816 -> 0 bytes .../typing_extensions-4.1.1-py3-none-any.whl | Bin 0 -> 26844 bytes 6 files changed, 31 insertions(+), 3 deletions(-) delete mode 100644 wheels/py3/typing_extensions-4.0.1-py3-none-any.whl create mode 100644 wheels/py3/typing_extensions-4.1.1-py3-none-any.whl diff --git a/LICENSE b/LICENSE index 6af04d8..9a2c915 100644 --- a/LICENSE +++ b/LICENSE @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/parser.json b/parser.json index 1657301..b5f2bdb 100644 --- a/parser.json +++ b/parser.json @@ -93,7 +93,7 @@ }, { "module": "typing_extensions", - "input_file": "wheels/py3/typing_extensions-4.0.1-py3-none-any.whl" + "input_file": "wheels/py3/typing_extensions-4.1.1-py3-none-any.whl" }, { "module": "urllib3", diff --git a/parser_email.py b/parser_email.py index 73a0964..10748f0 100644 --- a/parser_email.py +++ b/parser_email.py @@ -25,6 +25,7 @@ from collections import OrderedDict from email.header import decode_header, make_header from html import unescape +from urllib.parse import urlparse import magic import phantom.app as phantom @@ -181,6 +182,18 @@ def _is_ip(input_ip): return False +def _refang_url(url): + parsed = urlparse(url) + scheme = parsed.scheme + + # Replace hxxp/hxxps with http/https + if scheme == "hxxp": + parsed = parsed._replace(scheme='http') + elif scheme == "hxxps": + parsed = parsed._replace(scheme='https') + + refang_url = parsed.geturl() + return refang_url def _clean_url(url): url = url.strip('>),.]\r\n') @@ -193,6 +206,7 @@ def _clean_url(url): if '>' in url: url = url[:url.find('>')] + url = _refang_url(url) return url diff --git a/parser_methods.py b/parser_methods.py index 44fc651..0e29a78 100644 --- a/parser_methods.py +++ b/parser_methods.py @@ -18,6 +18,7 @@ import sys import zipfile from html import unescape +from urllib.parse import urlparse import pdfminer from bs4 import BeautifulSoup, UnicodeDammit @@ -108,6 +109,18 @@ def _is_url(input_url): def is_ipv6(input_ip): return bool(re.match(IPV6_REGEX, input_ip)) +def _refang_url(url): + parsed = urlparse(url) + scheme = parsed.scheme + + # Replace hxxp/hxxps with http/https + if scheme == "hxxp": + parsed = parsed._replace(scheme='http') + elif scheme == "hxxps": + parsed = parsed._replace(scheme='https') + + refang_url = parsed.geturl() + return refang_url def _clean_url(url): url = url.strip('>),.]\r\n') @@ -120,6 +133,7 @@ def _clean_url(url): if '>' in url: url = url[:url.find('>')] + url = _refang_url(url) return url @@ -199,7 +213,7 @@ class TextIOCParser: # If you really wanted to, you could also have subtypes in the subtypes { 'cef': 'destinationDnsDomain', - 'name': 'Domain Artifact', + 'nacme': 'Domain Artifact', 'callback': _extract_domain_from_url # Method to extract substring } ] diff --git a/wheels/py3/typing_extensions-4.0.1-py3-none-any.whl b/wheels/py3/typing_extensions-4.0.1-py3-none-any.whl deleted file mode 100644 index 65500a1458e26d6272dac38080801d786486f807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22816 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 bvH$6sN^-Ct{{sjJ*pHU|;nwt)|NixFXDE~Y literal 0 HcmV?d00001 From 487cc3d47474424f198d4f2909ad9d1b75497af5 Mon Sep 17 00:00:00 2001 From: Shiying Tu Date: Mon, 14 Mar 2022 15:52:57 -0700 Subject: [PATCH 3/9] Fix linting issues --- parser_email.py | 2 ++ parser_methods.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/parser_email.py b/parser_email.py index 10748f0..8ed1765 100644 --- a/parser_email.py +++ b/parser_email.py @@ -182,6 +182,7 @@ def _is_ip(input_ip): return False + def _refang_url(url): parsed = urlparse(url) scheme = parsed.scheme @@ -195,6 +196,7 @@ def _refang_url(url): refang_url = parsed.geturl() return refang_url + def _clean_url(url): url = url.strip('>),.]\r\n') diff --git a/parser_methods.py b/parser_methods.py index 0e29a78..46dbf21 100644 --- a/parser_methods.py +++ b/parser_methods.py @@ -109,6 +109,7 @@ def _is_url(input_url): def is_ipv6(input_ip): return bool(re.match(IPV6_REGEX, input_ip)) + def _refang_url(url): parsed = urlparse(url) scheme = parsed.scheme @@ -122,6 +123,7 @@ def _refang_url(url): refang_url = parsed.geturl() return refang_url + def _clean_url(url): url = url.strip('>),.]\r\n') @@ -213,7 +215,7 @@ class TextIOCParser: # If you really wanted to, you could also have subtypes in the subtypes { 'cef': 'destinationDnsDomain', - 'nacme': 'Domain Artifact', + 'name': 'Domain Artifact', 'callback': _extract_domain_from_url # Method to extract substring } ] From cda5d18edeafb004532f079bbd11f6e77d8a12f1 Mon Sep 17 00:00:00 2001 From: Shiying Tu <85594384+shiyingtu@users.noreply.github.com> Date: Mon, 14 Mar 2022 17:35:28 -0700 Subject: [PATCH 4/9] Update Defang URL match pattern Co-authored-by: rgil-splunk <70550165+rgil-splunk@users.noreply.github.com> --- parser_methods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser_methods.py b/parser_methods.py index 46dbf21..10aec2a 100644 --- a/parser_methods.py +++ b/parser_methods.py @@ -51,7 +51,7 @@ } -URI_REGEX = r"h[tt|xx]+p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" +URI_REGEX = r"h(tt|xx)p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" EMAIL_REGEX = r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" EMAIL_REGEX2 = r'".*"@[A-Z0-9.-]+\.[A-Z]{2,}\b' HASH_REGEX = r"\b[0-9a-fA-F]{32}\b|\b[0-9a-fA-F]{40}\b|\b[0-9a-fA-F]{64}\b" From a2e145afe067c60d0dd07929537bcf7779cc8a02 Mon Sep 17 00:00:00 2001 From: Shiying Tu Date: Mon, 14 Mar 2022 17:58:21 -0700 Subject: [PATCH 5/9] Update Regex pattern to match only one occurence of xx or tt Also modify to un-capturing group --- parser_email.py | 2 +- parser_methods.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/parser_email.py b/parser_email.py index 8ed1765..7949772 100644 --- a/parser_email.py +++ b/parser_email.py @@ -102,7 +102,7 @@ PROC_EMAIL_JSON_EMAIL_HEADERS = "email_headers" PROC_EMAIL_CONTENT_TYPE_MESSAGE = "message/rfc822" -URI_REGEX = r"h[tt|xx]+p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" +URI_REGEX = r"h(?:tt|xx)p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" EMAIL_REGEX = r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" EMAIL_REGEX2 = r'".*"@[A-Z0-9.-]+\.[A-Z]{2,}\b' HASH_REGEX = r"\b[0-9a-fA-F]{32}\b|\b[0-9a-fA-F]{40}\b|\b[0-9a-fA-F]{64}\b" diff --git a/parser_methods.py b/parser_methods.py index 10aec2a..8c98b1e 100644 --- a/parser_methods.py +++ b/parser_methods.py @@ -51,7 +51,7 @@ } -URI_REGEX = r"h(tt|xx)p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" +URI_REGEX = r"h(?:tt|xx)p[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" EMAIL_REGEX = r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" EMAIL_REGEX2 = r'".*"@[A-Z0-9.-]+\.[A-Z]{2,}\b' HASH_REGEX = r"\b[0-9a-fA-F]{32}\b|\b[0-9a-fA-F]{40}\b|\b[0-9a-fA-F]{64}\b" From 8663a6e4d8d44223831c39f914d6808a055acd2d Mon Sep 17 00:00:00 2001 From: root Date: Tue, 15 Mar 2022 11:28:54 -0700 Subject: [PATCH 6/9] Bumped up the version of parser from 2.7.0 to 2.7.1 --- parser.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parser.json b/parser.json index b5f2bdb..b91f65d 100644 --- a/parser.json +++ b/parser.json @@ -9,10 +9,10 @@ "product_name": "Parser", "product_version_regex": ".*", "publisher": "Splunk", - "app_version": "2.7.0", + "app_version": "2.7.1", "fips_compliant": true, "license": "Copyright (c) 2017-2022 Splunk Inc.", - "utctime_updated": "2022-02-08T18:41:46.000000Z", + "utctime_updated": "2022-03-15T18:28:49.000000Z", "package_name": "phantom_parser", "main_module": "parser_connector.py", "min_phantom_version": "5.1.0", @@ -571,4 +571,4 @@ } ] } -} +} \ No newline at end of file From b78aed78106e747a5cc69130880b172746269c9d Mon Sep 17 00:00:00 2001 From: root Date: Tue, 15 Mar 2022 11:29:40 -0700 Subject: [PATCH 7/9] Release notes for version 2.7.1 --- LICENSE | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 9a2c915..6af04d8 100644 --- a/LICENSE +++ b/LICENSE @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 881edf2..76210b4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Parser Publisher: Splunk -Connector Version: 2\.7\.0 +Connector Version: 2\.7\.1 Product Vendor: Splunk Product Name: Parser Product Version Supported (regex): "\.\*" From 554dc5b6d96e70b15c1b9969eb1481b213006c8f Mon Sep 17 00:00:00 2001 From: Mary Pan Date: Thu, 17 Mar 2022 11:09:23 -0700 Subject: [PATCH 8/9] PAPP-24845: Extract defanged URL Code Implementation --- release_notes/unreleased.md | 1 + 1 file changed, 1 insertion(+) diff --git a/release_notes/unreleased.md b/release_notes/unreleased.md index fbcb2fd..42ca6f2 100644 --- a/release_notes/unreleased.md +++ b/release_notes/unreleased.md @@ -1 +1,2 @@ **Unreleased** +* Extract defanged URL Code Implementation [PAPP-24845] From 6c7bf67590dd09a0b6a6182eb56312531f1fef09 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 17 Mar 2022 13:21:31 -0700 Subject: [PATCH 9/9] Release notes for version 2.7.1 --- release_notes/2.7.1.md | 1 + release_notes/release_notes.html | 6 +++++- release_notes/unreleased.md | 1 - 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 release_notes/2.7.1.md diff --git a/release_notes/2.7.1.md b/release_notes/2.7.1.md new file mode 100644 index 0000000..56bd00b --- /dev/null +++ b/release_notes/2.7.1.md @@ -0,0 +1 @@ +* Extract defanged URL Code Implementation [PAPP-24845] \ No newline at end of file diff --git a/release_notes/release_notes.html b/release_notes/release_notes.html index 3f72750..e279aa8 100644 --- a/release_notes/release_notes.html +++ b/release_notes/release_notes.html @@ -1,5 +1,9 @@ -Parser Release Notes - Published by Splunk February 21, 2022 +Parser Release Notes - Published by Splunk March 17, 2022

+Version 2.7.1 - Released March 17, 2022 +
    +
  • Extract defanged URL Code Implementation [PAPP-24845]
  • +
Version 2.7.0 - Released February 21, 2022
  • Added validation for the extraction of URL artifacts [PAPP-23789]
  • diff --git a/release_notes/unreleased.md b/release_notes/unreleased.md index 42ca6f2..fbcb2fd 100644 --- a/release_notes/unreleased.md +++ b/release_notes/unreleased.md @@ -1,2 +1 @@ **Unreleased** -* Extract defanged URL Code Implementation [PAPP-24845]