공개 출처 정보 수집 Part 1

밍기적·2023년 5월 16일
0

Part 1


대상에 관한 정보를 수동적으로 수집하는 것

공개된 정보를 검색하고 활용하는 실세계의 예제들

또한 공개되어있긴 하지만 에전에는 보지 못했던 정보를 발견할 수 있음

컴퓨터 시스템에 관한 정보를 수집하는 것으로 시작하게 된다

예를들어 네트워크 도메인 이름, 호스트 이름, IP 주소, URL, 이메일 주소, 잠재적인 패스워드들을 수집하게 된다

중요한 부분은 이러한 정보를 데이터 패킷을 하나도 보내지 않고 수집한다는 것이다

정보 수집 과정은 원하는 사람은 누구나 볼 수 있는 공개된 정보에 기초하고 있다

즉, 이러한 과정은 전혀 보호되지 않은, 그리고 접근하는 데 비용도 전혀 들지 않는 정보를 이용하게 된다

그러면에서 이런 정보를 공개 출처 정보(open source information)라고 부르기도 함

공개 출처 정보 수집(open source information, OSINT) 평가

대체로 OSINT 평가는 수동적인 활동이다

  • 이 활동의 목적으로 유효한 공격 대상 또는 시스템을 식별하거나, 소프트웨어 종류 및 버전을 수집하거나, 테스트의 이후 단계들에서 활용할 수 있는 관련 인물을 파악하는 것
  • 웹 검색 엔진 같은 공개 데이터 공급원에서 얻을 수 있는 정보를 수집하는 데 초점을 두는 것

OSINT의 목표는 소유자가 자신에게 권한을 부여하지 않은 컴퓨터 시스템에 접근하는 공격을 수행하는 데 도움이 될 정보를 획득하는 것

정리하자면 우리가 찾아봐야 할 핵심정보는 다음과 같다

  • 사용자 이름, 프로필 이름 및 이메일 주소
  • 패스워드(개인 키, PIN Number 등)
  • 도메인 이름
  • 호스트 이름
  • IP 주소 (외부, 내부)
  • 소프트웨어와 운영체제의 종류, 이름, 버전
  • 시스템 사용자 가이드 같은 기술 문서

어디에서 찾는가?


  • 개인 웹사이트 (블로그 등)
  • 최대한 많은 검색 엔진(구글, Bing 등)
  • SNS(링크드인, 페이스북, 트위터, 인스타그램 등)
  • 그 밖에 흔히 쓰이는 계정들 (Github, 포털과 유명 공동체 사이트, 뉴스그룹, 메일링 리스트)
  • 공공 데이터베이스(ICANN, 무선 통신 업체, 도메인 이름 등록 업체, 도서관, 전화번호부)
  • P2P 파일 공유 네트워크(BitTorrent 클라이언트로 접근)

OSINT 도구들


  • 검색 엔진 (구글 등)
  • Goog-mail.py
  • 공개 데이터베이스의 API
  • Recon-ng
  • TheHarvester
  • FOCA
  • Metagoofil
  • Exiftool
  • Maltego CE
  • LinkedInt
  • Shodan
  • Dig, Host, Nslookup, WHOIS 등 여러 DNS(Domain Name Server) 도구
  1. 구글 검색으로 이메일 주소 얻기

어느 시점부터는 정보 수집 작업을 자동화할 필요가 있다

그런 과정을 좀 더 수월하게 만드는 다양한 도구들이 존재한다

이메일 주소를 로그인용 사용자 이름으로 사용하는 경우도 있다

  • 사회공학 및 스피어 피싱 공격

goog-mail.py (using python2)


#!/usr/bin/python
import sys
import re
import string
import httplib
import urllib2

def StripTags(text):
    finished = 0
    while not finished:
        finished = 1
        start = text.find("<")
        if start >= 0:
            stop = text[start:].find(">")
            if stop >= 0:
                text = text[:start] + text[start+stop+1:]
                finished = 0
    return text
if len(sys.argv) != 2:
        print "\nExtracts emails from Google results.\n"
        print "\nUsage: ./goog-mail.py <domain>\n"
        sys.exit(1)

domain_name=sys.argv[1]
d={}
page_counter = 0
try:
    while page_counter < 50 :
        results = 'http://groups.google.com/groups?q='+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter) + '&sa=N'
        request = urllib2.Request(results)
        request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener = urllib2.build_opener()                           
        text = opener.open(request).read()
        emails = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email in emails:
            d[email]=1
            uniq_emails=d.keys()
        page_counter = page_counter +10
except IOError:
    print "Cannot connect to Google Groups."+""
    
page_counter_web=0
try:
    while page_counter_web < 50 :
        results_web = 'http://www.google.com/search?q=%40'+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter_web) + '&sa=N'
        request_web = urllib2.Request(results_web)
        request_web.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener_web = urllib2.build_opener()                           
        text = opener_web.open(request_web).read()
        emails_web = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email_web in emails_web:
            d[email_web]=1
            uniq_emails_web=d.keys()
        page_counter_web = page_counter_web +10
        
except IOError:
    print "Cannot connect to Google Web."+""
for uniq_emails_web in d.keys():
    print uniq_emails_web+""

