sy_IFM 1.0 | 一个自动化信息收集小工具

/ 2评 / 0

0x00

好久都没有更新博客了,一直没有时间去整理。近期由于实习在信息收集上,老是得ping一下域名,看看域名和记录的iP是否为同一个,还有写报告的时候得把网站的标题给取出来写报告上,再者就是端口扫描了,每次都是重复这些操作,所以也就有了这个自动化小工具的产生了,sy_IFM 1.0.py 意思很简单就是shiyan的信息收集小工具1.0版,毕竟第一版坑多,所以以后慢慢维护改善把。

0x01

在写这个小工具前,肯定是先构思如何去写,恩,其中细分化的话也就三个功能,第一输入域名,然后把域名转换为ip,然后再通过ip得到这个ip的物理地址。第二个功能就是端口扫描了,在思考这个的时候,我想过使用socket来直接探测,但是不知道为什么,这个方法去探测,探测了还没几分钟我电脑就CPU高飙直接死机了。。。然后我还是老老实实的调用nmap模块吧。第三个功能就是输入域名,然后显示域名和网站的标题。当然为了好区分我还调用了一个colour模块,这个是luan他当初写luanmap时自己造的一个轮子,我以前不是说过我通读过这个源码,但是读的头蒙蒙的就没继续了。

0x02

首先,我们先设计第一个功能,把域名转换为ip,然后再获得域名的物理地址。

我使用了四个模块分别是 socket ,requests,re,还有一个colour模块。

# coding:utf-8

import socket
import requests
import re
from colour import *

class DNSYM(object):

    def __init__(self,ip):
        self.ip = ip

    def DNS_ip(self):
        IP = socket.gethostbyname(self.ip)
        # return IP
        printGreen(u"[-] 域名IP地址")
        print IP

    def IP(self):
        IP = socket.gethostbyname(self.ip)
        return IP

    def IP_dZ(self):
        IP = socket.gethostbyname(self.ip)
        _ipdz = "http://ip.chinaz.com/?ip={}"
        _ipqq = _ipdz.format(IP)
        _jddz = requests.get(_ipqq)
        ip_text = _jddz.text
        zz = "<span class="\&quot;Whwtdhalf">(.*?)</span>"
        f = re.findall(zz, ip_text)
        for i in f:
            if re.findall('IP',i):
                ipcl = u'[+] ' + i
                printGreen(ipcl)
            else:
                print i

原理很简单,使用socket来直接获取域名的真实ip,然后通过调用接口,把物理地址也给获取开。

0x03

然后,我们继续写第二个端口扫描的模块。

这里我是直接调用一个nmap模块,这里得说明一下,python默认库是没有这个的,你得自己安装下,就是 pip install python-nmap ,大家电脑上应该都装了nmap了吧,所以这里光装一个这个库就行了。

# coding:utf-8

import nmap

class DKSM(object):

    def __init__(self,ip,dk):
        self.ip = ip
        self.dk = dk
        self.nm = nmap.PortScanner()
        self.nm.scan(self.ip, self.dk)

    def host_nm(self):
        h_n = self.nm.all_hosts()
        return h_n

    def host_xy(self):
        h_x = self.nm[self.ip].all_protocols()
        return h_x

    def host_tc(self):
        for ipdz in self.host_nm():
            for xy in self.host_xy():
                dk_list = self.nm[ipdz][xy].keys()
                dk_list.sort()
                for port in dk_list:
                    print u'端口 : %s\t探测结果 : %s' % (port, self.nm[ipdz][xy][port]['state'])

我这里只取出了通过tcp探测出来的开放端口,这里需要注意的一点是,扫端口的范围是自己设置,这个我在最后运行的那个py文件里设置。

0x04

最后一个就是输入域名,然后取出域名和这个域名网站名,我当时在想的时候直接取html里的title标签里的名字不就行了,因为网站的名字都是在这里。

# coding:utf-8

import re
import requests

class BTXS(object):

    def __init__(self,ip):
        self.ip = ip

    def bt_xs(self):
        requ_http = 'http://'+ self.ip
        requ = requests.get(requ_http)
        requ_txt = requ.text
        regz = ''
        requ_re = re.findall(regz,requ_txt)
        for i in requ_re:
            print '+ - + - + - + - + - + - + - + - + - + - + - +'
            print '测试 URL:',self.ip
            print '网站名称:',i
            print '+ - + - + - + - + - + - + - + - + - + - + - +'

0x05

对了 colour 这个模块还没介绍了,因为在python的默认颜色库里,都是使用的颜色标签,所以可能存在不兼容Linux和win同时的显示,所以,luan 就自己造了这个模块,原理上主要是通过调用系统本身的设置,然后设置下参数,最后弄了四个颜色模块,分别是:提示信息 printBlue,成功信息 printGreen,失败信息 printRed,警告信息 printYellow 这四个颜色函数。

import platform

