<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@detectmr</title><generator>teletype.in</generator><description><![CDATA[@detectmr]]></description><link>https://teletype.in/@detectmr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=detectmr</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/detectmr?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/detectmr?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 17 May 2026 13:04:41 GMT</pubDate><lastBuildDate>Sun, 17 May 2026 13:04:41 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@detectmr/Masscan</guid><link>https://teletype.in/@detectmr/Masscan?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=detectmr</link><comments>https://teletype.in/@detectmr/Masscan?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=detectmr#comments</comments><dc:creator>detectmr</dc:creator><title>MASSCAN</title><pubDate>Wed, 30 Nov 2022 18:03:41 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ae/82/ae82f540-ee5a-4e69-b00b-b5d199c4202f.png"></media:content><description><![CDATA[<img src="https://i.imgur.com/zO50G2y.png"></img>
Masscan - Це сканер портів в Інтернеті. Він може сканувати весь Інтернет менше ніж за 5 хвилин, передаючи 10 мільйонів пакетів в секунду, з однієї машини.]]></description><content:encoded><![CDATA[
  <figure id="ZxL2" class="m_column">
    <img src="https://i.imgur.com/zO50G2y.png" width="1041" />
  </figure>
  <p id="1DkK"><br />Masscan - Це сканер портів в Інтернеті. Він може сканувати весь Інтернет менше ніж за 5 хвилин, передаючи 10 мільйонів пакетів в секунду, з однієї машини.</p>
  <p id="gRup">Його використання ( параметрів, вихід ) схоже на <code>nmap</code>, найвідоміший сканер портів. Якщо ви сумніваєтесь, спробуйте одну з таких особливостей - функції, які широко підтримують підтримується сканування багатьох машин при поглибленому скануванні однієї машини ні.</p>
  <p id="Vik3">Внутрішньо він використовує асинхронну передачу, подібну до портових сканерів як <code>scanrand</code>, <code>unicornscan</code>, і <code>ZMap</code>. Це гнучкіше, що дозволяє довільні діапазони портів та адрес.</p>
  <p id="qNjT">ПРИМІТКА: masscan використовує своє <strong>спеціальний стек TCP / IP</strong>. Що-небудь, крім просте сканування портів може спричинити конфлікт із локальним стеком TCP / IP. Це означає для вас потрібно використовувати будь-яке <code>--src-ip</code> можливість запуску з іншої IP-адреси або використовувати <code>--src-port</code> налаштувати, які порти джерела використовує masscan, а потім також налаштувати внутрішній брандмауер ( <code>pf</code> або <code>iptables</code>) для брандмауера цих портів з решти операційної системи.</p>
  <p id="i0Vu"></p>
  <h1 id="YDbv">Будівля</h1>
  <p id="aa3Z">На Debian / Ubuntu це щось подібне. Це не так дійсно мають будь-які залежності, крім компілятора C (, наприклад <code>gcc</code> або <code>clang</code>).</p>
  <pre id="kQvv">sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
</pre>
  <p id="dSJe">Це ставить програму в <code>masscan/bin</code> підкаталог. Щоб встановити його ( на Linux ) запустіть:</p>
  <pre id="vCHh">make install
</pre>
  <p id="wbaj">Джерело складається з безлічі невеликих файлів, тому будівництво йде набагато швидше за допомогою багатопотокової збірки. Для цього потрібно більше 2 гігів Малиновий Пі ( і розриває ), тому ви можете використовувати меншу кількість, як <code>-j4</code> а не всі можливі нитки.</p>
  <pre id="FNU6">make -j
</pre>
  <p id="nIxP">Хоча Linux є основною цільовою платформою, код працює добре на багатьох інших системи ( Windows, macOS тощо ). Ось додаткова інформація про збірку:</p>
  <ul id="9Ybg">
    <li id="L3UR">Windows w / Visual Studio: використовуйте проект VS10</li>
    <li id="hBD9">Windows w / MinGW: просто введіть <code>make</code></li>
    <li id="qilB">Windows w / cygwin: не працюватиме</li>
    <li id="VMUE">Mac OS X / w XCode: використовуйте проект XCode4</li>
    <li id="vVii">Mac OS X / w cmdline: просто введіть <code>make</code></li>
    <li id="rCxP">FreeBSD: тип <code>gmake</code></li>
    <li id="8bSj">інше: спробуйте просто скласти всі файли разом, <code>cc src/*.c -o bin/masscan</code></li>
  </ul>
  <p id="2Ww0">На macOS, здається, бінарні файли x86 працюють так само швидко під емуляцією ARM.</p>
  <h1 id="YUzt">Використання</h1>
  <p id="6HTz">Використання схоже на <code>nmap</code>. Щоб сканувати мережевий сегмент для деяких портів:</p>
  <pre id="qSBy"># masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
</pre>
  <p id="qcND">Це буде:</p>
  <ul id="ork9">
    <li id="qj9X">сканувати <code>10.x.x.x</code> підмережа та <code>2603:3001:2d00:da00::x</code> підмережі</li>
    <li id="ifnI">сканує порт 80 і діапазон від 8000 до 8100 або 102 портів загалом на обох підмережах</li>
    <li id="ZMj2">вихід друку до <code>&lt;stdout&gt;</code> який можна перенаправити у файл</li>
  </ul>
  <p id="L6d0">Щоб переглянути повний перелік варіантів, скористайтеся цим <code>--echo</code> особливість. Це скидає поточну конфігурацію та виходить з ладу. Цей вихід може бути використаний як вхід назад в програму:</p>
  <pre id="TVgt"># masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo &gt; xxx.conf
# masscan -c xxx.conf --rate 1000
</pre>
  <h2 id="Q50q">Перевірка банера</h2>
  <p id="BfD2">Masscan може зробити більше, ніж просто виявити, чи відкриті порти. Це також може завершити з&#x27;єднання TCP та взаємодію з додатком при цьому порт, щоб захопити просту інформацію про &quot;банер.</p>
  <p id="euNb">Masscan підтримує перевірку банерів на наступних протоколах:</p>
  <ul id="uedk">
    <li id="vEXy">FTP</li>
    <li id="OMbv">HTTP</li>
    <li id="XSrE">IMAP4</li>
    <li id="k4ju">запам&#x27;ятався</li>
    <li id="EZ6D">POP3</li>
    <li id="nzih">SMTP</li>
    <li id="lPEe">СШ</li>
    <li id="1Lk6">SSL</li>
    <li id="YEXr">SMBv1</li>
    <li id="wzyE">SMBv2</li>
    <li id="uXta">Телнет</li>
    <li id="YssL">РДП</li>
    <li id="Yl4R">ВНК</li>
  </ul>
  <p id="ndJ3">Проблема в цьому полягає в тому, що masscan містить власний стек TCP / IP окремо від системи, в якій ви її запускаєте. Коли локальна система отримує SYN-ACK з досліджуваної цілі, він відповідає пакетом RST, який вбиває з&#x27;єднання перед масканом може захопити банер.</p>
  <p id="Jmq6">Найпростіший спосіб запобігти цьому - призначити масовий окремий IP адреса. Це виглядало б як один із наступних прикладів:</p>
  <pre id="aMYK"># 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
</pre>
  <p id="vijR">Вибрана вами адреса повинна бути в локальній підмережі, а не в іншому випадку використовуватись іншою системою. Маскан попередить вас, що ви зробили помилка, але ви, можливо, зіпсували зв’язок іншої машини кілька хвилин, тому будьте обережні.</p>
  <p id="Zo21">У деяких випадках, таких як WiFi, це неможливо. У тих випадках можна брандмауер порту, який використовує маскан. Це запобігає локальному стеку TCP / IP побачивши пакет, але Маскан все ще бачить його, оскільки він обходить місцевий стек. Для Linux це виглядатиме так:</p>
  <pre id="ww1n"># iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
</pre>
  <p id="G2NF">Ви, ймовірно, хочете вибрати порти, які не суперечать портам Linux, інакше вибрати для джерел-портів. Ви можете побачити діапазон використання Linux та перенастроїти цей діапазон, переглянувши файл:</p>
  <pre id="tzrG">/proc/sys/net/ipv4/ip_local_port_range
</pre>
  <p id="Vnbz">В останній версії Kali Linux ( 2018-серпень ) цей діапазон становить від 32768 до 60999, так вам слід вибрати порти нижче 32768 або 61000 і вище.</p>
  <p id="9cDK">Встановлення <code>iptables</code> правило триває лише до наступного перезавантаження. Потрібно шукати, як це зробити збережіть конфігурацію залежно від вашого дистрибутива, наприклад, використання <code>iptables-save</code> та / або <code>iptables-persistent</code>.</p>
  <p id="v72X">На Mac OS X та BSD є подібні кроки. Щоб дізнатися про діапазони, яких слід уникати, використовувати команду типу:</p>
  <pre id="bA5x"># sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
</pre>
  <p id="IyEQ">На FreeBSD та старих MacOS використовуйте його <code>ipfw</code> команда:</p>
  <pre id="IZob"># sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
</pre>
  <p id="ISgT">На новіших MacOS та OpenBSD використовуйте <code>pf</code> утиліта пакетного фільтра. Редагування файлу <code>/etc/pf.conf</code> додати такий рядок:</p>
  <pre id="yBv8">block in proto tcp from any to any port 40000
</pre>
  <p id="U3xK">Потім, щоб увімкнути брандмауер, запустіть команду:</p>
  <pre id="NCN4"># pfctrl -E    
</pre>
  <p id="3wDZ">Якщо брандмауер вже працює, то перезавантажте або перезавантажте правила з наступною командою:</p>
  <pre id="4qEN"># pfctl -f /etc/pf.conf
</pre>
  <p id="xFLn">Windows не відповідає пакетами RST, тому жодна з цих методик необхідні. Однак masscan все ще розроблений для того, щоб найкраще працювати, використовуючи його власна IP-адреса, тому ви повинні запускати цей шлях, коли це можливо, навіть коли він є не суворо необхідно.</p>
  <p id="cze0">Те саме потрібно для інших перевірок, таких як <code>--heartbleed</code> перевірити, що є лише формою перевірки банерів.</p>
  <h2 id="iAfZ">Як сканувати весь Інтернет</h2>
  <p id="Cw8a">Хоча корисна для менших внутрішніх мереж, програма справді розроблена з урахуванням всього Інтернету. Це може виглядати приблизно так:</p>
  <pre id="vGXa"># masscan 0.0.0.0/0 -p0-65535
</pre>
  <p id="G2wt">Сканування всього Інтернету погано. З одного боку, частини Інтернету реагують погано сканується. З іншого боку, деякі сайти відстежують сканування та додають вас до списку заборон, який дозволить вам заграти з корисних частин Інтернету. Тому ви хочете виключити багато діапазонів. До чорного списку або виключати діапазони, ви хочете використовувати наступний синтаксис:</p>
  <pre id="5ITc"># masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
</pre>
  <p id="y8wY">Це просто друкує результати на командному рядку. Ви, мабуть, хочете їх збережено у файлі. Тому ви хочете щось на кшталт:</p>
  <pre id="o0Dc"># masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
</pre>
  <p id="q4jF">Це зберігає результати у файлі XML, що дозволяє легко скинути призводить до отримання бази даних чи чогось іншого.</p>
  <p id="tRmv">Але це йде лише за замовчуванням 100 пакетів / секунду, що буде вічно сканувати Інтернет. Вам потрібно пришвидшити його так:</p>
  <pre id="g9Zh"># masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
</pre>
  <p id="XOu4">Це збільшує швидкість до 100 000 пакетів / секунду, що сканує весь Інтернет ( мінус виключає ) приблизно за 10 годин на порт ( або 655 360 годин якщо сканувати всі порти ).</p>
  <p id="XVgc">Що слід помітити в цьому командному рядку, це те, що це все <code>nmap</code> сумісні варіанти. Крім того, &quot;невидимі&quot; варіанти, сумісні з <code>nmap</code> також встановлені для вас: <code>-sS -Pn -n --randomize-hosts --send-eth</code>. Так само, формат файлу XML натхненний <code>nmap</code>. Звичайно, є багато відмінностей, тому що <em>асинхронний</em> характер програми призводить до принципово іншого підходу до проблеми.</p>
  <p id="KJao">Вищевказаний командний рядок трохи громіздкий. Замість того, щоб все ставити на командному рядку він може бути збережений у файлі. Наведені вище налаштування виглядав би так:</p>
  <pre id="h0Mo"># 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
</pre>
  <p id="23xl">Щоб використовувати цей файл конфігурації, використовуйте його <code>-c</code>:</p>
  <pre id="6kfj"># masscan -c myscan.conf
</pre>
  <p id="qU9S">Це також полегшує ситуацію, коли ви повторюєте сканування.</p>
  <p id="weQC">За замовчуванням masscan спочатку завантажує файл конфігурації <code>/etc/masscan/masscan.conf</code>. Будь-які пізніші параметри конфігурації перекривають те, що є у цьому файлі конфігурації за замовчуванням. Ось де я поставив своє &quot;виключне&quot; параметр, щоб я його ніколи не забував. Це просто працює автоматично.</p>
  <h2 id="LcTn">Вихід</h2>
  <p id="8AI8">За замовчуванням masscan виробляє досить великі текстові файли, але це легко перетворити їх у будь-який інший формат. Існує п&#x27;ять підтримуваних форматів виводу:</p>
  <ol id="kHuB">
    <li id="SQoI">xml: Просто використовуйте параметр <code>-oX &lt;filename&gt;</code>. Або використовуйте параметри <code>--output-format xml</code> і <code>--output-filename &lt;filename&gt;</code>.</li>
    <li id="q0Y0">двійковий: Це формат вбудованого масового сканування. Він створює набагато менші файли так, щоб коли я сканую Інтернет, мій диск не заповнюється. Їх потрібно розібрати, хоч. Параметр командного рядка <code>--readscan</code> буде читати файли двійкового сканування. Використання <code>--readscan</code> з <code>-oX</code> опція створить XML-версію файл результатів.</li>
    <li id="AZKQ">grepable: Це реалізація Nmap -oG вихід, який можна легко проаналізувати за допомогою інструментів командного рядка. Просто використовуйте параметр <code>-oG &lt;filename&gt;</code>. Або використовуйте параметри <code>--output-format grepable</code> і <code>--output-filename &lt;filename&gt;</code>.</li>
    <li id="Rh2C">json: Це зберігає результати у форматі JSON. Просто використовуйте параметр <code>-oJ &lt;filename&gt;</code>. Або використовуйте параметри <code>--output-format json</code> і <code>--output-filename &lt;filename&gt;</code>.</li>
    <li id="Rzs7">список: Це простий список з одним хостом і парою портів за рядок. Просто використовуйте параметр <code>-oL &lt;filename&gt;</code>. Або використовуйте параметри <code>--output-format list</code> і <code>--output-filename &lt;filename&gt;</code>. Формат:<code>&lt;port state&gt; &lt;protocol&gt; &lt;port number&gt; &lt;IP address&gt; &lt;POSIX timestamp&gt; open tcp 80 XXX.XXX.XXX.XXX 1390380064 </code></li>
  </ol>
  <h2 id="2BeT">Порівняння з Nmap</h2>
  <p id="oStg">Там, де це розумно, докладено всіх зусиль, щоб програма була ознайомлена до <code>nmap</code> користувачі, хоча це принципово інакше. Маскан налаштований для широкого діапазону сканування багатьох машин, тоді як nmap призначений для інтенсивне сканування однієї машини або невеликого діапазону.</p>
  <p id="GgpI">Дві важливі відмінності:</p>
  <ul id="gZMh">
    <li id="uByw">не потрібно сканувати порти за замовчуванням, потрібно вказати <code>-p &lt;ports&gt;</code></li>
    <li id="hyxl">цільові хости - це IP-адреси або прості діапазони, а не імена DNS, ні фанкі підмережі <code>nmap</code> може використовувати ( як <code>10.0.0-255.0-255</code>).</li>
  </ul>
  <p id="a6X5">Ви можете придумати <code>masscan</code> як такі налаштування постійно ввімкнено:</p>
  <ul id="LTPJ">
    <li id="J1gM"><code>-sS</code>: це лише сканування SYN ( в даний час зміниться в майбутньому )</li>
    <li id="Frtb"><code>-Pn</code>: не пінг господарів спочатку, що є основоположним для операції асинхронізації</li>
    <li id="LAla"><code>-n</code>: не відбувається роздільної здатності DNS</li>
    <li id="PgRz"><code>--randomize-hosts</code>: скануйте повністю рандомізовано, завжди ви не можете цього змінити</li>
    <li id="Tqo9"><code>--send-eth</code>: відправляє за допомогою сировини <code>libpcap</code></li>
  </ul>
  <p id="G5HO">Якщо ви хочете список додаткових <code>nmap</code> сумісні налаштування, використовуйте наступне команда:</p>
  <pre id="Naos"># masscan --nmap
</pre>
  <h2 id="KOxA">Швидкість передачі ( ВАЖЛИВО !! )</h2>
  <p id="e2Ck">Ця програма дуже швидко виводить пакети. У Windows або від VM, він може робити 300 000 пакетів / секунду. У Linux ( немає віртуалізації ) це буде робити 1,6 мільйона пакетів на секунду. Це досить швидко, щоб розплавити більшість мереж.</p>
  <p id="q1JI">Зауважте, що він розтане лише вашу власну мережу. Це рандомізує ціль IP-адреси, щоб вони не переповнювали будь-яку віддалену мережу.</p>
  <p id="ZHHX">За замовчуванням ставка встановлюється на 100 пакетів / секунду. Збільшити ставку до мільйон використовують щось на кшталт <code>--rate 1000000</code>.</p>
  <p id="USHq">Скануючи IPv4 Інтернет, ви будете сканувати безліч підмереж, так що, хоча велика кількість пакетів виходить, кожен цільовий підмереж отримає невелику ставку вхідних пакетів.</p>
  <p id="NOXO">Однак при скануванні IPv6 ви, як правило, зосередитесь на одному цільовий підмереж з мільярдами адрес. Таким чином, ваш дефолт поведінка переповнить цільову мережу. Мережі часто збій під навантаженням, яке може генерувати маскан.</p>
  <h1 id="vpm0">Дизайн</h1>
  <p id="4jyT">У цьому розділі описані основні проблеми дизайну програми.</p>
  <h2 id="EloH">Макет коду</h2>
  <p id="Rsmz">Файл <code>main.c</code> містить <code>main()</code> функціонувати, як можна було очікувати. Це також містить <code>transmit_thread()</code> і <code>receive_thread()</code> функції. Ці функції були навмисно сплющені та сильно прокоментовані, щоб ви можна прочитати дизайн програми просто шляхом кроку по лінії кожен із них.</p>
  <h2 id="3XBl">Асинхронний</h2>
  <p id="sCag">Це <em>асинхронний</em> дизайн. Іншими словами, це <code>nmap</code> що то <code>nginx</code> веб-сервер повинен <code>Apache</code>. Він має окрему передачу та отримання нитки, які значною мірою незалежні одна від одної. Це такий самий вид дизайн знайдено в <code>scanrand</code>, <code>unicornscan</code>, і <code>ZMap</code>.</p>
  <p id="U7PY">Оскільки він асинхронний, він працює так само швидко, як і базовий пакет дозволяє.</p>
  <h2 id="Ap5J">Рандомізація</h2>
  <p id="IVY1">Ключова відмінність Masscan від інших сканерів полягає в тому, як він рандомізується цілі.</p>
  <p id="t3Sp">Принциповим принципом є наявність єдиної змінної індексу, яка починається з нуль і збільшується на кожен зонд. У коді С це виражається як:</p>
  <pre id="Azzw">for (i = 0; i &lt; range; i++) {
    scan(i);
}
</pre>
  <p id="ofMu">Ми повинні перевести індекс на IP-адресу. Скажімо, що ви хочете сканувати всі &quot;приватні&quot; IP-адреси. Це була б таблиця діапазонів на кшталт:</p>
  <pre id="k4gf">192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
</pre>
  <p id="LKRv">У цьому прикладі перші індекси 64k додаються до 192.168.x.x для формування цільова адреса. Потім наступні 16 мільйонів додаються до 10.x.x.x. Решта індексів у діапазоні застосовуються до 172.16.x.x.</p>
  <p id="3oxg">У цьому прикладі у нас є лише три діапазони. Під час сканування всього Інтернету, у нас на практиці більше 100 діапазонів. Це тому, що ви повинні перейти до чорного списку або виключити багато піддіапазонів. Це розбиває потрібний діапазон на сотні менших діапазонів.</p>
  <p id="3pU4">Це призводить до однієї з найповільніших частин коду. Ми передаємо 10 мільйонів пакети в секунду і повинні конвертувати змінну індексу в IP-адресу для кожного зонда. Ми вирішуємо це, роблячи «двійковий пошук» у невеликому кількість пам&#x27;яті. При цій швидкості пакету ефективність кешу починає домінувати над ефективністю алгоритму. Є багато більш ефективних методик теорія, але всі вони потребують стільки пам’яті, щоб бути повільнішими на практиці.</p>
  <p id="XK77">Ми називаємо функцію, яка перекладається з індексу на IP-адресу то <code>pick()</code> функція. У використанні це виглядає так:</p>
  <pre id="9yIT">for (i = 0; i &lt; range; i++) {
    ip = pick(addresses, i);
    scan(ip);
}
</pre>
  <p id="BYd7">Masscan підтримує не тільки діапазони IP-адрес, але і діапазони портів. Це означає нам потрібно вибрати зі змінної індексу як IP-адресу, так і порт. Це досить просто:</p>
  <pre id="9v1M">range = ip_count * port_count;
for (i = 0; i &lt; range; i++) {
    ip   = pick(addresses, i / port_count);
    port = pick(ports,     i % port_count);
    scan(ip, port);
}
</pre>
  <p id="OzGw">Це призводить до іншої дорогої частини коду. Ділення / модуль інструкції - близько 90 тактових циклів або 30 наносекунд на процесорах x86. Коли передаючи зі швидкістю 10 мільйонів пакетів / секунду, у нас є лише 100 наносекунд на пакет. Я не бачу способу оптимізувати це краще. На щастя, хоча дві такі операції можна виконати одночасно, тому дві з них, як показано вище, не дорожче, ніж робити.</p>
  <p id="u2JQ">Насправді є кілька простих оптимізацій для вищезазначених проблем із продуктивністю, але всі вони покладаються <code>i++</code>, той факт, що змінна індексу збільшує одну одним через сканування. Власне, нам потрібно рандомізувати цю змінну. Ми потрібно рандомізувати порядок IP-адрес, які ми скануємо, або ми підірвемо чорт із цільових мереж, які не побудовані для цього рівня швидкості. Ми потрібно рівномірно розподілити наш трафік по цілі.</p>
  <p id="OYvu">Те, як ми рандомізуємо, - це просто зашифрування змінної індексу. За визначенням, шифрування є випадковим і створює відображення 1 на 1 між оригінальним індексом змінна і вихід. Це означає, що, поки ми лінійно проходимо через діапазон, вихідні IP-адреси абсолютно випадкові. У коді це виглядає так:</p>
  <pre id="6Rev">range = ip_count * port_count;
for (i = 0; i &lt; range; i++) {
    x = encrypt(i);
    ip   = pick(addresses, x / port_count);
    port = pick(ports,     x % port_count);
    scan(ip, port);
}
</pre>
  <p id="v4Tl">Це також має великі витрати. Оскільки діапазон замість цього непередбачуваний розмір приємної рівномірної потужності 2, ми не можемо використовувати дешеві бінарні методи, як І ( &amp; ) і XOR ( ^ ). Натомість нам доводиться використовувати дорогі операції, як МОДУЛЮС (% ). У моїх нинішніх орієнтирах потрібно 40 наносекунд зашифруйте змінну.</p>
  <p id="VknG">Ця архітектура дозволяє отримати багато цікавих функцій. Наприклад, він підтримує &quot;шматки&quot;. Ви можете налаштувати по 5 машин, кожен з яких виконує п&#x27;яту частину сканування або <code>range / shard_count</code>. Shards можуть бути декількома машинами або просто декількома мережеві адаптери на одній машині або навіть (, якщо ви хочете ) кілька IP адреси джерел на одному мережевому адаптері.</p>
  <p id="ylhH">Або ви можете використовувати &quot;насіння&quot; або &quot;ключ&quot; для функції шифрування, щоб отримати інший порядок кожного разу, коли ви скануєте, як <code>x = encrypt(seed, i)</code>.</p>
  <p id="K5HB">Ми також можемо призупинити сканування, вийшовши з програми, і просто запам&#x27;ятовування поточного значення <code>i</code>, і перезавантажте його пізніше. Я роблю це багато під час розвитку. Я бачу, що щось не так у моєму скануванні в Інтернеті, так Я натискаю, щоб зупинити сканування, а потім перезавантажую його після виправлення помилки.</p>
  <p id="pDHj">Ще одна особливість - це повторні перекази / ретри. Пакети іноді потрапляють на Інтернет, тож ви можете відправити два пакети назад. Однак щось таке краплі одного пакета можуть скинути відразу після пакета. Тому ти хочу надіслати копію близько 1 секунди один від одного. Це просто. У нас уже є змінна &quot;швидкість&quot;, яка є кількістю пакетів на секунду передача в, тому функція повторного введення просто використовувати <code>i + rate</code> як індекс. Одного дня я збираюся зробити дослідження Інтернету, і диференціювати &quot;назад до спини&quot;, &quot;1 секунду&quot;, &quot;10 секунд&quot; і &quot;1 хвилину&quot; повторно передає таким чином, щоб побачити, чи є якась різниця в чому падає.</p>
  <h2 id="YeHL">C10 Масштабованість</h2>
  <p id="2bFp">Асинхронна техніка відома як рішення &quot;проблеми c10k&quot;. Masscan призначений для наступного рівня масштабованості, &quot;проблеми C10M&quot;.</p>
  <p id="9x4b">Рішення C10M - це обхід ядра. Є три первинні ядра обходить в Маскані:</p>
  <ul id="ylTF">
    <li id="R50W">користувальницький мережевий драйвер</li>
    <li id="GlwL">стек TCP в режимі користувача</li>
    <li id="tkC5">синхронізація в режимі користувача</li>
  </ul>
  <p id="PV81">Masscan може використовувати драйвер ДНК PF_RING. Цей драйвер DMA пакує безпосередньо від пам&#x27;яті в режимі користувача до мережевого драйвера з нульовим залученням ядра. Це дозволяє програмному забезпеченню навіть при повільному процесорі передавати пакети максимум швидкість апаратного забезпечення дозволяє. Якщо ви помістите в комп&#x27;ютер 8 мережевих карт 10 Гбіт / с, це означає, що він може передавати зі швидкістю 100 мільйонів пакетів на секунду.</p>
  <p id="cTTl">Masscan має власний вбудований стек TCP для захоплення банерів від TCP з&#x27;єднання. Це означає, що він може легко підтримати 10 мільйонів одночасних TCP з&#x27;єднання, якщо, звичайно, у комп&#x27;ютера достатньо пам&#x27;яті.</p>
  <p id="wKud">У Маскана немає &quot;мутексу&quot;. Сучасні мютекси ( ака. футекси ) - це переважно режим користувача, але у них дві проблеми. Перша проблема полягає в тому, що вони викликають кеш-лінії швидко відскакувати між процесорами. Друге - це коли там це суперечка, вони зроблять системний дзвінок у ядро, яке вбиває продуктивність. Мутекс на швидкому шляху програми сильно обмежує масштабованість. Натомість Маскан використовує &quot;кільця&quot; для синхронізації речей, наприклад, коли стек TCP в режимі користувача в приймальній нитці повинен передавати пакет без заважаючи потоку передачі.</p>
  <h2 id="4GpO">Переносність</h2>
  <p id="kLXc">Код добре працює в Linux, Windows та Mac OS X. Усі важливі біти є у стандарті C ( C90 ). Тому він компілює на Visual Studio з Microsoft компілятор, компілятор Clang / LLVM на Mac OS X та GCC на Linux.</p>
  <p id="utjx">Windows і Mac не налаштовані на передачу пакетів і отримують лише близько 300 000 пакети за секунду, тоді як Linux може робити 1500 000 пакетів / секунду. Це напевно, швидше, ніж ти хочеш.</p>
  <h2 id="xir2">Безпечний код</h2>
  <p id="nFfn">Для вразливих ситуацій пропонується щедрість, див. Файл VULNINFO.md для отримання додаткової інформації інформація.</p>
  <p id="yha7">Цей проект використовує безпечні функції, як <code>strcpy_s()</code> замість небезпечних функцій як <code>strcpy()</code>.</p>
  <p id="EB0v">Цей проект має автоматизовані випробування на регресію блоку (<code>make regress</code>).</p>
  <h2 id="SE1m">Сумісність</h2>
  <p id="GRyI">Багато зусиль доклали до того, щоб зробити вхід / вихід схожим <code>nmap</code>, який кожен, хто робить сканування портів, ( або повинен бути ) знайомий.</p>
  <h2 id="jKii">Співіснування IPv6 та IPv4</h2>
  <p id="ceEK">Masscan підтримує IPv6, але спеціального режиму немає, обидва підтримуються водночас. ( Немає <code>-6</code> варіант - він завжди доступний ).</p>
  <p id="0cfR">У будь-якому прикладі ви бачите використання масових, просто введіть IPv6-адресу, де ви бачите IPv4-адресу. Ви можете включити IPv4 та IPv6 адреси одночасно в одному скануванні. Вихід включає відповідна адреса в тому ж місці, без спеціального маркування.</p>
  <p id="cHGD">Пам&#x27;ятайте лише, що адресний простір IPv6 дійсно великий. Ви, мабуть, не хочете сканувати для великих діапазонів, за винятком, можливо, перших 64 к адрес підмережі, які були призначені через DHCPv6.</p>
  <p id="Br5m">Натомість ви, ймовірно, захочете сканувати великі списки збережених адрес у файлі (<code>--include-file filename.txt</code>), що ви отримали з інших джерел. Як і скрізь, цей файл може містити списки як IPv4, так і IPv6 адрес. Тестовий файл, який я використовую, містить 8 мільйонів адрес. Файли такого розміру потребують пари додаткові секунди, які потрібно прочитати при запуску ( masscan сортує адреси та видаляє дублює перед скануванням ).</p>
  <p id="dmEx">Пам&#x27;ятайте, що masscan містить власний мережевий стек. Таким чином, локальна машина Ви запускаєте masscan з не потрібно включати IPv6 - хоча локальний мережа повинна мати можливість маршрутизувати пакети IPv6.</p>
  <h2 id="mya9">PF_RING</h2>
  <p id="piHH">Щоб отримати понад 2 мільйони пакетів / секунду, вам потрібен Intel 10-фунт / с Ethernet адаптер та спеціальний драйвер, відомий як <a href="http://www.ntop.org/products/packet-capture/pf_ring/pf_ring-zc-zero-copy/" target="_blank">&quot;PF_RING ZC&quot; з ntop</a>. Masscan не потрібно перебудовувати для використання PF_RING. Для використання PF_RING, потрібно створити такі компоненти:</p>
  <ul id="I1lD">
    <li id="EqZz"><code>libpfring.so</code>( встановлено в /usr/lib/libpfring.so )</li>
    <li id="zcE1"><code>pf_ring.ko</code>( їх драйвер ядра )</li>
    <li id="wkZg"><code>ixgbe.ko</code>( їх версія драйвера Intel 10-gbps Ethernet )</li>
  </ul>
  <p id="avSQ">Вам не потрібно створювати їх версію <code>libpcap.so</code>.</p>
  <p id="gPa2">Коли Маскан виявить, що адаптер названий чимось подібним <code>zc:enp1s0</code> замість цього чогось подібного <code>enp1s0</code>, він автоматично перейде в режим PF_RING ZC.</p>
  <p id="sQwL">Більш детальну дискусію можна знайти в <strong>PoC | | GTFO 0x15</strong>.</p>
  <h2 id="uKB0">Регресійне тестування</h2>
  <p id="D42t">Проект містить вбудований тест на одиницю:</p>
  <pre id="vO0j">$ make test
bin/masscan --selftest
selftest: success!
</pre>
  <p id="C3Wo">Це тестує багато складних бітів коду. Ви повинні зробити це після будівництва.</p>
  <h2 id="qv9A">Тестування працездатності</h2>
  <p id="Ii3d">Щоб перевірити продуктивність, запустіть щось на зразок наступного на адресу, що викидається, щоб не перевантажувати локальний маршрутизатор:</p>
  <pre id="b1mu">$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
</pre>
  <p id="jUYN">Блудний <code>--router-mac</code> зберігає пакети на локальних сегментах мережі так, щоб вони не вийдуть в Інтернет.</p>
  <p id="dKWf">Ви також можете протестувати в режимі &quot;офлайн&quot;, який швидко працює програма без передачі накладних витрат:</p>
  <pre id="VjRM">$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline
</pre>
  <p id="T6az">Цей другий орієнтир приблизно показує, наскільки швидко програма запуститься, якби вона була використання PF_RING, який має майже нульові накладні витрати.</p>
  <p id="M4wV">До речі, алгоритм рандомізації використовує &quot;цілеспрямовану арифметику&quot;, хронічно повільна робота на процесорах. Сучасні процесори подвоїли швидкість при якому вони виконують цей розрахунок, роблячи <code>masscan</code> набагато швидше.</p>

]]></content:encoded></item></channel></rss>