Dirsearch tool, scan web path

1. Giớ thiệu

Không phải lúc nào các đường dẫn của một trang web cũng hiện ra để người dùng có thể truy cập, việc tìm kiếm các đường dẫn web cũng là một trong những phần quan trọng của việc pentest. Tìm kiếm các đường dẫn web bị ẩn đi sẽ tăng thêm thông tin cũng như các giá trị cho người kiểm thử. Có hàng loạt các công cụ giúp cho việc này trở nên dễ dàng hơn như Dirbuster, Dirb, Gobuster... nhưng mỗi cái đều có hạn chế riêng.

DirBuster được viết bằng Java và chỉ có giao diện GUI.

Dirb cũng là một công cụ scan khá phổ biến nhưng không hỗ trợ đa luồng, việc scan không hỗ trợ đa luồng gặp rất nhiều bất tiện.

Gobuster cũng là một công cụ rất mạnh được viết bằng Go, nhưng việc cài đặt khó khăn hơn trên win hay ubuntu so với Dirsearch.

Dirsearch là một công cụ mã nguồn mở được viết bằng Python hoạt động theo kiểu brute-forcing cấu trúc thư mục, file của web. Nó có thể chạy trên Windows, Linux, macOS. Dirsearch sử dụng các dòng lệnh đơn giản mà hiệu quả, nó hỗ trợ rất nhiều options như đa luồng, tìm kiếm theo list extensions, delay giữa các request, set cookie, user-agent, headers, proxy... Chính vì thế dirsearch trở thành công cụ phổ biến mà hầu hết các hacker hay pentester đều sử dụng.

2. Cài đặt

Đầu tiên chúng ta cần clone dirsearch từ GitHub

~$ git clone https://github.com/maurosoria/dirsearch.git
Cloning into 'dirsearch'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 1818 (delta 0), reused 3 (delta 0), pack-reused 1813
Receiving objects: 100% (1818/1818), 17.69 MiB | 2.38 MiB/s, done.
Resolving deltas: 100% (1059/1059), done.

3. Cấu hình

Có rất nhiều các chạy dirsearch như chạy bằng python, bash, Symbolic Link, cấu hình alias, bạn có thể chọn một trong số cách sau đây.

1. Chạy bằng Python

Như ở trên mình đã nói dirsearch được viết bằng Python, nên chỉ cần chạy file dirsearch.py với Python3.

$ cd dirsearch/
~/dirsearch$ python3 dirsearch.py 
URL target is missing, try using -u <url>
2. Chạy bằng Bash
$ cd dirsearch/
~/dirsearch$ ./dirsearch.py 
URL target is missing, try using -u <url>
3. Sử dụng alias

Mở .bashrc và add alias dirsearch='python3 ~/dirsearch/dirsearch.py'

~$ nano ~/.bashrc

~$ source ~/.bashrc

Xong các bạn chỉ cần chạy lệnh dirsearch trên terminal khi các bạn đứng ở bất cứ thư mục nào.

~$ dirsearch
URL target is missing, try using -u <url>

4. Sử dụng Symbolic Link

Có thể tạo một liên kết tới thư mục /bin. Nó cũng giống như ở trên bạn cũng có thể chạy lệnh dirsearch trên terminal khi các bạn đứng ở bất cứ thư mục nào.

~$ sudo ln -s ~/dirsearch/dirsearch.py /bin/dirsearch
~$ dirsearch
URL target is missing, try using -u <url>

4. Sử dụng dirsearch

Để xem các chi tiết các options cũng như tác dụng của mỗi option thì chỉ cần thêm option -h:

~$ dirsearch -h
Usage: dirsearch [-u|--url] target [-e|--extensions] extensions [options]

