У меня возникли некоторые трудности с масштабированием сценария путем добавления потоков. Я пишу фаззер для чего-то и решил реализовать queue
, который работает с threading
. Скрипт принимает файл с запросами на фазз, с точками вставки, разделенными %__v__%
. А также файл полезных данных.
Например, при условии, что следующие два файла используются в качестве ввода:
requests_file
Test1: %__v__%
Test2: %__v__%
Test3: %__v__%
Test4: %__v__%
Test5: %__v__%
payloads_file
1
2
3
4
5
Скрипт должен выдавать запросы следующим образом, перебирая все возможности:
Test1: 1
Test1: 2
Test1: 3
Test1: 4
Test1: 5
Test2: 1
Test2: 2
Test2: 3
...
etc.
Я знаю, что это можно реализовать с помощью циклов for без очереди или потоков, но это медленнее, чем с использованием потоков. Я намереваюсь использовать это с некоторыми довольно большими файлами, и делать некоторую обработку в том, что получено.
Я попробовал тонну вещей и, очевидно, просто не понимаю, как работают потоки / очереди. До сих пор я получал вывод, близкий к следующему:
Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 2
Test1: 2
Test1: 2
Test1: 2
Test1: 2
...
Затем он в конечном итоге достигает Test1: 5
и завершается быстрой посылкой Test2 - Test5, например:
Test2: 1
Test3: 1
Test4: 1
Test5: 1
Вот пример того, что я пробовал. Если у меня есть request_file
и payload_file
, я делаю что-то похожее на следующее:
import threading
import queue
threads = 5
def build_wordlist(input_file):
<queue building logic>
return queue
def send(payloads_queue, requests_file):
while not payloads_queue.empty():
p = payload_queue.get()
with open(requests_file) as fin:
for r in fin:
<send logic>
payloads_queue = build_wordlist('payloads.txt')
for i in range(threads):
t = threading.Thread(target=send, args=(payloads_queue,requests_file))
t.start()
Я тоже попробовал противоположное вышесказанному - и получил схожий результат:
import threading
import queue
threads = 5
def build_wordlist(input_file):
<queue building logic>
return queue
def send(requests_queue, payloads_file):
while not requests_queue.empty():
r = requests_queue.get()
with open(payloads_file) as fin:
for r in fin:
<send logic>
requests_queue = build_wordlist('requests.txt')
for i in range(threads):
t = threading.Thread(target=send, args=(requests_queue, payloads_file))
t.start()
Еще одна вещь, которую я попробовал, это вызвать потоки и передать в глобальный список и очередь. Используя ту же логику queue.get (), что и выше, я попытался использовать list.pop()
в глобальном списке, чтобы получить значение для каждого потока. Что-то вроде:
global payloads
payloads = []
def build_wordlist(input_file):
<queue building logic>
return queue
with open(payload_File) as fin:
for payload in fin:
payloads += payload
def send(rq, p):
while not request_queue.empty():
request = request_queue.get()
<send logic>
requests_queue = build_wordlist('requests.txt')
while len(payloads) != 0:
payload = payloads.pop()
for i in range(threads):
t = threading.Thread(target=send, args=(request_queue, payload))
t.start()
Я также пытался перебирать две очереди, загружая оба файла в очереди и перебирая их, чтобы получить похожие результаты, когда первая очередь очищается.
Это сводит меня с ума, так как этого легко добиться, используя итерации без потоков. Извините за длинный пост, это, вероятно, простой ответ, и я что-то упускаю, но сейчас это просто не имеет смысла.
В любом случае, дайте мне знать, если вам нужна дополнительная информация. Я не копировал и не вставлял свой текущий код, но он очень похож на примеры, которые я предоставляю.
Спасибо.