Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
masscan — TCP 포트 스캐너, 비동기식으로 SYN 패킷을 발사하여 5분 이내에 전체 인터넷을 스캔합니다. | Kitploit
도구/GitHubGitHub/robertdavidgraham/masscan
ReconnaissanceNetwork MappingPort ScanningInformation GatheringPenetration Testing
GitHubrobertdavidgraham/masscan

masscan

TCP 포트 스캐너, 비동기식으로 SYN 패킷을 발사하여 5분 이내에 전체 인터넷을 스캔합니다.

저장소 보기
25.9k3.2k3개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

unittests

MASSCAN: Mass IP 포트 스캐너

이것은 인터넷 규모의 포트 스캐너입니다. 단일 머신에서 초당 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 등) 외에는 실제로 종속성이 없습니다.

root@kitploit:~
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

이렇게 하면 프로그램이 masscan/bin 하위 디렉터리에 배치됩니다. (Linux에) 설치하려면 다음을 실행하세요:

root@kitploit:~
make install

소스는 많은 작은 파일로 구성되어 있으므로 멀티스레드 빌드를 사용하면 빌드 속도가 훨씬 빨라집니다. 라즈베리 파이에서는 2GB 이상이 필요하며(실패할 수 있음) 모든 가능한 스레드 대신 -j4와 같이 더 작은 숫자를 사용하는 것이 좋습니다.

root@kitploit:~
make -j

