nmap สามารถแสดงเฉพาะโฮสต์ที่เปิดพอร์ตเฉพาะได้หรือไม่


18

สามารถnmapแสดงรายการโฮสต์ทั้งหมดในเครือข่ายท้องถิ่นที่เปิดทั้ง SSH และ HTTP ได้หรือไม่ หากต้องการทำเช่นนั้นฉันสามารถใช้งานสิ่งต่อไปนี้:

nmap 192.168.1.1-254 -p22,80 --open

อย่างไรก็ตามรายการนี้โฮสต์ที่เปิดพอร์ตรายการใด ๆ ในขณะที่ฉันต้องการโฮสต์ที่เปิดพอร์ตทั้งหมด นอกจากนี้เอาต์พุตค่อนข้างละเอียด:

# nmap 192.168.1.1-254 -p22,80 --open

Starting Nmap 6.47 ( http://nmap.org ) at 2015-12-31 10:14 EST
Nmap scan report for Wireless_Broadband_Router.home (192.168.1.1)
Host is up (0.0016s latency).
Not shown: 1 closed port
PORT   STATE SERVICE
80/tcp open  http

Nmap scan report for new-host-2.home (192.168.1.16)
Host is up (0.013s latency).
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 254 IP addresses (7 hosts up) scanned in 3.78 seconds

สิ่งที่ฉันกำลังมองหาก็คือผลลัพธ์เช่น:

192.168.1.16

เนื่องจากโฮสต์ด้านบนเป็นเพียงพอร์ตเดียวที่เปิดพอร์ตทั้งหมด

แน่นอนฉันสามารถ post-process เอาท์พุท แต่ฉันไม่ต้องการที่จะพึ่งพารูปแบบผลลัพธ์ของ nmap ฉันอยากให้ nmap ทำถ้ามีวิธี


หากคุณต้องการทดสอบเพียงหนึ่งพอร์ต 'nmap -p 22 | grep -B3 open 'เป็นวิธีที่ง่าย
Luciano Andress Martini

คำตอบ:


10

ไม่มีวิธีการทำเช่นนั้นภายใน Nmap แต่ความคิดเห็นของคุณเกี่ยวกับการไม่ต้องการ "พึ่งพารูปแบบเอาต์พุตของ nmap" ให้ฉันชี้ให้เห็นว่า Nmap มีรูปแบบเอาต์พุตที่มีเสถียรภาพสองแบบสำหรับการวิเคราะห์คำที่เครื่องอ่านได้ อันที่เก่ากว่าคือเอาต์พุต Grepable ( -oG)ซึ่งทำงานได้ดีสำหรับการประมวลผลด้วย perl, awk และ grep แต่ขาดเอาต์พุตขั้นสูงบางส่วน (เช่นเอาต์พุตสคริปต์ NSE เหตุผลพอร์ตพอร์ต traceroute ฯลฯ ) รูปแบบที่สมบูรณ์ยิ่งขึ้นคือเอาต์พุต XML ( -oX)แต่อาจเกินความจำเป็นตามวัตถุประสงค์ของคุณ

คุณสามารถบันทึกผลเหล่านี้ไปยังไฟล์ที่มี-oG, -oXหรือ-oA(ทั้งรูปแบบบวก "ปกติ" เอาท์พุทข้อความ) หรือคุณสามารถส่งคนใดคนหนึ่งตรงไป stdout:nmap 192.168.1.1-254-p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'


1
นั่นเป็นสิ่งที่สมบูรณ์แบบสิ่งที่ฉันกำลังมองหา (the -oG -)
Brian

2

พิจารณาawkหนึ่งซับนี้ด้วย:

nmap -Pn -oG -p22,80,443,445 - 100.100.100.100 | awk '/open/{ s = ""; for (i = 5; i <= NF-4; i++) s = s substr($i,1,length($i)-4) "\n"; print $2 " " $3 "\n" s}'

มันจะพิมพ์โฮสต์ทั้งหมดที่มีพอร์ตเปิดที่ระบุไว้ดังนี้:

 100.100.100.100 (some-domain.com)
 22/open/tcp//ssh
 80/open/tcp//http
 443/open/tcp//microsoft-ds
 445/open/tcp//https-alt

คุณต้องเพิ่ม -p หลังจากทดสอบสิ่งนี้ เครื่องหมาย '-' ในบรรทัดคำสั่งจะอยู่หลัง -oG
Wayne

1

ลองคำสั่งต่อไปนี้:

nmap --open -p 22,80 192.168.1.1-254 -oG - | grep "/open" | awk '{ print $2 }'

สิ่งนี้จะสแกนหาพอร์ตของคุณในช่วงของคุณและไพพ์เอาท์พุทในรูปแบบ greppable ที่กำลังมองหาพอร์ตที่เปิดอยู่จากนั้นพิมพ์ที่อยู่ IP ที่เหมาะสมกับเกณฑ์นั้น ๆ


ยินดีต้อนรับสู่ U&L! โปรดทราบว่าคำตอบที่ได้รับการยอมรับเมื่อประมาณ 3 ปีที่ผ่านมามีเวอร์ชันที่ง่ายกว่าซึ่งจะใช้ awk เพื่อ grep และพิมพ์
Jeff Schaller

1
ฉันจะโต้แย้งของฉันดีกว่าเนื่องจากคุณไม่ต้องเพิ่มข้อมูลเพิ่มเติมสำหรับพอร์ตเพิ่มเติมนอกเหนือจากตัวเลือกพอร์ต เขาต้องการให้คุณอัปเดต awk ของคุณด้วยแต่ละพอร์ตเช่นกันซึ่งเป็น verbose ที่ไม่จำเป็น
Marshall Hallenbeck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.