标签:内容 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