diff --git a/README.md b/README.md
index 7948d3d..979b8d4 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ For the building instructions, usage and the complete list of options [check the
## Supported Protocols/Features:
-AMQP (ActiveMQ, RabbitMQ, Qpid, JORAM and Solace), Cassandra/ScyllaDB, DNS subdomain enumeration, FTP, HTTP (basic authentication, NTLMv1, NTLMv2, multipart form, custom requests with CSRF support and files/folders enumeration), IMAP, Kerberos pre-authentication and user enumeration, LDAP, MongoDB, MQTT, Microsoft SQL, MySQL, Oracle, PostgreSQL, POP3, RDP, Redis, SSH / SFTP, SMTP, STOMP (ActiveMQ, RabbitMQ, HornetQ and OpenMQ), TCP port scanning, Telnet, VNC.
+AMQP (ActiveMQ, RabbitMQ, Qpid, JORAM and Solace), Cassandra/ScyllaDB, DNS subdomain enumeration, FTP, HTTP (basic authentication, NTLMv1, NTLMv2, multipart form, custom requests with CSRF support, files/folders enumeration, virtual host enumeration), IMAP, Kerberos pre-authentication and user enumeration, LDAP, MongoDB, MQTT, Microsoft SQL, MySQL, Oracle, PostgreSQL, POP3, RDP, Redis, SSH / SFTP, SMTP, STOMP (ActiveMQ, RabbitMQ, HornetQ and OpenMQ), TCP port scanning, Telnet, VNC.
## Benchmark
diff --git a/src/plugins/http/mod.rs b/src/plugins/http/mod.rs
index d741a79..35836a4 100644
--- a/src/plugins/http/mod.rs
+++ b/src/plugins/http/mod.rs
@@ -4,7 +4,7 @@ use async_trait::async_trait;
use ctor::ctor;
use rand::seq::SliceRandom;
use reqwest::{
- header::{HeaderMap, HeaderName, HeaderValue, CONTENT_TYPE, COOKIE, USER_AGENT},
+ header::{HeaderMap, HeaderName, HeaderValue, CONTENT_TYPE, COOKIE, HOST, USER_AGENT},
multipart, redirect, Client, Method, RequestBuilder, Response,
};
use url::Url;
@@ -29,6 +29,7 @@ fn register() {
crate::plugins::manager::register("http.ntlm1", Box::new(HTTP::new(Strategy::NLTMv1)));
crate::plugins::manager::register("http.ntlm2", Box::new(HTTP::new(Strategy::NLTMv2)));
crate::plugins::manager::register("http.enum", Box::new(HTTP::new(Strategy::Enumeration)));
+ crate::plugins::manager::register("http.vhost", Box::new(HTTP::new(Strategy::VHostEnum)));
}
fn method_requires_payload(method: &Method) -> bool {
@@ -43,6 +44,7 @@ pub(crate) enum Strategy {
NLTMv1,
NLTMv2,
Enumeration,
+ VHostEnum,
}
struct Success {
@@ -404,6 +406,47 @@ impl HTTP {
}
}
}
+
+ async fn http_vhost_enum_attempt(
+ &self,
+ creds: &Credentials,
+ timeout: Duration,
+ ) -> Result