شرح محرك الفحص المتقدم Nmap Script Enginet | NSE

شرح محرك الفحص المتقدم Nmap Script Enginet | NSE

أداة Nmap هي واحدة من أفضل أدوات الفحص و اختبار الاختراق على الاطلاق, وهذا الكلام ليس مبالغة لأن الاداة مزودة بميزات اخرى غير فحص الهوستات والبورتات, nmap مزودة بخاصية متقدمة تدعى Nmap Script Engine وتجدها بالانترنت باختصار NSE.

ماهو سكربت NSE ؟

ببساطة هي سكريبتات Script  موجودة في الكاللي لينكس مسبقًا بالمسار الأتي
cd /usr/share/nmap/scripts/
وهذه السكريبتات عبارة عن مهام مبرمجة ومجمعة مسبقا تغنيك عن كتابة الأوامر من جهة, ومن جهة أخرى تغنيك عن استعمال أدوات أخرى. فعلا سبيل المثال يمكنك عن طريق NSE وبواسطة Nmap فقط فعل ما يلي:
اختراق السيرفر, التخمين على السيرفرات والمواقع والاجهزة ssh smb ftp وغيرهم, اكتشاف الثغرات, معرفة نوع النظام ... لو كتبت جميع ما يمكن فعله بواسطة اداة ان ماب لا يكفيني موضوع واحد.

طريقة استعمال NSE

ببساطة أكتب أسم الاداة nmap وامامها أكتب --script بعدها أدخل اسم السكريبت المراد استعماله
 <ايبي الضحية الهدف> <اسم السكريبت> nmap --script
السكريبتات موجودة بالمسار
cd /usr/share/nmap/scripts/
وهذه بعض السكريبتات الموجودة بالاداة كلها تبلغ  590  لحد كتابتي الموضوع

  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

بعض الأمثلة:
سأستعمل سكريبت http-enum فهو ينفذ Brute Force على مسار الخادم من أجل اكتشاف تطبيقات الويب.فإنه يختبر أكثر من 2000 مسار الخادم. إن عمل هذا السكريبت NSE يشبه NIKTO.

nmap -p80 --script http-enum 192.168.1.16
والنتيجة

  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

وهذا مثال اخر باستعمال http-title

nmap --script http-title 192.168.1.16
نتيجة تطبيق الأمر


  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

وهذا مثال أخير باستعمال سكريبت smb-discovery دوره

تحديد نظام التشغيل واسم الكمبيوتر واسم netbios والمجال مع البرنامج النصي smb-os-discovery.nse. قد تكون حالة استخدام المثال هي استخدام هذا البرنامج النصي للعثور على كافة مضيفي Windows XP على شبكة كبيرة ، بحيث يمكن فصلها وإلقائها (لم يعد Windows XP مدعومًا من قِبل Microsoft). الميزة الأساسية لاستخدام Nmap لشيء من هذا القبيل بدلاً من أداة Microsoft الأصلية هي أنها ستجد جميع الأنظمة المتصلة بالشبكة ليس فقط تلك المتصلة بالنطاق.

nmap -p 445 --script smb-os-discovery 192.168.1.16
والنتيجة

  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

تصنيفات السكريبتات NSE 


auth لاكتشاف بيانات الدخول مثل اليوزر.
Discovery هو صنف يجمع السكريبتات الخاصة بعمليات الاستطلاع والكشف على الخدمات والبورتات
Dos خاص بعمل هجمات حجب الخدمة على الخدمات المختلفة
exploit للبحث عن الثغرات وتطبيق الاختراق
brute للتخمين على الخدمات
malware البحث عن باكدور
vuln استكشاف الثغرات بالخدمات والسيرفرات والمواقع
fuzzer يعرفها مكتشفي الاخطاء والثغرات فهي تعمل على حقن البيانات بالمواقع والبرامج عبر جميع المدخلات بالبرنامج حتى يحدث خطأ امتلاء الذاكرة مثلا.
default تستعمل السكريبتات العامة والشائعة على الهدف

استعمال NSE Nmap بطرق متقدمة وسهلة

