> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/http/or-directory-bruteforcing.md).

# 디렉토리 브루트포싱 | Directory Bruteforcing

## HTTP - 디렉토리 브루트포싱 (Directory Bruteforcing) <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

웹 애플리케이션들은 기본적으로 파일 시스템과 비슷하게 디렉토리들과 파일로 이뤄져 있습니다. 예를 들어 `www.example.com/cafe/home/lookup.html` 이라는 URL을 파일 시스템으로 치환해 간단하게 생각하면:

* `www.example.com`: 루트(root) 디렉토리에서
* `/cafe`: cafe라는 디렉토리 안의
* `/cafe/home`: home이라는 서브 디렉토리 안의
* `/cafe/home/lookup.html`: lookup.html 이라는 파일

이 됩니다. 어느 웹사이트나 웹 애플리케이션을 방문하더라도 `/` 로 구분 되어지는 디렉토리들은 많습니다. 이처럼 웹 애플리케이션이 유저에게 보여주지 않는 (UI나 버튼 등을 통해 확인 할 수 없는) 디렉토리들을 찾기 위해 브루트포싱을 하는 공격을 디렉토리 브루트포싱(Directory Bruteforcing)이라고 부릅니다.

예를 들어 다음과 같이 브루트포싱을 진행했을 때, 공격자는 의외의 디렉토리를 찾을 수도 있습니다.

```sql
www.example.com/cafe/home - 존재 O 
www.example.com/cafe/secret - 존재 X
www.example.com/cafe/members - 존재 O 
www.example.com/cafe/backup2022 - 존재 O - 어라? 
www.example.com/cafe/admin - 존재 O
```

그리고 이런 디렉토리 브루트포싱을 허용하는 웹 애플리케이션들을 "디렉토리 브루트포싱에 취약한 웹 애플리케이션" 이라고 합니다.

### 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FJky5fz3AJeLUFJYONiML%2Fimage.png?alt=media&amp;token=9a67e0bf-a3d7-4057-af71-887b94ee1784" alt=""><figcaption></figcaption></figure>

모든 브루트포싱 공겨과 마찬가지로 디렉토리 브루트포싱 또한 타겟 호스트의 가용성을 해치지 않는 선에서 진행합니다. 정답은 없지만, 대부분의 경우 하나의 프로세스에서 쓰레드 (thread) 10\~30 정도를 유지하며 대상 웹 애플리케이션에 초당 30개 이상의 HTTP 요청을 날리지 않는 선에서 진행합니다.

디렉토리 사전파일의 경우 [Seclist](https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content)의 `common.txt`, `directory-list-2.3-small.txt` 등이 많이 사용됩니다. 호스트의 숫자에 따라 너무 긴 사전 파일을 사용하는 경우 브루트포싱이 너무 오래 걸릴 수가 있어 유의해야 합니다. 예를 들어 실무에서 적게는 수백 대, 많게는 수천 대의 웹 서버/애플리케이션들을 진단하는 경우가 있는데, 이때 50,000줄 짜리 사전파일을 이용한다면 시간이 너무 오래 걸릴 것입니다.

> 실무의 경우 대상 웹 애플리케이션 앞의 클라우드플레어(Cloudflare)와 같은 리버스 프록시(Reverse Proxy), 웹 방화벽(WAF, Web Application Firewall), 네트워크 방화벽, 혹은 호스트 방화벽이 존재하는 경우가 많습니다. 빠른 디렉토리 브루트포싱을 진행하려다 IP 블랙리스트를 당하지 않도록 조심합니다.

디렉토리 브루트포싱의 경우 많은 툴이 있지만, BHPT 실습에서는 간단하고도 안전한 `gobuster`를 사용합니다. 이외 다른 툴로는 `ffuf, wfuzz, feroxbuster` 등이 있습니다. 다양한 툴들이 있지만, 실무에서는 툴들의 빠른 속도보다는 정확성과 가용성을 해치지 않는 안정성을 더 중요시 여깁니다.

디렉토리 브루트포싱

{% code overflow="wrap" %}

```sql
gobuster dir -u <url> -w <사전파일>
gobuster dir -u 1.1.1.1 -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt
```

