..

80,443 - Pentesting Web 방법론

{{#include ../../banners/hacktricks-training.md}}

기본 정보

웹 서비스는 가장 일반적이고 광범위한 서비스이며 많은 다양한 유형의 취약점이 존재합니다.

기본 포트: 80 (HTTP), 443(HTTPS)

PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  ssl/https
nc -v domain.com 80 # GET / HTTP/1.0
openssl s_client -connect domain.com:443 # GET / HTTP/1.0

웹 API 지침

{{#ref}} web-api-pentesting.md {{#endref}}

방법론 요약

이 방법론에서는 테스트할 대상이 도메인(또는 서브도메인) 하나만이라고 가정합니다. 따라서 스코프 내에서 발견된 각 도메인, 서브도메인 또는 웹 서버가 확정되지 않은 IP에 대해 이 방법론을 적용해야 합니다.

  • 먼저 웹 서버에서 사용되는 기술들식별하세요. 기술을 성공적으로 식별할 수 있다면 이후 테스트에서 기억해둘 요령을 찾아보세요.
  • 해당 기술 버전에 대한 known vulnerability가 있나요?
  • 사용 중인 well known tech가 있나요? 추가 정보를 추출하기 위한 useful trick가 있나요?
  • 실행할 specialised scanner가 있나요 (예: wpscan)?
  • general purposes scanners를 실행하세요. 무엇을 발견할지, 흥미로운 정보를 찾을지 모릅니다.
  • initial checks부터 시작하세요: robots, sitemap, 404 에러 및 SSL/TLS scan (HTTPS인 경우).
  • 웹 페이지 spidering을 시작하세요: 가능한 모든 files, folders와 사용 중인 parametersfind할 시간입니다. 또한 special findings도 확인하세요.
  • 새 디렉터리가 brute-forcing 또는 spidering 중에 발견되면, 해당 디렉터리는 spidered 되어야 한다는 점을 유의하세요.
  • Directory Brute-Forcing: 새로 발견된 폴더들에 대해 새로운 filesdirectories를 찾기 위해 brute force를 시도하세요.
  • 새 디렉터리가 brute-forcing 또는 spidering 중에 발견되면, 해당 디렉터리는 Brute-Forced 되어야 한다는 점을 유의하세요.
  • Backups checking: 공통 백업 확장자를 덧붙여 discovered filesbackups를 찾을 수 있는지 테스트하세요.
  • Brute-Force parameters: 숨겨진 파라미터를 찾아보세요.
  • 가능한 모든 endpointsuser input을 받는 것을 확인한 후, 이에 관련된 모든 종류의 vulnerabilities를 점검하세요.
  • 이 체크리스트를 따르세요

서버 버전 (취약한가?)

식별

실행 중인 서버의 version에 대한 known vulnerabilities가 있는지 확인하세요.
응답의 HTTP headers and cookies of the response는 사용 중인 technologies 및/또는 versionidentify하는 데 매우 유용할 수 있습니다. Nmap scan can identify the server version, but it could also be useful the tools whatweb, webtech or https://builtwith.com/:

whatweb -a 1 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
webanalyze -host https://google.com -crawl 2

Search for vulnerabilities of the web application version

WAF가 있는지 확인

웹 기술 트릭

사용 중인 다양한 잘 알려진 기술에서 취약점 찾기를 위한 몇 가지 트릭:

같은 도메인이 서로 다른 포트, 폴더서브도메인에서 서로 다른 기술을 사용할 수 있다는 점을 고려하세요.
웹 애플리케이션이 앞에서 나열한 잘 알려진 기술/플랫폼 또는 다른 것을 사용하고 있다면, 새로운 트릭을 인터넷에서 검색하는 것을 잊지 마세요(그리고 알려주세요!).

소스 코드 리뷰

애플리케이션의 source codegithub에서 이용 가능하다면, 직접 your own a White box test를 수행하는 것 외에도 현재의 Black-Box testinguseful할 수 있는 some information가 있습니다:

  • Is there a Change-log or Readme or Version file or anything with version info accessible via web?
  • How and where are saved the credentials? Is there any (accessible?) file with credentials (usernames or passwords)?
  • Are passwords in plain text, encrypted or which hashing algorithm is used?
  • Is it using any master key for encrypting something? Which algorithm is used?
  • Can you access any of these files exploiting some vulnerability?
  • Is there any interesting information in the github (solved and not solved) issues? Or in commit history (maybe some password introduced inside an old commit)?

{{#ref}} code-review-tools.md {{#endref}}

자동 스캐너

범용 자동 스캐너

nikto -h <URL>
whatweb -a 4 <URL>
wapiti -u <URL>
W3af
zaproxy #You can use an API
nuclei -ut && nuclei -target <URL>

# https://github.com/ignis-sec/puff (client side vulns fuzzer)
node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ"

CMS 스캐너

CMS를 사용하는 경우 스캐너를 실행하는 것을 잊지 마세요, 의외로 흥미로운 것이 발견될 수 있습니다:

Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin 웹사이트의 보안 문제를 검사합니다. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal 또는 (M)oodle
droopscan: Drupal, Joomla, Moodle, Silverstripe, Wordpress

cmsmap [-f W] -F -d <URL>
wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs

이 시점에서 클라이언트가 사용하는 웹 서버에 대한 정보(주어진 데이터가 있다면)와 테스트 중 유의할 몇 가지 요령을 이미 가지고 있어야 합니다. 운이 좋다면 CMS를 찾아 스캐너를 실행했을 수도 있습니다.

단계별 웹 애플리케이션 탐색

이 시점부터 웹 애플리케이션과 상호작용하기 시작합니다.

초기 확인

흥미로운 정보가 있는 기본 페이지:

  • /robots.txt
  • /sitemap.xml
  • /crossdomain.xml
  • /clientaccesspolicy.xml
  • /.well-known/
  • 메인 및 보조 페이지의 주석도 확인하세요.

오류 유도

웹 서버는 이상한 데이터가 전송될 때 예상치 못하게 동작할 수 있습니다. 이는 취약점을 유발하거나 민감한 정보의 노출을 초래할 수 있습니다.

  • /whatever_fake.php (.aspx,.html,.etc) 같은 가짜 페이지에 접근하세요
  • 오류를 유발하기 위해 cookie 값parameter 값에 "[]", "]]", "[["를 추가하세요
  • URL의 에 **/~randomthing/%s**를 입력하여 오류를 생성하세요
  • PATCH, DEBUG 같은 다양한 HTTP Verbs를 시도하거나 FAKE와 같이 잘못된 것을 시도하세요

파일 업로드 가능 여부 확인 (PUT verb, WebDav)

WebDav가 enabled되어 있지만 루트 폴더에 파일 업로드 권한이 충분하지 않다면 다음을 시도하세요:

  • 자격 증명에 대해 Brute Force
  • 웹 페이지 내 발견된 다른 폴더들에 WebDav를 통해 파일을 업로드하세요. 다른 폴더에는 업로드 권한이 있을 수 있습니다.

SSL/TLS 취약점

  • 애플리케이션이 어느 부분에서도 HTTPS 사용을 강제하지 않으면 MitM에 취약합니다
  • 애플리케이션이 민감한 데이터(비밀번호)를 HTTP로 전송한다면 이는 심각한 취약점입니다.

testssl.sh를 사용해 취약점을 확인하세요 (Bug Bounty 프로그램에서는 이런 종류의 취약점이 인정되지 않을 수 있음) 그리고 취약점을 다시 확인하려면 a2sv to recheck the vulnerabilities:

./testssl.sh [--htmlfile] 10.10.10.10:443
#Use the --htmlfile to save the output inside an htmlfile also

# You can also use other tools, by testssl.sh at this momment is the best one (I think)
sslscan <host:port>
sslyze --regular <ip:port>

Information about SSL/TLS vulnerabilities:

Spidering

웹 내부에 어떤 종류의 spider를 실행하세요. spider의 목적은 테스트 중인 애플리케이션에서 가능한 한 많은 경로를 찾는 것입니다. 따라서 웹 크롤링과 외부 소스를 사용해 가능한 많은 유효한 경로를 찾아야 합니다.

  • gospider (go): HTML spider, JS 파일에서 LinkFinder를 사용하고 외부 소스(Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com)를 참조합니다.
  • hakrawler (go): HTML spider, JS 파일에는 LinkFinder를 사용하고 Archive.org를 외부 소스로 사용합니다.
  • dirhunt (python): HTML spider이며 "juicy files"를 표시하기도 합니다.
  • evine (go): 대화형 CLI HTML spider. 또한 Archive.org를 검색합니다.
  • meg (go): 이 도구는 엄밀히 말해 spider는 아니지만 유용할 수 있습니다. 호스트 목록 파일과 경로 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다.
  • urlgrab (go): JS 렌더링 기능을 가진 HTML spider. 다만 유지보수가 안 되고, 사전 컴파일된 버전이 오래되었으며 현재 코드는 컴파일되지 않습니다.
  • gau (go): 외부 제공자(wayback, otx, commoncrawl)를 사용하는 HTML spider입니다.
  • ParamSpider: 파라미터가 있는 URL을 찾아 목록화하는 스크립트입니다.
  • galer (go): JS 렌더링 기능을 가진 HTML spider입니다.
  • LinkFinder (python): HTML spider이며 JS beautify 기능을 갖추어 JS 파일에서 새로운 경로를 검색할 수 있습니다. LinkFinder의 래퍼인 JSScanner도 살펴볼 가치가 있습니다.
  • goLinkFinder (go): HTML 소스와 임베디드 자바스크립트 파일에서 엔드포인트를 추출합니다. bug hunters, red teamers, infosec ninjas에게 유용합니다.
  • JSParser (python2.7): Tornado와 JSBeautifier를 사용해 JavaScript 파일에서 상대 URL을 파싱하는 Python 2.7 스크립트입니다. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지보수되지 않는 것으로 보입니다.
  • relative-url-extractor (ruby): 파일(HTML)을 입력하면 정교한 정규식으로 난독(minify) 파일에서 상대 URL을 찾아 추출합니다.
  • JSFScan (bash, 여러 도구): 여러 도구를 사용해 JS 파일에서 흥미로운 정보를 수집합니다.
  • subjs (go): JS 파일을 찾습니다.
  • page-fetch (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지 로드 시 로드되는 모든 URL을 출력합니다.
  • Feroxbuster (rust): 이전 도구들의 여러 옵션을 혼합한 콘텐츠 디스커버리 도구입니다.
  • Javascript Parsing: JS 파일에서 경로와 파라미터를 찾는 Burp extension입니다.
  • Sourcemapper: .js.map URL이 주어지면 정리된 JS 코드를 가져오는 도구입니다.
  • xnLinkFinder: 주어진 대상의 엔드포인트를 발견하는 도구입니다.
  • waymore: wayback machine에서 링크를 발견하고(또한 wayback에서 응답을 다운로드하고 더 많은 링크를 찾습니다)
  • HTTPLoot (go): 크롤링(심지어 폼 채우기 포함)하고 특정 정규식으로 민감한 정보를 찾아냅니다.
  • SpiderSuite: Spider Suite는 사이버 보안 전문가를 위해 설계된 고급 다기능 GUI 웹 보안 Crawler/Spider입니다.
  • jsluice (go): JavaScript 소스 코드에서 URL, 경로, 비밀 및 기타 흥미로운 데이터를 추출하는 Go 패키지이자 명령행 도구입니다.
  • ParaForge: 요청에서 파라미터와 엔드포인트를 추출하여 fuzzing과 열거를 위한 커스텀 워드리스트를 만드는 간단한 Burp Suite extension입니다.
  • katana (go): 이 작업에 적합한 훌륭한 도구입니다.
  • Crawley (go): 찾을 수 있는 모든 링크를 출력합니다.

Brute Force directories and files

루트 폴더에서 brute-forcing을 시작하고 이 **방법(this method)**으로 찾은 모든 디렉토리Spidering으로 발견된 모든 디렉토리를 반드시 brute-force 하세요(이 작업은 재귀적으로(recursively) 수행할 수 있으며, 사용한 워드리스트의 앞부분에 발견한 디렉토리 이름을 추가해서 실행할 수 있습니다).
도구:

  • Dirb / Dirbuster - Kali에 포함되어 있으며 오래된(old) (그리고 느린(slow)) 도구이지만 동작합니다. 자동 서명된 인증서 허용 및 재귀 검색을 지원합니다. 다른 옵션들에 비해 너무 느립니다.
  • Dirsearch (python): 자동 서명된 인증서를 허용하지 않지만 재귀 검색을 지원합니다.
  • Gobuster (go): 자동 서명된 인증서를 허용하며, 재귀(recursive) 검색은 지원하지 않습니다.
  • Feroxbuster - 빠르며, 재귀 검색을 지원합니다.
  • wfuzz wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ
  • ffuf - 빠름: ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ
  • uro (python): 발견된 URL 목록을 받아 "중복" URL을 제거하는 도구입니다.
  • Scavenger: Burp 히스토리에서 여러 페이지의 디렉토리 목록을 만드는 Burp Extension입니다.
  • TrashCompactor: js 임포트를 기반으로 중복 기능을 가진 URL을 제거합니다.
  • Chamaleon: wapalyzer를 사용해 사용된 기술을 감지하고 사용할 워드리스트를 선택합니다.

추천 사전(Recommended dictionaries):

참고: brute-forcing이나 spidering 중에 새로운 디렉토리가 발견되면 언제든지 해당 디렉토리는 Brute-Force 해야 합니다.

What to check on each file found

  • Broken link checker: HTML 내부의 끊어진 링크를 찾아 takeover에 취약한지 확인합니다.
  • File Backups: 모든 파일을 찾은 뒤에는 실행 파일들의 백업(".php", ".aspx"...)을 찾아보세요. 백업 파일 이름의 일반적인 변형으로는 file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp, file.old 등이 있습니다. 또한 도구 bfac 또는 backup-gen을 사용할 수 있습니다.
  • Discover new parameters: Arjun, parameth, x8 Param Miner를 사용해 숨겨진 파라미터를 발견할 수 있습니다. 가능하다면 각 실행 가능한 웹 파일에서 숨겨진 파라미터를 검색해 보세요.
  • Arjun all default wordlists: https://github.com/s0md3v/Arjun/tree/master/arjun/db
  • Param-miner “params” : https://github.com/PortSwigger/param-miner/blob/master/resources/params
  • Assetnote “parameters_top_1m”: https://wordlists.assetnote.io/
  • nullenc0de “params.txt”: https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773
  • Comments: 모든 파일의 주석을 확인하세요. 주석에서 credentials 또는 **숨겨진 기능(hidden functionality)**을 찾을 수 있습니다.
  • 만약 CTF를 진행하고 있다면, 흔한 트릭으로 페이지 소스 오른쪽에 수백 개의 공백을 넣어(브라우저로 소스 열 때 보이지 않게) 주석에 정보를 숨기는 방법이나 여러 줄을 추가해 페이지 하단 주석에 정보를 숨기는 방식이 있습니다.
  • API keys: API 키를 발견하면 다양한 플랫폼의 API 키 사용 방법을 알려주는 가이드들이 있습니다: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
  • Google API keys: 만약 AIza로 시작하는 API 키를 찾으면 프로젝트 gmapapiscanner를 사용해 해당 키로 어떤 API에 접근 가능한지 확인할 수 있습니다.
  • S3 Buckets: spidering 중에 어떤 subdomain이나 link가 S3 버킷과 관련되어 있는지 확인하세요. 그런 경우 버킷 권한을 확인하세요.

Special findings

spideringbrute-forcing을 수행하는 동안 주목해야 할 흥미로운 사항들을 발견할 수 있습니다.

Interesting files

403 Forbidden/Basic Authentication/401 Unauthorized (bypass)

{{#ref}} 403-and-401-bypasses.md {{#endref}}

502 Proxy Error

어떤 페이지가 이 코드로 응답하면 잘못 구성된 프록시일 가능성이 큽니다. 만약 다음과 같은 HTTP 요청을 보낸다면: GET https://google.com HTTP/1.1 (Host 헤더와 다른 일반 헤더들을 포함), 프록시는 _google.com_에 접근하려 시도하고 이로써 SSRF를 발견할 수 있습니다.

NTLM Authentication - Info disclosure

인증을 요구하는 서버가 Windows이거나 도메인 이름을 묻는 로그인 프롬프트를 찾으면 정보 노출을 유발할 수 있습니다.
헤더를 다음과 같이 전송하세요: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” 그러면 NTLM 인증 방식 때문에 서버는 "WWW-Authenticate" 헤더 안에 내부 정보(IIS 버전, Windows 버전 등)를 응답할 것입니다.
이 과정을 자동화하려면 nmap 플러그인 "http-ntlm-info.nse"를 사용할 수 있습니다.

HTTP Redirect (CTF)

리다이렉션 안에 콘텐츠를 넣을 수 있습니다. 이 콘텐츠는 브라우저가 리다이렉션을 실행하기 때문에 사용자에게 표시되지는 않지만 그 안에 무언가를 숨길 수 있습니다.

Web Vulnerabilities Checking

웹 애플리케이션의 포괄적 열거가 완료되었으면 이제 많은 가능한 취약점을 확인할 차례입니다. 체크리스트는 다음에서 확인하세요:

{{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}}

웹 취약점에 대한 추가 정보:

Monitor Pages for changes

페이지 변경 사항을 모니터링하려면 https://github.com/dgtlmoon/changedetection.io 같은 도구를 사용해 취약점을 삽입할 수 있는 수정 사항을 감지하세요.

HackTricks Automatic Commands

Protocol_Name: Web    #Protocol Abbreviation if there is one.
Port_Number:  80,443     #Comma separated if there is more than one.
Protocol_Description: Web         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for Web
Note: |
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/index.html

Entry_2:
Name: Quick Web Scan
Description: Nikto and GoBuster
Command: nikto -host {Web_Proto}://{IP}:{Web_Port} &&&& gobuster dir -w {Small_Dirlist} -u {Web_Proto}://{IP}:{Web_Port} && gobuster dir -w {Big_Dirlist} -u {Web_Proto}://{IP}:{Web_Port}

Entry_3:
Name: Nikto
Description: Basic Site Info via Nikto
Command: nikto -host {Web_Proto}://{IP}:{Web_Port}

Entry_4:
Name: WhatWeb
Description: General purpose auto scanner
Command: whatweb -a 4 {IP}

Entry_5:
Name: Directory Brute Force Non-Recursive
Description:  Non-Recursive Directory Brute Force
Command: gobuster dir -w {Big_Dirlist} -u {Web_Proto}://{IP}:{Web_Port}

Entry_6:
Name: Directory Brute Force Recursive
Description: Recursive Directory Brute Force
Command: python3 {Tool_Dir}dirsearch/dirsearch.py -w {Small_Dirlist} -e php,exe,sh,py,html,pl -f -t 20 -u {Web_Proto}://{IP}:{Web_Port} -r 10

Entry_7:
Name: Directory Brute Force CGI
Description: Common Gateway Interface Brute Force
Command: gobuster dir -u {Web_Proto}://{IP}:{Web_Port}/ -w /usr/share/seclists/Discovery/Web-Content/CGIs.txt -s 200

Entry_8:
Name: Nmap Web Vuln Scan
Description: Tailored Nmap Scan for web Vulnerabilities
Command: nmap -vv --reason -Pn -sV -p {Web_Port} --script=`banner,(http* or ssl*) and not (brute or broadcast or dos or external or http-slowloris* or fuzzer)` {IP}

Entry_9:
Name: Drupal
Description: Drupal Enumeration Notes
Note: |
git clone https://github.com/immunIT/drupwn.git for low hanging fruit and git clone https://github.com/droope/droopescan.git for deeper enumeration

Entry_10:
Name: WordPress
Description: WordPress Enumeration with WPScan
Command: |
?What is the location of the wp-login.php? Example: /Yeet/cannon/wp-login.php
wpscan --url {Web_Proto}://{IP}{1} --enumerate ap,at,cb,dbe && wpscan --url {Web_Proto}://{IP}{1} --enumerate u,tt,t,vp --passwords {Big_Passwordlist} -e

Entry_11:
Name: WordPress Hydra Brute Force
Description: Need User (admin is default)
Command: hydra -l admin -P {Big_Passwordlist} {IP} -V http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&testcookie=1:S=Location'

Entry_12:
Name: Ffuf Vhost
Description: Simple Scan with Ffuf for discovering additional vhosts
Command: ffuf -w {Subdomain_List}:FUZZ -u {Web_Proto}://{Domain_Name} -H "Host:FUZZ.{Domain_Name}" -c -mc all {Ffuf_Filters}

{{#include ../../banners/hacktricks-training.md}}