يمكننا استعمال سكريبتات الانماب NSE  بطرق متقدمة فمثلا بدل استعمال السكريبتات عن طريق اسم السكريبت http-title
كالامثلة السابقة:

nmap --script http-title <الهدف>

nmap -p80 --script http-huawei-hg5xx-vuln <الهدف>
 ضع فاصلة بين السكريبتات المختلفة
nmap --script http-title,http-methods <الهدف>

نستعمل البحث عن طريق التصنيف, بمعنى عندما نستعمل التصنيف Discovery سيستعمل السكريبتات الخاصة بالاستطلاع وكشف الخدمات بهذه الطريقة:

nmap --script discovery 192.168.1.16
ستظهر الكثير من النتائج كما بالصور


  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾


  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

لم أستطع تصويرها كلها فهي كثيرة لذا قمت بنسخ بعض النتائج هنا بالأسفل

root@bt:~# nmap --script discovery 192.168.1.16
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-01 02:00 CET
Pre-scan script results:
| broadcast-igmp-discovery:
|   192.168.1.15
|     Interface: wlan0
|     Version: 2
|     Group: 224.0.0.251
|     Description: mDNS (rfc6762)
|   192.168.1.15
|     Interface: wlan0
|     Version: 2
|     Group: 224.0.0.252
|     Description: Link-local Multicast Name Resolution (rfc4795)
|   192.168.1.15
|     Interface: wlan0
|     Version: 2
|     Group: 239.255.255.250
|     Description: Organization-Local Scope (rfc2365)
|_  Use the newtargets script-arg to add the results as targets
| ipv6-multicast-mld-list:
|   fe80::a00:27ff:fe50:55eb:
|     device: wlan0
|     mac: fa:aa:09:28:40:49
|     multicast_ips:
|       ff02::1:ff50:55eb         (NDP Solicited-node)
|       ff02::1:ff50:55eb         (NDP Solicited-node)
|   fe80::2a3b:82ff:febf:c29c:
|     device: wlan0
|     mac: 28:3b:82:bf:c2:9c
|     multicast_ips:
|       ff02::1:ff00:0            (Solicited-Node Address)
|       ff02::16                  (All MLDv2-capable routers)
|       ff02::1:ffbf:c29c         (NDP Solicited-node)
|_      ff02::2                   (All Routers Address)
| lltd-discovery:
|   192.168.1.1
|     Hostname: BRCM_ROUTER
|     Mac: 28:3b:82:bf:c2:9c (Unknown)
|_  Use the newtargets script-arg to add the results as targets
| targets-asn:
|_  targets-asn.asn is a mandatory parameter
| targets-ipv6-multicast-echo:
|   IP: fe80::2a3b:82ff:febf:c29c  MAC: 28:3b:82:bf:c2:9c  IFACE: wlan0
|   IP: fe80::a00:27ff:fe50:55eb   MAC: 08:00:27:50:55:eb  IFACE: wlan0
|_  Use --script-args=newtargets to add the results as targets
| targets-ipv6-multicast-invalid-dst:
|   IP: fe80::2a3b:82ff:febf:c29c  MAC: 28:3b:82:bf:c2:9c  IFACE: wlan0
|   IP: fe80::a00:27ff:fe50:55eb   MAC: 08:00:27:50:55:eb  IFACE: wlan0
|_  Use --script-args=newtargets to add the results as targets
| targets-ipv6-multicast-mld:
|   IP: fe80::2a3b:82ff:febf:c29c  MAC: 28:3b:82:bf:c2:9c  IFACE: wlan0
|   IP: fe80::a00:27ff:fe50:55eb   MAC: 08:00:27:50:55:eb  IFACE: wlan0
|
|_  Use --script-args=newtargets to add the results as targets
| targets-ipv6-multicast-slaac:
|   IP: fe80::a00:27ff:fe50:55eb  MAC: 08:00:27:50:55:eb  IFACE: wlan0
|_  Use --script-args=newtargets to add the results as targets
Stats: 0:01:44 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 99.96% done; ETC: 02:02 (0:00:00 remaining)
Nmap scan report for 192.168.1.16
Host is up (0.00092s latency).
Not shown: 977 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
|_banner: 220 (vsFTPd 2.3.4)
| ftp-syst:
|   STAT:
| FTP server status:
|      Connected to 192.168.1.10
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      vsFTPd 2.3.4 - secure, fast, stable
|_End of status
22/tcp   open  ssh
|_banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
| ssh-hostkey:
|   1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)
|_  2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)
| ssh2-enum-algos:
|   kex_algorithms: (4)
|   server_host_key_algorithms: (2)
|   encryption_algorithms: (13)
|   mac_algorithms: (7)
|_  compression_algorithms: (2)
23/tcp   open  telnet
|_banner: \xFF\xFD\x18\xFF\xFD \xFF\xFD#\xFF\xFD'
| telnet-encryption:
|_  Telnet server does not support encryption
25/tcp   open  smtp
|_banner: 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)
|_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,
|_smtp-open-relay: Server doesn't seem to be an open relay, all tests failed
| ssl-cert: Subject: commonName=ubuntu804-base.localdomain/organizationName=OCOSA/stateOrProvinceName=There is no such thing outside US/countryName=XX
| Not valid before: 2010-03-17T14:07:45
|_Not valid after:  2010-04-16T14:07:45
|_ssl-date: 2018-11-01T01:01:06+00:00; 0s from scanner time.
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA - E
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 1024) - D
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 1024) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 1024) - A
|       TLS_DHE_RSA_WITH_DES_CBC_SHA (dh 1024) - D
|       TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA - F
|       TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 - F
|       TLS_DH_anon_WITH_3DES_EDE_CBC_SHA - F
|       TLS_DH_anon_WITH_AES_128_CBC_SHA - F
|       TLS_DH_anon_WITH_AES_256_CBC_SHA - F
|       TLS_DH_anon_WITH_DES_CBC_SHA - F
|       TLS_DH_anon_WITH_RC4_128_MD5 - F
|       TLS_RSA_EXPORT_WITH_DES40_CBC_SHA - E
|       TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - E
|       TLS_RSA_EXPORT_WITH_RC4_40_MD5 - E
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
|       TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
|     compressors:
|       DEFLATE
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher DES vulnerable to SWEET32 attack
|       64-bit block cipher DES40 vulnerable to SWEET32 attack
|       64-bit block cipher RC2 vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       CBC-mode cipher in SSLv3 (CVE-2014-3566)
|       Ciphersuite uses MD5 for message integrity
|       Weak certificate signature: SHA1
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA - E
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 1024) - D
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 1024) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 1024) - A
|       TLS_DHE_RSA_WITH_DES_CBC_SHA (dh 1024) - D
|       TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA - F
|       TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 - F
|       TLS_DH_anon_WITH_3DES_EDE_CBC_SHA - F
|       TLS_DH_anon_WITH_AES_128_CBC_SHA - F
|       TLS_DH_anon_WITH_AES_256_CBC_SHA - F
|       TLS_DH_anon_WITH_DES_CBC_SHA - F
|       TLS_DH_anon_WITH_RC4_128_MD5 - F
|       TLS_RSA_EXPORT_WITH_DES40_CBC_SHA - E
|       TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - E
|       TLS_RSA_EXPORT_WITH_RC4_40_MD5 - E
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
|       TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
|     compressors:
|       DEFLATE
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher DES vulnerable to SWEET32 attack
|       64-bit block cipher DES40 vulnerable to SWEET32 attack
|       64-bit block cipher RC2 vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|       Weak certificate signature: SHA1
|_  least strength: F
53/tcp   open  domain
|_dns-nsec-enum: Can't determine domain for host 192.168.1.16; use dns-nsec-enum.domains script arg.
|_dns-nsec3-enum: Can't determine domain for host 192.168.1.16; use dns-nsec3-enum.domains script arg.
| dns-nsid:
|_  bind.version: 9.4.2
80/tcp   open  http
|_http-apache-negotiation: mod_negotiation enabled.
| http-auth-finder:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.168.1.16
|   url                                                   method
|   http://192.168.1.16:80/dvwa/                          FORM
|   http://192.168.1.16:80/phpMyAdmin/                    FORM
|   http://192.168.1.16:80/dvwa/login.php                 FORM
|   http://192.168.1.16:80/phpMyAdmin/index.php           FORM
|_  http://192.168.1.16:80/twiki/TWikiDocumentation.html  FORM
|_http-chrono: Request times for /; avg: 297.14ms; min: 194.40ms; max: | http-auth-finder:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.168.1.16
|   url                                      method
|   http://192.168.1.16:8180/manager/status  HTTP: Basic
|   http://192.168.1.16:8180/admin/          FORM
|_  http://192.168.1.16:8180/manager/html    HTTP: Basic
|_http-chrono: Request times for /; avg: 1773.74ms; min: 214.36ms; max: 4702.71ms
|_http-date: Thu, 01 Nov 2018 01:01:05 GMT; -1s from local time.
| http-default-accounts:
|   [Apache Tomcat] at /manager/html/
|_    tomcat:tomcat
| http-enum:
|   /admin/: Possible admin folder
|   /admin/index.html: Possible admin folder
|   /admin/login.html: Possible admin folder
|   /admin/admin.html: Possible admin folder
|   /admin/account.html: Possible admin folder
|   /admin/admin_login.html: Possible admin folder
|   /admin/home.html: Possible admin folder
|   /admin/admin-login.html: Possible admin folder
|   /admin/adminLogin.html: Possible admin folder
|   /admin/controlpanel.html: Possible admin folder
|   /admin/cp.html: Possible admin folder
|   /admin/index.jsp: Possible admin folder
|   /admin/login.jsp: Possible admin folder
|   /admin/admin.jsp: Possible admin folder
|   /admin/home.jsp: Possible admin folder
|   /admin/controlpanel.jsp: Possible admin folder
|   /admin/admin-login.jsp: Possible admin folder
|   /admin/cp.jsp: Possible admin folder
|   /admin/account.jsp: Possible admin folder
|   /admin/admin_login.jsp: Possible admin folder
|   /admin/adminLogin.jsp: Possible admin folder
|   /manager/html/upload: Apache Tomcat (401 Unauthorized)
|   /manager/html: Apache Tomcat (401 Unauthorized)
|   /admin/view/javascript/fckeditor/editor/filemanager/connectors/test.html: OpenCart/FCKeditor File upload
|   /admin/includes/FCKeditor/editor/filemanager/upload/test.html: ASP Simple Blog / FCKeditor File Upload
|   /admin/jscript/upload.html: Lizard Cart/Remote File upload
|_  /webdav/: Potentially interesting folder
|_http-favicon: Apache Tomcat
| http-grep:
|   (2) http://192.168.1.16:8180/:
|     (2) email:
|       + users@tomcat.apache.org
|       + dev@tomcat.apache.org
|   (3) http://192.168.1.16:8180/tomcat-docs/changelog.html:
|     (3) email:
|       + remm@apache.org
|       + yoavs@apache.org
|       + fhanik@apache.org
|   (1) http://192.168.1.16:8180/tomcat-docs/:
|     (1) email:
|_      + craigmcc@apache.org
| http-headers:
|   Server: Apache-Coyote/1.1
|   Content-Type: text/html;charset=ISO-8859-1
|   Date: Thu, 01 Nov 2018 01:01:06 GMT
|   Connection: close
|  
|_  (Request type: HEAD)
|_http-title: Apache Tomcat/5.5
| http-vhosts:
|_127 names had status 200
MAC Address: 08:00:27:50:55:EB (Oracle VirtualBox virtual NIC)

