
악성코드 분석 및 분류 도구입니다.
Inhale은 정적 분석 작업을 자동화하고 확장할 수 있는 악성코드 분석 및 분류 도구입니다.
이것은 베타 릴리스 버전으로, 테스트 목적, 피드백 및 커뮤니티 개발을 위한 것입니다.
Inhale은 다양한 소스에서 대량의 악성코드를 수집하고 분석할 때 사용했던 작은 스크립트 모음에서 시작되었습니다. 비슷한 작업을 수행하는 프레임워크와 도구는 많지만, 많은 파일에 대한 정보를 신속하게 찾고, 분류하고, 저장하는 제 작업 흐름에 맞는 것은 없었습니다. 일부는 비싼 API 키와 비용이 드는 기타 서비스가 필요하기도 했습니다. 결국 이 스크립트들을 연구 서버, 노트북, 또는 Raspberry Pi 같은 저비용 컴퓨터에서도 빠르게 설정하고 사용할 수 있는 무언가로 만들었습니다.
이 도구는 Linux에서 Python3, ElasticSearch, radare2, yara 및 binwalk를 사용하여 실행되도록 제작되었습니다. jq는 데이터베이스 출력을 예쁘게 출력하는 데 필요합니다. 기본 설치 지침은 다음과 같습니다.
config.yml 파일에 아직 실제로 설정되지 않은 여러 항목들이 있습니다. 이 문서에서 달리 명시되지 않는 한 그대로 두십시오.
요구 사항 설치
python3 -m pip install -r requirements.txt
데이터베이스는 Inhale을 사용하는 데 필수는 아니지만, 설정을 원한다면 다음 지침을 따르고 config.yml 옵션 'enable_database'를 True로 설정하십시오.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch
sudo service elasticsearch start
또한 이 문서를 따라 수동으로 설치할 수 있습니다.
또한 시각화 및 데이터 분석 목적으로 전체 ELK 스택을 설정할 수 있습니다. 이 도구를 사용하는 데 필수는 아닙니다.
radare2를 패키지 관리자가 아닌 저장소에서 설치하는 것이 중요합니다. 패키지 관리자 버전은 inhale에 필요한 모든 기능을 제공하지 않습니다.
git clone https://github.com/radare/radare2
cd radare2
sys/install.sh
sudo apt-get install automake libtool make gcc
wget https://github.com/VirusTotal/yara/archive/v3.10.0.tar.gz
tar xvzf v3.10.0.tar.gz
cd yara-3.10.0/
./bootstrap.sh
./configure
make
sudo make install
공유 객체에 대한 오류가 발생하면 다음을 시도하여 수정하십시오.
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
binwalk를 저장소에서 간단히 설치하는 것이 가장 좋습니다.
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
binwalk의 추가 기능 설치에 대한 자세한 정보는 여기에 있습니다.
이 라이브러리는 악성코드 패밀리 분석을 위해 ELF 파일의 섹션을 해싱합니다. telfhash는 tlsh에 의존하므로 둘 다 설치하는 지침은 다음과 같습니다.
tlsh 설정
git clone https://github.com/trendmicro/tlsh
cd tlsh
./make.sh
cd py_ext/
python3 ./setup.py build
sudo python3 ./setup.py install
telfhash 설정
git clone https://github.com/trendmicro/telfhash
cd telfhash
sudo python3 setup.py install
inhale 출력을 공유하기 위해 웹 서버를 사용하려면 config.yml의 변수를 적절한 경로로 설정하고 해당 디렉토리가 존재하는지 확인하십시오!
web:
gen_html: False
webdir: "/var/www/html/" # The actual web directory
fqdn: "http://threat.land" # Your website
in_path: "/var/www/html/inhaled/" # The path to inhale output
ex_path: "/var/www/html/exhaled/" # The path for db query cache output
HTML 출력을 사용하려면 inhale을 다음과 같이 실행하십시오:
python3 inhale.py [all your args here] --html
유형별로 스크래핑할 파일을 지정하십시오:
-f INFILE Analyze a single file
-d DIRECTORY Analyze a directory of files
-u URLFILE Analyze a remote file (url)
-r RDIRECTORY Analyze a remote directory (url)
-l URLLIST Analyze a list of URLs in a text file
기타 옵션:
-t TAGS Add additional tags to the output.
-b Turn off binwalk signatures
-y YARARULES Specify custom Yara Rules
-o OUTDIR Store scraped files in specific output dir (default: ./files/<date>/)
-i Just print info, don't add files to database
--html Save output as html to the webdir.
inhale.py를 실행하면 주어진 파일/디렉토리/URL에 대한 모든 분석을 수행하고 터미널에 출력합니다.
/bin/ls에 대한 정보를 보되 데이터베이스에 추가하지 않음
python3 inhale.py -f /bin/ls -i
'malwarez' 디렉토리를 데이터베이스에 추가
python3 inhale.py -d malwarez/
이 파일을 다운로드하고 데이터베이스에 추가
python3 inhale.py -u https://thugcrowd.com/chal/skull
이 원격 디렉토리의 모든 것을 다운로드하고 모두 'phishing'으로 태그 지정:
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
PROTIP: 이 트위터 해시태그 검색을 사용하여 악성코드를 포함할 가능성이 있는 흥미로운 오픈 디렉토리를 찾으십시오. 사용에 따른 책임은 본인에게 있습니다.
-y를 사용하여 자신의 yara 규칙을 전달할 수 있습니다. 이것은 대규모 진행 중인 작업이며, 'YaraRules'의 거의 모든 것은 https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules에서 가져온 것입니다. @KevTheHermit에게 감사 인사를 전합니다.
db.sh를 사용하여 쿼리합니다 (곧 멋진 스크립트가 될 예정)
db.sh *something* | jq .
다음은 elasticsearch 데이터베이스에 사용되는 현재 데이터 모델입니다. 이 모든 필드가 모든 파일에 사용되는 것은 아닙니다. r2_* 태그는 일반적으로 일종의 바이너리용으로 예약되어 있습니다.
| Name | Description |
|---|---|
| filename | 바이너리의 전체 경로 |
| file_ext | 파일 확장자 |
| filesize | 파일 크기 |
| filetype | 매직 값에 기반한 파일 유형. binwalk 시그니처만큼 신뢰할 수 없음. |
| md5 | 파일의 MD5 해시 |
| sha1 | 파일의 SHA1 해시 |
| sha256 | 파일의 SHA256 해시 |
| added | 파일이 추가된 날짜 |
| r2_arch | 바이너리 파일의 아키텍처 |
| r2_baddr | 바이너리의 베이스 주소 |
| r2_binsz | 프로그램 코드의 크기 |
| r2_bits | 아키텍처 비트 - 8/16/32/64 등 |
| r2_canary | 스택 카나리 활성화 여부 |
| r2_class | 바이너리 클래스 |
| r2_compiled | 바이너리가 컴파일된 날짜 |
| r2_dbg_file | 바이너리의 디버그 파일 |
| r2_intrp | 동적 링크된 경우 바이너리가 호출하는 인터프리터 |
| r2_lang | 소스 코드의 언어 |
| r2_lsyms | 디버그 심볼 존재 여부 |
| r2_machine | 머신 유형, 일반적으로 바이너리 대상 CPU를 의미 |
| r2_os | 머신이 실행되어야 하는 OS |
| r2_pic | 위치 독립 코드(PIC) 존재 여부 |
| r2_relocs | 재배치 존재 여부 |
| r2_rpath | 런타임 검색 경로 (해당되는 경우) |
| r2_stripped | 바이너리 스트립 여부 |
| r2_subsys | 바이너리의 서브시스템 |
| r2_format | 바이너리 포맷 |
| r2_iorw | ioctl 호출 존재 여부 |
| r2_type | 바이너리 유형 (실행 파일, 공유 객체 등) |
| yara | yara 일치 목록 포함 |
| binwalk | binwalk 시그니처 및 바이너리 내 위치 목록 포함 |
| tags | -t 플래그로 전달된 사용자 정의 태그 |
| url | 원격으로 다운로드된 파일의 원본 URL |
| urls | 바이너리에서 추출된 모든 URL |
이 프로젝트에는 몇 가지 알려진 문제가 있습니다 (주로 패키지 관리자 버전과 관련됨). 여기서는 해결책이 있는 모든 것을 추적하겠습니다.
다음과 같은 오류가 발생하면:
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
ElasticSearch의 이전 버전을 사용하고 있을 수 있습니다. 업그레이드하거나 다음 한 줄 명령으로 필드 제한을 늘릴 수 있습니다.
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
PR은 환영합니다! 구체적인 피드백을 원하시면 Twitter에서 @netspooky로 DM을 보내주셔도 됩니다.
이 도구를 함께 테스트해 주신 모든 분께 감사드립니다. 또한 코드를 좀 더 깔끔하게 정리해 주신 Plazmaz님께도 감사드립니다.
인사: hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd, 그리고 ThreatLand와 TC Safari Zone에 관련된 모든 분들께.