码迷,mamicode.com
首页 > 编程语言 > 详细

Hacking By Python---端口扫描1

时间:2017-02-03 13:38:16      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:内容   security   start   lines   先来   mysq   app   pool   变量   

最新初学python,感觉她是一个很可爱很小巧的编程语言,在平时的渗透测试中能经常用到。www.t00ls.net& Z3 Y$ H‘ ^* \2 R
   然后想到来写一系列的文章,就叫做Hacking By Python,先从简单的端口扫描开始,抛砖引玉,希望多多交流。
   
   对于一些基本的python语法在本系列文章中就不提及了,希望大家自学进行参考。www.t00ls.net3 V# d" h4 _: X* }+ |5 P. D
  / f, P9 r- a$ N9 G+ Z‘ @! l
   今天先来一个简单的端口扫描程序,从socket开始。
   首先指定文档编码 - 低调求发展/ N, g. n2 b0 z7 M5 x
#coding:utf-8
然后导入socket包
import socket
定义一个要扫描的IP地址变量: - 低调求发展 - 潜心习安全6 Q1 U7 s4 L: N+ G$ r
ip=‘45.34.182.142‘
接着定义一个需要扫描的端口范围
default_ports=[21,22,80,1433,3306]; ]‘ Y$ u# p+ L. X
然后咱们定义一个扫描的函数
def port_scan(ip,port):
    try: - 低调求发展 - 潜心习安全: W2 a3 C1 @+ v, L( l1 S- C& g, ]
        socket.setdefaulttimeout(3)  #设置一个超时时间
        s=socket.socket()
        s.connect((ip,port))  T00LS3 a! n8 ~+ q- J" B2 X
        print ‘[+] port:%d\topen‘ % portT00ls.Net - 低调求发展 - 潜心习安全 - Focus On Cyber Security1 r  ]# Q& P( J) n
    except:
        pass

这个函数中,咱们接收两个参数,一个为ip地址,另一个为端口号,并且指定了一个超时时间为3秒钟,接着定义了一个socket对象.调用了socket对象的connect函数,注意该函数的接收的参数为一个元组。 - 低调求发展; D- S0 d- R‘ e
最好进行异常处理。
然后启动函数执行扫描
if __name__==‘__main__‘:
    for port in default_ports: # 遍历默认的端口号
        port_scan(ip, port)T00LS: d4 O& U7 \2 f% f
www.t00ls.net  O) @: k0 W$ f. O. K
完整版的代码:

01 #coding:utf-8
02 import socket
03 ip=‘45.34.182.142‘
04 default_ports=[21,22,80,1433,3306]
05  
06 def port_scan(ip,port):
07     try:
08         socket.setdefaulttimeout(3)
09         s=socket.socket()
10         s.connect((ip,port))
11         print ‘[+] port:%d\topen‘ % port
12         s.close()
13     except:
14         pass
15      
16 if __name__==‘__main__‘:
17     for port in default_ports:
18         port_scan(ip, port)

扫描的结果是这个样子:
[+] port:21        openT00ls.Net - 低调求发展 - 潜心习安全 - Focus On Cyber Security- E! ^! M# O. o1 `, Y5 G
[+] port:80        open
www.t00ls.net- I‘ r; ~% U! _5 J: C5 w
www.t00ls.net- O6 L1 Z9 U5 d1 a‘ `
当然,在主函数中咱们也可以使用函数式编程的思想来做,而不需要遍历端口号3 Z- E; x5 K* j3 x$ @) ^
if __name__==‘__main__‘:
    map(port_scan,[ip]*len(default_ports),default_ports)

使用map函数来进行迭代. - 低调求发展 - 潜心习安全7 ^$ [& f. p) F2 p

如果想获取当前端口号对应的服务,可以加一个函数进行查看。
print ‘[+] port:%d\topen\t%s‘ % (port,socket.getservbyport(port))www.t00ls.net0 p, y! D3 E( O" c; m) ?, i

完整代码如下:

01 #coding:utf-8
02 import socket
03 ip=‘45.34.182.142‘
04 default_ports=[21,22,80,1433,3306]
05  
06 def port_scan(ip,port):
07     try:
08         socket.setdefaulttimeout(3)
09         s=socket.socket()
10         s.connect((ip,port))
11         print ‘[+] port:%d\topen\t%s‘ % (port,socket.getservbyport(port))
12         s.close()
13     except:
14         pass
15      
16 if __name__==‘__main__‘:
17     map(port_scan,[ip]*len(default_ports),default_ports)

输出结果:
[+] port:21        open        ftp
[+] port:80        open        httpwww.t00ls.net2 b6 j9 y: ]1 G1 X
- 低调求发展( L, Z3 O+ |5 u‘ J4 T; ^; j
- 低调求发展 - 潜心习安全/ M0 a/ h8 d/ n2 R# N5 ?9 E% L
如果再想查看更详细的响应信息,可以主动发送一个字符串,然后获取响应。T00ls.Net - 低调求发展 - 潜心习安全 - Focus On Cyber Security6 B( G6 y0 v! c& m9 b
s.send(‘dream9\r\n‘)
res=s.recv(40)
- 低调求发展2 g& g; U1 T8 z7 s8 e
完整代码如下:

01 #coding:utf-8
02 import socket
03 ip=‘45.34.182.142‘
04 default_ports=[21,22,80,1433,3306]
05  
06 def port_scan(ip,port):
07     try:
08         socket.setdefaulttimeout(3)
09         s=socket.socket()
10         s.connect((ip,port))
11         s.send(‘dream9\r\n‘)
12         res=s.recv(40)
13         print ‘[+] port:%d\topen\t%s‘ % (port,res)
14         s.close()
15     except:
16         pass
17      
18 if __name__==‘__main__‘:
19     map(port_scan,[ip]*len(default_ports),default_ports)

输出内容如下:T00LS( Q# j- T0 X* a" g
[+] port:21        open        220 Serv-U FTP Server v6.4 for WinSock r9 w; |7 E  |7 B0 T# a- v) ?
[+] port:80        open        HTTP/1.1 400 Bad Request4 \3 w0 U+ t‘ l8 L  }3 q
Content-Type: 
www.t00ls.net$ m  `5 q5 Y7 e1 `
单线程的效率毕竟有限,可以使用多线程来进行完善:
导入threading模块www.t00ls.net8 ~: p) ~1 `7 r" }‘ n
for port in default_ports:T00LS) G0 m# c0 u2 V+ ~
        t=threading.Thread(target=port_scan,args=(ip,port))1 \1 ]- j) T, X" V. O; h6 {
        t.start()