Host script results:
|_dns-brute: Can't guess domain of "192.168.1.16"; use dns-brute.domain script argument.
|_fcrdns: FAIL (No PTR record)
|_ipidseq: All zeros
|_msrpc-enum: NT_STATUS_OBJECT_NAME_NOT_FOUND
|_nbstat: NetBIOS name: METASPLOITABLE, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
|_path-mtu: PMTU == 1500
| qscan:
| PORT  FAMILY  MEAN (us)  STDDEV  LOSS (%)
| 1     0       446.80     71.34   0.0%
| 21    0       483.20     85.39   0.0%
| 22    0       525.10     170.05  0.0%
| 23    0       447.30     108.34  0.0%
| 25    0       511.78     99.24   10.0%
| 53    1       508.60     68.68   0.0%
| 80    0       492.60     74.90   0.0%
| 111   0       441.70     59.25   0.0%
|_139   1       530.20     113.72  0.0%
| smb-mbenum:
|_  ERROR: Failed to connect to browser service: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [12]
| smb-os-discovery:
|   OS: Unix (Samba 3.0.20-Debian)
|   NetBIOS computer name:
|   Workgroup: WORKGROUP\x00
|_  System time: 2018-10-31T21:01:10-04:00
|_smb2-time: Protocol negotiation failed (SMB2)

