🛠️ Project 1: Full Network Security Scanner
import socket, threading, argparse, json
from queue import Queue
from datetime import datetime
from colorama import Fore, init
init(autoreset=True)
SERVICES = {
21:"FTP",22:"SSH",23:"Telnet",25:"SMTP",53:"DNS",
80:"HTTP",110:"POP3",143:"IMAP",443:"HTTPS",445:"SMB",
3306:"MySQL",3389:"RDP",5432:"PostgreSQL",6379:"Redis",
8080:"HTTP-Alt",27017:"MongoDB"
}
class NetScanner:
def __init__(self, target, ports, threads=300):
self.target = target; self.results = []; self.lock = threading.Lock()
self.queue = Queue()
for p in ports: self.queue.put(p)
self.threads = threads
def banner(self, port):
try:
s = socket.socket(); s.settimeout(1)
s.connect((self.target, port))
s.send(b"HEAD / HTTP/1.0\r\n\r\n" if port in [80,8080] else b"\r\n")
b = s.recv(256).decode('utf-8', errors='ignore').strip()[:80]
s.close(); return b
except: return ""
def worker(self):
while not self.queue.empty():
port = self.queue.get()
try:
s = socket.socket(); s.settimeout(0.5)
if s.connect_ex((self.target, port)) == 0:
s.close()
svc = SERVICES.get(port, "Unknown")
bnr = self.banner(port)
with self.lock:
self.results.append({'port':port,'service':svc,'banner':bnr})
print(f"{Fore.GREEN}[+] {port:<5}/tcp OPEN {svc:<12} {bnr[:50]}")
else: s.close()
except: pass
finally: self.queue.task_done()
def run(self):
t0 = datetime.now()
print(f"\n[*] Scanning {self.target} | {datetime.now()}")
ts = [threading.Thread(target=self.worker) for _ in range(self.threads)]
for t in ts: t.daemon=True; t.start()
for t in ts: t.join()
secs = (datetime.now()-t0).seconds
print(f"\n[*] Done in {secs}s | {len(self.results)} open ports")
with open(f"scan_{self.target}.json",'w') as f:
json.dump({'target':self.target,'results':self.results},f,indent=2)
return self.results
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("target")
parser.add_argument("-p", default="1-1024")
args = parser.parse_args()
s, e = map(int, args.p.split("-"))
NetScanner(args.target, range(s, e+1)).run()
🌐 Project 2: Web Vulnerability Scanner
import requests
from bs4 import BeautifulSoup
class WebVulnScanner:
def __init__(self, url):
self.url = url; self.findings = []
self.sess = requests.Session()
self.sess.headers['User-Agent'] = 'Mozilla/5.0'
def check_headers(self):
r = self.sess.get(self.url, timeout=5)
SEC_HEADERS = ['X-Frame-Options','Content-Security-Policy',
'Strict-Transport-Security','X-Content-Type-Options']
print("\n[*] Security Headers:")
for h in SEC_HEADERS:
ok = h.lower() in {k.lower(): v for k,v in r.headers.items()}
sym = "✓" if ok else "✗ MISSING"
print(f" [{sym}] {h}")
def check_server_info(self):
r = self.sess.get(self.url, timeout=5)
for h in ['Server','X-Powered-By']:
if h in r.headers:
print(f"\n[!] Version disclosure — {h}: {r.headers[h]}")
self.findings.append({'type':'info_disclosure','header':h})
def test_sqli(self, params):
PAYLOADS = ["'", "'' OR '1'='1", "' OR 1=1--"]
ERRORS = ['sql','mysql','syntax error','ora-']
for p, v in params.items():
for payload in PAYLOADS:
r = self.sess.get(self.url, params={p: payload}, timeout=5)
if any(e in r.text.lower() for e in ERRORS):
print(f"\n[!] SQLi in '{p}': {payload}")
self.findings.append({'type':'sqli','param':p})
def run(self):
print(f"\n[*] Scanning: {self.url}")
self.check_headers(); self.check_server_info()
print(f"\n[*] Findings: {len(self.findings)}")
return self.findings
WebVulnScanner("http://testphp.vulnweb.com").run()
🔐 Project 3: Password Strength Auditor
import hashlib, re, string
class PasswordAuditor:
COMMON = ["password","123456","admin","letmein","qwerty","dragon"]
def audit(self, pwd):
score, issues = 0, []
if len(pwd) >= 8: score += 1
else: issues.append("Too short")
if len(pwd) >= 12: score += 1
if re.search(r'[A-Z]', pwd): score += 1
else: issues.append("No uppercase")
if re.search(r'[a-z]', pwd): score += 1
else: issues.append("No lowercase")
if re.search(r'\d', pwd): score += 1
else: issues.append("No numbers")
if re.search(r'[!@#$%^&*]', pwd): score += 2
else: issues.append("No special chars")
if pwd.lower() in self.COMMON:
score = 0; issues = ["Common password!"]
labels = ["VERY WEAK","WEAK","WEAK","MODERATE",
"MODERATE","STRONG","STRONG","VERY STRONG"]
strength = labels[min(score, 7)]
print(f"\n[*] Password: {'*'*len(pwd)}")
print(f"[+] Score: {score}/7 — {strength}")
print(f"[+] MD5: {hashlib.md5(pwd.encode()).hexdigest()}")
if issues:
print("[!] Issues:")
for i in issues: print(f" - {i}")
return strength
PasswordAuditor().audit("MyS3cur3P@ssw0rd!")
🔑 Project 4: SSH Recon Automator
import paramiko, json
class SSHRecon:
def __init__(self, host, user, password=None, key=None, port=22):
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if key:
self.client.connect(host, port=port, username=user,
pkey=paramiko.RSAKey.from_private_key_file(key))
else:
self.client.connect(host, port=port, username=user, password=password)
self.host = host; print(f"[+] Connected: {user}@{host}")
def run(self, cmd):
_, out, err = self.client.exec_command(cmd)
return out.read().decode() + err.read().decode()
def full_recon(self):
cmds = {
"OS": "uname -a",
"Hostname": "hostname",
"Users": "cat /etc/passwd | cut -d: -f1",
"Network": "ip a",
"Ports": "ss -tlnp",
"Processes": "ps aux | head -15",
"Cron": "crontab -l 2>/dev/null",
"SUID": "find / -perm -4000 2>/dev/null | head -10",
"Env": "env | grep -i pass",
}
results = {}
for name, cmd in cmds.items():
out = self.run(cmd).strip()
results[name] = out
print(f"\n[+] {name}:\n{out[:200]}")
with open(f"recon_{self.host}.json", "w") as f:
json.dump(results, f, indent=2)
print(f"\n[+] Saved: recon_{self.host}.json")
def close(self): self.client.close()
ssh = SSHRecon("192.168.1.100", "root", password="toor")
ssh.full_recon(); ssh.close()
🤖 Project 5: CTF Swiss Army Knife
import base64, hashlib, re, string, codecs
class CTFSolver:
def auto_decode(self, text):
text = text.strip(); results = []
# Base64
try:
d = base64.b64decode(text+'==').decode()
if d.isprintable(): results.append(('Base64', d))
except: pass
# Hex
try:
d = bytes.fromhex(text.replace(' ','')).decode()
if d.isprintable(): results.append(('Hex', d))
except: pass
# Binary
try:
bits = text.replace(' ','')
if set(bits) <= {'0','1'} and len(bits) % 8 == 0:
d = "".join(chr(int(bits[i:i+8],2)) for i in range(0,len(bits),8))
results.append(('Binary', d))
except: pass
# ROT13
results.append(('ROT13', codecs.encode(text,'rot_13')))
# All Caesar
for shift in range(1,26):
d = "".join(chr((ord(c)-65+shift)%26+65) if c.isupper() else
chr((ord(c)-97+shift)%26+97) if c.islower() else c for c in text)
results.append((f'Caesar-{shift}', d))
return results
def xor_brute(self, data):
if isinstance(data, str): data = bytes.fromhex(data)
best = []
for key in range(256):
r = bytes([b^key for b in data])
try:
t = r.decode('utf-8')
sc = sum(1 for c in t if c in string.printable)
best.append((sc, key, t))
except: pass
return sorted(best, reverse=True)[:5]
def find_flag(self, text):
patterns = [r'flag\{[^}]+\}',r'CTF\{[^}]+\}',r'THM\{[^}]+\}',r'HTB\{[^}]+\}']
return [f for p in patterns for f in re.findall(p, text, re.I)]
ctf = CTFSolver()
for method, val in ctf.auto_decode("SGVsbG8gV29ybGQ=")[:3]:
print(f"[{method}]: {val}")
🔒 Project 6: Encrypted Chat (AES)
import socket, threading, os, base64
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding as pad_mod
from cryptography.hazmat.backends import default_backend
SHARED_KEY = b'MySuperSecretKey' * 2 # 32 bytes AES-256
def encrypt(msg):
iv = os.urandom(16)
padder = pad_mod.PKCS7(128).padder()
padded = padder.update(msg.encode()) + padder.finalize()
c = Cipher(algorithms.AES(SHARED_KEY), modes.CBC(iv), backend=default_backend())
ct = c.encryptor().update(padded) + c.encryptor().finalize()
return base64.b64encode(iv + ct).decode()
def decrypt(data):
raw = base64.b64decode(data)
iv, ct = raw[:16], raw[16:]
c = Cipher(algorithms.AES(SHARED_KEY), modes.CBC(iv), backend=default_backend())
padded = c.decryptor().update(ct) + c.decryptor().finalize()
unpadder = pad_mod.PKCS7(128).unpadder()
return (unpadder.update(padded) + unpadder.finalize()).decode()
def chat_server(port=9999):
server = socket.socket(); server.bind(("0.0.0.0", port)); server.listen(1)
print(f"[*] Encrypted chat listening on {port}")
conn, addr = server.accept(); print(f"[+] {addr[0]} joined")
def recv_loop():
while True:
data = conn.recv(4096).decode()
if not data: break
print(f"[Them]: {decrypt(data)}")
threading.Thread(target=recv_loop, daemon=True).start()
while True:
msg = input("[You]: ")
conn.send(encrypt(msg).encode())
chat_server()
🎯 তুমি এখন কী কী পারোWhat You Can Now Do
- 🔌 Python socket দিয়ে যেকোনো network tool বানাতে পারোBuild any network tool with Python sockets
- 🔍 Multi-threaded port scanner দিয়ে network scan করতে পারোScan networks with multi-threaded port scanners
- 🌐 SQLi, XSS, directory brute force — web attack test করতে পারোTest web attacks — SQLi, XSS, directory bruteforce
- 🔑 Hash crack, password attack, dictionary/brute force করতে পারোCrack hashes, perform dictionary/brute force attacks
- 📦 Scapy দিয়ে packet sniff, craft, ARP spoof করতে পারোSniff, craft packets, and ARP spoof with Scapy
- 🔐 AES, RSA, XOR encryption implement করতে পারোImplement AES, RSA, XOR encryption
- 🕵️ EXIF, steganography, domain OSINT করতে পারোPerform EXIF analysis, steganography, domain OSINT
- 🦠 Static malware analysis ও Linux hardening audit করতে পারোPerform static malware analysis and Linux hardening audits
- 🚀 Production-ready security tool বানাতে পারোBuild production-ready security tools
🐍 "With great Python power comes great ethical responsibility."
সব কিছু authorized environment-এ practice করো। Security শেখার উদ্দেশ্য হলো defend করা, attack নয়।
Practice everything in authorized environments. The goal of learning security is to defend, not attack.
Python for Hackers v1.0 — 12 Chapters | Complete Bilingual Guide | বাংলা + English