[KOR] CriminalIP-python 툴 공개

2000년대 후반 Shodan을 필두로 공개출처정보수집 (OSINT) 기반의 플랫폼/검색 엔진들이 많이 생겼다. 2022년도 기준으로는 그 수가 너무 많다고 느껴질 정도다 (Shodan, Censys, GreyNoise, Zoomeye, Hunter.io, Pipl,  project-sonar, fullhunt, hackertarget, threatcrowd, threatminer, .....).

하지만 후발 주자 플랫폼들은 각자만의 특장점을 갖고 나왔기 때문에 사용할만한 가치가 있다. 예를 들어 AI Spera 사의 CriminalIP.io 플랫폼이 그렇다. 이 플랫폼의 경우 Asset, Exploit, TLS/SSL Certificate, Domain 등에 관련된 자세한 정보들을 제공함과 동시에 국내에서 서비스 하다보니 한글로된 결과값을 얻기가 더 쉬운 장점을 갖고 있다. 또, 제공되는 데이터가 보안에 초점이 맞춰져 있다.

CrminalIP-Python

웹사이트 형태로 서비스를 이용하는 것도 좋지만, 자동화가 필수가 되어버린 요즘에는 API 를 통해 데이터를 받아와 원하는 형태로 가공 하는 것도 중요하다. CriminalIP 플랫폼도 다행히 API를 제공하고 있다. 단, 플랫폼도 아직 베타 단계이고 여러모로 부족한 것이 많기에 API 또한 기능이 많이 부족한 상태다. 실제로 웹사이트에서는 사용 가능한 기능과 필터링이 API 버전1 에서는 지원이 안되는 경우가 많다.

하지만 베타 단계인 만큼 개인이 API를 이용할 시 "베타 멤버쉽" 플랜을 이용해 월 최대 10,000개의 요청을 무료로 이용할 수 있다. 플랫폼과 API가 베타 단계를 벗어나 완전 상용화가 된다면 유료로 바뀔 수도 있겠지만, 적어도 2022년 9월 25일 기준으로는 아직 무료다.

브라우저를 이용해 플랫폼을 이용하다가 마음에 들어서 API 를 보고 간단하게 파이썬 CLI 형태의 프로그램을 만들어봤다. 이 블로그 글에서는 툴을 소개하고 예시 시나리오를 통해 툴 사용 방법에 대해서 익혀본다.

설치

