
서버, 클라이언트, 이름 및 그 이상을 식별하는 파이썬 스니퍼인 패시브 서비스 로케이터
수동 서비스 로케이터, 서버, 클라이언트, 이름 등을 식별하는 파이썬 스니퍼
수동 서비스 스니퍼인 passer를 시작하기 위한 간단한 메모입니다. 스니핑에 대한 권한을 얻는 것은 귀하의 책임입니다.
Passer는 실시간 패킷 캡처 또는 pcap 파일에서 작동할 수 있습니다(명령줄 매개변수, 아래 예제 참조). 이는 라이브 서비스와 클라이언트, LAN 상의 이더넷 카드, DNS 항목, 운영 체제, 라우터를 모두 수동적으로 보고합니다!
Windows를 사용 중이거나 지원 파일에 대한 경로가 여러 이유로 제 경로와 일치하지 않는 경우, 해당 위치를 알려주시면 스크립트를 업데이트하겠습니다.
# Install system dependencies
sudo apt-get install arp-scan ettercap-text-only nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
# Install system dependencies
sudo yum install arp-scan ettercap nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
scapy를 설치하려면 설치 가이드를 참조하세요.
Passer는 Docker 이미지로도 패키징되어 제공됩니다. 아직 Docker가 설치되어 있지 않다면, Linux에 Docker를 설치하는 빠르고 간단한 방법은 다음과 같습니다:
curl -fsSL https://get.docker.com | sh -
그렇지 않으면, 사용 중인 운영 체제에 맞는 설치 지침을 따르십시오.
대부분의 용도에서는 이 저장소에 포함된 passer 스크립트를 권장합니다. 이 스크립트는 모든 Docker 관련
wget https://raw.githubusercontent.com/activecm/passer/master/passer
chmod +x passer
그런 다음 아래 예시 중 어느 것에서든 사용하듯이 이 스크립트를 사용할 수 있습니다. 예를 들어:
./passer -i eth0
# The equivalent without using the included script would be:
docker run --rm --name=passer -i --init --net=host --cap-add=net_raw activecm/passer -i eth0
패서 실행을 중지하려면:
docker stop passer
/path/to/passer.py
모든 네트워크 인터페이스에서 스니핑하여 모든 출력 줄을 콘솔로 전송합니다.
sudo /path/to/passer.py
또는
su - -c '/path/to/passer.py'
/path/to/passer.py -i IfaceName
route를 실행하면 사용할 수 있는 활성 인터페이스가 표시됩니다.
❕
-i는-r과 호환되지 않습니다.
/path/to/passer.py -r /path/to/packets.pcap
❕
-r는-i와 호환되지 않습니다.
cat packetdata.pcap | ./passer.py -r /proc/self/fd/0
zcat packetdata.pcap.gz | ./passer.py -r /proc/self/fd/0
bzcat packetdata.pcap.bz2 | ./passer.py -r /proc/self/fd/0
tcpdump -i eth0 -qtnp -w - | ./passer.py -r /proc/self/fd/0
# etc...
이를 통해 패킷을 pcap 파일로 저장할 수 있는 모든 도구로 패킷을 캡처하고, 나중에 다른 시스템에서 passer로 처리할 수 있습니다.
/path/to/passer.py -l /path/to/networkinfo.txt
/path/to/passer.py 2>/dev/null
/path/to/passer.py -h
/path/to/passer.py -u /path/to/oddpackets.pcap
이것은 일반적으로 개발 과정을 위한 것입니다. 이 파일에 저장되는 패킷은 서명이 작성되어야 하는 패킷입니다. 이상한 패킷의 기여, 서비스 설명, 그리고 프로그램에 대한 패치를 감사히 받아들입니다.
이것은 명령줄 끝에 BPF 필터를 작은따옴표로 감싸서 배치하는 것만큼 간단해야 합니다. 버전 1.16 기준으로, 기반 라이브러리는 제공된 필터를 성공적으로 사용하지 못하는 것으로 보이지만, 우회 방법이 있습니다. tcpdump를 사용하여 필터링을 수행하고, 위에서처럼 축소된 패킷 집합을 stdin을 통해 passer에 전달하십시오:
tcpdump -r packets.pcap -w - 'icmp or arp' | ./passer.py -r /proc/self/fd/0
패킷을 미리 캡처하거나 실시간 스니핑할 때 사용할 필터 제안은 아래의 "샘플 필터" 섹션을 참조하십시오.
socket.error: (1, 'Operation not permitted')
비root 사용자로 라이브 스니핑을 시도하고 계신 것 같습니다. root로 로그인하거나, sudo/su를 사용하거나, pcap 파일로 작업하세요.
passer가 충돌하거나 시스템에서 작동하지 않는 경우, 오류 메시지(있는 경우)와 운영 체제에 대한 세부 정보를 포함한 이슈를 생성해 주세요.
Passer의 출력은 stdout으로 전달되며, 명령줄 매개변수
-l /path/to/logfile을 지정하면 해당 파일에도 기록됩니다. 형식은 다음과 같습니다:
| Type | IPAddr | Proto | State | Optional description (may be empty) |
|---|---|---|---|---|
| 'IP' | IPaddr | 'IP' | dead or live | p0f OS description |
| 'MA' | IPaddr | 'Ethernet' | MacAddr | ManufDescription |
| 'TC' | IPaddr | 'TCP_'Port | closed or open | client description |
| 'TS' | IPaddr | 'TCP_'Port | closed or listening | server description |
| 'UC' | IPaddr | 'UDP_'Port | open or closed | udp client port description |
| 'US' | IPaddr | 'UDP_'Port | open or closed | udp server port description |
| 'DN' | IPaddr | 'A' or 'PTR' | hostname | possible extra info |
| 'RO' | IPaddr | 'TTLEx' | router | possible extra info |
각 줄은 스프레드시트나 SQL 가져오기에 쉽게 로드할 수 있도록 쉼표로 구분됩니다. 어떤 필드에도 쉼표가 포함되어서는 안 됩니다. 샘플 출력 파일은 http://www.stearns.org/passer/passer-sample-log.txt 에 있습니다.
다음은 이러한 줄에서 원하는 데이터를 얻는 방법에 대한 몇 가지 예입니다:
cat /var/tmp/passer-log | sort -u | less
cat /var/tmp/passer-log | sort -t, -k2 -u | less
cat /var/tmp/passer-log | sort -u | egrep '(^DN|^RO)' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.0\.17,' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.' | less
cat /var/tmp/passer-log | sort -u | grep ',TCP_25,listening,' | less
cat /var/tmp/passer-log | sort -u | grep -v ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep -i 'google\.com\.,' | less
/path/to/make-hosts /var/tmp/passer-log | /path/to/mergehosts.pl >/var/tmp/passer-hosts
"make-hosts"와 merge-hosts는 http://www.stearns.org/passer/make-hosts 에 있는 별도의 셸 및 perl 스크립트입니다.
이것은 시작에 불과합니다! 관심 있는 항목을 추출하는 여러분이 즐겨 쓰는 방법을 보내주시면 추가하고 여러분의 공을 인정해 드리겠습니다.
개별 레코드 유형은 원시 데이터를 제공하기 위해 특정 유형의 패킷이 필요합니다. 이를 포함하거나 제외하려면 함께 제공되는 필터를 사용하십시오.
'IP', IPaddr, 'IP', dead or live, p0f OS description
이것은 TCP SYN 패킷이 필요합니다:
'tcp[13] & 0x12 = 0x02'
'MA', IPaddr, 'Ethernet', MacAddr, ManufDescription
이들은 arp 응답에서 비롯됩니다(*1):
'arp'
'TC', IPaddr, 'TCP_'Port, closed or open, client description
이들은 TCP SYN/ACK, FIN, RST(*2)가 필요합니다:
'tcp[13] & 0x07 != 0'
'TS', IPaddr, 'TCP_'Port, closed 또는 listening, server description
포트가 열려 있는지 닫혀 있는지 확인하려면 TCP SYN, SYN/ACK, RST가 필요합니다:
'tcp[13] & 0x06 != 0'
서버 설명 문자열을 만들기 위해서는 네트워크상 트래픽의 대부분을 차지하는 ACK 패킷도 확인해야 합니다:
'tcp[13] & 0x17 = 0x10'
TCP 트래픽 전체를 원한다면 그냥 다음을 실행하세요:
'tcp'
'UC', IPaddr, 'UDP_'Port, open or closed, udp client port description
모든 UDP 포트와 ICMP 포트 도달 불가 메시지를 그냥 넘겨주는 것이 가장 간단합니다:
'udp or icmp[0:2] = 0x0303'
'US', IPaddr, 'UDP_'Port, open or closed, udp server port description
위와 동일:
'udp or icmp[0:2] = 0x0303'
'DN', IPaddr, A,AAAA,PTR,CNAME hostname, possible extra info
UDP 또는 TCP 포트 53 (*3):
'udp src port 53 or tcp src port 53'
'RO', IPaddr, 'TTLEx', router, possible extra info
라우터는 TTL 초과(Time-To-Live-Exceeded) 또는 도달 불가 메시지를 전송하기 때문에 식별합니다:
'icmp[0:2] = 0x0B00 or icmp[0] = 0x03'
*1 이것은 arp 요청도 잡지만, 이는 무시된다.
*2 필터는 기술적으로 SYN도 포함하지만, 이는 소량의 추가 데이터에 불과하다
*3 버전 1.16 기준으로, UDP 포트 53 응답만 추출된다.