Nmap done: 1 IP address (1 host up) scanned in 166.20 seconds
root@bt:~#
  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

طريقة استعمال صنف vuln لمعرفة الثغرات الموجودة على السيرفر
nmap --script vuln 192.168.1.16
ستظهر النتائج بالتفصيل 

هنا يظهر السيرفر مصاب بعدة ثغرات مثل ثغرة FTP ويعطيك استغلال الثغرة

ظهرت بالصورة أسفل ثغرات CSRF
وفي هذه الصورة السيرفر مثصاب بثغرات Sql Injection 

وهنا يظهر المجلدات الموجودة بالسيرفر ولوجة التحكم وغيرها من المعلومات المفيدة , وفي الأسفل السيرفر مصاب بثغرة تمكننا من تطبيق هجوم حجب الخدمة بواسطة أداة Slowloris


حيل في التعامل مع العبارات

يمكننا استعمال جميع سكريبتات البحث واستثناء البعض, لاستثناء سكريبت نضع العبارة not 
العبارة or تعني أو

استثناء أمر من البحث

هذا الأمر أسفل مثلا
nmap --script "not(intrusive or dos or exploit)" -sV <الهدف>
يعني قم باستعمال جميع السكريبتات باستثناء dos أو intrusive أو  exploit .

استعمال امر الجمع and


