NDIFF(1) دستورات کاربر NDIFF(1)

ndiff - مقایسه و نمایش تفاوت‌های میان نتایج پویش‌های Nmap

ndiff [گزینه‌ها] {a.xml} {b.xml}

ابزار Ndiff برنامه‌ای برای کمک به مقایسه پویش‌های Nmap است. این ابزار دو فایل خروجی XML مربوط به Nmap را دریافت کرده و تفاوت‌های میان آن‌ها را نمایش می‌دهد. تفاوت‌های بررسی‌شده عبارتند از:

•وضعیت‌های میزبان (مانند تغییر از حالت بالا به پایین)
•وضعیت‌های درگاه (مانند تغییر از حالت باز به بسته)
•نگارش‌های سرویس (از گزینه -sV)
•تطبیق‌های سیستم‌عامل (از گزینه -O)
•خروجی اسکریپت

ابزار Ndiff همانند ابزار استاندارد diff، در هر زمان دو پویش را با یکدیگر مقایسه می‌کند.

-h, --help

نمایش پیام راهنما و خروج.

-v, --verbose

گنجاندن تمام میزبان‌ها و درگاه‌ها در خروجی، نه فقط آن‌هایی که تغییر کرده‌اند.

--text

نوشتن خروجی در قالب متنی خوانا برای انسان.

--xml

نوشتن خروجی در قالب ماشینی XML. ساختار سند در فایل ndiff.dtd موجود در بسته توزیع تعریف شده است.

هر آرگومان دیگری به عنوان نام فایل‌های خروجی XML ابزار Nmap در نظر گرفته می‌شود. دقیقاً باید دو فایل مشخص شوند.

برای مقایسه خروجی دو پویش Nmap که از گزینه‌های متفاوتی استفاده کرده‌اند از Ndiff استفاده می‌کنیم. در پویش نخست، یک پویش سریع (-F) انجام می‌دهیم که برای افزایش سرعت، درگاه‌های کمتری را بررسی می‌کند. در پویش دوم، مجموعه بزرگ‌تر و پیش‌فرض درگاه‌ها را پویش کرده و یک اسکریپت NSE را اجرا می‌کنیم.

# nmap -F scanme.nmap.org -oX scanme-1.xml
# nmap --script=html-title scanme.nmap.org -oX scanme-2.xml
$ ndiff -v scanme-1.xml scanme-2.xml
-Nmap 5.35DC1 at 2010-07-16 12:09
+Nmap 5.35DC1 at 2010-07-16 12:13
 scanme.nmap.org (64.13.134.52):
 Host is up.
-Not shown: 95 filtered ports
+Not shown: 993 filtered ports
 PORT      STATE  SERVICE VERSION
 22/tcp    open   ssh
 25/tcp    closed smtp
 53/tcp    open   domain
+70/tcp    closed gopher
 80/tcp    open   http
+|_ html-title: Go ahead and ScanMe!
 113/tcp   closed auth
+31337/tcp closed Elite

تغییرات با علامت - یا + در ابتدای خط مشخص می‌شوند. از خروجی می‌توان دریافت که پویش بدون گزینه پویش سریع -F دو درگاه اضافی پیدا کرده است: ۷۰ و ۳۱۳۳۷. اسکریپت html-title خروجی‌های بیشتری برای درگاه ۸۰ تولید کرده است. از روی تعداد درگاه‌ها می‌توان دریافت که پویش سریع ۱۰۰ درگاه (۹۵ فیلترشده، ۳ باز و ۲ بسته) را بررسی کرده، در حالی که پویش عادی ۱۰۰۰ درگاه (۹۹۳ فیلترشده، ۳ باز و ۴ بسته) را پویش کرده است.

گزینه -v (یا --verbose) در Ndiff باعث می‌شود حتی درگاه‌هایی که تغییری نکرده‌اند نیز نمایش داده شوند، مانند ۲۲ و ۲۵. بدون -v، این درگاه‌ها در خروجی نمایش داده نمی‌شدند.

