內網IP埠掃描統計+服務識別簡單思路
阿新 • • 發佈:2019-01-23
前提:內網是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
主要提供一個思路,可以根據需要修改和優化。