Spaces:
Build error
Build error
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import seaborn as sns | |
from wordcloud import WordCloud | |
from dotenv import load_dotenv | |
import os | |
# Load environment variables from .env file | |
load_dotenv() | |
access_token = os.getenv("HUGGINGFACE_ACCESS_TOKEN") | |
# Page configuration | |
st.set_page_config(page_title="ReconNinja Wordlists", page_icon="💬", layout="wide") | |
# Sidebar for navigation | |
def display_sidebar(): | |
st.sidebar.title("Navigation") | |
options = ["Wordlist Generator", "Statistics", "Security Analysis"] | |
choice = st.sidebar.radio("Go to", options) | |
return choice | |
# Header section | |
def display_header(): | |
st.title("💬 ReconNinja Wordlists") | |
st.subheader("Tailored wordlists for efficient penetration testing") | |
st.markdown(""" | |
This application generates customized wordlists for use in network reconnaissance and penetration testing. | |
Adjust the parameters to generate wordlists suited for your specific testing scenario. | |
""") | |
# Sidebar for user input | |
def get_user_inputs(): | |
st.sidebar.header("Customize Your Wordlist") | |
st.sidebar.markdown(""" | |
Adjust the following parameters to create wordlists optimized for your penetration testing tasks. | |
""") | |
wordlist_size = st.sidebar.slider("Wordlist Size", min_value=50, max_value=10000, value=1000, step=50) | |
min_length = st.sidebar.slider("Minimum Word Length", min_value=3, max_value=12, value=6) | |
max_length = st.sidebar.slider("Maximum Word Length", min_value=3, max_value=12, value=8) | |
include_special_chars = st.sidebar.checkbox("Include Special Characters", value=False) | |
include_numbers = st.sidebar.checkbox("Include Numbers", value=True) | |
return wordlist_size, min_length, max_length, include_special_chars, include_numbers | |
# Wordlist generation logic (mock-up for your project) | |
def generate_wordlist(size, min_length, max_length, special_chars=False, numbers=True): | |
words = [] | |
for _ in range(size): | |
word = ''.join(np.random.choice(list("abcdefghijklmnopqrstuvwxyz"), size=np.random.randint(min_length, max_length))) | |
if special_chars: | |
word += np.random.choice(["!", "@", "#", "$", "%"]) | |
if numbers: | |
word += np.random.choice([str(i) for i in range(10)]) | |
words.append(word) | |
return words | |
# Wordlist generation and display | |
def generate_and_display_wordlist(wordlist_size, min_length, max_length, include_special_chars, include_numbers): | |
try: | |
# Generate the wordlist | |
wordlist = generate_wordlist( | |
size=wordlist_size, | |
min_length=min_length, | |
max_length=max_length, | |
special_chars=include_special_chars, | |
numbers=include_numbers | |
) | |
# Display a preview of the wordlist | |
st.write(f"Preview of {wordlist_size} words:") | |
st.dataframe(pd.DataFrame(wordlist[:20], columns=["Generated Words"])) # Display first 20 words | |
# Provide a download link for the full wordlist | |
st.markdown("### Download Full Wordlist") | |
csv_data = pd.Series(wordlist).to_csv(index=False).encode() | |
st.download_button( | |
label="Download Wordlist as CSV", | |
data=csv_data, | |
file_name="reconninja_wordlist.csv", | |
mime="text/csv" | |
) | |
return wordlist | |
except Exception as e: | |
st.error(f"Error generating wordlist: {e}") | |
return None | |
# Visualizing the wordlist statistics | |
def display_wordlist_statistics(wordlist): | |
if wordlist: | |
st.header("Wordlist Statistics") | |
# Calculate and display word length distribution | |
word_lengths = [len(word) for word in wordlist] | |
word_length_df = pd.DataFrame(word_lengths, columns=["Word Length"]) | |
# Bar Chart for Word Length Distribution | |
st.subheader("Word Length Distribution") | |
fig, ax = plt.subplots(figsize=(8, 6)) | |
sns.countplot(x=word_length_df["Word Length"], ax=ax, palette="viridis") | |
ax.set_title("Frequency of Word Lengths") | |
ax.set_xlabel("Word Length") | |
ax.set_ylabel("Frequency") | |
st.pyplot(fig) | |
# Word Cloud of Words | |
st.subheader("Word Cloud") | |
wordcloud = WordCloud(width=800, height=400, background_color="white").generate(" ".join(wordlist)) | |
st.image(wordcloud.to_array(), use_column_width=True) | |
# Analyze wordlist security (entropy) | |
def analyze_wordlist_security(wordlist): | |
if wordlist: | |
st.header("Analyze Wordlist Security") | |
entropy_slider = st.slider( | |
"Select Entropy Multiplier", | |
min_value=1.0, | |
max_value=10.0, | |
value=3.0, | |
step=0.1 | |
) | |
# Simulate password entropy calculation | |
entropy = np.log2(len(wordlist) ** entropy_slider) | |
st.write(f"Estimated Entropy: {entropy:.2f} bits") | |
# Security analysis feedback | |
if entropy < 50: | |
st.warning("Low entropy detected! This wordlist might be vulnerable to brute-force attacks.") | |
else: | |
st.success("Good entropy! This wordlist is secure against most brute-force attempts.") | |
# Footer section | |
def display_footer(): | |
st.markdown("---") | |
st.markdown( | |
"Made with ❤️ by Canstralian. For more information on ReconNinja, visit our [GitHub](https://github.com/Canstralian)." | |
) | |
# Main application function | |
def main(): | |
choice = display_sidebar() | |
display_header() | |
if 'wordlist' not in st.session_state: | |
st.session_state.wordlist = None # Initialize wordlist if it doesn't exist | |
if choice == "Wordlist Generator": | |
wordlist_size, min_length, max_length, include_special_chars, include_numbers = get_user_inputs() | |
wordlist = generate_and_display_wordlist( | |
wordlist_size, min_length, max_length, include_special_chars, include_numbers | |
) | |
# Store wordlist in session_state | |
st.session_state.wordlist = wordlist | |
elif choice == "Statistics": | |
if st.session_state.wordlist is None: | |
st.warning("Please generate a wordlist first!") | |
else: | |
display_wordlist_statistics(st.session_state.wordlist) | |
elif choice == "Security Analysis": | |
if st.session_state.wordlist is None: | |
st.warning("Please generate a wordlist first!") | |
else: | |
analyze_wordlist_security(st.session_state.wordlist) | |
display_footer() | |
if __name__ == "__main__": | |
main() | |