
Snoopy: A distributed tracking and data interception framework
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
"에이미, 기술은 본질적으로 선하거나 악하지 않아. 그것은 어떻게 사용되느냐의 문제지. 마치 죽음의 광선처럼."
- 프로페서 판스워스
Snoopy에 오신 것을 환영합니다; 분산 추적 및 프로파일링 프레임워크입니다. Snoopy는 아직 개발 중이므로, 언제든지 제안이나 수정 사항을 제출해 주세요. 이 문서는 기본적인 사용법을 설명합니다. 더 자세한 배경을 이해하려면 다음을 참조하세요:
클라이언트 측 소프트웨어는 "드론"이라고 부르는 장치에서 실행됩니다. 드론은 WiFi 인터페이스(인젝션 드라이버 지원)와 외부 인터넷 연결이 있는 모든 Linux 기반 장치가 될 수 있습니다. Snoopy는 Nokia N900과 BackTrack을 실행하는 노트북에서 테스트되었습니다. 드론은 다음 두 가지 작업을 수행합니다:
수집된 프로브 요청(예: Bob의 iPhone이 BTHomeHub-4123을 찾는 경우)은 정기적으로 Snoopy 서버에 업로드됩니다. 가짜 AP에 연결된 모든 장치는 Snoopy 서버를 통해 인터넷에 연결됩니다.
서버는 모든 프로브 요청을 데이터베이스에 저장하고, Wigle을 사용하여 GPS 좌표를 결정하며, Google Maps를 사용하여 도로명 주소(및 스트리트 뷰 사진)를 확인합니다. 즉, 집 네트워크를 프로빙하는 경우 집 사진을 얻을 수 있습니다.
각 드론은 OpenVPN을 통해 서버에 연결되며, 자체 서브넷을 가집니다. 연결된 클라이언트는 드론에서 IP 주소를 받고, 해당 드론을 통해 트래픽을 라우팅합니다. 따라서 서버에서 클라이언트 IP 주소(따라서 MAC 주소)를 인터넷 활동과 매칭할 수 있습니다.
서버에서는 다음과 같은 작업이 수행됩니다:
네트워크 다이어그램은 다음과 같습니다:
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Walter가 Snoopy용 웹 인터페이스를 작성했습니다. http://your-snoopy-server.com:5000/ 에서 접근할 수 있습니다.
수집된 데이터를 그래픽으로 탐색할 수 있는 여러 Maltego 변환이 있습니다(자세한 내용은 아래 참조).
설치 ================ 서버 설치는 간단합니다. Ubuntu 12.04 LTS 32비트의 기본 설치에서만 테스트되었습니다. 여러 서버 구성 요소가 변경되므로, 가능하면 기본 설치 상태에서 설치 스크립트를 실행하고 해당 상자에 다른 것은 거의 실행하지 않는 것이 좋습니다. 의심스러우면 install.sh 파일을 확인하고 수동으로 변경하십시오. 그렇지 않으면 설치 프로그램(./install.sh)을 실행하기만 하면 됩니다.
사용법 ======== 설치가 완료되면 'snoopy'를 입력하여 서버 메뉴를 로드할 수 있을 것입니다. 그렇지 않은 경우(또는 의심스러운 경우) 설치 단계에서 생성된 사용자의 홈 디렉토리로 이동하십시오. 'snoopy/server/' 디렉토리 내에 'snoopy.sh' 파일이 있으며, 이를 실행할 수 있습니다. 아래는 메뉴입니다:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
드론 팩 생성 메뉴의 [3] 옵션을 사용하면 드론 장치용 클라이언트 측 '팩'을 만들 수 있습니다. 각 드론은 고유한 OpenVPN 및 SSH 키, DHCP 범위, 라우팅 테이블을 받습니다. 각 드론 장치에 대한 다운로드 URL이 제공됩니다. 서버와 드론의 시간이 올바르게 설정되어 있는지 확인하십시오. 그렇지 않으면 VPN 연결이 설정되지 않습니다.
드론에 Snoopy 설치 및 실행 최대 100개의 드론을 사용할 수 있습니다(더 필요하면 소스 코드를 확인하거나 이메일을 보내주세요. 실제 제한은 없습니다). 설치는 이전 단계에서 구성 팩을 다운로드하고 관련 설정 스크립트를 실행하는 것으로 구성됩니다. Nokia N900의 경우 바탕 화면에 아이콘이 배치됩니다. 예:
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
각 Snoopy 엔티티에는 다른 변환을 적용할 수 있습니다. 시작하려면 'Snoopy' 엔티티를 그래프로 드래그하세요. 엔티티 속성에서 시작 또는 종료 날짜를 지정하지 않으면 기본적으로 지난 5분 동안의 결과를 가져옵니다(이 값은 서버 구성 메뉴에서 변경 가능).
Snoopy 머신을 사용하면 변환을 자동으로 시퀀싱하고 요구 사항에 따라 노드를 필터링/삭제할 수 있습니다. 소스/주석이 작동 방식을 충분히 설명할 것입니다.
법적 고려 사항 ======================= Snoopy 구성 요소 중 일부 또는 전부는 거주 지역에서 불법일 수 있습니다. 소프트웨어를 사용하기 전에 확인하십시오. 영국에서는 프로브 수집 구성 요소가 트래픽의 브로드캐스트 특성으로 인해 합법적입니다. 그러나 가짜 액세스 포인트 구성 요소는 대부분의 지역에서 불법일 가능성이 높습니다. SensePost는 이 도구를 사용하여 문제가 발생하는 것에 대해 책임을 지지 않습니다.
보안 고려 사항 ========================== 각 '드론 팩'에는 OpenVPN 및 SSH 키가 포함되어 있습니다. 드론이 도난 등으로 손상되면 서버에 보안 위험이 될 수 있습니다. Snoopy 서버를 전용 목적으로 실행하는 것이 매우 권장됩니다. 서버에서 생성된 사용자의 .ssh/authorized_hosts 파일에는 추가 보안을 위해 다음이 자동으로 추가됩니다:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
향후 작업 =============== 아직 수행/추가해야 할 많은 작업이 있습니다. 이 버전은 PoC에 가깝습니다.
도움/조언/의견을 주신 분들께 감사드립니다:
Q. 외국 스파이가 11월 11일에 히드로 공항에 도착한다는 것을 알고 있지만, 언제 어떤 항공편으로 오는지는 모릅니다. 정보에 따르면 그는 도착 후 힐튼 호텔에 머물고 14일에 루턴 공항에서 항공편(다시 말하지만 시간이나 목적지는 모름)을 탈 것입니다. 그는 변장의 달인입니다. 어떻게 그를 식별할 수 있을까요?
A. 히드로, 힐튼, 루턴에 Snoopy 드론을 배치합니다. 'CommonLocation' Maltego 변환은 세 위치에 모두 있는 장치의 교집합을 확인합니다. 희망적으로는 단 하나의 결과만 나올 것입니다 - 바로 우리의 대상입니다. 대상이 발견되면 Google 지도와 스트리트 뷰 사진을 통해 스파이가 여행한 위치를 조사할 수 있습니다. 그의 장치(들)이 Snoopy 가짜 액세스 포인트에 연결되도록 속임으로써(예: Facebook, Twitter 또는 이메일) 그의 신원이 드러날 수 있습니다.
Snoopy에게 특정 모래가 많은^W 바람직하지 않은 국가의 WiFi 지점에 연결한 모든 개인을 기록하도록 요청합니다.
10개의 백화점에 Snoopy를 배치합니다. 사람들의 이동, 재방문 고객, 고객 유형을 기록합니다.
연결된 클라이언트 장치를 장악하고 악성 코드를 설치하기 위해 악의적인 코드를 주입합니다. 라우팅 테이블로 인해 서버에서 연결된 피해자에게 직접 익스플로잇을 발사할 수 있습니다.
TFL은 각 런던 지하철역에 Snoopy 드론을 배치할 수 있습니다. 사람들의 이동을 모니터링하여 피크/오프피크 시간/요일을 파악하고 그에 따라 직원을 배정/감축할 수 있습니다.
런던 전역에 500개의 Snoopy 드론을 배치합니다. 사람들이 드론을 지나칠 때의 움직임을 모니터링합니다. 몇 주/몇 달에 걸쳐 적용하면 흥미로운 인간 이동 패턴이 나타날 것입니다.
Linux 기반 데스크탑/노트북의 경우 Alfa AWUS036H 카드가 평균적인 성능을 보입니다. 더 안정적인 카드는 Ubiquity SR-71입니다. 인젝션 드라이버 지원과 관련하여 어떤 것이 작동/작동하지 않는지에 대한 피드백을 보내주시면 감사하겠습니다.
N900의 경우 인젝션 드라이버를 로드하면 배터리 수명이 크게 줄어듭니다. TecNet 6600mAh 배터리 팩은 테스트에서 약 6~8시간을 제공했습니다. 그러나 N900을 배터리 팩에 연결하려면 어댑터가 필요합니다. GPS 폴링 빈도를 줄이거나 비활성화하면 배터리 수명이 더 좋아집니다.
USB를 통해 N900을 노트북에 연결(SSH 목적)하는 방법에 대한 팁은 여기에서 찾을 수 있습니다.
현재 RaspberryPi, Alfa R36 미니 AP, SheevaPlug에서 테스트 중입니다. 결과는 추후 공개하겠습니다.
수집된 데이터를 탐색하기 위해 자신만의 Maltego 변환을 만들 수 있습니다. 제공된 변환은 주로 할 수 있는 일을 보여주기 위한 것입니다. 소스 코드를 확인하고 다음을 읽어보세요:
질문이 있으면 [email protected]으로 문의하세요(또는 훌륭한 Maltego 팀에게 물어보세요).
웹 UI 코드는 다음 위치에서 접근 가능합니다: ~user/snoopy/server/bin/snoopy/src/snoopy/
플러그인은 두 부분으로 구성됩니다:
플러그인은 Snoopy 애플리케이션에 의해 동적으로 로드되는 호출 가능한 객체입니다. 예제부터 시작하겠습니다:
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
이제 상세하게 설명하겠습니다...
from snoopy import db, pluginregistry
Snoopy 데이터베이스에 접근하려면 db가 필요하고, 플러그인을 등록하려면 pluginregistry가 필요합니다.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
이것이 플러그인(호출 가능한 모든 것)을 등록하는 방법입니다. 첫 번째 인수는 이 플러그인이 속한 그룹의 이름을 지정합니다. client-data를 지정했는데, 이 플러그인이 MAC 주소를 받아 클라이언트 데이터 창에 표시할 데이터를 반환하기 때문입니다. client-data 외에도 근접 세션에서 작동하는 session-data 그룹의 플러그인이 있습니다. 두 번째 매개변수는 플러그인 이름입니다. 이 이름은 내부 전용이며 JSON에 적합해야 합니다. 세 번째 매개변수는 플러그인 제목입니다. 기본적으로 이름과 동일하지만 제목은 GUI에 표시됩니다. 더 구체적으로 말하면 클라이언트 데이터 창의 데이터 섹션 제목입니다.
제목 다음의 모든 키워드 인수는 옵션으로 저장됩니다. 플러그인 시스템에는 옵션이 필요하지 않지만, Snoopy는 js 옵션을 지원합니다. 이 옵션은 이 플러그인의 JavaScript 구성 요소의 URL(Snoopy/서버 측이 아닌 브라우저 측에서의 URL)을 지정합니다.
def ssid_list(mac):
이 플러그인은 간단한 함수입니다. client-data 플러그인의 정의에 따라 MAC 주소 문자열을 받습니다. 호출 가능한 객체의 이름은 사용되지 않습니다.본 예제 플러그인의 본문은 단순히 SQLAlchemy 쿼리를 수행하여 기본적으로 SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac을 실행하고 결과를 리스트로 반환합니다. 플러그인의 반환 값은 일반적으로 JSON 응답의 일부로 추가됩니다. 따라서 결과는 Flask의 jsonify() 함수가 지원하는 대로 JSON 친화적이어야 한다는 제한이 있습니다.
그렇게 간단합니다!
클라이언트 데이터를 위한 프론트엔드 플러그인은 클라이언트 데이터 핸들러라고 합니다. 이들은 Snoopy.registerPlugin(sectionName, dataHandler) 함수를 통해 등록됩니다. sectionName은 데이터 핸들러가 처리하려는 데이터 섹션의 이름입니다. 이 이름은 데이터를 생성한 백엔드 플러그인 이름과 동일합니다. dataHandler는 다음 시그니처를 가진 함수여야 합니다: function($section, clientData) {...}. $section은 데이터 핸들러가 데이터를 표시하거나 변경 사항을 적용할 수 있는 div 요소의 jQuery 객체입니다. 클라이언트 데이터(백엔드 플러그인이 생성한)는 clientData 매개변수에 제공됩니다.
데이터 핸들러의 유일한 허용 출력은 주어진 div($section)에 대한 변경 사항이므로 반환 값은 필요하지 않습니다.
SSID 위치 조회 www.wigle.net에 계정을 생성하고 '서버 옵션 구성'을 통해 자격 증명을 설정하십시오.
웹 인터페이스 http://your-snoopy-server:5000/ 에서 웹 인터페이스에 접근할 수 있습니다. 데이터를 탐색하고 표시하기 위해 자체 플러그인을 작성할 수 있습니다. Walter가 쉽게 만들었습니다(이 문서의 부록 참조).
Maltego로 데이터 탐색 Snoopy 서버 메뉴에서 '서버 옵션 구성' > 'Maltego'로 이동하십시오. 여기에서 Snoopy 엔티티, 머신 및 변환 URL을 다운로드할 수 있는 URL을 볼 수 있습니다. Maltego 변환을 사용하려면 다음이 필요합니다.