mirror of
http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/darknet-lantern.git
synced 2025-05-16 20:26:58 +00:00
new changes
This commit is contained in:
parent
8fb883aa40
commit
e27d8f9dce
11 changed files with 374 additions and 136 deletions
|
@ -1,20 +1,31 @@
|
||||||
import os, pwd
|
import os, pwd, re, pandas as pd
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
rootpath='/srv/darknet-onion-webring/'
|
rootpath='/srv/darknet-onion-webring/'
|
||||||
urlpath=pwd.getpwuid(os.getuid()).pw_dir+"/.darknet_participant_url"
|
urlpath=pwd.getpwuid(os.getuid()).pw_dir+"/.darknet_participant_url"
|
||||||
print(urlpath)
|
#print(urlpath)
|
||||||
isitvalid="n"
|
|
||||||
|
|
||||||
#check if ~/.darknet_participant_url exists,
|
|
||||||
|
# check if ~/.darknet_participant_url exists,
|
||||||
# if exists, instance= the content of ~/.darknet_participant_url (which is the url: such as uptime.nowherejez...onion)
|
# if exists, instance= the content of ~/.darknet_participant_url (which is the url: such as uptime.nowherejez...onion)
|
||||||
|
isitvalid="n"
|
||||||
while isitvalid != "y":
|
while isitvalid != "y":
|
||||||
if os.path.isfile(urlpath):
|
if os.path.isfile(urlpath):
|
||||||
with open(urlpath) as f:
|
with open(urlpath) as f:
|
||||||
instance = f.read()
|
instance = f.read().rstrip()
|
||||||
# TODO check if the instance URL domain is valid
|
# check if the instance URL domain is valid
|
||||||
|
#print(urlpath,instance)
|
||||||
|
if IsOnionValid(instance):
|
||||||
|
print("[+] Instance Name: ",instance,IsOnionValid(instance))
|
||||||
|
else:
|
||||||
|
print('[-] Invalid instance name in ~/.darknet_participant_url:', instance)
|
||||||
|
return False
|
||||||
instancepath=rootpath+'www/participants/'+instance
|
instancepath=rootpath+'www/participants/'+instance
|
||||||
|
verifiedcsvfile=instancepath+'/verified.csv'
|
||||||
|
vdf = pd.read_csv(verifiedcsvfile)
|
||||||
|
unverifiedcsvfile=instancepath+'/unverified.csv'
|
||||||
|
uvdf = pd.read_csv(unverifiedcsvfile)
|
||||||
|
#df = pd.read_csv(csvfile)
|
||||||
print("[+] file exists, your Webring URL is ", instance)
|
print("[+] file exists, your Webring URL is ", instance)
|
||||||
isitvalid = "y"
|
isitvalid = "y"
|
||||||
else:
|
else:
|
||||||
|
@ -23,112 +34,207 @@ def main():
|
||||||
instance = input("What is your Instance domain ? (ex: uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion):")
|
instance = input("What is your Instance domain ? (ex: uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion):")
|
||||||
instancepath=rootpath+'www/participants/'+instance
|
instancepath=rootpath+'www/participants/'+instance
|
||||||
# TODO check if the instance URL domain is valid
|
# TODO check if the instance URL domain is valid
|
||||||
|
if IsOnionValid(instance):
|
||||||
|
print("[+] Instance Name: ",instance,IsUrlValid(instance))
|
||||||
|
else:
|
||||||
|
print('[-] Invalid instance name in ~/.darknet_participant_url:', instance)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# ask the user if the instance URL is valid ?
|
# ask the user if the instance URL is valid ?
|
||||||
print()
|
print()
|
||||||
print(instance)
|
print(instance)
|
||||||
isitvalid=input("Is your this your instance domain ?")
|
isitvalid=input("Is this your this your instance domain ? (y/n)")
|
||||||
# if yes, then write it into ~/.darknet_participant_url
|
# if yes, then write it into ~/.darknet_participant_url
|
||||||
if isitvalid != "y" :
|
if isitvalid == "y" :
|
||||||
print("OK writing the instance url to ~/.darknet_participants_url")
|
print("OK writing the instance url to ~/.darknet_participants_url")
|
||||||
with open(urlpath, "w") as file:
|
with open(urlpath, "w") as file:
|
||||||
file.write(instance)
|
file.write(instance)
|
||||||
print("[+] file written, let's read it")
|
print("[+] file written, let's read it")
|
||||||
f = open(urlpath,"r")
|
f = open(urlpath,"r")
|
||||||
print(f.read())
|
print(f.read())
|
||||||
print("[+] Initial Setup Completed!")
|
print("[+] Initial Setup Completed!")
|
||||||
|
while True:
|
||||||
print("[+] Welcome to the Darknet Onion Webring, where you are exploring the Darknet and helping others do the same.")
|
print("[+] Welcome to the Darknet Onion Webring, where you are exploring the Darknet and helping others do the same.")
|
||||||
print("""
|
print("""
|
||||||
1) Add a new entry (into unverified.csv)
|
Websites:
|
||||||
2) Verify an entry (move an entry from unverified to verified.csv)
|
1) Add a new Website entry (into unverified.csv)
|
||||||
3) Add a new webring participant (and download their files into their directory (without trusting them yet!))
|
2) Trust a Website entry (move an entry from unverified to verified.csv)
|
||||||
4) Trust a webring participant (Potentially dangerous)
|
3) Untrust a Website entry (move an entry from unverified to verified.csv)
|
||||||
5) Add/Remove words in the sensitive list (ex: drug)
|
|
||||||
6) Add/Remove words in the blacklist (ex: porn)
|
Webring Participants:
|
||||||
""")
|
4) Add a new webring participant (and download their files into their directory (without trusting them yet!))
|
||||||
option = input("Select Option? (1-4)")
|
5) Trust a webring participant (Potentially dangerous)
|
||||||
print(option)
|
6) Untrust a webring participant
|
||||||
match option:
|
7) Remove a webring participant
|
||||||
case "1":
|
|
||||||
print("[+] Add a new Entry (into unverified.csv)")
|
Wordlists:
|
||||||
# ask for the following:
|
8) Add/Remove words in the sensitive list (ex: drug)
|
||||||
unverifiedpath=instancepath+'/unverified.csv'
|
9) Add/Remove words in the blacklist (ex: porn)
|
||||||
# the name of the website (required) + check if its valid
|
0) Exit
|
||||||
entry_name = input("What is the Website name ?")
|
""")
|
||||||
# the url of the website (required) + check if its valid
|
option = input("Select Option? (0-6)")
|
||||||
entry_url = input("What is URL of the Website ? (ex: https://torproject.org or http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion")
|
print(option)
|
||||||
# a quick description (optional) + check if its valid
|
match option:
|
||||||
entry_url = input("(Optional) Description of the website ? (max 256 characters) (press enter to skip)"
|
|
||||||
# sensitive ? (y/n) + check if its valid
|
|
||||||
entry_url = input("is it a sensitive website ? (ex: website related to drugs)"
|
########## MANAGING WEBSITE ENTRIES #################
|
||||||
|
case "1":
|
||||||
|
print("\n[+] Add a new Website entry (into unverified.csv)")
|
||||||
|
name=''
|
||||||
|
while(IsNameValid(name) is not True):
|
||||||
|
name = input("What is the Website name ? ")
|
||||||
|
category=''
|
||||||
|
while(IsCategoryValid(category) is not True):
|
||||||
|
category = input("What is the website Category ? ")
|
||||||
|
# the url of the website (required) + check if its valid
|
||||||
|
#entry_url = input("What is URL of the Website ? (ex: https://torproject.org or http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion)")
|
||||||
|
url=''
|
||||||
|
while(IsUrlValid(url) is not True):
|
||||||
|
url=input("What is the website URL ? ")
|
||||||
|
|
||||||
|
# a quick description (optional) + check if its valid
|
||||||
|
#entry_desc = input("(Optional) Description of the website ? (max 256 characters) (press enter to skip)")
|
||||||
|
#desc="This is a new website that we add, it has this description"
|
||||||
|
desc='DEFAULT'
|
||||||
|
while(IsDescriptionValid(desc) is not True):
|
||||||
|
desc=input("Description for the website ? (Optional)")
|
||||||
|
# sensitive ? (y/n) + check if its valid
|
||||||
|
#entry_sensi = input("is it a sensitive website ? (ex: website related to drugs) (y/n)")
|
||||||
|
sensi = ''
|
||||||
|
while(IsStatusValid(sensi) is not True):
|
||||||
|
sensi=input("Is this website sensitive (ex: related to drugs) ? (y/n)")
|
||||||
|
|
||||||
|
newrow=[instance,category,name,url,sensi,desc,'','']
|
||||||
|
print("[+] NEWROW=",newrow)
|
||||||
# (rest is automatic: status, score, instance is = '' because it is your own instance)
|
# (rest is automatic: status, score, instance is = '' because it is your own instance)
|
||||||
# check if the entry doesn't already exist in verified.csv and in unverified.csv
|
# check if the entry doesn't already exist in verified.csv and in unverified.csv
|
||||||
# if it doesnt exist, add it into unverified.csv
|
# if it doesnt exist, add it into unverified.csv
|
||||||
|
uvdf.loc[-1] = newrow # adding a row
|
||||||
|
uvdf.index = uvdf.index + 1 # shifting index
|
||||||
|
uvdf = uvdf.sort_index() # sorting by index
|
||||||
|
print("[+] New row added! now writing the csv file:")
|
||||||
|
uvdf.to_csv(unverifiedcsvfile, index=False)
|
||||||
|
|
||||||
case "2":
|
case "2":
|
||||||
print("[+] Verify an entry (move an entry from unverified.csv to verified.csv)")
|
print("[+] Trust a Website entry (move an entry from unverified to verified.csv)")
|
||||||
# search for a word
|
# search for a word
|
||||||
searchterm = input("What is the Website name ?")
|
name=''
|
||||||
# and display only the matching entries in an array format (display it in CLI).
|
while(IsNameValid(name) is not True):
|
||||||
# Each of the rows must have an index,
|
name = input("What is the Website name you want to verify ? (ex: Nowhere)")
|
||||||
# prompt the user to ask for with row they want to move to verified.csv
|
filter_uvdf = uvdf[uvdf.Name.str.contains(name)]
|
||||||
searchterm = input("What is the index of the entry that you want to move to verified.csv ?")
|
# and display only the matching entries in unverified.csv in an array format (display it in CLI).
|
||||||
# once selected, it must be able to print that row, and:
|
print(filter_uvdf[['Name','URL']])
|
||||||
# append it into verified.csv
|
# check if there are no results, dont proceed if there are none!
|
||||||
# remove it from unverified.csv
|
if filter_uvdf.size == 0:
|
||||||
# print("[+] completed! You are now listing [name] (url) (sensitive)")
|
print("ERROR no results, skipping.")
|
||||||
|
|
||||||
case "3":
|
|
||||||
print("[+] Add a new webring participant (and download their files into their directory (without trusting them yet!))")
|
|
||||||
# ask for the url to the other webring participant
|
|
||||||
webring_participant_url = input("What is URL of the new webring participant? (ex: https://torproject.org or http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion")
|
|
||||||
# check if the (onion only) url is valid or not: at http://URL.onion/participants/URL.onion/{verified.csv,unverified.csv,sensitive.csv,blacklist.csv,webring-participants.csv}
|
|
||||||
|
|
||||||
case "4":
|
|
||||||
print("[+] Trust a webring participant (Potentially dangerous)")
|
|
||||||
# list the existing webring participants from webring-participants.csv and
|
|
||||||
# ask the user to pick the index (0-9?) of the instance to trust
|
|
||||||
# if index is valid, then mark the instance as trusted in webring-participants.csv
|
|
||||||
searchterm = input("What is the index of the entry that you want to trust ?")
|
|
||||||
case "5":
|
|
||||||
print("[+] Add/Remove words in the sensitive list (ex: drug)")
|
|
||||||
print("do you want to 1) add words or 2) remove words ?")
|
|
||||||
option="0"
|
|
||||||
|
|
||||||
done = False
|
|
||||||
while(done == False):
|
|
||||||
while option not any((1,2,"exit")):
|
|
||||||
option=input("do you want to 1) add words or 2) remove words ? (type exit to exit)")
|
|
||||||
# display the contents of sensitive.csv file
|
|
||||||
if option == 1:
|
|
||||||
word=input("which word do you want to add? (write 0 to exit")
|
|
||||||
if word == "0":
|
|
||||||
done = True
|
|
||||||
#True to get out of the while loop
|
|
||||||
else
|
|
||||||
print("checking if word is valid")
|
|
||||||
#check if word is valid in a while loop (dont check if
|
|
||||||
# if invalid! remove word at index
|
|
||||||
else:
|
else:
|
||||||
index=input("which word do you want to remove? (index 0 to (max index) (write exit to exit)")
|
# Each of the rows has an index,
|
||||||
if index == "exit":
|
index=-1
|
||||||
done = True
|
while (index not in filter_uvdf.index):
|
||||||
#True to get out of the while loop
|
# prompt the user to ask for with row they want to move to verified.csv
|
||||||
else
|
index = int(input("What is the index of the entry that you want to move to verified.csv ? (ex: 3) "))
|
||||||
print("checking if index is valid")
|
# once selected, it must be able to SAVE and print that row:
|
||||||
#check if index is valid or not
|
print(uvdf.iloc[index].values)
|
||||||
# if valid! remove word at index
|
newrow=uvdf.iloc[index].values
|
||||||
# if invalid! just pass to ask for another word
|
|
||||||
|
|
||||||
case "6":
|
|
||||||
print("[+] Add/Remove words in the blacklist list (ex: porn)")
|
# append it into verified.csv
|
||||||
# copy option 5
|
vdf.loc[-1] = newrow # adding a row
|
||||||
# print("do you want to 1) add words or 2) remove words ?")
|
vdf.index = vdf.index + 1 # shifting index
|
||||||
# display the contents of blacklist.csv file
|
vdf = vdf.sort_index() # sorting by index
|
||||||
|
vdf.to_csv(verifiedcsvfile, index=False)
|
||||||
|
print("[+] New row added to verified.csv! now writing to the csv")
|
||||||
|
|
||||||
|
|
||||||
|
# remove it from unverified.csv
|
||||||
|
uvdf.drop(index, inplace= True)
|
||||||
|
uvdf.to_csv(unverifiedcsvfile, index=False)
|
||||||
|
print("[+] Link is now moved to verified.csv!")
|
||||||
|
|
||||||
|
case "3":
|
||||||
|
# TODO
|
||||||
|
print("[+] Untrust a Website entry (move an entry from verified to unverified.csv)")
|
||||||
|
|
||||||
|
|
||||||
|
####### MANAGING WEBRING PARTICIPANTS ###########
|
||||||
|
# 4) Add a new webring participant (and download their files into their directory (without trusting them yet!))
|
||||||
|
# 5) Trust a webring participant (Potentially dangerous)
|
||||||
|
# 6) Untrust a webring participant
|
||||||
|
# 7) Remove a webring participant
|
||||||
|
#####################################################
|
||||||
|
case "4":
|
||||||
|
print("[+] Add a new webring participant (and download their files into their directory (without trusting them yet!))")
|
||||||
|
# TODO ask for the url to the other webring participant
|
||||||
|
webring_participant_url = input("What is URL of the new webring participant? (ex: https://torproject.org or http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion")
|
||||||
|
# TODO check if the (onion only) url is valid or not: at http://URL.onion/participants/URL.onion/{verified.csv,unverified.csv,sensitive.csv,blacklist.csv,webring-participants.csv}
|
||||||
|
# TODO if OK then add it to the webring-participants.csv file
|
||||||
|
|
||||||
case _:
|
case "5":
|
||||||
print("[-] ERROR, incorrect input")
|
print("[+] Trust a webring participant (Potentially dangerous)")
|
||||||
|
# TODO list the existing webring participants from webring-participants.csv and
|
||||||
|
# TODO ask the user to pick the index (0-9?) of the instance to trust
|
||||||
|
# TODO if index is valid, then mark the instance as trusted in webring-participants.csv
|
||||||
|
searchterm = input("What is the index of the entry that you want to trust ?")
|
||||||
|
case "6":
|
||||||
|
# TODO
|
||||||
|
print("[+] Untrust a webring participant")
|
||||||
|
case "7":
|
||||||
|
# TODO
|
||||||
|
print("[+] Remove a webring participant")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################### MANAGING WORDLISTS #################
|
||||||
|
#Wordlists:
|
||||||
|
# 8) Add/Remove words in the sensitive list (ex: drug)
|
||||||
|
# 9) Add/Remove words in the blacklist (ex: porn)
|
||||||
|
# 0) Exit
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
case "8":
|
||||||
|
print("[+] Add/Remove words in the sensitive list (ex: drug)")
|
||||||
|
print("do you want to 1) add words or 2) remove words ?")
|
||||||
|
option="0"
|
||||||
|
|
||||||
|
done = False
|
||||||
|
while(done == False):
|
||||||
|
while option != "1" and option != "2" and option != "exit":
|
||||||
|
option=input("do you want to 1) add words or 2) remove words ? (type exit to exit)")
|
||||||
|
# TODO display the contents of sensitive.csv file
|
||||||
|
if option == 1:
|
||||||
|
word=input("which word do you want to add? (write 0 to exit")
|
||||||
|
if word == "0":
|
||||||
|
done = True
|
||||||
|
#True to get out of the while loop
|
||||||
|
else:
|
||||||
|
print("checking if word is valid")
|
||||||
|
# TODO check if word is valid in a while loop (dont check if
|
||||||
|
# TODO if invalid! remove word at index
|
||||||
|
else:
|
||||||
|
index=input("which word do you want to remove? (index 0 to (max index) (write exit to exit)")
|
||||||
|
if index == "exit":
|
||||||
|
done = True
|
||||||
|
#True to get out of the while loop
|
||||||
|
else:
|
||||||
|
print("checking if index is valid")
|
||||||
|
# TODO check if index is valid or not
|
||||||
|
# TODO if valid! remove word at index
|
||||||
|
# TODO if invalid! just pass to ask for another word
|
||||||
|
|
||||||
|
case "9":
|
||||||
|
print("[+] Add/Remove words in the blacklist list (ex: porn)")
|
||||||
|
# TODO copy option 5
|
||||||
|
# TODO print("do you want to 1) add words or 2) remove words ?")
|
||||||
|
# TODO display the contents of blacklist.csv file
|
||||||
|
|
||||||
|
case _:
|
||||||
|
print("[-] Exiting")
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
#### PROTECTIONS AGAINST MALICIOUS CSV INPUTS ####
|
#### PROTECTIONS AGAINST MALICIOUS CSV INPUTS ####
|
||||||
|
@ -168,7 +274,7 @@ def IsOnionValid(url: str)-> bool:
|
||||||
print("Domain not valid")
|
print("Domain not valid")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
print("URL doesn't start http")
|
#print("URL doesn't start http")
|
||||||
if pattern.fullmatch(url) is not None:
|
if pattern.fullmatch(url) is not None:
|
||||||
if len(url.split('.')) > 3:
|
if len(url.split('.')) > 3:
|
||||||
n_subdomians = len(url.split('.'))
|
n_subdomians = len(url.split('.'))
|
||||||
|
@ -205,11 +311,11 @@ def IsUrlValid(url:str)->bool:
|
||||||
return IsOnionValid(url)
|
return IsOnionValid(url)
|
||||||
else:
|
else:
|
||||||
if not url.__contains__('.'):
|
if not url.__contains__('.'):
|
||||||
print("No (DOT) in url")
|
print("No (DOT) in clearnet url")
|
||||||
|
return False
|
||||||
|
if pattern.fullmatch(url) is None:
|
||||||
|
print('Url contains invalid chars')
|
||||||
return False
|
return False
|
||||||
if pattern.fullmatch(url) is None:
|
|
||||||
print('Url contains invalid chars')
|
|
||||||
return False
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def IsStatusValid(status: str)-> bool:
|
def IsStatusValid(status: str)-> bool:
|
||||||
|
@ -219,13 +325,14 @@ def IsStatusValid(status: str)-> bool:
|
||||||
# check if the characters are only [vx] with maximum 1 chars max
|
# check if the characters are only [vx] with maximum 1 chars max
|
||||||
# if OK return True
|
# if OK return True
|
||||||
#if not : return False
|
#if not : return False
|
||||||
pattern = ['v','x']
|
pattern = ['y','n']
|
||||||
if len(status) != 1:
|
if len(status) != 1:
|
||||||
print("Got more than one character or nothing.")
|
print("Got more than one character or nothing.")
|
||||||
return False
|
return False
|
||||||
elif (status not in pattern):
|
elif (status not in pattern):
|
||||||
print("Got an invalid character")
|
print("Got an invalid character it must be either y or n")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def IsDescriptionValid(desc:str)->bool:
|
def IsDescriptionValid(desc:str)->bool:
|
||||||
|
@ -238,8 +345,8 @@ def IsDescriptionValid(desc:str)->bool:
|
||||||
#if not : return False
|
#if not : return False
|
||||||
pattern = re.compile("^[A-Za-z0-9-.,' ]+$")
|
pattern = re.compile("^[A-Za-z0-9-.,' ]+$")
|
||||||
desc.strip()
|
desc.strip()
|
||||||
if pattern.fullmatch(desc) is None:
|
# empty description is fine as it's optional
|
||||||
print('Got an empty desc or invalid chars')
|
if desc == "DEFAULT":
|
||||||
return False
|
return False
|
||||||
elif len(desc) > 256:
|
elif len(desc) > 256:
|
||||||
print("desc is greater than 256 chars")
|
print("desc is greater than 256 chars")
|
||||||
|
@ -258,7 +365,7 @@ def IsCategoryValid(categories: list)-> bool:
|
||||||
for category in categories:
|
for category in categories:
|
||||||
category.strip()
|
category.strip()
|
||||||
if pattern.fullmatch(category) is None:
|
if pattern.fullmatch(category) is None:
|
||||||
print('Got an empty list or invalid chars')
|
#print('Got an empty list or invalid chars')
|
||||||
return False
|
return False
|
||||||
elif len(category) > 64:
|
elif len(category) > 64:
|
||||||
print('Category is too long')
|
print('Category is too long')
|
||||||
|
@ -276,7 +383,7 @@ def IsNameValid(name: str)->bool:
|
||||||
pattern = re.compile("^[A-Za-z0-9 ]+$")
|
pattern = re.compile("^[A-Za-z0-9 ]+$")
|
||||||
name = name.strip()
|
name = name.strip()
|
||||||
if (pattern.fullmatch(name) is None):
|
if (pattern.fullmatch(name) is None):
|
||||||
print("Got an invalid character or nothing")
|
#print("Got an invalid character or nothing")
|
||||||
return False
|
return False
|
||||||
elif len(name) > 64:
|
elif len(name) > 64:
|
||||||
print(f'Got a name lenght greater than 64. {len(name)}')
|
print(f'Got a name lenght greater than 64. {len(name)}')
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import csv, json, pandas as pd, glob
|
import csv, json, pandas as pd, glob
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
print("aaa")
|
#print("aaa")
|
||||||
csvfile="verified.csv"
|
csvfile="verified.csv"
|
||||||
df = pd.read_csv(csvfile)
|
df = pd.read_csv(csvfile)
|
||||||
#for i in range (df.index.stop):
|
#for i in range (df.index.stop):
|
||||||
|
@ -12,26 +12,123 @@ def main():
|
||||||
# print(df.at[i][col])
|
# print(df.at[i][col])
|
||||||
|
|
||||||
#print(df)
|
#print(df)
|
||||||
print("[+] Display 2 columns:")
|
# print("[+] Display 2 columns:")
|
||||||
#display 2 columns:
|
#display 2 columns:
|
||||||
print(df[['Name', 'URL']])
|
# print(df[['Name', 'URL']])
|
||||||
|
|
||||||
print("[+] Display rows 0 to 5")
|
# print("[+] Display rows 0 to 5")
|
||||||
#display rows from 0 to 5
|
#display rows from 0 to 5
|
||||||
print(df[0:5])
|
# print(df[0:5])
|
||||||
|
|
||||||
#display rows from 0 to 5
|
#display rows from 0 to 5
|
||||||
print("[+] Display rows 3 to 5 and columns Name and URL")
|
# print("[+] Display rows 3 to 5 and columns Name and URL")
|
||||||
print(df.loc[3:5,['Name','URL']])
|
# print(df.loc[3:5,['Name','URL']])
|
||||||
#print(df[0:1,['Name','URL']])
|
#print(df[0:1,['Name','URL']])
|
||||||
|
|
||||||
print("[+] Display all rows for and columns name and URL")
|
# print("[+] Display all rows for and columns name and URL")
|
||||||
#df.loc[startrow:endrow, startcolumn:endcolumn]
|
#df.loc[startrow:endrow, startcolumn:endcolumn]
|
||||||
print(df.loc[0:df.index.stop,['Name','URL']])
|
# print(df.loc[0:df.index.stop,['Name','URL']])
|
||||||
|
|
||||||
#display rows from 0 to the end of indexes
|
#display rows from 0 to the end of indexes
|
||||||
print("[+] Display all rows for all columns")
|
# print("[+] Display all rows for all columns")
|
||||||
print(df[0:df.index.stop])
|
# print(df[0:df.index.stop])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
print('\n[+] list the entire csv file and get all row IDs')
|
||||||
|
print(df[['Name', 'URL']])
|
||||||
|
index=-1
|
||||||
|
while (index > df.tail(1).index.item() or index < 0):
|
||||||
|
#index=input("\n[+] What entry do you want to edit ? (enter the row index (ex: 4)")
|
||||||
|
index=4
|
||||||
|
index=int(index)
|
||||||
|
print(df.iloc[index], "last index:", df.index.stop-1)
|
||||||
|
print("\n[+] Number of Rows:", len(df.index)-1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print('\n[+] Iterate over the rows by their IDs for the 2 Columns URL and Name')
|
||||||
|
print(df.iterrows())
|
||||||
|
for i,j in df.iterrows():
|
||||||
|
#print("[+] ROW=",i,"\n[+] CONTENT=\n",j)
|
||||||
|
#print("[+] ROW=",i)
|
||||||
|
#print("[+] ROW CONTENTS= \n",df.loc[i, ['URL','Name']])
|
||||||
|
#print("[+] ROW CONTENTS= \n",df.loc[i, ['URL']])
|
||||||
|
print("[+] ROW=",i,"ROW CONTENTS=", df.at[i, 'Name'], df.at[i, 'URL'])
|
||||||
|
#print(df[0][i])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print('\n[+] Iterate over the columns by their name:')
|
||||||
|
columns = list(df)
|
||||||
|
print(columns)
|
||||||
|
print('\n[+] Iterate over the columns of the first row:')
|
||||||
|
for i in columns:
|
||||||
|
print('\nCOLUMN=',i)
|
||||||
|
print('CONTENTS=',df[i][0])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#print('[+] list the csv file by filtering a keyword and get all row IDs')
|
||||||
|
#filterterm=input("[+] Filter the CSV file using a keyword (ex: DNM)")
|
||||||
|
filterterm="Psy"
|
||||||
|
filter_df = df[df.Name.str.contains(filterterm)]
|
||||||
|
#print(filtered_df) # print all columns
|
||||||
|
print(filter_df[['Name','URL']]) #print only 2 columns
|
||||||
|
#print("\n[+] Number of Rows:", len(filter_df.index))
|
||||||
|
#for index in filter_df.index:
|
||||||
|
#print(index)
|
||||||
|
index=-1
|
||||||
|
while (index not in filter_df.index):
|
||||||
|
#index=int(input("\n[+] Please select a valid row: "))
|
||||||
|
index=int("1")
|
||||||
|
print("ROW=",index, 'CONTENT=', filter_df.at[index, 'Name'], filter_df.at[index, 'URL'])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("\n[+] Adding a new row:")
|
||||||
|
# ask for the following:
|
||||||
|
#unverifiedpath=instancepath+'/unverified.csv'
|
||||||
|
instance='uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion'
|
||||||
|
unverifiedpath='verified.csv'
|
||||||
|
# the name of the website (required) + check if its valid
|
||||||
|
# if the website name is "exit" then get out of the while loop
|
||||||
|
#entry_name = input("What is the Website name ?")
|
||||||
|
name="NewWebsite"
|
||||||
|
category="TestCategory"
|
||||||
|
# the url of the website (required) + check if its valid
|
||||||
|
#entry_url = input("What is URL of the Website ? (ex: https://torproject.org or http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion)")
|
||||||
|
url="http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion"
|
||||||
|
# a quick description (optional) + check if its valid
|
||||||
|
#entry_desc = input("(Optional) Description of the website ? (max 256 characters) (press enter to skip)")
|
||||||
|
desc="This is a new website that we add, it has this description"
|
||||||
|
# sensitive ? (y/n) + check if its valid
|
||||||
|
#entry_sensi = input("is it a sensitive website ? (ex: website related to drugs) (y/n)")
|
||||||
|
sensi = "n"
|
||||||
|
newrow=[instance,category,name,url,sensi,desc,'','']
|
||||||
|
print("[+] NEWROW=",newrow)
|
||||||
|
|
||||||
|
#add a new row (get all the new data you need first):
|
||||||
|
|
||||||
|
df.loc[-1] = newrow # adding a row
|
||||||
|
df.index = df.index + 1 # shifting index
|
||||||
|
df = df.sort_index() # sorting by index
|
||||||
|
print("[+] New row added! now writing the csv file:")
|
||||||
|
df.to_csv(csvfile, index=False)
|
||||||
|
|
||||||
|
print(df)
|
||||||
|
|
||||||
|
#write the dataframe into the csv file
|
||||||
|
#read and print the contents of the csv file
|
||||||
|
#re-add that row in the csv file
|
||||||
|
#remove that row from the dataframe
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
# then select a row in it (by the ID) and display it
|
||||||
|
# list
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
FIRSTherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,Psychonaut Wiki,http://vvedndyt433kopnhv6vejxnut54y5752vpxshjaqmj7ftwiu6quiv2ad.onion/,,"This is the wiki for psychonauts, it contains infos on substances and trip reports",✔️,100.0
|
FIRSTherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,Psychonaut Wiki,http://vvedndyt433kopnhv6vejxnut54y5752vpxshjaqmj7ftwiu6quiv2ad.onion/,,"This is the wiki for psychonauts, it contains infos on substances and trip reports",✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,1DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,2DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,3DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewh3refoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,4DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,5DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,6DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
somewherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,7DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
LASTherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
nowherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,8DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
|
LASTherefoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Infos and Links,Psychonaut Wiki,http://vvedndyt433kopnhv6vejxnut54y5752vpxshjaqmj7ftwiu6quiv2ad.onion/,,"This is the wiki for psychonauts, it contains infos on substances and trip reports",✔️,100.0
|
||||||
|
|
||||||
|
|
|
BIN
templates/banner.png
Normal file
BIN
templates/banner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
2
templates/blacklist.csv
Normal file
2
templates/blacklist.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
blacklisted-words
|
||||||
|
porn
|
|
5
templates/sensitive.csv
Normal file
5
templates/sensitive.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
sensitive-words
|
||||||
|
Market
|
||||||
|
market
|
||||||
|
drug
|
||||||
|
|
|
2
templates/unverified.csv
Normal file
2
templates/unverified.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
||||||
|
|
|
3
templates/verified.csv
Normal file
3
templates/verified.csv
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
||||||
|
|
||||||
|
|
|
2
templates/webring-participants.csv
Normal file
2
templates/webring-participants.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Name,URL,Description,Trusted,Status,Score
|
||||||
|
Nowhere,http://uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,"Darknet Webring Onion Participant",✔️,✔️,100.0
|
|
|
@ -1,4 +1,12 @@
|
||||||
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
||||||
,Infos and Links,Tor Taxi,http://tortaxi2dev6xjwbaydqzla77rrnth7yn2oqzjfmiuwn5h6vsk2a4syd.onion/,✔️,"List of links to go to popular darknet places",✔️,100.0
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,aaa,aa,http://niggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.onion,y,test,,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,bbb,aaa,ccc.com,y,,,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,w,q,adwwawa.com,n,dwaawdwa,,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,w,a,dwa.com,n,,,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,wadwda,dwawdawawda,meinnigga.com,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,b,a,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
,Infos and Links,Tor Taxi,http://tortaxi2dev6xjwbaydqzla77rrnth7yn2oqzjfmiuwn5h6vsk2a4syd.onion/,✔️,List of links to go to popular darknet places,✔️,100.0
|
||||||
|
|
|
|
@ -1,5 +1,16 @@
|
||||||
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
Instance,Category,Name,URL,Sensitive,Description,Status,Score
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,NewWebsite,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Test,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Test,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Test,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Test,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,TestCategory,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
|
uptime.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,Test,Test,http://newwebsitewoidwajiawdhjoidwahjoadiwhj.onion,n,"This is a new website that we add, it has this description",,
|
||||||
,Infos and Links,Psychonaut Wiki,http://vvedndyt433kopnhv6vejxnut54y5752vpxshjaqmj7ftwiu6quiv2ad.onion/,,"This is the wiki for psychonauts, it contains infos on substances and trip reports",✔️,100.0
|
,Infos and Links,Psychonaut Wiki,http://vvedndyt433kopnhv6vejxnut54y5752vpxshjaqmj7ftwiu6quiv2ad.onion/,,"This is the wiki for psychonauts, it contains infos on substances and trip reports",✔️,100.0
|
||||||
,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,"General guide on how to navigate the Darknet to buy drugs",✔️,100.0
|
,Infos and Links,DNM Bible,http://biblemeowimkh3utujmhm6oh2oeb3ubjw2lpgeq3lahrfr2l6ev6zgyd.onion/,✔️,General guide on how to navigate the Darknet to buy drugs,✔️,100.0
|
||||||
|
|
||||||
|
|
||||||
|
|
|
Loading…
Add table
Add a link
Reference in a new issue