대상에 관한 정보를 수동적으로 수집하는 것
공개된 정보를 검색하고 활용하는 실세계의 예제들
또한 공개되어있긴 하지만 에전에는 보지 못했던 정보를 발견할 수 있음
컴퓨터 시스템에 관한 정보를 수집하는 것으로 시작하게 된다
예를들어 네트워크 도메인 이름, 호스트 이름, IP 주소, URL, 이메일 주소, 잠재적인 패스워드들을 수집하게 된다
중요한 부분은 이러한 정보를 데이터 패킷을 하나도 보내지 않고 수집한다는 것이다
정보 수집 과정은 원하는 사람은 누구나 볼 수 있는 공개된 정보에 기초하고 있다
즉, 이러한 과정은 전혀 보호되지 않은, 그리고 접근하는 데 비용도 전혀 들지 않는 정보를 이용하게 된다
그러면에서 이런 정보를 공개 출처 정보(open source information)라고 부르기도 함
공개 출처 정보 수집(open source information, OSINT) 평가
대체로 OSINT 평가는 수동적인 활동이다
OSINT의 목표는 소유자가 자신에게 권한을 부여하지 않은 컴퓨터 시스템에 접근하는 공격을 수행하는 데 도움이 될 정보를 획득하는 것
정리하자면 우리가 찾아봐야 할 핵심정보는 다음과 같다
어디에서 찾는가?
어느 시점부터는 정보 수집 작업을 자동화할 필요가 있다
그런 과정을 좀 더 수월하게 만드는 다양한 도구들이 존재한다
이메일 주소를 로그인용 사용자 이름으로 사용하는 경우도 있다
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 파일과 shadow 파일에 관한 간단한 소개
리눅스와 유닉스에서 passwd 파일은 그 시스템의 모든 사용자가 읽을 수 있다
또 다른 예로 filetype이 존재한다
filetype:doc inurl:gov intext:"default password"
구글 해킹 데이터베이스
간단한 구글 도킹 사례들이 존재한다
구글 해킹 데이터베이스(Google Hacking Database)
공개된 민감한 정보를 구글 검색으로만 찾아낼 수 있다는 것이 구글 도킹의 핵심이다
도킹 검색어의 또 다른 예
이것은 인기 있는 CMS(콘텐츠 관리 시스템)인 Drupal이 설치된 사이트를 찾기 위한 것이다