دو حالت خروجی وجود دارد: متنی و XML. خروجی متنی حالت پیش‌فرض است و با گزینه --text نیز قابل انتخاب است. خروجی متنی شبیه به یک diff یکپارچه از خروجی استاندارد ترمینال Nmap است. در ابتدای هر خط نویسه‌ای قرار می‌گیرد که نشان‌دهنده تغییر آن است. - نشان می‌دهد که خط در پویش نخست وجود داشته اما در پویش دوم نیست؛ + نشان می‌دهد که در پویش دوم بوده اما در پویش اول نبوده است. خطی که تغییر کرده با یک خط - و به دنبال آن یک خط + نشان داده می‌شود. خطوطی که تغییر نکرده‌اند با یک فاصله خالی در ابتدای خط نمایش می‌یابند.

مثال 1 نمونه‌ای از خروجی متنی را نشان می‌دهد. در اینجا، درگاه ۸۰ روی میزبان photos-cache-snc1.facebook.com دارای نگارش سرویس شده است (lighttpd 1.5.0). میزبان 69.63.179.25 نام DNS معکوس خود را تغییر داده است. میزبان 69.63.184.145 در پویش اول کاملاً غایب بوده اما در پویش دوم بالا آمده است.

مثال 1. خروجی متنی Ndiff

-Nmap 4.85BETA3 at 2009-03-15 11:00
+Nmap 4.85BETA4 at 2009-03-18 11:00
 photos-cache-snc1.facebook.com (69.63.178.41):
 Host is up.
 Not shown: 99 filtered ports
 PORT   STATE SERVICE VERSION
-80/tcp open  http
+80/tcp open  http    lighttpd 1.5.0
-cm.out.snc1.tfbnw.net (69.63.179.25):
+mailout-snc1.facebook.com (69.63.179.25):
 Host is up.
 Not shown: 100 filtered ports
+69.63.184.145:
+Host is up.
+Not shown: 98 filtered ports
+PORT    STATE SERVICE  VERSION
+80/tcp  open  http     Apache httpd 1.3.41.fb1
+443/tcp open  ssl/http Apache httpd 1.3.41.fb1

خروجی XML که برای پردازش توسط سایر برنامه‌ها در نظر گرفته شده، با گزینه --xml انتخاب می‌شود. این قالب بر پایه خروجی XML ابزار Nmap است همراه با چند عنصر اضافی برای مشخص کردن تفاوت‌ها. سند XML درون عناصر nmapdiff و scandiff محصور شده است. تفاوت‌های میزبان درون تگ‌های hostdiff و تفاوت‌های درگاه درون تگ‌های portdiff قرار می‌گیرند. درون یک hostdiff یا portdiff، تگ‌های a و b وضعیت میزبان یا درگاه را در پویش اول (a) یا پویش دوم (b) نمایش می‌دهند.

مثال 2 تفاوت XML همان پویش‌های نشان‌داده‌شده در مثال 1 را نمایش می‌دهد. توجه کنید که چگونه درگاه ۸۰ از photos-cache-snc1.facebook.com درون تگ‌های portdiff محصور شده است. برای 69.63.179.25، نام میزبان قدیمی در تگ‌های a و نام جدید در b قرار دارد. برای میزبان جدید 69.63.184.145، یک b در hostdiff بدون a متناظر وجود دارد که نشان می‌دهد اطلاعاتی برای این میزبان در پویش اول وجود نداشته است.

مثال 2. خروجی XML ابزار Ndiff

