如何从nmap -O输出中获取特定行?

时间:2013-05-19 14:40:26

标签: text sed awk grep nmap

我有许多名为192.168.203.txt的文件作为

的输出
sudo nmap -O --top-ports 192.168.203.* >>192.168.203.txt 

输出如下所示:


Nmap scan report for 192.168.203.29
Host is up (0.00067s latency).
PORT     STATE    SERVICE
21/tcp   closed   ftp
22/tcp   closed   ssh
23/tcp   closed   telnet
25/tcp   closed   smtp
80/tcp   open     http
110/tcp  closed   pop3
139/tcp  filtered netbios-ssn
443/tcp  closed   https
445/tcp  filtered microsoft-ds
3389/tcp filtered ms-wbt-server
Device type: general purpose
Running: Microsoft Windows 2008|7
OS CPE: cpe:/o:microsoft:windows_server_2008::sp2 cpe:/o:microsoft:windows_7
OS details: Microsoft Windows Server 2008 SP2, Microsoft Windows 7 or Windows Server 2008 SP1
Network Distance: 6 hops

我只想像192.168.203.29http或其他端口ssh一样使用open知识产权。也许我会将所有结果IP传递到名为http_open_ip.txt的文件中。

我已尝试使用命令grep ftp

cat *.txt|grep -B 3 "ftp"|grep -B3 "open"|grep "192.168."|awk '{print $5}'|sort -t . -k 3,3n -k  4,4n> ftp_open_ip.txt

因此,我得到了一个文件ftp_open_ip.txt。但我发现此命令不适用于ssh stmp等其他关键字。我该怎么办 ?

2 个答案:

答案 0 :(得分:2)

我不清楚你想要什么。也许,你想要查看所有文件以及所有那些将在一个文件中打开http端口的IP,在另一个文件中打开ssh端口。因此,多个文件中可能存在相同的IP。 假设,下面是awk解决方案

awk 'BEGIN{http_open="http_open";ssh_open="ssh_open";ftp_open="ftp_open"}
  /Nmap scan report for/{ip=$5}
  /ftp/ && /open/{print "ftp open for " ip >> ftp_open}
  /ssh/ && /open/{print "ssh open for " ip >> ssh_open }
  /http/ && /open/{print "http open for " ip >> http_open}
  ' <filename>

它假定文件包含的示例中显示的顺序相同。所以Nmap scan report for行在第5个字段中具有IP。此后,其余的非常简单。如果找到ftp,ssh,http等以及open状态,我们会将输出重定向到相应的文件中。

答案 1 :(得分:0)

而不是所有这些具有挑战性的文本处理,您应该使用Nmap自己的功能,使这种输出处理更容易。首先,Nmap提供了许多output formats和输出到文件的选项。从这个命令开始:

sudo nmap -oA my-scan-%y%m%d -O --top-ports 192.168.203.0/24

-oA my-scan-%y%m%d选项会将扫描输出保存在3个不同的文件中:

$ ls
my-scan-20130520.gnmap   my-scan-20130520.nmap   my-scan-20130520.xml

对于快速查询,.gnmap文件最容易与awkgrep一起使用,但它没有正常中包含的所有有用信息( .nmap)或XML formats。如果您打算使此脚本自动化,或以任何方式扩展它,最好的办法是使用XML输出。

以下是一些可以使用这些输出格式执行所需操作的命令:

awk '/\/open\/tcp\/\/http\//{print $2}' my-scan-*.gnmap > http_open_ip.txt

xmlstarlet sel -t -m "//port[@protocol='tcp' and service/@name='ssh' and state/@state='open']/ancestor::host/address[@addrtype='ipv4']" -v '@addr' -n my-scan-*.xml > ssh_open_ip.txt