标签:内容   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
完整版的代码:
04 | 
default_ports=[21,22,80,1433,3306] | 
 
06 | 
def port_scan(ip,port): | 
 
08 | 
        socket.setdefaulttimeout(3) | 
 
11 | 
        print ‘[+] port:%d\topen‘ % port | 
 
16 | 
if __name__==‘__main__‘: | 
 
17 | 
    for port in default_ports: | 
 
 
 
扫描的结果是这个样子:
[+] 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
完整代码如下:
04 | 
default_ports=[21,22,80,1433,3306] | 
 
06 | 
def port_scan(ip,port): | 
 
08 | 
        socket.setdefaulttimeout(3) | 
 
11 | 
        print ‘[+] port:%d\topen\t%s‘ % (port,socket.getservbyport(port)) | 
 
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
完整代码如下:
04 | 
default_ports=[21,22,80,1433,3306] | 
 
06 | 
def port_scan(ip,port): | 
 
08 | 
        socket.setdefaulttimeout(3) | 
 
13 | 
        print ‘[+] port:%d\topen\t%s‘ % (port,res) | 
 
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进行加锁限制。
完整代码如下:
- #coding:utf-8
 
- import socket,threading
 
- ip=‘45.34.182.142‘
 
- default_ports=[21,22,80,1433,3306]
 
- lock=threading.Semaphore(value=1)
 
- def port_scan(ip,port):
 
-     try:
 
-         socket.setdefaulttimeout(3)
 
-         s=socket.socket()
 
-         s.connect((ip,port))
 
-         s.send(‘dream9\r\n‘)
 
-         res=s.recv(40)
 
-         lock.acquire()
 
-         print ‘[+] port:%d\topen\t%s‘ % (port,res)
 
-         lock.release()
 
-         s.close()
 
-     except:
 
-         pass
 
-     
 
- if __name__==‘__main__‘:
 
-     for port in default_ports:
 
-         t=threading.Thread(target=port_scan,args=(ip,port))
 
-         t.start()
 
复制代码
 
谈到多线程,我更喜欢用并发map
03 | 
from multiprocessing.dummy import Pool as ThreadPool | 
 
04 | 
from multiprocessing.synchronize import Semaphore | 
 
07 | 
default_ports=[21,22,80,1433,3306] | 
 
09 | 
lock=Semaphore(value=1) | 
 
12 | 
        socket.setdefaulttimeout(3) | 
 
18 | 
        print ‘[+] port:%d\topen\t%s‘ % (port,res) | 
 
24 | 
if __name__==‘__main__‘: | 
 
26 | 
    results = pool.map(port_scan,default_ports) | 
 
 
 
就先简单的写道这吧,后面咱们再使用其他的一些python库来完成一些其他功能。
比如我要扫描45.34.182.0---45.34.182.254 这个C段该怎么做?
第一种方式使用拼接:
4 | 
    ips.append(‘45.34.182.‘+str(x)) | 
 
 
 
如果是这种方式还有一种简单的方式就是使用列表生成式
2 | 
ips=[‘45.34.182.‘+str(x) for x in xrange(255)] | 
 
 
 
第二种方式使用netaddr
2 | 
from netaddr import IPNetwork | 
 
3 | 
for ip in IPNetwork(‘45.34.182.0/24‘).iter_hosts(): | 
 
 
 
然后获取一个IP范围: - 低调求发展- m  w( S: j! \
比如获取 45.34.182.130 到 45.34.182.140(包含)之间的主机
2 | 
from netaddr import IPRange | 
 
3 | 
r1 = IPRange(‘45.34.182.130‘, ‘45.34.182.140‘) | 
 
 
 
这些东西仅仅作为演示,就不包含到扫描代码中了,如果大家有兴趣可以自行拼装。5 Z‘ i: f5 z* X" V. w
www.t00ls.net* \3 e, u3 R% a
自己写端口扫描,总感觉在重复造轮子,因为要处理很多的东西(比如协议),如果不嫌麻烦完全可以用scapy库来做,但是可以让大家提升点乐趣,平时在扫描的过程中都在使用nmap进行端口扫描,但是在python中如何使用呢?
安装了python-nmap 之后,也是需要安装nmap的。安装过程就不赘述了。来看一下几个栗子:
对单个IP地址进行扫描,然后查看所有的TCP端口
5 | 
scanobj=nmap.PortScanner() | 
 
8 | 
print scanobj[‘45.34.182.142‘].all_tcp() | 
 
 
 
再看一个稍微完整点的
05 | 
ip=‘45.34.182.144-145‘ | 
 
06 | 
scanobj=nmap.PortScanner() | 
 
07 | 
scanobj.scan(ip,arguments=‘ -Pn ‘)  | 
 
09 | 
for host in scanobj.all_hosts():  | 
 
10 | 
    for pro in scanobj[host].all_protocols():  | 
 
11 | 
        lport = scanobj[host][pro].keys()  | 
 
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
这个时间有限,就简单的写一点啊......
05 | 
    print ‘Usage python ‘+sys.argv[0]+‘ [Options] use -h for help‘  | 
 
09 | 
    parser = argparse.ArgumentParser(epilog = ‘这是结束语 可以做一些示例展示‘,description=‘这是描述‘) | 
 
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() | 
 
19 | 
    if unknown or len(sys.argv)<2: | 
 
24 | 
if __name__==‘__main__‘: | 
 
 
 Hacking By Python---端口扫描1
标签:内容   security   start   lines   先来   mysq   app   pool   变量   
原文地址:http://www.cnblogs.com/test404/p/6362438.html