if 'Windows' in platform.system():
	import sys
	import ctypes
	__stdInputHandle = -10
	__stdOutputHandle = -11
	__stdErrorHandle = -12
	__foreGroundBLUE = 0x09
	__foreGroundGREEN = 0x0a
	__foreGroundRED = 0x0c
	__foreGroundYELLOW = 0x0e
	stdOutHandle=ctypes.windll.kernel32.GetStdHandle(__stdOutputHandle)
	def setCmdColor(color,handle=stdOutHandle):
		return ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
	def resetCmdColor():
		setCmdColor(__foreGroundRED | __foreGroundGREEN | __foreGroundBLUE)
	def printBlue(msg):
		setCmdColor(__foreGroundBLUE)
		sys.stdout.write(msg + '\n')
		resetCmdColor()
	def printGreen(msg):
		setCmdColor(__foreGroundGREEN)
		sys.stdout.write(msg + '\n')
		resetCmdColor()
	def printRed(msg):
		setCmdColor(__foreGroundRED)
		sys.stdout.write(msg + '\n')
		resetCmdColor()
	def printYellow(msg):
		setCmdColor(__foreGroundYELLOW)
		sys.stdout.write(msg + '\n')
		resetCmdColor()
else:
	STYLE = {
		'fore':{
			   'red': 31,
			   'green': 32,
			   'yellow': 33,
			   'blue': 34,
		}
	}
	def UseStyle(msg, mode = '', fore = '', back = '40'):
		fore  = '%s' % STYLE['fore'][fore] if STYLE['fore'].has_key(fore) else ''
		style = ';'.join([s for s in [mode, fore, back] if s])
		style = '\033[%sm' % style if style else ''
		end   = '\033[%sm' % 0 if style else ''
		return '%s%s%s' % (style, msg, end)
	def printRed(msg):
		print UseStyle(msg,fore='red')
	def printGreen(msg):
		print UseStyle(msg,fore='green')
	def printYellow(msg):
		print UseStyle(msg,fore='yellow')
	def printBlue(msg):
		print UseStyle(msg,fore='blue')

0x06

最后一个就是我们的主运行模块了,说白了就是直接调用的模块,因为各大功能模块都完成了就剩下调用了。

# coding:utf-8

from DNSYM import *
from DKSM import *
import time,sys
from urlparse import urlparse
from colour import *
from BTXS import *

printBlue('''
/¯¯¯¯¯/ '|¯¯¯|¯¯¯|    O    \¯¯¯|¯¯¯/|    /¯¯¯¯¯| |¯¯¯\|¯¯¯| 
\ __¯¯¯\' |       |°|¯¯¯¯|  \     /    /   !   | |       '||
/______/||___|___|  |____|   |___|'  /___/¯|__'| |___|\___| 

''')

_ym = "%s" %(sys.argv[1])
a = urlparse(_ym)
b = a.netloc
ks = BTXS(b)
ks.bt_xs()
time.sleep(1)
printGreen(u'[+] 正在探测域名IP地址和物理地址中...')
time.sleep(1)
c = DNSYM(b)
c.DNS_ip()
c.IP_dZ()
printGreen(u'[-] 正在扫描域名开放端口中...')
cc = c.IP()
d = DKSM(cc,'0-100')
d.host_tc()
printGreen(u'[+] 结束所有探测')

额,可能这里我写的太丑了,毕竟我也懒的改,直接把我测试调用时的代码给贴上来了。等后续更加完善功能的时候再继续改写这里的主调用运行模块吧。

0x07

目前已知的bug为第一个运行调用的把域名取出来,显示URL和网站名称这里,主要是编码转换问题,由于我在IDE里没有出现这个问题,但是在cmd里有时会出现报错,在Linux的shell下,我没有测试过。

下面是在Windows10的CMD下运行成功的样子。

G:\>sy_IFM.py http://sh1yan.top

/¯¯¯¯¯/ '|¯¯¯|¯¯¯|    O    \¯¯¯|¯¯¯/|    /¯¯¯¯¯| |¯¯¯\|¯¯¯| 
\ __¯¯¯' |       |°|¯¯¯¯|  \     /    /   !   | |       '||
/______/||___|___|  |____|   |___|'  /___/¯|__'| |___|\___| 


+ - + - + - + - + - + - + - + - + - + - + - +
测试 URL: sh1yan.top
网站名称: shiyan's Blog
+ - + - + - + - + - + - + - + - + - + - + - +
[+] 正在探测域名IP地址和物理地址中...
[-] 域名IP地址
104.28.14.70
[+] IP的物理位置
美国 CloudFlare公司CDN节点
[-] 正在扫描域名开放端口中...
端口 : 80	探测结果 : open
[+] 结束所有探测

0x08

注:代码主要为 python2.7 编写的,建议使用 python2.7 运行。

百度网盘:

链接: https://pan.baidu.com/s/1bpKzBdH 密码: mhbj

Github:

https://github.com/shiyan-520/sy_IFM

2条回应:“sy_IFM 1.0 | 一个自动化信息收集小工具”

  1. 大米说道:

    好东西啊 先收藏再说

发表评论

电子邮件地址不会被公开。 必填项已用*标注