Tengo un proyecto de sitio web de Django que está activo (llamémoslo example.com). Es un foro donde los usuarios pueden enviar comentarios y responderlos. Tiene una base de datos Postgresql y un proxy inverso gunicorn + nginx como el servidor web configurado. Estoy alojado en una máquina virtual con tecnología Azure, con Ubuntu 14.04 basado en Debian como sistema operativo. Por último, tenga en cuenta que la aplicación web y el servidor se encuentran en dos instancias de máquinas virtuales separadas.
Sospecho que mis servidores pueden estar comprometidos: estoy en la etapa de recopilación de datos en la que estoy averiguando si (i) de hecho mis servidores están comprometidos (ii) si mis datos también están comprometidos (iii) cómo se comprometieron Sucede, para que no me vuelvan a hackear.
En las aplicaciones de Django, hay un archivo base.html
que todos los demás archivos .html
heredan (o extend
en Django). Este archivo base.html
contiene la etiqueta <head>
con metaetiquetas requeridas, etc., por lo que no es necesario replicarlo en cada archivo de plantilla.
Mi archivo base.html
tiene algún código javascript que no escribí . De hecho, no uso javascript en mi código en absoluto. Este fragmento malintencionado de JavaScript redirige a mis usuarios a los anuncios (es un truco para hacer dinero). Si inicio sesión en el servidor de producción de mi aplicación web y nano
en el archivo base.html
(es decir, lo abro en un editor de texto), los fragmentos ofensivos de javascript no aparecen allí .
En segundo lugar, cuando inspecciono el elemento en mi sitio web en vivo (navegador: Firefox), veo un botón ev
junto a la etiqueta contraída de mi sitio web:
Aparentemente,esteesunbotóndeeventosparadepurarJSenelinspectordecódigodeMozilla.Silopresiono,veo:
Noestoysegurodequées:37
(puerto37?).Además,sipresionoelbotóndepausa(depuración)delantedeclick
,medirigenaunodelosfragmentosdecódigoJSqueresidenenmicódigobase.html
:
Mi confusión es sobre cómo estos fragmentos de código JS pueden formar parte de mi sitio web en vivo cuando los archivos de mi servidor de producción parecen ser sin ellos?
Supongo que encontrar la fuente del hackeo requeriría profundizar más en esto. No he instalado SSL todavía, pero sospecho que mi problema no puede ser solucionado por eso. Este es un proyecto de dos personas, y la otra persona es una especialista en antropología cultural no tecnológica, especializada en estudios del sur de Asia, así que estoy segura de que no tiene nada que ver con eso.
He establecido rules.v4
para iptables
en:
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
1COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT