a dcerpc scanner under development
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',135))
s.send(bytes.fromhex('05000b03100000007400000002000000d016d016000000000200000000000100c4fefc9960521b10bbcb00aa0021347a00000000045d888aeb1cc9119fe808002b1048600200000001000100c4fefc9960521b10bbcb00aa0021347a000000002c1cb76c12984045030000000000000001000000'))
s.send(bytes.fromhex('050000031000000018000000020000000000000000000500'))
core code is as above
from scapy.fields import (
LEShortField,
PacketLenField,
PacketListField,
StrFixedLenField
)
from scapy.packet import (
Packet
)
# issubclass(IP,Packet)->True
from uuid import (
UUID
)
# 通用唯一标识符版本一
from scapy.layers.dcerpc import (
DceRpc5Request,
DceRpc5,
DceRpc5Bind
)
from scapy.layers.msrpce.all import (
find_dcerpc_interface
)
from scapy.all import hexdump
class WBZ7j(Packet):
name = "WBZ7j"
fields_desc = [
LEShortField("cn_ctx_id", 0),
LEShortField("cn_num_trans_items", 1),
StrFixedLenField("abstract_syntax", b"", length=20),
PacketListField(
name="cn_bind_trans",
default=[],
pkt_cls=lambda: StrFixedLenField("ts", b"", length=20), count_from=lambda pkt: pkt.cn_num_trans_items)
]
cn_bind_to_uuid = find_dcerpc_interface('IObjectExporter').uuid.bytes_le
# IObjectExporter对象导出器方法 用端点映射器查找一个远程过程调用接口
# ServerAlive2操作和是5
cn_bind_trans_id = list((UUID('8a885d04-1ceb-11c9-9fe8-08002b104860').bytes_le+bytes.fromhex('02000000'),))
# 生成器表达式
item0 = WBZ7j(cn_ctx_id=0, cn_num_trans_items=1, abstract_syntax=cn_bind_to_uuid, cn_bind_trans=cn_bind_trans_id)
cn_bind_trans_id = list((UUID('6cb71c2c-9812-4540-0300-000000000000').bytes_le+bytes.fromhex('01000000'),))
item1 = WBZ7j(cn_ctx_id=1, cn_num_trans_items=1, abstract_syntax=cn_bind_to_uuid, cn_bind_trans=cn_bind_trans_id)
context_list = [item0, item1]
pkt = DceRpc5(
rpc_vers=5,
rpc_vers_minor=0,
ptype=11,
pfc_flags=0x03,
endian=1,
encoding=0,
float=0,
reserved1=0,
reserved2=0,
frag_len=116,
auth_len=0,
call_id=2,
auth_verifier=None,
auth_padding=None,
vt_trailer=None
)
"""
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPC VERS | RPC VERS MINOR| PTYPE | PFC FLAGS |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ENDIAN|ENCODIN| FLOAT | RESERVED1 | RESERVED2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FRAG LEN | AUTH LEN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CALL ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AUTH VERIFIER | AUTH PADDING |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| VT TRAILER |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
"""
hexdump(pkt)
a = DceRpc5Bind(
max_xmit_frag=5840,
max_recv_frag=5840,
assoc_group_id=0x00000000,
n_context_elem=2,
reserved=0,
context_elem=context_list
)
hexdump(a)
a=bytes(a)
print(bytes(pkt).hex()+a.hex())
pkt = DceRpc5(
rpc_vers=5,
rpc_vers_minor=0,
ptype=0,
pfc_flags=0x03,
endian=1,
encoding=0,
float=0,
reserved1=0,
reserved2=0,
frag_len=24,
auth_len=0,
call_id=2,
auth_verifier=None,
auth_padding=None,
vt_trailer=None
)
c=DceRpc5Request(
alloc_hint=0,
cont_id=0,
opnum=5,
object=None
)
hexdump(pkt)
hexdump(c)
print(bytes(pkt).hex()+bytes(c).hex())
I dont want to explain too much
评论
发表评论