chore(i18n): finish translating code comments and scripts to English
CI / Format and clippy (push) Successful in 1m13s
CI / Dependency audit (push) Successful in 13s
CI / Tests (Linux) (push) Successful in 1m35s
Release / Create release (push) Successful in 7s
CI / Check desktop app (Linux) (push) Successful in 3m19s
Release / CLI (linux-aarch64) (push) Successful in 1m3s
Release / CLI (linux-x86_64) (push) Successful in 1m28s
Release / Desktop app (linux-aarch64) (push) Successful in 7m16s
Release / Desktop app (linux-x86_64) (push) Successful in 10m17s
Release / Desktop app (windows) (push) Successful in 4m54s
CI / Format and clippy (push) Successful in 1m13s
CI / Dependency audit (push) Successful in 13s
CI / Tests (Linux) (push) Successful in 1m35s
Release / Create release (push) Successful in 7s
CI / Check desktop app (Linux) (push) Successful in 3m19s
Release / CLI (linux-aarch64) (push) Successful in 1m3s
Release / CLI (linux-x86_64) (push) Successful in 1m28s
Release / Desktop app (linux-aarch64) (push) Successful in 7m16s
Release / Desktop app (linux-x86_64) (push) Successful in 10m17s
Release / Desktop app (windows) (push) Successful in 4m54s
Completes the English-only standardization for code, comments, scripts and CI templates (UI/CLI-facing strings stay bilingual pt-BR/en, untouched). Covers the remaining crates/, apps/gui/ui/ and apps/gui/src-tauri/ comments, .gitea/ workflow and template comments, .githooks/ hooks, and the scripts/ source comments for the files already renamed in a prior commit (check.sh, generate-logo.py, install-hooks.sh). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VAyr8d7HuAdUGB6aA5xmDD
This commit is contained in:
1 parent
bf059fd0bc
commit
55e19a8e5b
59 files changed
+935
-879
No files matched your search
@@ -1,36 +1,36 @@
|
||||
//! Evil Twin pra redes WPA2/WPA3-Enterprise (802.1X — usuário+senha via
|
||||
//! RADIUS, não uma senha única como o PSK comum): clona o AP numa segunda
|
||||
//! interface anunciando o mesmo SSID e aceita o handshake EAP (PEAP/EAP-TTLS
|
||||
//! com MSCHAPv2) de qualquer cliente que tente autenticar nele. Diferente do
|
||||
//! Evil Twin de PSK (`eviltwin.rs`), aqui o dispositivo manda a credencial
|
||||
//! **automaticamente**, como parte do próprio protocolo 802.1X — não precisa
|
||||
//! de portal cativo nem de nenhuma ação humana, porque o cliente já tenta
|
||||
//! autenticar sozinho em qualquer AP que anuncie o SSID que ele reconhece.
|
||||
//! WPA2/WPA3-Enterprise (802.1X) Evil Twin: clones an Enterprise AP on a
|
||||
//! secondary interface using `hostapd-wpe` to accept EAP (PEAP/EAP-TTLS with
|
||||
//! inner MSCHAPv2) authentication attempts and log NetNTLMv1 challenge/response
|
||||
//! hashes for offline cracking with `john` or `hashcat -m 5500`.
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//! Note: because the server certificate is self-signed, clients configured to
|
||||
//! strictly validate the RADIUS CA certificate chain will reject the connection;
|
||||
//! clients without strict CA pinning will complete the inner MSCHAPv2 exchange.
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//!
|
||||
//! Isso só existe pra Enterprise porque só nela a senha (ou algo derivado
|
||||
//! dela) de fato viaja pela rede como parte da autenticação — no PSK a
|
||||
//! senha nunca é transmitida (só confere um MIC), por isso o Evil Twin de
|
||||
//! PSK precisa enganar um humano a digitá-la de novo.
|
||||
//!
|
||||
//! Orquestra o `hostapd-wpe` (não vem com o Sabiá — precisa estar instalado
|
||||
//! separadamente: não é um binário pequeno vendorizável como o reaver, é um
|
||||
//! patch sobre a árvore de build do próprio hostapd). O Sabiá só gera a
|
||||
//! config, o `eap_user` genérico e o certificado autoassinado, e depois lê o
|
||||
//! log de credenciais capturadas.
|
||||
//!
|
||||
//! Limitação honesta: o certificado é autoassinado. Clientes que validam a
|
||||
//! cadeia de certificado da rede (comum em dispositivos atualizados,
|
||||
//! principalmente com perfil MDM corporativo) vão recusar a conexão ou
|
||||
//! avisar o usuário — exatamente a defesa que deveria existir contra esse
|
||||
//! ataque. Funciona de verdade contra dispositivos configurados sem essa
|
||||
//! validação (ainda comum em redes legadas/mal configuradas), que é o caso
|
||||
//! que esse ataque sempre existiu para expor.
|
||||
|
||||
use std::fmt::Write as _;
|
||||
|
||||
/// Config do hostapd-wpe pro AP clone: mesmo SSID/canal do AP real,
|
||||
/// anunciando WPA2-Enterprise e aceitando qualquer EAP (PEAP/TTLS) — é o
|
||||
/// `eap_user_file` genérico que faz ele aceitar qualquer identidade.
|
||||
/// Generates the `hostapd-wpe` configuration for the Enterprise clone AP.
|
||||
///
|
||||
///
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn hostapd_wpe_conf(
|
||||
iface: &str,
|
||||
@@ -64,20 +64,20 @@ pub fn hostapd_wpe_conf(
|
||||
out
|
||||
}
|
||||
|
||||
/// `eap_user` genérico: aceita qualquer identidade externa pra PEAP/TTLS e
|
||||
/// força MSCHAPv2 por dentro — é o que faz o hostapd-wpe logar usuário +
|
||||
/// challenge/response de qualquer cliente que tentar autenticar, sem
|
||||
/// precisar saber credenciais reais de antemão.
|
||||
/// Wildcard `eap_user` table: accepts any outer identity for PEAP/TTLS and
|
||||
/// negotiates inner MSCHAPv2 so `hostapd-wpe` logs the challenge/response pair.
|
||||
///
|
||||
///
|
||||
pub const DEFAULT_EAP_USER_FILE: &str = concat!(
|
||||
"# gerado pelo Sabiá — aceita qualquer identidade, qualquer EAP externo\n",
|
||||
"* PEAP,TTLS\n",
|
||||
"\"anonymous\" TTLS-MSCHAPV2,MSCHAPV2 \"senha\" [2]\n",
|
||||
);
|
||||
|
||||
/// Argumentos do `openssl req` pra gerar o par certificado+chave
|
||||
/// autoassinado que o hostapd-wpe precisa pra abrir TLS (PEAP/TTLS sempre
|
||||
/// envolve um túnel TLS, mesmo sendo um AP falso). Efêmero: 1 dia de validade
|
||||
/// é de sobra pra uma sessão de teste.
|
||||
/// Builds `openssl req` arguments to generate a 1-day ephemeral self-signed
|
||||
/// RSA certificate and private key for the outer EAP-TLS/PEAP/TTLS tunnel.
|
||||
///
|
||||
///
|
||||
pub fn openssl_selfsigned_cert_args(key_path: &str, cert_path: &str) -> Vec<String> {
|
||||
[
|
||||
"req",
|
||||
@@ -103,23 +103,23 @@ fn sanitize_conf_value(value: &str) -> String {
|
||||
value.replace(['\n', '\r'], "")
|
||||
}
|
||||
|
||||
/// Uma credencial capturada: identidade + a linha pronta pra crackear
|
||||
/// (formato `netntlm` do John the Ripper / compatível com `hashcat -m 5500`),
|
||||
/// se o hostapd-wpe conseguiu capturar os dois.
|
||||
/// A captured Enterprise credential: username plus NetNTLMv1 hash string
|
||||
/// (compatible with `john --format=netntlm` and `hashcat -m 5500`).
|
||||
///
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct CapturedCredential {
|
||||
pub username: String,
|
||||
pub netntlm: Option<String>,
|
||||
}
|
||||
|
||||
/// Lê o `wpe_logfile` e extrai as credenciais capturadas. Parser
|
||||
/// best-effort: o formato do hostapd-wpe é documentado (blocos
|
||||
/// `username:`/`challenge:`/`response:`/`jtr NETNTLM:`), mas não dá pra
|
||||
/// validar contra uma instalação de verdade nesta máquina (não é um
|
||||
/// binário que o Sabiá vendoriza). Pega a linha `jtr NETNTLM:` quando
|
||||
/// presente — já vem pronta pra `john --format=netntlm` ou pra reformatar
|
||||
/// pro `hashcat -m 5500` — e nunca falha "silenciosamente demais": o job
|
||||
/// sempre expõe o arquivo de log cru também, pra conferência manual.
|
||||
/// Parses `hostapd-wpe` log output and extracts captured MSCHAPv2 / NetNTLMv1 credentials.
|
||||
///
|
||||
///
|
||||
///
|
||||
///
|
||||
///
|
||||
///
|
||||
///
|
||||
pub fn captured_identities(log: &str) -> Vec<CapturedCredential> {
|
||||
let mut out: Vec<CapturedCredential> = Vec::new();
|
||||
let mut current_username: Option<String> = None;
|
||||
|
||||
Reference in new issue
Block a user