{% endcode %}

디렉토리 브루트포싱 - 디렉토리 뒤에 `/` 강제로 붙이기

{% code overflow="wrap" %}

```sql
gobuster dir -u <url> -w <사전파일> -f
gobuster dir -u 1.1.1.1 -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt -f
```

{% endcode %}

파일 이름 브루트포싱 - 뒤에 파일 확장자 추가하기

```sql
gobuster dir -u <url> -w <사전파일> -x <확장자> 
gobuster dir -u <url> -w <사전파일> -x php,txt,html
```

HTTP 응답코드 200,301,302만 확인

```sql
gobuster dir -u <url> -w <사전파일> -t 20 -s 200,301,302 -b ""
```

`-t` 옵션의 경우에는 <mark style="color:blue;">**-t 10은 기본값**</mark>인데 <mark style="color:red;">**쓰레드**</mark>를 <mark style="color:red;">**-t 100**</mark>으로 설정하면 머신 자체가 고장날 확률이 높다.

`-s 200,301,302 -b ""`옵션의 경우에는 내가 보고 싶은 HTTP 응답코드를 지정할 수 있고, -b "" 옵션은 그 이외 응답코드는 무시하라는 옵션이다.

디렉토리 브루트포싱을 진행한 뒤 추가적인 디렉토리가 나왔다면, 해당 디렉토리에 한번 더 브루트포싱을 진행 해줍니다. <mark style="color:red;">**자동으로 이러한 재귀적 브루트포싱을 지원하는 툴들도 있지만, 이런 툴들의 경우 너무 오랜 시간이 걸릴 수 있어 실무에서는 사용을 자제하는 편입니다.**</mark>

<mark style="color:blue;">**추가 브루트포싱 진행을 잘 하지는 않는다.**</mark>

추가 브루트포싱 진행 - `/wp-content/` 이후의 디렉토리 브루트포싱

{% code overflow="wrap" %}

```sql
└─# gobuster dir -u http://172.31.188.187:8081/wp-content -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt -t 20 -s 200,301,302 -b ""

[ . . . ]
/themes     (Status: 301) [Size: 335] [--> http://172.31.188.187:8081/wp-content/themes/]
/feed       (Status: 200) [Size: 723]
/uploads    (Status: 301) [Size: 336] [--> http://172.31.188.187:8081/wp-content/uploads/]
```

{% endcode %}

### 연습 문제 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>

* `mod3ex`에서 발견한 모든 웹 서버 및 웹 애플리케이션들을 상대로 디렉토리 브루트포싱 공격을 시도해보세요.
* 찾아낸 디렉토리 및 페이지들을 따로 문서화 해 저장해놓으세요.

{% code overflow="wrap" %}

```
─# gobuster dir -u http://192.168.0.140/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,git,txt,backup
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.0.140/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,git,txt,backup
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php            (Status: 301) [Size: 0] [--> http://192.168.0.140/]
/login.php            (Status: 200) [Size: 2203]
/wp-content           (Status: 301) [Size: 240] [--> http://192.168.0.140/wp-content/]                                                                                  
/wp-login.php         (Status: 200) [Size: 7923]
/test.php             (Status: 200) [Size: 32]
/license.txt          (Status: 200) [Size: 19915]
/wp-includes          (Status: 301) [Size: 241] [--> http://192.168.0.140/wp-includes/]                                                                                 
/wp-trackback.php     (Status: 200) [Size: 146]
/wp-admin             (Status: 301) [Size: 238] [--> http://192.168.0.140/wp-admin/]
/hidden               (Status: 301) [Size: 236] [--> http://192.168.0.140/hidden/]
/xmlrpc.php           (Status: 405) [Size: 42]
/wp-signup.php        (Status: 302) [Size: 0] [--> http://192.168.0.140/wp-login.php?action=register]                                                                   
Progress: 1102800 / 1102805 (100.00%)
===============================================================
Finished
===============================================================

```

{% endcode %}

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F4DyEiDOtu77C0dzDzRXM%2Fimage.png?alt=media&amp;token=4275dd6b-bba9-422d-839c-361b1502319c" alt=""><figcaption></figcaption></figure>