깃허브 링크는 여기(https://github.com/ChoiSG/criminalip-python)에서 확인할 수 있다. pipx 를 이용해 설치한다.

sudo git clone https://github.com/ChoiSG/criminalip-python
cd ./criminal-python 

pip3 install pipx 
pipx ensurepath 
pipx install . 

설치가 완성되면 현 PATH 에 cip 라는 명령어를 사용할 수 있게 될 것이다.  만약 안된다면 터미널을 새로 열면 된다.

┌──(root㉿kali)-[~]
└─# cip -h 
Usage: cip [OPTIONS] COMMAND [ARGS]...

Options:
  -h, --help  Show this message and exit.

Commands:
  init          Initialize Criminal IP API key.
  ip            Get information about an IP address
  request-scan  Request a domain scan to Criminal IP
  scan-result   Get scan result for a domain
  search        Search for specific network service banner
  vpn           Check VPN/Proxy status of an IP address 

사용법

시작하기 앞서 CriminalIP 플랫폼의 API 키가 필요하다. 해당 링크로 가 가입한다. 구글이나 트위터 계정을 이용해 가입하는 것도 가능하다.

오른쪽 위의 프로필을 클릭해 살펴보면 Free Beta Membership 이라고 되어 있을 것이다.

여기서 다시 My Information 으로 가면 API 키가 있다. API 키를 복사한다.

그러면 끝이다. 이제 cip init 명령어를 통해 API 키를 활성화한다.

┌──(root㉿kali)-[~]
└─# cip init <API-KEY>
[+] Work directory created at /root/.cip
[+] API key is valid
[+] API key check successful.

EMAIL:<REDACTED>
NAME:<REDACTED>
LAST_ACCESS_DATE:2022-09-26 02:11:31
MAX_SEARCH:10,000

[+] API key stored in /root/.cip/api_key.txt

API 키는 평문 형태로 현 유저 홈 디렉토리 /.cip/api_key.txt 파일에 저장된다.

예시 시나리오 - 1

기업의 블루팀 엔지니어로서 회사에서 운영중인 자산관리 플랫폼안의 IP 주소들 중 인터넷에 노출되어 있는 호스트들이 불필요한 포트를 노출하고 있지 않은지 확인해보자.

먼저 확인하고 싶은 IP 주소들을 리스트 형태로 만든다.

┌──(root㉿kali)-[/opt/criminalip-python/examples]
└─# cat ip.txt 
210.217.18.78
210.217.18.69
211.197.11.12

이제 해당 IP 주소들을 CriminalIP 에다가 검색해본다.

└─# cip ip -f ip.txt -o output.txt                                                                                                                                                                                            
IP:210.217.18.78                                                                                                                                                                                                              
 [ ... ] 
 
   Port:21
     Service:vsftpd 3.0.3
     Is_Vuln:True
     confirmed_time:2022-09-21 19:35:19
                                                                       
  Port:500                                                                                                     
    Service:Unknown Unknown                                                                                    
    Is_Vuln:None                                                                                               
    confirmed_time:2022-05-14 11:54:48

IP:[REDACTED]
  Port:7547
    Service:N/A N/A
    Is_Vuln:False
    confirmed_time:2022-09-25 19:02:39
  [ ... ] 
  Port:21
    Service:vsftpd 3.0.3
    Is_Vuln:True
    confirmed_time:2022-09-21 19:35:19

  CVE:CVE-2021-3618
    CVSSv3:7.4
    Port:TCP/[21] UDP/[]
    Service:vsftpd 3.0.3

이런! 회사의 [REDACTED] IP 주소를 가진 서버가 외부에 vsftpd 3.0.3 서비스를 포트 21로 노출시키고 있었다. 심지어 이 FTP 서비스는 CVE-2021-3618 이라는 DOS 취약점을 갖고 있는 상태다. 이를 팀장님께 보고한 뒤, 서버에 접속해 vsftpd 를 업데이트 하거나 설정/방화벽 설정을 바꿔 인터넷에 노출되지 않도록 업데이트하자.

예시 시나리오 - 2

온라인 플랫폼을 운영하고 있는 회사의 보안 엔지니어로서 우리 기업의 플랫폼에 VPN, TOR, Proxy 등의 수상한 트래픽을 알아보고 싶었다. 이런 정보를 제공하는 다양한 서비스들이 있지만, 가장 좋은 것은 우리 회사의 플랫폼을 방문하는 IP 주소들 중 수상한 IP 주소들을 모아 VPN/TOR/Proxy 여부를 살펴보는 것이다.

┌──(root㉿kali)-[/opt/criminalip-python]
└─# cat ./examples/vpn.txt                                 
31.171.152.11
210.217.18.69
211.197.11.12

이제 위 의심되는 아이피주소들을 CriminalIP 로 가져가 확인해보자. 하나는 NordVPN 으로 확정되었고, 나머지 둘은 확실하지는 않지만 VPN 일 확률이 높다.

┌──(root㉿kali)-[/opt/criminalip-python]
└─# cip vpn -f ./examples/vpn.txt 
IP:31.171.152.11
IS_VPN:True
VPN_NAME:nordvpn

IP:210.217.18.69
IS_VPN:True

IP:211.197.11.12
IS_VPN:True

예시 시나리오 - 3

보안관제에서 일을 하고 있는 보안 엔지니어로서 티켓을 뒤져보다 수상한 도메인으로 word.exe > connhost.exe 가 트래픽을 보내는 것을 발견했다. 다양한 서비스를 이용해 도메인에 관련된 정보들을 수집할 수 있겠지만, CriminalIP 를 이용해 한 번 더 확인할 수도 있다.

먼저 request-scan 명령어를 이용해 CriminalIP 플랫폼에 도메인 스캔을 의뢰한다.

┌──(root㉿kali)-[/opt/criminalip-python]
└─# cip request-scan semiconductboard.com  
[+] Successfully requested domain scan for semiconductboard.com
[+] Scan ID: 2197936

[+] Wait for couple of minutes, and then run scan-result with scan_id for progress and results.

스캔이 언제 끝나나 궁금하니 scan-result 명령어와 --progress [-p]를 이용해 진행도를 알아본다.

┌──(root㉿kali)-[/opt/criminalip-python]
└─# cip scan-result 2197936 -p            
{
  "data": {
    "scan_percentage": 100
  },
  "message": "api success",
  "status": 200
}

커피를 한잔 뽑아오니 스캔이 끝났다! 결과를 확인한다.

┌──(root㉿kali)-[/opt/criminalip-python]
└─# cip scan-result 2197936

[ ... ] 

    "main_domain_info": {      
      "changed_url": "",
      "domain_created": "2021-10-13",
      "domain_registrar": "NameCheap, Inc.",
      "domain_score": {                                                                                        
        "score": "critical",
        "score_num": 4
      },                 
      "favicon": [],      
      "inserted_url": "http://www.semiconductboard.com",
      "main_domain": "semiconductboard.com",
      "title": "Website suspended"
    },  
    
[ ... ] 

NameCheap 에서 구매한 도메인인데 타이틀이 Website suspended 라고 나오고, 도메인 점수가 critical 이다. 확실히 수상한 도메인에다가 이미 Namecheap 측에서 조치를 취해서 사이트나 도메인 자체가 내려간 상태일 수도 있을 것이다. 이런 위험한 도메인에 우리 회사 서버가 콜백을 보내고 있었다니, 수상하다. 더 심도 있는 침해대응을 준비한다.

마치며

몇 년 전과는 비교도 안될 정도로 효율적이고 좋은 퀄리티의 플랫폼들이 나오고 있다. 블루팀의 입장에서는 수십, 수백가지의 툴들을 수동으로 사용하기 보다는 어느정도 자동화를 한 뒤 정보를 필터링 해야 효율적으로 업무를 처리할 수 있을 것이다. "투 머치 로그 (too much logs)" 에서 벗어나 업무 자동화에 CriminalIP-Python이 도움이 되길 바라며 글을 마친다.

Happy Hacking!