
무해화된 침해 지표(IOC) 추출기.
침해 지표 (IOC) 추출기로, 가장 흔히 수집되는 아티팩트 중 일부를 대상으로 합니다.
iocextract 패키지는 텍스트 코퍼스에서 URL, IP 주소, MD5/SHA 해시, 이메일 주소, YARA 규칙을 추출하기 위한 라이브러리 및 명령줄 인터페이스(CLI)입니다. 인코딩되거나 "defanged"된 IOC를 추출하고, 선택적으로 디코딩하거나 refang 할 수 있습니다.
악성코드 분석가나 엔드포인트 소프트웨어가 실시간 악성 콘텐츠에 대한 우발적 노출을 방지하기 위해 URL, IP 주소 등의 IOC를 "defang"하는 것은 일반적인 관행입니다. 이러한 IOC를 추출하고 집계하는 것은 분석가에게 종종 유용합니다. 안타깝게도 기존의 "IOC 추출" 도구는 표준 정규식에 포착되지 않아 이러한 IOC를 그냥 지나치는 경우가 많습니다.
예를 들어, 점을 대괄호로 감싸는 간단한 defang 기법:
127[.]0[.]0[.]1
간단한 IP 주소 정규식을 사용하는 기존 도구는 이 IOC를 완전히 무시합니다.
특수하게 제작된 정규식과 사용자 정의 후처리를 결합하여 "defanged"된 IOC를 감지하고 난독화를 해제할 수 있습니다. 이는 분석가가 수동으로 IOC를 찾아 기계가 읽을 수 있는 형식으로 변환해야 하는 수고를 덜어 시간과 노력을 절약해 줍니다.
많은 트위터 사용자가 defanged된 URL과 함께 C2 또는 기타 유용한 IOC 정보를 게시합니다. 예를 들어, @InQuest의 이 트윗:
Recommended reading and great work from @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
InQuest customers have had detection for threats delivered from hotfixmsupload[.]com
since 6/3/2017 and cdnverify[.]net since 2/1/18.
이것을 추출기에 통과시키면 URL을 쉽게 뽑아낼 수 있습니다:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
추출 시 refang=True를 전달하면 난독화가 제거되지만, 이는 실제 IOC이므로 문서에서는 defanged 상태로 두겠습니다.
regex 의존성을 설치하려면 Python 개발 헤더를 설치해야 할 수도 있습니다. Ubuntu/Debian 계열 시스템에서는 다음을 시도하세요:
sudo apt-get install python-dev
그런 다음 pip에서 iocextract를 설치하세요:
pip install iocextract
Windows에서 설치에 문제가 있으면 PyPI에서 적절한 wheel을 다운로드하여 pip로 직접 regex를 설치해 보세요:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
defanged된 URL을 추출해 보세요:
import iocextract
content = \
"""
I really love example[.]com!
All the bots are on hxxp://example.com/bad/url these days.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# 출력
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
참고: 일부 URL이 여러 정규식에 걸려 두 번 나타날 수 있습니다.
원한다면 "refang"하거나 IOC에서 일반적인 난독화 방법을 제거할 수도 있습니다:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# 출력
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
추출된 IOC를 전혀 defang하지 않으려면 이 기능을 비활성화할 수도 있습니다:
import iocextract
content = \
"""
http://example.com/bad/url
http://example.com:8989/bad
http://example.com
http://example.com:8989/bad
"""
for url in iocextract.extract_urls(content, defang=False):
print(url)
# 출력
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
이 라이브러리의 모든 extract_* 함수는 리스트가 아닌 이터레이터를 반환합니다. 이 동작의 장점은 iocextract가 매우 큰 입력도 오버헤드가 매우 낮게 처리할 수 있다는 점입니다. 하지만 어떤 이유로 IOC를 두 번 이상 반복해야 한다면 결과를 리스트로 저장해야 합니다:
import iocextract
content = \
"""
I really love example[.]com!
All the bots are on hxxp://example.com/bad/url these days.
C2: tcp://example[.]com:8989/bad
"""
print(list(iocextract.extract_urls(content)))
# ['hxxp://example.com/bad/url', 'tcp://example[.]com:8989/bad', 'example[.]com', 'tcp://example[.]com:8989/bad']
명령줄 도구도 포함되어 있습니다:
$ iocextract -h
usage: iocextract [-h] [--input INPUT] [--output OUTPUT] [--extract-emails]
[--extract-ips] [--extract-ipv4s] [--extract-ipv6s]
[--extract-urls] [--extract-yara-rules] [--extract-hashes]
[--custom-regex REGEX_FILE] [--refang] [--strip-urls]
[--wide]
고급 침해 지표(IOC) 추출기. 인수를 지정하지 않으면 기본적으로 모든 IOC를 추출합니다.
선택적 인수:
-h, --help 이 도움말 메시지를 표시하고 종료
--input INPUT 기본값: stdin
--output OUTPUT 기본값: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE 각 줄에 하나의 캡처 그룹이 있는 사용자 정의 정규식 문자열 파일
--refang 기본값: no
--strip-urls URL 끝에서 가능한 쓰레기 제거. 기본값: no
--wide 와이드 인코딩 문자 일치를 위해 입력 전처리. 기본값: no
참고: URL, 이메일, IPv4 주소만 "refang"할 수 있습니다.
질문:
Q. 트윗이나 블로그 글 내용과 같은 일반 텍스트에서 defang되었을 가능성이 있는 IOC를 추출하는 경우인가요?
A. 네! 이것이 바로 iocextract가 설계된 용도이며, 가장 뛰어난 성능을 발휘하는 곳입니다. 더 나아가 자동으로 추출 및 저장을 자동화하고 싶다면 ThreatIngestor를 확인해 보세요.
Q. 16진수 또는 base64로 인코딩된 URL을 추출하는 경우인가요?
A. 네, 하지만 CLI가 최상의 결과를 제공하지 않을 수 있습니다. Python 스크립트를 작성하고
iocextract.extract_encoded_urls를 직접 호출해 보세요.
참고: URL 끝에 추가 쓰레기가 남을 가능성이 높습니다.
Q. HTML/XML/RTF에서 defang되지 않은 IOC를 추출하는 경우인가요?
A. 가능하지만,
--strip-urlsCLI 플래그(또는 라이브러리에서strip=True매개변수)를 사용하는 것을 고려해야 하며, 여전히 출력에 쓰레기가 포함될 수 있습니다. HTML에서 추출하는 경우 Beautiful Soup과 같은 도구를 사용하여 먼저 텍스트 콘텐츠를 분리한 다음 iocextract에 전달하는 것을 고려하세요. 이 예제를 참조하세요.
Q. 실행 파일이나 매우 큰 입력과 같은 바이너리 데이터에서 defang되지 않은 IOC를 추출하는 경우인가요?
A. 라이브러리로 실행할 때 매우 단순한 버전을 사용할 수 있지만,
defang=False매개변수가 필요하며 일부 IOC를 놓칠 수 있습니다. iocextract의 정규식은 defang된 IOC를 잡기 위해 유연하게 설계되었습니다. 필요한 정보를 수집할 수 없는 경우 Cacador와 같은 도구를 대신 사용하는 것을 고려하세요.
이 라이브러리는 현재 다음 IOC를 지원합니다:
[.] 앵커 포함@ 또는 at에 고정IPv4 주소의 경우 다음 defang 기법이 지원됩니다:
이메일 주소의 경우 다음 defang 기법이 지원됩니다:
URL의 경우 다음 defang 기법이 지원됩니다:
참고: 위 표는 완전하지 않으며, 다른 URL/defang 패턴도 올바르게 추출될 수 있습니다. 누락되거나 올바르게 작동하지 않는 부분이 있으면 GitHub Issues를 통해 알려주세요.
base64 정규식은 @deadpixi의 base64 정규식 도구를 사용하여 생성되었습니다.
CLI를 사용하여 사용자 정의 정규식으로 IOC를 추출하려면 각 줄에 하나의 정규식 문자열이 있는 일반 텍스트 파일을 만들고 --custom-regex 플래그로 전달하세요. 각 정규식 문자열에 정확히 하나의 캡처 그룹이 포함되어 있는지 확인하세요.
예를 들어:
http://(example\.com)/
(?:https|ftp)://(example\.com)/
이 사용자 정의 정규식 파일은 일치하는 URL에서 도메인 example.com을 추출합니다. (?: ) 비캡처 그룹은 일치 결과에 포함되지 않습니다.
전체 일치를 추출하려면 정규식 문자열 전체를 괄호로 묶으세요. 예:
(https?://.*?.com)
정규식이 유효하지 않으면 다음과 같은 오류 메시지가 표시됩니다:
Error in custom regex: missing ) at position 5
정규식에 캡처 그룹이 포함되지 않으면 다음과 같은 오류 메시지가 표시됩니다:
Error in custom regex: no such group
사용자 정의 정규식을 사용할 때는 항상 단일 캡처 그룹을 사용하세요. 간단한 예:
[
r'(my regex)', # 패턴이 일치하면 'my regex'를 반환
r'my (re)gex', # 패턴이 일치하면 're'를 반환
]
둘 이상의 캡처 그룹을 사용하면 예기치 않은 결과가 발생할 수 있습니다. 다음 예를 확인하세요:
[
r'my regex', # 아무것도 반환하지 않음
r'(my) (re)gex', # 패턴이 일치하면 'my'를 반환
]
왜일까요? 결과는 항상 각 정규식의 첫 번째 그룹 일치만 반환하기 때문입니다.
더 복잡한 정규식 쿼리의 경우 캡처 그룹과 비캡처 그룹을 다음과 같이 결합할 수 있습니다:
[
r'(?:my|your) (re)gex', # 패턴이 일치하면 're'를 반환
]
이제 비캡처 그룹을 위한 (?: ) 구문과 캡처 그룹을 위한 ( ) 구문을 비교할 수 있습니다.
iocextract가 사용 사례에 맞지 않는다면 유사한 프로젝트가 여러 개 존재합니다. GitHub에서 defang 및 indicators-of-compromise 태그를 확인하세요. 또한:
IOC 추출, 보강, 내보내기 등을 자동화하려면 ThreatIngestor를 확인하세요.
YARA 규칙을 작업 중이라면 plyara에 관심이 있을 수 있습니다.
추출기를 통과하지 못하는 defang 기법이 있거나 버그를 발견하면 Pull Request와 Issue를 언제든지 환영합니다. 라이브러리는 GPL-2.0 라이선스로 배포됩니다.
사용 중이신가요? 귀하의 사이트가 이 목록에 포함되길 원하시나요? 알려주세요!
| 기법 | Defanged | Refanged |
|---|
. -> [.] | 1[.]1[.]1[.]1 | 1.1.1.1 |
. -> (.) | 1(.)1(.)1(.)1 | 1.1.1.1 |
. -> \. | 1\.1\.1\.1 | 1.1.1.1 |
| 부분 | 1[.1[.1.]1 | 1.1.1.1 |
| 임의 조합 | 1.)1[.1.)1 | 1.1.1.1 |
| 기법 | Defanged | Refanged |
|---|
. -> [.] | me@example[.]com | [email protected] |
. -> (.) | me@example(.)com | [email protected] |
. -> {.} | me@example{.}com | [email protected] |
. -> _dot_ | me@example dot com | [email protected] |
@ -> [@] | me[@]example.com | [email protected] |
@ -> (@) | me(@)example.com | [email protected] |
@ -> {@} | me{@}example.com | [email protected] |
@ -> _at_ | me at example.com | [email protected] |
| 부분 | me@} example[.com | [email protected] |
| 공백 추가 | me@example [.] com | [email protected] |
| 임의 조합 | me @example [.)com | [email protected] |
| 기법 | Defanged | Refanged |
|---|
. -> [.] | example[.]com/path | http://example.com/path |
. -> (.) | example(.)com/path | http://example.com/path |
. -> \. | example\.com/path | http://example.com/path |
| 부분 | http://example[.com/path | http://example.com/path |
/ -> [/] | http://example.com[/]path | http://example.com/path |
| Cisco ESA | http:// example .com /path | http://example.com/path |
:// -> __ | http__example.com/path | http://example.com/path |
:// -> :\\ | http:\\example.com/path | http://example.com/path |
: -> [:] | http[:]//example.com/path | http://example.com/path |
hxxp | hxxp://example.com/path | http://example.com/path |
| 임의 조합 | hxxp__ example( .com[/]path | http://example.com/path |
| 16진수 인코딩 | 687474703a2f2f6578616d706c652e636f6d2f70617468 | http://example.com/path |
| URL 인코딩 | http%3A%2F%2fexample%2Ecom%2Fpath | http://example.com/path |
| Base64 인코딩 | aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK | http://example.com/path |