T00ls.Net - 低调求发展 - 潜心习安全 - Focus On Cyber Security. |) f- d  y3 A‘ M; x% b+ [% C
多线程的输出可是无序的.
但是加入了多线程之后,输出的结果会比较乱,所以要对print进行加锁限制。
完整代码如下:

  1. #coding:utf-8
  2. import socket,threading
  3. ip=‘45.34.182.142‘
  4. default_ports=[21,22,80,1433,3306]
  5. lock=threading.Semaphore(value=1)
  6. def port_scan(ip,port):
  7.     try:
  8.         socket.setdefaulttimeout(3)
  9.         s=socket.socket()
  10.         s.connect((ip,port))
  11.         s.send(‘dream9\r\n‘)
  12.         res=s.recv(40)
  13.         lock.acquire()
  14.         print ‘[+] port:%d\topen\t%s‘ % (port,res)
  15.         lock.release()
  16.         s.close()
  17.     except:
  18.         pass
  19.     
  20. if __name__==‘__main__‘:
  21.     for port in default_ports:
  22.         t=threading.Thread(target=port_scan,args=(ip,port))
  23.         t.start()
复制代码

谈到多线程,我更喜欢用并发map

01 #coding:utf-8
02 import socket
03 from multiprocessing.dummy import Pool as ThreadPool
04 from multiprocessing.synchronize import Semaphore
05  
06 ip=‘45.34.182.142‘
07 default_ports=[21,22,80,1433,3306]
08  
09 lock=Semaphore(value=1)
10 def port_scan(port):
11     try:
12         socket.setdefaulttimeout(3)
13         s=socket.socket()
14         s.connect((ip,port))
15         s.send(‘dream9\r\n‘)
16         res=s.recv(40)
17         lock.acquire()
18         print ‘[+] port:%d\topen\t%s‘ % (port,res)
19         lock.release()
20         s.close()
21     except:
22         pass
23      
24 if __name__==‘__main__‘:
25     pool = ThreadPool(10)
26     results = pool.map(port_scan,default_ports)
27     pool.close()
28     pool.join()

就先简单的写道这吧,后面咱们再使用其他的一些python库来完成一些其他功能。

比如我要扫描45.34.182.0---45.34.182.254 这个C段该怎么做?
第一种方式使用拼接:

1 #coding:utf-8
2 ips=[]
3 for in xrange(255):
4     ips.append(‘45.34.182.‘+str(x))
5 print ips

如果是这种方式还有一种简单的方式就是使用列表生成式

1 #coding:utf-8
2 ips=[‘45.34.182.‘+str(x) for in xrange(255)]
3 print ips

第二种方式使用netaddr

1 #coding:utf-8
2 from netaddr import IPNetwork
3 for ip in IPNetwork(‘45.34.182.0/24‘).iter_hosts():
4     print ‘%s‘ % ip

然后获取一个IP范围: - 低调求发展- m  w( S: j! \
比如获取 45.34.182.130 到 45.34.182.140(包含)之间的主机

1 #coding:utf-8
2 from netaddr import IPRange
3 r1 = IPRange(‘45.34.182.130‘‘45.34.182.140‘)
4 for in r1:
5     print r

这些东西仅仅作为演示,就不包含到扫描代码中了,如果大家有兴趣可以自行拼装。5 Z‘ i: f5 z* X" V. w
www.t00ls.net* \3 e, u3 R% a
自己写端口扫描,总感觉在重复造轮子,因为要处理很多的东西(比如协议),如果不嫌麻烦完全可以用scapy库来做,但是可以让大家提升点乐趣,平时在扫描的过程中都在使用nmap进行端口扫描,但是在python中如何使用呢?
安装了python-nmap 之后,也是需要安装nmap的。安装过程就不赘述了。来看一下几个栗子:
对单个IP地址进行扫描,然后查看所有的TCP端口

1 #coding:utf-8
2 import nmap
3  
4 ip=‘45.34.182.142‘
5 scanobj=nmap.PortScanner()
6 scanobj.scan(ip)
7  
8 print scanobj[‘45.34.182.142‘].all_tcp()

再看一个稍微完整点的

01 #coding:utf-8
02 #created by dream9
03 import nmap
04  
05 ip=‘45.34.182.144-145‘
06 scanobj=nmap.PortScanner()
07 scanobj.scan(ip,arguments=‘ -Pn ‘# 可以自定义参数
08  
09 for host in scanobj.all_hosts(): # 获取所扫描的主机
10     for pro in scanobj[host].all_protocols(): # 获取扫描的协议 (ip|tcp|udp|sctp)
11         lport = scanobj[host][pro].keys() # 获取指定协议的所有端口
12         lport.sort() # 端口排序
13         print host
14         for port in lport:
15             ‘ 打印端口号 端口状态  端口对应的服务名称 ‘
16             print ‘%s\t%s\t%s‘ % (port,scanobj[host][pro][port][‘state‘],scanobj[host][pro][port][‘name‘])

输出如下:
45.34.182.144
80        open        http
135        open        msrpc: ^) s) `. j# @; d6 \9 J: Y7 J
445        open        microsoft-dsT00LS) Z0 l4 a2 e8 p9 B4 p
1025        open        NFS-or-IIS - 低调求发展 - 潜心习安全. ^$ |* P* `4 c9 M8 W+ B
1027        open        IIST00LS2 Z& J8 V9 c& J5 f/ O* x; h
3306        open        mysql
3389        open        ms-wbt-server
49152        filtered        unknown
45.34.182.145
80        open        httpT00ls.Net - 低调求发展 - 潜心习安全 - Focus On Cyber Security, A0 N& {‘ k: q6 Z# P) _
135        filtered        msrpc0 ?! J8 ]2 Y0 g! M1 E, C+ G
445        open        microsoft-ds
1025        open        NFS-or-IIS! E( h6 O& }; a" R0 a
1028        open        unknown
3389        open        ms-wbt-server
4444        filtered        krb524
49152        filtered        unknown
www.t00ls.net( K  i+ X* T5 C7 t- Q
OK,一些简单的示例就说这么多,咱们再来看看argparse库。) _  a. R/ }( L" Y) v
这个库是用来干什么的呢?T00LS8 Q! F& i( e* L
还记得sqlmap 中 -u --dump --data --cookie 吗?
不过sqlmap中用的是optparse,这个库就是用来完成一些命令行参数的解析。T00LS+ M3 p; S- R% R( p& v
这货分 位置参数 和 可选参数  位置参数不带 "-" - 低调求发展8 [/ E‘ B. P8 x* Y3 A
这个时间有限,就简单的写一点啊......

01 #coding:utf-8
02 #created by dream9
03 import sys,argparse
04 def usage(msg=None):
05     print ‘Usage python ‘+sys.argv[0]+‘ [Options] use -h for help‘ # 打印帮助信息
06     sys.exit()
07      
08 def test():
09     parser = argparse.ArgumentParser(epilog = ‘这是结束语 可以做一些示例展示‘,description=‘这是描述‘)
10     parser.error = usage # 主要对一些必传参数的没有传递出现的错误情况
11     parser.add_argument(‘-a‘‘--domain‘help="Domain name to enumrate it‘s subdomains", required=True)
12     parser.add_argument(‘-s‘,‘--status‘,help=‘response status‘,nargs=‘?‘,default=200)
13     parser.add_argument(‘-v‘,‘--verbose‘,help=‘verbose‘,action=‘store_true‘)
14     parser.add_argument(‘-l‘,‘--list‘,help=‘list‘,action=‘append‘,default=‘abc‘)
15     args,unknown=parser.parse_known_args()
16      
17     domain=args.domain # 获取命令行中的参数内容
18      
19     if unknown or len(sys.argv)<2:
20         usage()
21      
22     print domain
23      
24 if __name__==‘__main__‘:
25     test()

Hacking By Python---端口扫描1

标签:内容   security   start   lines   先来   mysq   app   pool   变量   

原文地址:http://www.cnblogs.com/test404/p/6362438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!