<?xml version="1.0" encoding="UTF-8"?>
<nmapdiff version="1">
  <scandiff>
    <hostdiff>
      <host>
        <status state="up"/>
        <address addr="69.63.178.41" addrtype="ipv4"/>
        <hostnames>
          <hostname name="photos-cache-snc1.facebook.com"/>
        </hostnames>
        <ports>
          <extraports count="99" state="filtered"/>
          <portdiff>
            <port portid="80" protocol="tcp">
              <state state="open"/>
              <a>
                <service name="http"/>
              </a>
              <b>
                <service name="http" product="lighttpd" version="1.5.0"/>
              </b>
            </port>
          </portdiff>
        </ports>
      </host>
    </hostdiff>
    <hostdiff>
      <host>
        <status state="up"/>
        <address addr="69.63.179.25" addrtype="ipv4"/>
        <hostnames>
          <a>
            <hostname name="cm.out.snc1.tfbnw.net"/>
          </a>
          <b>
            <hostname name="mailout-snc1.facebook.com"/>
          </b>
        </hostnames>
        <ports>
          <extraports count="100" state="filtered"/>
        </ports>
      </host>
    </hostdiff>
    <hostdiff>
      <b>
        <host>
          <status state="up"/>
          <address addr="69.63.184.145" addrtype="ipv4"/>
          <ports>
            <extraports count="98" state="filtered"/>
            <port portid="80" protocol="tcp">
              <state state="open"/>
              <service name="http" product="Apache httpd"
                       version="1.3.41.fb1"/>
            </port>
            <port portid="443" protocol="tcp">
              <state state="open"/>
              <service name="http" product="Apache httpd" tunnel="ssl"
                       version="1.3.41.fb1"/>
            </port>
          </ports>
        </host>
      </b>
    </hostdiff>
  </scandiff>
</nmapdiff>

با استفاده از Nmap، Ndiff، cron و یک اسکریپت شل، می‌توان یک شبکه را به‌طور روزانه پویش کرد و گزارش‌های ایمیلی از وضعیت شبکه و تغییرات آن نسبت به پویش پیشین دریافت نمود. مثال 3 اسکریپتی را نشان می‌دهد که این قابلیت را پیاده‌سازی می‌کند.

مثال 3. پویش دوره‌ای شبکه با Ndiff و cron

#!/bin/sh
TARGETS="targets"
OPTIONS="-v -T4 -F -sV"
date=`date +%F`
cd /root/scans
nmap $OPTIONS $TARGETS -oA scan-$date > /dev/null
if [ -e scan-prev.xml ]; then
        ndiff scan-prev.xml scan-$date.xml > diff-$date
        echo "*** NDIFF RESULTS ***"
        cat diff-$date
        echo
fi
echo "*** NMAP RESULTS ***"
cat scan-$date.nmap
ln -sf scan-$date.xml scan-prev.xml

اگر اسکریپت با نام /root/scan-ndiff.sh ذخیره شده است، خط زیر را به crontab کاربر root اضافه کنید:

0 12 * * * /root/scan-ndiff.sh

کد خروج نشان می‌دهد که آیا پویش‌ها یکسان هستند یا خیر.

•۰ نشان می‌دهد که پویش‌ها در تمام جنبه‌های شناخته‌شده برای Ndiff یکسان هستند.
•۱ نشان می‌دهد که پویش‌ها با یکدیگر تفاوت دارند.
•۲ نشان‌دهنده یک خطای زمان اجرا است، مانند عدم موفقیت در باز کردن یک فایل.

اشکالات را به فهرست پستی nmap-dev در نشانی <dev@nmap.org> گزارش دهید.

پروژه Ndiff توسط Michael Pattrick در جریان برنامه Google Summer of Code در سال ۲۰۰۸ آغاز شد. مایکل برنامه را طراحی کرد و بحث پیرامون قالب‌های خروجی آن را هدایت نمود. او نگارش‌هایی از برنامه را به زبان‌های Perl و C++ نوشت، اما تابستان مدت کوتاهی پس از تصمیم‌گیری برای بازنویسی برنامه به زبان Python جهت سازگاری با ویندوز (و Zenmap) به پایان رسید. این نگارش پایتون توسط David Fifield نوشته شد. جیمز لوین (James Levine) در سال ۲۰۰۰ یک اسکریپت پرل به نام Ndiff با عملکردی مشابه منتشر کرد[1].

David Fifield <david@bamsoftware.com>

Michael Pattrick <mpattrick@rhinovirus.org>

https://nmap.org/ndiff

1.
منتشر کرد
03/27/2026 Ndiff