DCE/RPC server than handles the minimum RPCs for SMB to work:
| 1644 | |
| 1645 | |
| 1646 | class SMB_DCERPC_Server(DCERPC_Server): |
| 1647 | """ |
| 1648 | DCE/RPC server than handles the minimum RPCs for SMB to work: |
| 1649 | """ |
| 1650 | |
| 1651 | def __init__(self, *args, **kwargs): |
| 1652 | self.shares = kwargs.pop("shares") |
| 1653 | super(SMB_DCERPC_Server, self).__init__(*args, **kwargs) |
| 1654 | |
| 1655 | @DCERPC_Server.answer(NetrShareEnum_Request) |
| 1656 | def netr_share_enum(self, req): |
| 1657 | """ |
| 1658 | NetrShareEnum [MS-SRVS] |
| 1659 | "retrieves information about each shared resource on a server." |
| 1660 | """ |
| 1661 | nbEntries = len(self.shares) |
| 1662 | return NetrShareEnum_Response( |
| 1663 | InfoStruct=LPSHARE_ENUM_STRUCT( |
| 1664 | Level=1, |
| 1665 | ShareInfo=NDRUnion( |
| 1666 | tag=1, |
| 1667 | value=SHARE_INFO_1_CONTAINER( |
| 1668 | Buffer=[ |
| 1669 | # Add shares |
| 1670 | LPSHARE_INFO_1( |
| 1671 | shi1_netname=x.name, |
| 1672 | shi1_type=x.type, |
| 1673 | shi1_remark=x.remark, |
| 1674 | ) |
| 1675 | for x in self.shares |
| 1676 | ], |
| 1677 | EntriesRead=nbEntries, |
| 1678 | ), |
| 1679 | ), |
| 1680 | ), |
| 1681 | TotalEntries=nbEntries, |
| 1682 | ndr64=self.ndr64, |
| 1683 | ) |
| 1684 | |
| 1685 | @DCERPC_Server.answer(NetrWkstaGetInfo_Request) |
| 1686 | def netr_wksta_getinfo(self, req): |
| 1687 | """ |
| 1688 | NetrWkstaGetInfo [MS-SRVS] |
| 1689 | "returns information about the configuration of a workstation." |
| 1690 | """ |
| 1691 | return NetrWkstaGetInfo_Response( |
| 1692 | WkstaInfo=NDRUnion( |
| 1693 | tag=100, |
| 1694 | value=LPWKSTA_INFO_100( |
| 1695 | wki100_platform_id=500, # NT |
| 1696 | wki100_ver_major=5, |
| 1697 | ), |
| 1698 | ), |
| 1699 | ndr64=self.ndr64, |
| 1700 | ) |
| 1701 | |
| 1702 | @DCERPC_Server.answer(NetrServerGetInfo_Request) |
| 1703 | def netr_server_getinfo(self, req): |
no outgoing calls
no test coverage detected
searching dependent graphs…