Options:
  -h, --help            show this help message and exit

  Mandatory:
    -u URL, --url=URL   URL target
    -L URLLIST, --url-list=URLLIST
                        URL list target
    -e EXTENSIONS, --extensions=EXTENSIONS
                        Extension list separated by comma (Example: php,asp)
    -E, --extensions-list
                        Use predefined list of common extensions

  Dictionary Settings:
    -w WORDLIST, --wordlist=WORDLIST
                        Customize wordlist (separated by comma)
    -l, --lowercase     
    -f, --force-extensions
                        Force extensions for every wordlist entry (like in
                        DirBuster)

  General Settings:
    -s DELAY, --delay=DELAY
                        Delay between requests (float number)
    -r, --recursive     Bruteforce recursively
    -R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
                        Max recursion level (subdirs) (Default: 1 [only
                        rootdir + 1 dir])
    --suppress-empty, --suppress-empty
    --scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
                        Scan subdirectories of the given -u|--url (separated
                        by comma)
    --exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
                        Exclude the following subdirectories during recursive
                        scan (separated by comma)
    -t THREADSCOUNT, --threads=THREADSCOUNT
                        Number of Threads                                                                                                                                                                                                  
    -x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES                                                                                                                                                                             
                        Exclude status code, separated by comma (example: 301,                                                                                                                                                             
                        500)                                                                                                                                                                                                               
    --exclude-texts=EXCLUDETEXTS                                                                                                                                                                                                           
                        Exclude responses by texts, separated by comma                                                                                                                                                                     
                        (example: "Not found", "Error")                                                                                                                                                                                    
    --exclude-regexps=EXCLUDEREGEXPS                                                                                                                                                                                                       
                        Exclude responses by regexps, separated by comma                                                                                                                                                                   
                        (example: "Not foun[a-z]{1}", "^Error$")                                                                                                                                                                           
    -c COOKIE, --cookie=COOKIE                                                                                                                                                                                                             
    --ua=USERAGENT, --user-agent=USERAGENT
    -F, --follow-redirects
    -H HEADERS, --header=HEADERS
                        Headers to add (example: --header "Referer:
                        example.com" --header "User-Agent: IE"
    --random-agents, --random-user-agents

  Connection Settings:
    --timeout=TIMEOUT   Connection timeout
    --ip=IP             Resolve name to IP address
    --proxy=HTTPPROXY, --http-proxy=HTTPPROXY
                        Http Proxy (example: localhost:8080
    --http-method=HTTPMETHOD
                        Method to use, default: GET, possible also: HEAD;POST
    --max-retries=MAXRETRIES
    -b, --request-by-hostname
                        By default dirsearch will request by IP for speed.
                        This forces requests by hostname

  Reports:
    --simple-report=SIMPLEOUTPUTFILE
                        Only found paths
    --plain-text-report=PLAINTEXTOUTPUTFILE
                        Found paths with status codes
    --json-report=JSONOUTPUTFILE

Có thể thấy options của dirsearch rất đa dạng phong phú, nhưng chúng ta nên chú trọng vào những options quan trọng như -u, -e, -r, -t, -w, -x.

Ví dụ có target là trang http://testphp.vulnweb.com/

Để scan được chúng ta bắt buộc phải truyền vào 2 đối số à -u, -e, trong đó -u là url mà ta muốn scan, -e là extensions mà chúng ta muốn tìm kiếm, cũng có thể tìm kiếm nhiều extensions một lúc, mỗi extension cách nhau một dấu phẩy.

Example:

~$ dirsearch -u http://testphp.vulnweb.com/ -e php,html,txt

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, html, txt | HTTP method: get | Threads: 10 | Wordlist size: 6748

Error Log: /home/justx/dirsearch/logs/errors-20-05-24_13-50-24.log

Target: http://testphp.vulnweb.com/

[13:50:24] Starting: 
[13:50:31] 400 -  172B  - /%2e%2e/google.com
[13:50:39] 301 -  184B  - /.idea  ->  http://testphp.vulnweb.com/.idea/
[13:50:39] 200 -  967B  - /.idea/
[13:50:39] 200 -    6B  - /.idea/.name
[13:50:39] 200 -  266B  - /.idea/misc.xml                      
[13:50:39] 200 -  171B  - /.idea/encodings.xml
[13:50:39] 200 -  275B  - /.idea/modules.xml
[13:50:39] 200 -  143B  - /.idea/scopes/scope_settings.xml
[13:50:39] 200 -  173B  - /.idea/vcs.xml          
[13:50:41] 200 -   12KB - /.idea/workspace.xml      
[13:50:57] 200 -   92B  - /_mmServerScripts/MMHTTPDB.php                         
[13:51:06] 301 -  184B  - /admin  ->  http://testphp.vulnweb.com/admin/
[13:51:10] 200 -  278B  - /admin/                 
[13:51:10] 200 -  278B  - /admin/?/login
[13:52:04] 403 -  263B  - /cgi-bin                                                                                
[13:52:04] 403 -  263B  - /cgi-bin/ 
[13:52:13] 301 -  184B  - /Connections  ->  http://testphp.vulnweb.com/Connections/
[13:52:16] 200 -  224B  - /crossdomain.xml                
[13:52:18] 200 -    1B  - /CVS/Root        
[13:52:18] 301 -  184B  - /CVS  ->  http://testphp.vulnweb.com/CVS/
[13:52:18] 200 -  611B  - /CVS/       
[13:52:33] 200 -  894B  - /favicon.ico                                   
[13:52:48] 301 -  184B  - /images  ->  http://testphp.vulnweb.com/images/                             
[13:52:51] 200 -    5KB - /index.php                                                                           
[13:52:51] 200 -    3KB - /index.bak   
[13:52:53] 200 -    3KB - /index.zip       
[13:53:06] 200 -    5KB - /login.php                                                                    
[13:53:35] 301 -  184B  - /pictures  ->  http://testphp.vulnweb.com/pictures/           
[13:53:46] 301 -  184B  - /secured  ->  http://testphp.vulnweb.com/secured/                             
[13:54:03] 301 -  184B  - /Templates  ->  http://testphp.vulnweb.com/Templates/                                   
[13:54:11] 302 -   14B  - /userinfo.php  ->  login.php                      
                                                                                        
Task Completed

Như các bạn thấy phần phía trên là những tham số mà chương trình đã set để chạy, phía dưới là kết quả của việc thực hiện quét, nó được chia ra thành từng cột nhìn rất rõ ràng. Cột đầu tiên là thời gian, cột thứ 2 là status code của response, cột thứ 3 là size, và cột cuối cùng là thư mục hay file thực hiện quét.

Vậy làm sao để tạm dừng khi nó đang chạy, chỉ cần ấn <Ctrl>+C chương trình sẽ tạm dừng và có 2 lựa chọn là ec, trong đó e là exit để thoát hẳn chương trình và c continue để tiếp tục quét ngay tại chỗ bạn đã tạm dừng.

Nâng cao hơn là các bạn có thể loại bỏ những status code mà không mong muốn tránh cho việc quá nhiều thông tin thừa gây rối loạn. Ví dụ cần loại bỏ những thư mục hay file nào có status code không mong muốn chỉ cần thêm option -x <status code cần loại bỏ>, cũng có thể loại bỏ nhiều status code cùng một lúc, mỗi status code cách nhau bởi dấu phẩy. Ví dụ cần loại bỏ những thư mục hay file có status code là 400 và 403 thì ta cần thêm options -x 403,400.

Example:

~$ dirsearch -u http://testphp.vulnweb.com/ -e php,html,txt -x 403,400

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, html, txt | HTTP method: get | Threads: 10 | Wordlist size: 6748

Error Log: /home/justx/dirsearch/logs/errors-20-05-24_14-14-04.log

Target: http://testphp.vulnweb.com/

[14:14:05] Starting: 
[14:14:14] 301 -  184B  - /.idea  ->  http://testphp.vulnweb.com/.idea/
[14:14:14] 200 -  967B  - /.idea/
[14:14:14] 200 -    6B  - /.idea/.name                         
[14:14:15] 200 -  171B  - /.idea/encodings.xml       
[14:14:15] 200 -  143B  - /.idea/scopes/scope_settings.xml
[14:14:15] 200 -  266B  - /.idea/misc.xml
[14:14:15] 200 -  275B  - /.idea/modules.xml
[14:14:15] 200 -  173B  - /.idea/vcs.xml          
[14:14:16] 200 -   12KB - /.idea/workspace.xml      
[14:14:31] 200 -   92B  - /_mmServerScripts/MMHTTPDB.php                         
[14:14:39] 301 -  184B  - /admin  ->  http://testphp.vulnweb.com/admin/
[14:14:43] 200 -  278B  - /admin/                 
[14:14:43] 200 -  278B  - /admin/?/login  
[14:15:47] 301 -  184B  - /Connections  ->  http://testphp.vulnweb.com/Connections/                               
[14:15:50] 200 -  224B  - /crossdomain.xml                
[14:15:51] 200 -  611B  - /CVS/            
[14:15:51] 301 -  184B  - /CVS  ->  http://testphp.vulnweb.com/CVS/
[14:15:51] 200 -    1B  - /CVS/Root
[14:16:05] 200 -  894B  - /favicon.ico                                   
[14:16:17] 301 -  184B  - /images  ->  http://testphp.vulnweb.com/images/                             
[14:16:19] 200 -    5KB - /index.php                                                                           
[14:16:20] 200 -    3KB - /index.bak   
[14:16:21] 200 -    3KB - /index.zip       
[14:16:31] 200 -    5KB - /login.php                                                                    
[14:17:03] 301 -  184B  - /pictures  ->  http://testphp.vulnweb.com/pictures/           
[14:17:16] 301 -  184B  - /secured  ->  http://testphp.vulnweb.com/secured/                             
[14:17:35] 301 -  184B  - /Templates  ->  http://testphp.vulnweb.com/Templates/                                   
[14:17:43] 302 -   14B  - /userinfo.php  ->  login.php                      
                                                                                        
Task Completed

So với kết quả ở trên, trông nó đã gọn hơn rất nhiều phải không, việc loại bỏ status code tùy thuộc vào mỗi trường hợp khác nhau, tùy vào nhu cầu của người cần quét để việc loại bỏ trở nên hiệu quả hơn.

Scan theo kiểu brute-forcing này phụ thuộc rất nhiều vào thư việc các từ mà chúng ta cần thử nó gọi là wordlist, vậy nên chúng ta không muốn dùng wordlist mặc định của dirsearch mà chúng ta dùng thư viện riêng khác để việc scan trở nên hiệu quả hơn, dirsearch hỗ trợ một option để làm điều này cực kỳ hữu ích đó là -w. Bạn có thể tham khảo qua wordlist của kali. Một số lưu ý bạn cần đảm bảo rằng đường dẫn đến wordlist của bạn phải đúng, nên sử dụng đường dẫn tuyệt đối là một cách tốt vời nhất để tránh không tìm thấy wordlist gây ra lỗi không thể load wordlist. Ví dụ như -w /home/justx/common.txt.

Example:

~$ dirsearch -u http://testphp.vulnweb.com/ -e php,html,txt -x 403,400 -w /home/justx/common.txt 

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, html, txt | HTTP method: get | Threads: 10 | Wordlist size: 100

Error Log: /home/justx/dirsearch/logs/errors-20-05-24_14-42-29.log

Target: http://testphp.vulnweb.com/

[14:42:30] Starting: 
[14:42:32] 301 -  184B  - /CVS  ->  http://testphp.vulnweb.com/CVS/
[14:42:33] 301 -  184B  - /admin  ->  http://testphp.vulnweb.com/admin/
                                         
Task Completed

Nhìn kết quả có vẻ rất ít, thu thập được ít thông tin hơn và các bạn cho rằng tool này không ngon, nhưng không như mình đã nói kiểu scan này phụ thuộc rất nhiều vào thư viện mà ta sử dụng, vậy nên chọn wordlist sao cho hợp lý cũng sẽ giúp cho việc thu thập thông tin trở nên hiệu quả hơn.

Để quét sâu hơn vào trong các thư mục thì dirsearch hỗ trợ một option -r, ví dụ các bạn quét được http://testphp.vulnweb.com/admin/ nhưng các bạn muốn chương trình quét tiếp trong thư mục đấy có gì thì các bạn có thể sử dụng option này thay vì phải quét thủ công bằng cách thay đổi url.

Example:

~$ dirsearch -u http://testphp.vulnweb.com/ -e php,html,txt -x 403,400 -w /usr/share/wordlists/dirb/common.txt -r

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, html, txt | HTTP method: get | Threads: 10 | Wordlist size: 4614 | Recursion level: 1

Error Log: /home/justx/dirsearch/logs/errors-20-05-24_15-35-04.log

Target: http://testphp.vulnweb.com/

[15:35:05] Starting: 
[15:35:06] 200 -    5KB - /
[15:35:16] 301 -  184B  - /admin  ->  http://testphp.vulnweb.com/admin/
[15:35:44] 301 -  184B  - /CVS  ->  http://testphp.vulnweb.com/CVS/
[15:35:44] 200 -    1B  - /CVS/Entries
[15:35:44] 200 -    8B  - /CVS/Repository
[15:35:44] 200 -    1B  - /CVS/Root
[15:35:44] 200 -  224B  - /crossdomain.xml
[15:36:00] 200 -  894B  - /favicon.ico               
[15:36:13] 301 -  184B  - /images  ->  http://testphp.vulnweb.com/images/
[15:36:15] 200 -    5KB - /index.php   
[15:36:44] 301 -  184B  - /pictures  ->  http://testphp.vulnweb.com/pictures/
[15:37:01] 301 -  184B  - /secured  ->  http://testphp.vulnweb.com/secured/
[15:37:31] Starting: admin/                     
[15:37:33] 200 -  278B  - /admin/
[15:40:09] Starting: CVS/                             
[15:40:11] 200 -  611B  - /CVS/        
[15:40:53] 200 -    1B  - /CVS/Entries                
[15:41:52] 200 -    1B  - /CVS/Root          
[15:42:28] Starting: images/                    
[15:42:29] 200 -  393B  - /images/  
[15:44:49] Starting: pictures/                        
[15:44:59] 200 -    3KB - /pictures/   
[15:47:18] 200 -  771B  - /pictures/WS_FTP.LOG        
[15:47:23] Starting: secured/               
[15:48:07] 200 -    0B  - /secured/
[15:49:05] 200 -    0B  - /secured/index.php          
[15:49:33] 200 -   45KB - /secured/phpinfo.php
                                                
Task Completed

Sau khi tìm thấy các file hay thư mục ở cấp độ một chúng tiếp tục quét vào từng thư mục mà nó đã tìm thấy, như vậy việc quét thu được kết quả sâu hơn các mức quét bình thường

Và option tiếp theo mình muốn giới thiệu là -t, một trong nhưng sức mạnh của dirsearch, option này giúp cho chương trình chạy đa luồng làm tăng tốc độ quét, một chương trình kiểu brute-forcing với việc chạy đa luồng sẽ giúp giảm đi thời gian chạy rất nhiều lần, với những wordlist có size lớn bạn sẽ thấy rõ hiệu quả của việc chạy đa luồng là như thế nào.

Example:

~$ dirsearch -u http://testphp.vulnweb.com/ -e php,html,txt -x 403,400 -w /usr/share/wordlists/dirb/common.txt -r -t 100

 _|. _ _  _  _  _ _|_    v0.3.9
(_||| _) (/_(_|| (_| )

Extensions: php, html, txt | HTTP method: get | Threads: 100 | Wordlist size: 4614 | Recursion level: 1

Error Log: /home/justx/dirsearch/logs/errors-20-05-24_15-35-06.log

Target: http://testphp.vulnweb.com/

[15:35:07] Starting: 
[15:35:09] 200 -    5KB - /
[15:35:11] 301 -  184B  - /admin  ->  http://testphp.vulnweb.com/admin/
[15:35:13] 200 -  224B  - /crossdomain.xml   
[15:35:14] 301 -  184B  - /CVS  ->  http://testphp.vulnweb.com/CVS/
[15:35:14] 200 -    1B  - /CVS/Entries   
[15:35:14] 200 -    1B  - /CVS/Root        
[15:35:14] 200 -    8B  - /CVS/Repository
[15:35:15] 200 -  894B  - /favicon.ico               
[15:35:17] 301 -  184B  - /images  ->  http://testphp.vulnweb.com/images/
[15:35:17] 200 -    5KB - /index.php 
[15:35:20] 301 -  184B  - /pictures  ->  http://testphp.vulnweb.com/pictures/
[15:35:23] 301 -  184B  - /secured  ->  http://testphp.vulnweb.com/secured/
[15:35:51] Starting: admin/                     
[15:35:53] 200 -  278B  - /admin/
[15:36:35] Starting: CVS/                             
[15:36:40] 200 -  611B  - /CVS/                       
[15:36:45] 200 -    1B  - /CVS/Entries               
[15:36:52] 200 -    1B  - /CVS/Root               
[15:37:05] Starting: images/                    
[15:37:07] 200 -  393B  - /images/     
[15:37:52] Starting: pictures/                        
[15:37:54] 200 -    3KB - /pictures/   
[15:38:11] 200 -  771B  - /pictures/WS_FTP.LOG        
[15:38:28] Starting: secured/                 
[15:38:30] 200 -    0B  - /secured/ 
[15:38:39] 200 -    0B  - /secured/index.php          
[15:38:45] 200 -   45KB - /secured/phpinfo.php
                                                
Task Completed

Nhìn kết quả và so với kết quả của phần trước cùng thời điểm quét mọi options quét đều giống nhau chỉ khác ở phần sau có thêm thread thì hiệu quả về mặt thời gian tăng đáng kể, điều đó thể hiện là cùng quét tại thời điểm 15:35 thì chỉ với 10 threads thì kết thúc vào lúc 15:49, nghĩa là mất khoảng 14 phút nhưng với 100 threads thì chỉ mất đến 3 phút để quét hết wordlist cùng size, thật tuyệt vời khi có thread phải không.

Ngoài ra còn một số options như xuất report, set cookie, set headers, timeout... cũng là những options rất hữu ích các bạn có thể tham khảo thêm. Hy vọng tool này sẽ giúp ích cho các bạn trong việc tìm các thư mục hay file bị ẩn của một trang web.

5. Tài liệu

https://medium.com/@irfaanshakeel/dirsearch-to-find-hidden-web-directories-d0357fbe47b0

https://github.com/maurosoria/dirsearch

https://gitlab.com/kalilinux/packages/wordlists


All Rights Reserved