內網IP端口掃描統計+服務識別簡單思路

前提:內網是10網段的,幾乎所有機器都開了80和22端口,所以以此爲依據認爲掃描到的都是在線的IP。
目標是得到在線的IP啓動了哪些端口,儘量猜測端口對應的服務。

  • Centos7 (macos用brew直接安裝就行)
  • Nmap 6.47
  • Masscan 1.0.4
  • Python 2.7.x

centos7

sudo yum install nmap

## masscan 需要編譯安裝了
sudo yum install git gcc make libpcap-devel
git clone https://github.com/robertdavidgraham/masscan
cd masscan/
make 
sudo make install

macos

brew install masscan
brew install nmap

使用方法

sudo masscan -p22,80 10.0.0.0/8 --rate=15000 -oL ips.txt
cat ips.txt|grep -v '#'|awk '{print $4}'|sort| uniq > avaips.txt 
sudo python explore.py avaips.txt 

說明:

  • 首先用masscan掃描所有開放22,80端口的ip,盲掃爲主
  • 然後用awk統計所有ip
  • 接着對每個IP 1~30000 tcp端口掃描,找出來存活的端口,在用 Nmap做服務識別

explore.py

# coding:utf-8
import os
import sys
import subprocess

scan = 'sudo masscan -p1-30000 {0} --rate 15000 -oL tmp.txt'
nmap_scan = 'nmap --version-all {0} -p{1}'

def run_command(cmd):
    """given shell command, returns communication tuple of stdout and stderr"""
    sp = subprocess.Popen(cmd, shell=True, 
                          stdout=subprocess.PIPE, 
                          stderr=subprocess.PIPE)
    sp.wait()
    return sp.communicate()

def clear_tmp(filename):
    try:
       os.remove(filename) 
    except:
        pass

def ip_scan(filename):
    with open(filename) as f:
        for line in f:
            ip = line.strip()
            run_command(scan.format(ip))
            ports_scan(ip)


def ports_scan(ip):
    ports = []
    with open('tmp.txt') as ff:
        for item in ff:
            if item.startswith('#'):
                continue            
            sel = item.strip().split()
            ports.append(sel[2])

        if len(ports) == 0:
            return

        stdout, stderr = run_command(nmap_scan.format(ip, ','.join(ports)))
        if stderr != "":
            print 'error', stderr
            return 
        ress = stdout.split('\n')
        flag = False

        with open('res.txt', 'a+') as f:
            f.write('ip: ' + ip + '\n')
            for r in ress:
                if r.startswith('PORT'):
                    flag = True
                    continue
                if flag and len(r) > 3 and r.find('open') > 0:
                    port, _, service = r.split()
                    f.write('- {0} {1}\n'.format(port, service))


if __name__ == "__main__":
    args = sys.argv 
    if len(args) < 2:
        print 'Usage: %s ip_list_file.txt' % args[0]
        sys.exit(1) 
    clear_tmp('red.txt')
    ip_scan(args[1])    
    clear_tmp('tmp.txt')

整個過程比較慢,可以優化的地方,使用多進程,pipeline等。

得到的結果像下面的樣子

ip: 10.0.10.12
- 22/tcp ssh
- 18089/tcp unknown
- 19088/tcp unknown
- 19088/tcp unknown
- 19089/tcp unknown
ip: 10.0.10.1
- 22/tcp ssh
- 23/tcp telnet
ip: 10.0.10.12
- 22/tcp ssh
- 18089/tcp unknown
- 19088/tcp unknown
- 19089/tcp unknown
...

python調用的命令

掃描某個ip開放的tcp端口

sudo masscan -p1-30000 10.0.10.44 --rate 15000

服務識別,很多識別不出來,這部分也可以自己寫,不過要蒐集很多服務指紋,沒找到很好的替代品

nmap --version-all 10.101.1.249 -p80,22,3456,10050

主要提供一個思路,可以根據需要修改和優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章