
TCP 포트 스캐너, 비동기식으로 SYN 패킷을 발사하여 5분 이내에 전체 인터넷을 스캔합니다.
이것은 인터넷 규모의 포트 스캐너입니다. 단일 머신에서 초당 1000만 개의 패킷을 전송하며 5분 이내에 전체 인터넷을 스캔할 수 있습니다.
사용법(매개변수, 출력)은 가장 유명한 포트 스캐너인 nmap과 유사합니다. 확신이 서지 않으면 해당 기능 중 하나를 시도해 보세요. 많은 머신을 광범위하게 스캔하는 기능은 지원되지만, 단일 머신에 대한 심층 스캔 기능은 지원되지 않습니다.
내부적으로는 scanrand, unicornscan, ZMap과 같은 포트 스캐너와 유사하게 비동기 전송을 사용합니다. 더 유연하여 임의의 포트 및 주소 범위를 허용합니다.
참고: masscan은 자체 ad hoc TCP/IP 스택을 사용합니다. 단순한 포트 스캔 이외의 작업은 로컬 TCP/IP 스택과 충돌을 일으킬 수 있습니다. 즉, 다른 IP 주소에서 실행하려면 --src-ip 옵션을 사용하거나, masscan이 사용할 소스 포트를 구성하려면 --src-port를 사용한 다음, 내부 방화벽(pf 또는 iptables 등)을 구성하여 해당 포트를 운영 체제의 나머지 부분으로부터 차단해야 합니다.
이 도구는 무료이지만, 개발에 기여하는 것을 고려해 주세요: 비트코인 지갑 주소: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
Debian/Ubuntu에서는 대략 다음과 같습니다. C 컴파일러(gcc 또는 clang 등) 외에는 실제로 종속성이 없습니다.
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
이렇게 하면 프로그램이 masscan/bin 하위 디렉터리에 배치됩니다.
(Linux에) 설치하려면 다음을 실행하세요:
make install
소스는 많은 작은 파일로 구성되어 있으므로 멀티스레드 빌드를 사용하면 빌드 속도가 훨씬 빨라집니다. 라즈베리 파이에서는 2GB 이상이 필요하며(실패할 수 있음) 모든 가능한 스레드 대신 -j4와 같이 더 작은 숫자를 사용하는 것이 좋습니다.
make -j
Linux가 기본 대상 플랫폼이지만, 이 코드는 다른 많은 시스템(Windows, macOS 등)에서도 잘 실행됩니다. 추가 빌드 정보는 다음과 같습니다.
make 입력make 입력gmake 입력cc src/*.c -o bin/masscanmacOS에서는 x86 바이너리가 ARM 에뮬레이션에서도 동일하게 빠르게 작동하는 것으로 보입니다.
사용법은 nmap과 유사합니다. 일부 포트에 대해 네트워크 세그먼트를 스캔하려면:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
이 명령은 다음을 수행합니다:
10.x.x.x 서브넷과 2603:3001:2d00:da00::x 서브넷을 스캔합니다.<stdout>으로 인쇄하여 파일로 리디렉션할 수 있습니다.전체 옵션 목록을 보려면 --echo 기능을 사용하세요. 그러면 현재 구성이 덤프되고 종료됩니다. 이 출력을 프로그램에 다시 입력으로 사용할 수 있습니다:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
Masscan은 포트가 열려 있는지 여부만 감지하는 것 이상을 수행할 수 있습니다. 또한 TCP 연결을 완료하고 해당 포트의 애플리케이션과 상호 작용하여 간단한 "배너" 정보를 수집할 수도 있습니다.
Masscan은 다음 프로토콜에 대한 배너 확인을 지원합니다:
이 문제는 masscan이 자체 TCP/IP 스택을 포함하고 있어 이를 실행 중인 시스템과 분리한다는 점에 있습니다. 로컬 시스템이 프로브된 대상으로부터 SYN-ACK를 수신하면 masscan이 배너를 가져오기 전에 연결을 종료하는 RST 패킷으로 응답합니다.
이를 방지하는 가장 쉬운 방법은 masscan에 별도의 IP 주소를 할당하는 것입니다. 이는 다음 예제 중 하나와 같이 보일 것입니다:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
선택한 주소는 로컬 서브넷에 있어야 하며 다른 시스템에서 사용하지 않아야 합니다. Masscan은 실수했음을 경고하지만, 몇 분 동안 다른 머신의 통신을 망칠 수 있으므로 주의하세요.
WiFi와 같은 경우에는 이것이 불가능할 수 있습니다. 그러한 경우 masscan이 사용하는 포트를 방화벽으로 차단할 수 있습니다. 이렇게 하면 로컬 TCP/IP 스택이 패킷을 보지 못하지만, masscan은 로컬 스택을 우회하기 때문에 여전히 패킷을 볼 수 있습니다. Linux의 경우 다음과 같습니다:
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
Linux가 소스 포트로 선택할 수 있는 포트와 충돌하지 않는 포트를 선택하는 것이 좋습니다. Linux가 사용하는 범위를 확인하고 해당 범위를 재구성하려면 다음 파일을 확인하세요:
/proc/sys/net/ipv4/ip_local_port_range
최신 Kali Linux(2018년 8월)에서 해당 범위는 32768에서 60999이므로 32768 미만 또는 61000 이상의 포트를 선택해야 합니다.
iptables 규칙 설정은 다음 재부팅까지만 지속됩니다. 배포판에 따라 iptables-save 및/또는 iptables-persistent를 사용하여 구성을 저장하는 방법을 찾아야 합니다.
Mac OS X 및 BSD에서도 비슷한 단계가 있습니다. 피해야 할 범위를 찾으려면 다음과 같은 명령을 사용하세요:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
FreeBSD 및 이전 MacOS에서는 ipfw 명령을 사용하세요:
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
최신 MacOS 및 OpenBSD에서는 pf 패킷 필터 유틸리티를 사용하세요.
/etc/pf.conf 파일을 편집하여 다음과 같은 줄을 추가하세요:
block in proto tcp from any to any port 40000:40015
그런 다음 방화벽을 활성화하려면 다음 명령을 실행하세요:
# pfctl -E
방화벽이 이미 실행 중인 경우 재부팅하거나 다음 명령으로 규칙을 다시 로드하세요:
# pfctl -f /etc/pf.conf
Windows는 RST 패킷으로 응답하지 않으므로 이러한 기술이 필요하지 않습니다. 그러나 masscan은 여전히 자체 IP 주소를 사용할 때 가장 잘 작동하도록 설계되었으므로, 엄격히 필요하지 않은 경우에도 가능하면 그렇게 실행해야 합니다.
--heartbleed 검사와 같은 다른 검사에도 동일한 작업이 필요합니다. 이는 배너 확인의 한 형태일 뿐입니다.
더 작은 내부 네트워크에 유용하지만, 이 프로그램은 실제로 전체 인터넷을 염두에 두고 설계되었습니다. 대략 다음과 같을 수 있습니다:
# masscan 0.0.0.0/0 -p0-65535
전체 인터넷을 스캔하는 것은 좋지 않습니다. 첫째, 인터넷의 일부는 스캔되는 것에 나쁘게 반응합니다. 둘째, 일부 사이트는 스캔을 추적하여 차단 목록에 추가하므로 인터넷의 유용한 부분에서 방화벽으로 차단될 수 있습니다. 따라서 많은 범위를 제외해야 합니다. 범위를 블랙리스트에 추가하거나 제외하려면 다음 구문을 사용하세요:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
이렇게 하면 결과가 명령줄에 출력됩니다. 대신 파일에 저장하려 할 것입니다. 따라서 다음과 같은 것을 원할 것입니다:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
그러면 결과가 XML 파일로 저장되어 데이터베이스 등에 쉽게 덤프할 수 있습니다.
하지만 이것은 기본 속도인 초당 100패킷으로만 진행되므로 인터넷을 스캔하는 데 영원히 걸릴 것입니다. 다음과 같이 속도를 높여야 합니다:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
이렇게 하면 속도가 초당 100,000패킷으로 증가하여 포트당 약 10시간(모든 포트를 스캔하면 655,360시간) 만에 전체 인터넷(제외 항목 제외)을 스캔할 수 있습니다.
이 명령줄에서 주목할 점은 이 모든 옵션이 nmap 호환 옵션이라는 것입니다. 또한 nmap과 호환되는 "보이지 않는" 옵션도 자동으로 설정됩니다: -sS -Pn -n --randomize-hosts --send-eth. 마찬가지로 XML 파일의 형식은 nmap에서 영감을 받았습니다. 물론 프로그램의 비동기 특성으로 인해 문제에 대한 근본적으로 다른 접근 방식이 필요하므로 많은 차이점이 있습니다.
위의 명령줄은 약간 번거롭습니다. 모든 것을 명령줄에 넣는 대신 파일에 저장할 수 있습니다. 위 설정은 다음과 같습니다:
# My Scan
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
이 구성 파일을 사용하려면 -c를 사용하세요:
# masscan -c myscan.conf
이렇게 하면 스캔을 반복할 때도 더 쉬워집니다.
기본적으로 masscan은 먼저 구성 파일 /etc/masscan/masscan.conf를 로드합니다. 이후의 구성 매개변수는 이 기본 구성 파일의 설정을 재정의합니다. 저는 "excludefile" 매개변수를 거기에 넣어서 잊어버리지 않도록 합니다. 자동으로 작동합니다.
기본적으로 masscan은 상당히 큰 텍스트 파일을 생성하지만, 다른 형식으로 쉽게 변환할 수 있습니다. 5가지 지원되는 출력 형식이 있습니다:
xml: -oX <filename> 매개변수를 사용하세요.
또는 --output-format xml 및 --output-filename <filename> 매개변수를 사용하세요.
binary: 이것은 masscan 내장 형식입니다. 훨씬 작은 파일을 생성하므로 인터넷을 스캔할 때 디스크가 가득 차지 않습니다. 그러나 파싱이 필요합니다. 명령줄 옵션 --readscan은 바이너리 스캔 파일을 읽습니다. --readscan을 -oX 옵션과 함께 사용하면 결과 파일의 XML 버전이 생성됩니다.
grepable: 이것은 명령줄 도구로 쉽게 파싱할 수 있는 Nmap -oG 출력의 구현입니다. -oG <filename> 매개변수를 사용하세요. 또는 --output-format grepable 및 --output-filename <filename> 매개변수를 사용하세요.
json: 결과를 JSON 형식으로 저장합니다. -oJ <filename> 매개변수를 사용하세요. 또는 --output-format json 및 --output-filename <filename> 매개변수를 사용하세요.
list: 이것은 호스트와 포트 쌍이 한 줄에 하나씩 있는 간단한 목록입니다. -oL <filename> 매개변수를 사용하세요. 또는 --output-format list 및 --output-filename <filename> 매개변수를 사용하세요. 형식은 다음과 같습니다:
<port state> <protocol> <port number> <IP address> <POSIX timestamp>
open tcp 80 XXX.XXX.XXX.XXX 1390380064
합리적인 경우, nmap 사용자에게 친숙하게 만들기 위해 모든 노력을 기울였지만 근본적으로 다릅니다. Masscan은 많은 머신의 광범위한 스캔에 맞춰 조정된 반면, nmap은 단일 머신 또는 작은 범위의 집중 스캔을 위해 설계되었습니다.
두 가지 중요한 차이점은 다음과 같습니다:
-p <ports>를 지정해야 합니다.nmap이 사용할 수 있는 특이한 서브넷 범위(예: 10.0.0-255.0-255)가 아닙니다.masscan은 다음 설정이 영구적으로 활성화되어 있다고 생각할 수 있습니다:
-sS: SYN 스캔만 수행합니다(현재로서는, 향후 변경될 예정).-Pn: 비동기 작업의 기본이므로 호스트에 먼저 핑을 보내지 않습니다.-n: DNS 확인이 발생하지 않습니다.--randomize-hosts: 스캔이 완전히 무작위화되며, 항상 그렇습니다. 변경할 수 없습니다.--send-eth: 원시 libpcap을 사용하여 전송합니다.추가 nmap 호환 설정 목록을 원하면 다음 명령을 사용하세요:
# masscan --nmap
이 프로그램은 패킷을 매우 빠르게 뿜어냅니다. Windows 또는 VM에서 초당 300,000패킷을 수행할 수 있습니다. Linux(가상화 없음)에서는 초당 160만 패킷을 수행합니다. 이는 대부분의 네트워크를 녹일 만큼 빠릅니다.
참고로 자신의 네트워크만 녹일 수 있습니다. 대상 IP 주소를 무작위화하므로 원격 네트워크를 압도하지 않아야 합니다.
기본적으로 속도는 초당 100패킷으로 설정됩니다. 속도를 100만으로 높이려면 --rate 1000000과 같은 것을 사용하세요.
IPv4 인터넷을 스캔할 때는 많은 서브넷을 스캔하게 되므로 나가는 패킷 속도가 높더라도 각 대상 서브넷은 적은 양의 수신 패킷을 받게 됩니다.