Initial commit
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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 *
|
||||
|
||||
private = "98388cb816ac994e5c19fd0168618f5e2e55ea2b526cf0c2bdce569235e92ead"
|
||||
|
||||
# This will be the base dont change it
|
||||
q = 135589091449528481388008471290289910812753186702167314685052586130282290721619
|
||||
p = 271178182899056962776016942580579821625506373404334629370105172260564581443239
|
||||
g = pow(2, (p-1)//p, p)
|
||||
|
||||
# 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
|
||||
|
||||
def getEncFlag(session, private, url):
|
||||
r = session.get(url+'/admin_panel', timeout=5)
|
||||
enc_flag = r.text.split("encrypted flag: ")[1].split("</p>")[0]
|
||||
return enc_flag
|
||||
|
||||
def parseSignEnc(enc):
|
||||
cps = bytes.fromhex(enc)
|
||||
y = bytes_to_long(cps[-128:-96].lstrip(b'0'))
|
||||
dig = bytes_to_long(cps[-96:-64].lstrip(b'0'))
|
||||
r = bytes_to_long(cps[-64:-32].lstrip(b'0'))
|
||||
s = bytes_to_long(cps[-32:].lstrip(b'0'))
|
||||
return y, dig, r, s
|
||||
|
||||
def createDataSet(inc, session, url):
|
||||
dataset = []
|
||||
for i in range(inc):
|
||||
enc_flag = getEncFlag(session, private, url)
|
||||
dataset.append(parseSignEnc(enc_flag))
|
||||
return dataset
|
||||
|
||||
def attackHNP(dataset):
|
||||
ln = len(dataset)
|
||||
X = 2**216
|
||||
m = [[0]*i+[q]+[0]*(ln-i-1)+[0,0] for i in range(ln)]
|
||||
m += [[(dataset[i][2]*pow(dataset[i][3], -1, q))%q for i in range(ln)] + [Integer(X)/q, 0]]
|
||||
m += [[(dataset[i][1]*pow(dataset[i][3], -1, q))%q for i in range(ln)] + [0, q]]
|
||||
Mat = matrix(m)
|
||||
Zq = Zmod(q)
|
||||
|
||||
Zp = Zmod(p)
|
||||
for ks in Mat.LLL().rows():
|
||||
if int(ks[0])%q!=0 and dataset[0][2] == Zq(Zp(g) ** int(ks[0])):
|
||||
pot = int(ks[0])%q
|
||||
x = (((dataset[0][3]*pot) - dataset[0][1]) * pow(dataset[0][2], -1, q))%q
|
||||
if(pot.bit_length()<216):
|
||||
print("FoundX:",x)
|
||||
print("FoundX:",ks[0])
|
||||
return x
|
||||
# return x
|
||||
return 0
|
||||
|
||||
def main(url):
|
||||
private = "98388cb816ac994e5c19fd0168618f5e2e55ea2b526cf0c2bdce569235e92ead"
|
||||
print("Target:", int(private, 16))
|
||||
userData = {'username': "admin", "password": private}
|
||||
session = login(userData, url)
|
||||
dataset = createDataSet(7 ,session, url)
|
||||
if(int(private, 16)) == attackHNP(dataset):
|
||||
return 0
|
||||
return 1
|
||||
|
||||
while True:
|
||||
te = main('http://localhost:5111')
|
||||
if te==0: break
|
||||
Reference in New Issue
Block a user