Using Python3 (https://github.com/BushidoUK/Goog-mail/blob/main/goog-mail.py)

#!/usr/bin/python

import httplib
import re
import string
import sys
import urllib2
from sys import stdout

def StripTags(text):
    finished = 0
    while not finished:
        finished = 1
        start = text.find("<")
        if start >= 0:
            stop = text[start:].find(">")
            if stop >= 0:
                text = text[:start] + text[start+stop+1:]
                finished = 0
    return text

if len(sys.argv) != 2:
        print "\nExtracts emails from Google results.\n"
        print "\nUsage: ./goog-mail.py <domain>\n"
        sys.exit(1)

domain_name=sys.argv[1]
d={}
page_counter = 0

try:
    while page_counter < 50 :
        results = 'http://groups.google.com/groups?q='+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter) + '&sa=N'
        request = urllib2.Request(results)
        request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener = urllib2.build_opener()                           
        text = opener.open(request).read()
        emails = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email in emails:
            d[email]=1
            uniq_emails=d.keys()
        page_counter = page_counter +10
except IOError:
    print "Cannot connect to Google Groups."+""
    
page_counter_web=0

try:
    while page_counter_web < 50 :
        results_web = 'http://www.google.com/search?q=%40'+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter_web) + '&sa=N'
        request_web = urllib2.Request(results_web)
        request_web.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener_web = urllib2.build_opener()                           
        text = opener_web.open(request_web).read()
        emails_web = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email_web in emails_web:
            d[email_web]=1
            uniq_emails_web=d.keys()
        page_counter_web = page_counter_web +10
except IOError:
    print "Cannot connect to Google Web."+"" 

stdout.write('''    
  ________                                  _____         .__.__                     
 /  _____/  ____   ____   ____             /     \ _____  |__|  |      ______ ___.__.
/   \  ___ /  _ \ /  _ \ / ___\   ______  /  \ /  \\__   \ |  |  |      \____ <   |  |
\    \_\  (  <_> |  <_> ) /_/  > /_____/ /    Y    \/ __ \|  |  |__    |  |_> >___  |
 \______  /\____/ \____/\___  /          \____|__  (____  /__|____/ /\ |   __// ____|
        \/             /_____/                   \/     \/          \/ |__|   \/     
Emails associated with the domain will appear below: 
''')

for uniq_emails_web in d.keys():
    print uniq_emails_web+""

실제로 여기서 기능을 하는 코드는 아래와 같다

try:
    while page_counter_web < 50 :
        results_web = 'http://www.google.com/search?q=%40'+str(domain_name)+'&hl=en&lr=&ie=UTF-8&start=' + repr(page_counter_web) + '&sa=N'
        request_web = urllib2.Request(results_web)
        request_web.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener_web = urllib2.build_opener()                           
        text = opener_web.open(request_web).read()
        emails_web = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email_web in emails_web:
            d[email_web]=1
            uniq_emails_web=d.keys()
        page_counter_web = page_counter_web +10
except IOError:
    print "Cannot connect to Google Web."+"" 

domain_name을 입력받고 @ 뒤에 domain_name을 넣어서 해당하는 이메일 주소를 획득하게 된다

이렇게 획득한 주소로 악성 봇들은 악성코드나 스팸을 보내는 대상으로 지정하게 된다

  • 실제로는 사용하지 않는 이메일일 수도 있다

구글 도킹(구글 해킹)


검색어를 교묘하게 설정함으로써 구글이 민감한 정보를 드러내게 하는 것

구글 도킹으로 취약한 사이트와 데이터를 찾아내는 것은 실제로는 간단하다

예를들어 inurl:/etc/passwd root:x:0:0:root:/root:/bin/bash를 입력하는 것이다

  • 이 검색어는 설정 미숙으로 인하여 특정 웹사이트의 passwd 파일이 노출된 리눅스 또는 유닉스 호스트들을 찾아내는 것이다
    • inurl:/etc/passwd는 URL에 /etc/passwd가 포함된 웹 페이지들만 검색 결과에 포함하라는 뜻이다
    • 실질적인 검색어인 root:x:0:0:root:/root:/bin/bash는 리눅스나 유닉스의 passwd 파일에 거의 항상 들어있는 문구이다
    • passwd 파일은 리눅스 사용자 또는 관리자 튜토리얼에 흔히 등장하는 주제이다

이렇게 검색된 파일을 절대로 클릭해서는 안된다

  • 불법적인 행위

passwd 파일과 shadow 파일에 관한 간단한 소개


리눅스와 유닉스에서 passwd 파일은 그 시스템의 모든 사용자가 읽을 수 있다

  • 일반적으로 쓰는 것은 루트 사용자만이 가능하다

또 다른 예로 filetype이 존재한다

filetype:doc inurl:gov intext:"default password"

구글 해킹 데이터베이스


간단한 구글 도킹 사례들이 존재한다

  • 이러한 특화된 구글 검색어를 모아둔 데이터베이스가 존재한다

구글 해킹 데이터베이스(Google Hacking Database)

  • www.exploit-db.com/google-hacking-database

공개된 민감한 정보를 구글 검색으로만 찾아낼 수 있다는 것이 구글 도킹의 핵심이다

도킹 검색어의 또 다른 예

  • inurl:”q=user/password”가 있다

이것은 인기 있는 CMS(콘텐츠 관리 시스템)인 Drupal이 설치된 사이트를 찾기 위한 것이다

0개의 댓글