nmap --script "broadcast and discovery" <الهدف>
في الأمر السابق استعملنا and ومعنى الأمر قم باستخدام السكريبت broadcast و discovery معًا

استعمال العلامة * في NSE وهي تعني أي شيء أو الكل
في الأمر
nmap --script "snmp-*" <الهدف>
> معناه استعمل اي سكريبت يبدأ ب snmp- ولا يهم بماذا ينتهي.


سنحاول دمج أمرين ولنجعل الامر أكثر تعقيد


nmap --script "http-* and not(exploit)" <الهدف>
هنا استعملنا كل السكريبتات التي تبدا ب http- باستثناء exploit

استعمال مدخلات أخرى (script-args) مع NSE سنقوم مثلا بالفحص وجعل الأمر يظهر عند الضحية وكأنني أستعمل متصفح أخر باستعمال خاصية user-agent

nmap -sV --script http-title --script-args http.useragent="Mozilla 1337"
<الهدف>
  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾

ملاحظة: يمكن صنع سكريبتات خاصة بك باستعمال لغة LUA 

تنقيح سكريبت Debugging NSE scripts


ان أردت تنقيح ومعرفة اين يقع المشكل بالسكريبت ضع الأمر الاتي script-trace

nmap --script exploit --script-trace <الهدف>

وهذا الامر لتنقيح الحزم packet-trace

nmap -O --script myscript.nse --packet-trace <الهدف>

طريقة تحديث السكريبتات NSE

لتحديثها قم بادخال الأمر الأتي بالطرفية:
nmap --script-updatedb
  ✿◕‿◕✿ ❀◕‿◕❀ ❁◕‿◕❁ ✾◕‿◕✾
لمعرفة المزيد حول NSE وكيفية تصميم سكريبت خاص بك انصحك بكتاب عنوانه
Mastering Nmap Scripting Engine Book