Linux가 기본 대상 플랫폼이지만, 이 코드는 다른 많은 시스템(Windows, macOS 등)에서도 잘 실행됩니다. 추가 빌드 정보는 다음과 같습니다.

  • Windows w/ Visual Studio: VS10 프로젝트 사용
  • Windows w/ MinGW: 그냥 make 입력
  • Windows w/ cygwin: 작동하지 않음
  • Mac OS X /w XCode: XCode4 프로젝트 사용
  • Mac OS X /w cmdline: 그냥 make 입력
  • FreeBSD: gmake 입력
  • 기타: 모든 파일을 함께 컴파일해 보세요, cc src/*.c -o bin/masscan

macOS에서는 x86 바이너리가 ARM 에뮬레이션에서도 동일하게 빠르게 작동하는 것으로 보입니다.

사용법

사용법은 nmap과 유사합니다. 일부 포트에 대해 네트워크 세그먼트를 스캔하려면:

root@kitploit:~
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112

이 명령은 다음을 수행합니다:

  • 10.x.x.x 서브넷과 2603:3001:2d00:da00::x 서브넷을 스캔합니다.
  • 두 서브넷에서 포트 80과 8000~8100 범위(총 102개 포트)를 스캔합니다.
  • 출력을 <stdout>으로 인쇄하여 파일로 리디렉션할 수 있습니다.

전체 옵션 목록을 보려면 --echo 기능을 사용하세요. 그러면 현재 구성이 덤프되고 종료됩니다. 이 출력을 프로그램에 다시 입력으로 사용할 수 있습니다:

root@kitploit:~
# 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은 다음 프로토콜에 대한 배너 확인을 지원합니다:

  • FTP
  • HTTP
  • IMAP4
  • memcached
  • POP3
  • SMTP
  • SSH
  • SSL
  • SMBv1
  • SMBv2
  • Telnet
  • RDP
  • VNC

이 문제는 masscan이 자체 TCP/IP 스택을 포함하고 있어 이를 실행 중인 시스템과 분리한다는 점에 있습니다. 로컬 시스템이 프로브된 대상으로부터 SYN-ACK를 수신하면 masscan이 배너를 가져오기 전에 연결을 종료하는 RST 패킷으로 응답합니다.

이를 방지하는 가장 쉬운 방법은 masscan에 별도의 IP 주소를 할당하는 것입니다. 이는 다음 예제 중 하나와 같이 보일 것입니다:

root@kitploit:~
# 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의 경우 다음과 같습니다:

root@kitploit:~
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000

Linux가 소스 포트로 선택할 수 있는 포트와 충돌하지 않는 포트를 선택하는 것이 좋습니다. Linux가 사용하는 범위를 확인하고 해당 범위를 재구성하려면 다음 파일을 확인하세요:

root@kitploit:~
/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에서도 비슷한 단계가 있습니다. 피해야 할 범위를 찾으려면 다음과 같은 명령을 사용하세요:

root@kitploit:~
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last

FreeBSD 및 이전 MacOS에서는 ipfw 명령을 사용하세요:

root@kitploit:~
# 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 파일을 편집하여 다음과 같은 줄을 추가하세요:

root@kitploit:~
block in proto tcp from any to any port 40000:40015

그런 다음 방화벽을 활성화하려면 다음 명령을 실행하세요:

root@kitploit:~
# pfctl -E    

방화벽이 이미 실행 중인 경우 재부팅하거나 다음 명령으로 규칙을 다시 로드하세요:

root@kitploit:~
# pfctl -f /etc/pf.conf

Windows는 RST 패킷으로 응답하지 않으므로 이러한 기술이 필요하지 않습니다. 그러나 masscan은 여전히 자체 IP 주소를 사용할 때 가장 잘 작동하도록 설계되었으므로, 엄격히 필요하지 않은 경우에도 가능하면 그렇게 실행해야 합니다.

--heartbleed 검사와 같은 다른 검사에도 동일한 작업이 필요합니다. 이는 배너 확인의 한 형태일 뿐입니다.

전체 인터넷 스캔 방법

더 작은 내부 네트워크에 유용하지만, 이 프로그램은 실제로 전체 인터넷을 염두에 두고 설계되었습니다. 대략 다음과 같을 수 있습니다:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535

전체 인터넷을 스캔하는 것은 좋지 않습니다. 첫째, 인터넷의 일부는 스캔되는 것에 나쁘게 반응합니다. 둘째, 일부 사이트는 스캔을 추적하여 차단 목록에 추가하므로 인터넷의 유용한 부분에서 방화벽으로 차단될 수 있습니다. 따라서 많은 범위를 제외해야 합니다. 범위를 블랙리스트에 추가하거나 제외하려면 다음 구문을 사용하세요:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt

이렇게 하면 결과가 명령줄에 출력됩니다. 대신 파일에 저장하려 할 것입니다. 따라서 다음과 같은 것을 원할 것입니다:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml

그러면 결과가 XML 파일로 저장되어 데이터베이스 등에 쉽게 덤프할 수 있습니다.

하지만 이것은 기본 속도인 초당 100패킷으로만 진행되므로 인터넷을 스캔하는 데 영원히 걸릴 것입니다. 다음과 같이 속도를 높여야 합니다:

root@kitploit:~
# 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에서 영감을 받았습니다. 물론 프로그램의 비동기 특성으로 인해 문제에 대한 근본적으로 다른 접근 방식이 필요하므로 많은 차이점이 있습니다.

위의 명령줄은 약간 번거롭습니다. 모든 것을 명령줄에 넣는 대신 파일에 저장할 수 있습니다. 위 설정은 다음과 같습니다:

root@kitploit:~
# 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를 사용하세요:

root@kitploit:~
# masscan -c myscan.conf

이렇게 하면 스캔을 반복할 때도 더 쉬워집니다.

기본적으로 masscan은 먼저 구성 파일 /etc/masscan/masscan.conf를 로드합니다. 이후의 구성 매개변수는 이 기본 구성 파일의 설정을 재정의합니다. 저는 "excludefile" 매개변수를 거기에 넣어서 잊어버리지 않도록 합니다. 자동으로 작동합니다.

출력 가져오기

기본적으로 masscan은 상당히 큰 텍스트 파일을 생성하지만, 다른 형식으로 쉽게 변환할 수 있습니다. 5가지 지원되는 출력 형식이 있습니다:

  1. xml: -oX <filename> 매개변수를 사용하세요. 또는 --output-format xml 및 --output-filename <filename> 매개변수를 사용하세요.

  2. binary: 이것은 masscan 내장 형식입니다. 훨씬 작은 파일을 생성하므로 인터넷을 스캔할 때 디스크가 가득 차지 않습니다. 그러나 파싱이 필요합니다. 명령줄 옵션 --readscan은 바이너리 스캔 파일을 읽습니다. --readscan을 -oX 옵션과 함께 사용하면 결과 파일의 XML 버전이 생성됩니다.

  3. grepable: 이것은 명령줄 도구로 쉽게 파싱할 수 있는 Nmap -oG 출력의 구현입니다. -oG <filename> 매개변수를 사용하세요. 또는 --output-format grepable 및 --output-filename <filename> 매개변수를 사용하세요.

  4. json: 결과를 JSON 형식으로 저장합니다. -oJ <filename> 매개변수를 사용하세요. 또는 --output-format json 및 --output-filename <filename> 매개변수를 사용하세요.

Nmap과의 비교

합리적인 경우, nmap 사용자에게 친숙하게 만들기 위해 모든 노력을 기울였지만 근본적으로 다릅니다. Masscan은 많은 머신의 광범위한 스캔에 맞춰 조정된 반면, nmap은 단일 머신 또는 작은 범위의 집중 스캔을 위해 설계되었습니다.

두 가지 중요한 차이점은 다음과 같습니다:

  • 스캔할 기본 포트가 없으므로 -p <ports>를 지정해야 합니다.
  • 대상 호스트는 IP 주소 또는 단순 범위여야 하며, DNS 이름이나 nmap이 사용할 수 있는 특이한 서브넷 범위(예: 10.0.0-255.0-255)가 아닙니다.

masscan은 다음 설정이 영구적으로 활성화되어 있다고 생각할 수 있습니다:

  • -sS: SYN 스캔만 수행합니다(현재로서는, 향후 변경될 예정).
  • -Pn: 비동기 작업의 기본이므로 호스트에 먼저 핑을 보내지 않습니다.
  • -n: DNS 확인이 발생하지 않습니다.
  • --randomize-hosts: 스캔이 완전히 무작위화되며, 항상 그렇습니다. 변경할 수 없습니다.
  • --send-eth: 원시 libpcap을 사용하여 전송합니다.

추가 nmap 호환 설정 목록을 원하면 다음 명령을 사용하세요:

root@kitploit:~
# masscan --nmap

전송 속도 (중요!!)

이 프로그램은 패킷을 매우 빠르게 뿜어냅니다. Windows 또는 VM에서 초당 300,000패킷을 수행할 수 있습니다. Linux(가상화 없음)에서는 초당 160만 패킷을 수행합니다. 이는 대부분의 네트워크를 녹일 만큼 빠릅니다.

참고로 자신의 네트워크만 녹일 수 있습니다. 대상 IP 주소를 무작위화하므로 원격 네트워크를 압도하지 않아야 합니다.

기본적으로 속도는 초당 100패킷으로 설정됩니다. 속도를 100만으로 높이려면 --rate 1000000과 같은 것을 사용하세요.

IPv4 인터넷을 스캔할 때는 많은 서브넷을 스캔하게 되므로 나가는 패킷 속도가 높더라도 각 대상 서브넷은 적은 양의 수신 패킷을 받게 됩니다.

그러나 IPv6 스캔의 경우 수십억 개의 주소가 있는 단일 대상 서브넷에 집중하는 경향이 있습니다. 따라서 기본 동작이 대상 네트워크를 압도할 것입니다. 네트워크는 masscan이 생성할 수 있는 부하 아래에서 종종 충돌합니다.

설계

이 섹션에서는 프로그램의 주요 설계 문제를 설명합니다.

코드 레이아웃

main.c 파일에는 예상대로 main() 함수가 있습니다. 또한 transmit_thread() 및 receive_thread() 함수도 포함되어 있습니다. 이러한 함수는 의도적으로 평평하게 만들어지고 많은 주석이 추가되어 프로그램의 설계를 각 함수를 한 줄씩 따라가며 읽을 수 있습니다.

비동기

이것은 비동기 설계입니다. 즉, nginx 웹 서버가 Apache에 비해 가지는 관계를 nmap에 대해 가집니다. 서로 거의 독립적인 별도의 전송 및 수신 스레드가 있습니다. 이는 scanrand, unicornscan, ZMap에서 찾을 수 있는 것과 동일한 종류의 설계입니다.

비동기이기 때문에 기본 패킷 전송이 허용하는 만큼 빠르게 실행됩니다.

무작위화

Masscan과 다른 스캐너의 주요 차이점은 대상을 무작위화하는 방식입니다.

기본 원칙은 0에서 시작하여 각 프로브에 대해 1씩 증가하는 단일 인덱스 변수를 갖는 것입니다. C 코드로 표현하면 다음과 같습니다:

root@kitploit:~
for (i = 0; i < range; i++) {
    scan(i);
}

인덱스를 IP 주소로 변환해야 합니다. 모든 "사설" IP 주소를 스캔한다고 가정해 보겠습니다. 그러면 다음과 같은 범위 테이블이 됩니다:

root@kitploit:~
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12

이 예에서 첫 64k 인덱스는 192.168.x.x에 추가되어 대상 주소를 형성합니다. 그 다음 1600만 개는 10.x.x.x에 추가됩니다. 범위의 나머지 인덱스는 172.16.x.x에 적용됩니다.

이 예에서는 세 개의 범위만 있습니다. 전체 인터넷을 스캔할 때 실제로는 100개 이상의 범위가 있습니다. 이는 많은 하위 범위를 블랙리스트에 추가하거나 제외해야 하기 때문입니다. 이로 인해 원하는 범위가 수백 개의 더 작은 범위로 나뉩니다.

이것은 코드에서 가장 느린 부분 중 하나로 이어집니다. 초당 1000만 개의 패킷을 전송하고 각 프로브마다 인덱스 변수를 IP 주소로 변환해야 합니다. 우리는 적은 양의 메모리에서 "이진 검색"을 수행하여 이를 해결합니다. 이 패킷 속도에서는 알고리즘 효율성보다 캐시 효율성이 지배적이기 시작합니다. 이론적으로는 훨씬 더 효율적인 기술이 많이 있지만, 모두 너무 많은 메모리를 필요로 하여 실제로는 더 느려집니다.

인덱스에서 IP 주소로 변환하는 함수를 pick() 함수라고 부릅니다. 사용 시에는 다음과 같습니다:

root@kitploit:~
for (i = 0; i < range; i++) {
    ip = pick(addresses, i);
    scan(ip);
}

Masscan은 IP 주소 범위뿐만 아니라 포트 범위도 지원합니다. 즉, 인덱스 변수에서 IP 주소와 포트를 모두 선택해야 합니다. 이는 매우 간단합니다:

root@kitploit:~
range = ip_count * port_count;
for (i = 0; i < range; i++) {
    ip   = pick(addresses, i / port_count);
    port = pick(ports,     i % port_count);
    scan(ip, port);
}

이것은 코드의 또 다른 비용이 많이 드는 부분으로 이어집니다. 나눗셈/모듈러스 명령어는 x86 CPU에서 약 90 클록 사이클, 즉 30 나노초입니다. 초당 1000만 패킷의 속도로 전송할 때 패킷당 100나노초만 있습니다. 이것을 더 최적화할 방법이 없습니다. 운 좋게도 두 개의 이러한 연산을 동시에 실행할 수 있으므로 위와 같이 두 개를 수행하는 것은 하나를 수행하는 것보다 비용이 더 들지 않습니다.

위의 성능 문제에 대한 쉬운 최적화가 실제로 있지만, 모두 i++, 즉 스캔을 통해 인덱스 변수가 하나씩 증가한다는 사실에 의존합니다. 실제로는 이 변수를 무작위화해야 합니다. 스캔하는 IP 주소의 순서를 무작위화하지 않으면 이 속도 수준에 맞게 구축되지 않은 대상 네트워크를 엄청나게 압도할 것입니다. 트래픽을 대상에 고르게 분산해야 합니다.

무작위화하는 방법은 간단히 인덱스 변수를 암호화하는 것입니다. 정의에 따라 암호화는 무작위적이며 원래 인덱스 변수와 출력 간에 1:1 매핑을 생성합니다. 즉, 선형적으로 범위를 통과하는 동안 출력 IP 주소는 완전히 무작위입니다. 코드에서 이는 다음과 같습니다:

root@kitploit:~
range = ip_count * port_count;
for (i = 0; i < range; i++) {
    x = encrypt(i);
    ip   = pick(addresses, x / port_count);
    port = pick(ports,     x % port_count);
    scan(ip, port);
}

이것도 상당한 비용이 듭니다. 범위가 균일한 2의 거듭제곱이 아닌 예측할 수 없는 크기이기 때문에 AND (&) 및 XOR (^)과 같은 저렴한 이진 기술을 사용할 수 없습니다. 대신 MODULUS (%)와 같은 비용이 많이 드는 연산을 사용해야 합니다. 현재 벤치마크에서 변수를 암호화하는 데 40나노초가 걸립니다.

이 아키텍처는 많은 멋진 기능을 지원합니다. 예를 들어 "샤드(shards)"를 지원합니다. 각각 스캔의 1/5 또는 range / shard_count를 수행하는 5대의 머신을 설정할 수 있습니다. 샤드는 여러 머신일 수도 있고, 동일한 머신의 여러 네트워크 어댑터일 수도 있으며, 동일한 네트워크 어댑터의 여러 IP 소스 주소일 수도 있습니다(원하는 경우).

또는 암호화 함수에 '시드(seed)' 또는 '키(key)'를 사용하여 스캔할 때마다 다른 순서를 얻을 수 있습니다(예: x = encrypt(seed, i)).

프로그램을 종료하여 스캔을 일시 중지하고 현재 i 값을 기억한 다음 나중에 다시 시작할 수도 있습니다. 개발 중에 자주 사용합니다. 인터넷 스캔에 문제가 발생하면 를 눌러 스캔을 중지하고 버그를 수정한 후 다시 시작합니다.

또 다른 기능은 재전송/재시도입니다. 패킷은 인터넷에서 가끔 손실되므로 두 개의 패킷을 연속해서 보낼 수 있습니다. 그러나 하나의 패킷을 드롭하는 것은 바로 다음 패킷도 드롭할 수 있습니다. 따라서 약 1초 간격으로 복사본을 보내야 합니다. 이것은 간단합니다. 이미 전송 속도인 'rate' 변수가 있습니다. 이는 초당 패킷 수입니다. 따라서 재전송 함수는 단순히 인덱스로 i + rate를 사용하는 것입니다. 언젠가 인터넷에 대한 연구를 수행하여 "연속", "1초", "10초", "1분" 재전송을 이 방식으로 구분하여 어떤 것이 드롭되는지 차이가 있는지 확인할 계획입니다.

C10 확장성

비동기 기술은 "c10k 문제"에 대한 해결책으로 알려져 있습니다. Masscan은 다음 수준의 확장성인 "C10M 문제"를 위해 설계되었습니다.

C10M 솔루션은 커널을 우회하는 것입니다. Masscan에는 세 가지 주요 커널 우회가 있습니다:

  • 사용자 정의 네트워크 드라이버
  • 사용자 모드 TCP 스택
  • 사용자 모드 동기화

Masscan은 PF_RING DNA 드라이버를 사용할 수 있습니다. 이 드라이버는 사용자 모드 메모리에서 네트워크 드라이버로 패킷을 커널 개입 없이 직접 DMA 전송합니다. 따라서 느린 CPU를 사용하는 소프트웨어라도 하드웨어가 허용하는 최대 속도로 패킷을 전송할 수 있습니다. 컴퓨터에 8개의 10Gbps 네트워크 카드를 장착하면 초당 1억 개의 패킷을 전송할 수 있습니다.

Masscan에는 TCP 연결에서 배너를 가져오기 위한 자체 내장 TCP 스택이 있습니다. 따라서 컴퓨터에 충분한 메모리가 있다고 가정할 때 1000만 개의 동시 TCP 연결을 쉽게 지원할 수 있습니다.

Masscan에는 "뮤텍스(mutex)"가 없습니다. 현대의 뮤텍스(일명 futex)는 대부분 사용자 모드이지만 두 가지 문제가 있습니다. 첫 번째 문제는 캐시 라인이 CPU 간에 빠르게 바운스된다는 것입니다. 두 번째는 경합이 있을 때 커널로 시스템 호출을 수행하여 성능을 저하시킨다는 것입니다. 프로그램의 빠른 경로에 있는 뮤텍스는 확장성을 심각하게 제한합니다. 대신 Masscan은 "링(rings)"을 사용하여 수신 스레드의 사용자 모드 TCP 스택이 전송 스레드를 방해하지 않고 패킷을 전송해야 할 때와 같은 상황을 동기화합니다.

이식성The code runs well on Linux, Windows, and Mac OS X. All the important bits are

in standard C (C90). Therefore, it compiles on Visual Studio with Microsoft's compiler, the Clang/LLVM compiler on Mac OS X, and GCC on Linux.

Windows and Macs aren't tuned for packet transmit, and get only about 300,000 packets-per-second, whereas Linux can do 1,500,000 packets/second. That's probably faster than you want anyway.

Safe code

A bounty is offered for vulnerabilities, see the VULNINFO.md file for more information.

This project uses safe functions like safe_strcpy() instead of unsafe functions like strcpy().

This project has automated unit regression tests (make regress).

Compatibility

A lot of effort has gone into making the input/output look like nmap, which everyone who does port scans is (or should be) familiar with.

IPv6 and IPv4 coexistence

Masscan supports IPv6, but there is no special mode, both are supported at the same time. (There is no -6 option -- it's always available).

In any example you see of masscan usage, simply put an IPv6 address where you see an IPv4 address. You can include IPv4 and IPv6 addresses simultaneously in the same scan. Output includes the appropriate address at the same location, with no special marking.

Just remember that IPv6 address space is really big. You probably don't want to scan for big ranges, except maybe the first 64k addresses of a subnet that were assigned via DHCPv6.

Instead, you'll probably want to scan large lists of addresses stored in a file (--include-file filename.txt) that you got from other sources. Like everywhere else, this file can contain lists of both IPv4 and IPv6 addresses. The test file I use contains 8 million addresses. Files of that size need a couple extra seconds to be read on startup (masscan sorts the addresses and removes duplicates before scanning).

Remember that masscan contains its own network stack. Thus, the local machine you run masscan from does not need to be IPv6 enabled -- though the local network needs to be able to route IPv6 packets.

PF_RING

To get beyond 2 million packets/second, you need an Intel 10-gbps Ethernet adapter and a special driver known as "PF_RING ZC" from ntop. Masscan doesn't need to be rebuilt in order to use PF_RING. To use PF_RING, you need to build the following components:

  • libpfring.so (installed in /usr/lib/libpfring.so)
  • pf_ring.ko (their kernel driver)
  • ixgbe.ko (their version of the Intel 10-gbps Ethernet driver)

You don't need to build their version of libpcap.so.

When Masscan detects that an adapter is named something like zc:enp1s0 instead of something like enp1s0, it'll automatically switch to PF_RING ZC mode.

A more detail discussion can be found in PoC||GTFO 0x15.

Regression testing

The project contains a built-in unit test:

root@kitploit:~
$ make test
bin/masscan --selftest
selftest: success!

This tests a lot of tricky bits of the code. You should do this after building.

Performance testing

To test performance, run something like the following to a throw-away address, to avoid overloading your local router:

root@kitploit:~
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11

The bogus --router-mac keeps packets on the local network segments so that they won't go out to the Internet.

You can also test in "offline" mode, which is how fast the program runs without the transmit overhead:

root@kitploit:~
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline

This second benchmark shows roughly how fast the program would run if it were using PF_RING, which has near zero overhead.

By the way, the randomization algorithm makes heavy use of "integer arithmetic", a chronically slow operation on CPUs. Modern CPUs have doubled the speed at which they perform this calculation, making masscan much faster.

Authors

This tool created by Robert Graham: email: [email protected] twitter: @ErrataRob

License

Copyright (c) 2013 Robert David Graham

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.

도구 다운로드

list: 이것은 호스트와 포트 쌍이 한 줄에 하나씩 있는 간단한 목록입니다. -oL <filename> 매개변수를 사용하세요. 또는 --output-format list 및 --output-filename <filename> 매개변수를 사용하세요. 형식은 다음과 같습니다:

root@kitploit:~
<port state> <protocol> <port number> <IP address> <POSIX timestamp>  
open tcp 80 XXX.XXX.XXX.XXX 1390380064