در اختیار گرفتن شل سیستم ها در شبکه با پایتون
همراهان ZeroToHero سلام…
شاید تا بحال با ابزارهایی مثل نت کت کار کرده باشید که این توانایی را به شما میدهند تا بتوانید از راه دور به یک سیستم متصل شده و از آن Shell بگیرید! این قابلیت میتواند در بعضی موارد کار را بسیار آسان کند اما اگر در سیستم مقابل برنامه نت کت نصب نباشد چه میتوان کرد؟معمولا این برنامه روی برخی توزیع های لینوکس مثل کالی به صورت پیش فرض وجود دارد ولی روی ویندوز به صورت پیش فرض نصب نیست و باید آن را نصب کرد. در این مواقع میتوانیم خودمان نت کت خود را بسازیم!
با ZeroToHero همراه باشید….
البته نت کت قابلیت های دیگری نیز دارد اما ما در این مقاله میخواهیم قابلیت shell گرفتن با نت کت را با زبان پایتون پیاده سازی نماییم. تنها با کمی پیش زمینه ابتدایی شبکه و دانش برنامه نویسی با زبان پایتون میتوان این برنامه را پیاده سازی کرد.
خب در ابتدا نیاز هست که کتابخونه هایی رو که لازم داریم ایمپورت کنیم که با دستورات زیر این کار انجام میشود:
import sys,socket import subprocess
خب کتابخونه هایی که لازم داشتیم ایمپورت شدند. حالا باید متد برنامه رو بنویسیم. ببینین ما برای اینکه بتونیم تو شبکه ارتباط برقرار کنیم نیازمند سوکت ها هستیم. هر سوکتی نیازمند به یک آدرس آی پی و یک پورت هست که در ابتدا اون هارو مشخص میکنیم و به سوکتمان bind() میکنیم. چون ما میخواهیم که برنامه روی localhost اجرا کنیم در نتیجه آدرس آی پی رو ۰.۰.۰.۰ قرار میدهیم. شماره پورت را باید یوزر وارد کند چون که کاربر تصمیم گیرنده این است که روی کدام پورت shell خود را در اختیار شما قرار دهد. خب حالا صحبت هایی که تا اینجا کردیم رو تبدیل به کد میکنیم!!!
def main(): ip = "0.0.0.0" port = input("Enter Port:> ") print "Opening port :> " , port sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind((ip,port)) sock.listen(5) print "Opening port :> " , port sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind((ip,port)) sock.listen(5)
خب تا اینجا ما یه سوکت داریم که پس از اینکه کاربر شماره پورت دلخواهش رو وارد کرد میره به حالت listen()!
حالا این سوکت منتظر دریافت کانکشن از سمت یک کلاینت میماند و باید درخواست که آمد آن را بپذیرد! بعد از دریافت کانکشن و برقراری ارتباط کار اصلی شروع میشود. یعنی هر دستوری که از سمت کلاینت آمد باید اجرا شود و خروجی مربوط به آن برای کلاینت فرستاده شود. برای اجرای دستورات shell توسط پایتون میتوان از کتابخانه subprocess که در بالا آن را ایمپورت کرده ایم استفاده کنیم. از آنجا که این کتابخانه هم برای ویندوز و هم لینوکس وجود دارد میتوان این برنامه را در هر دو محیط اجرا کرد. برای اینکه جلوی خطاهای احتمالی را بگیریم حتما از دستورات try و except استفاده میکنیم. به کد زیر توجه کنید:
print "listening on port {}:".format(port) try: conn , add = sock.accept() print "Connection Accepted !\n" conn.send("Shell Is Ready :> ") except socket.error: print "Connectrion Failed!" while True: try: cmd_buff = conn.recv(2048) output = subprocess.check_output(cmd_buff,stderr=subprocess.STDOUT,shell=True) conn.send(output) conn.send("\nShell is Ready :> ") except subprocess.CalledProcessError as hl: print hl conn.send(hl) print cmd_buff
خب کد بالا نشان میدهد که پس از دریافت ارتباط؛ سیستم آماده است که دستوراتی که دریافت میکند را اجرا کرده و سپس برای سیستم کلاینت ارسال کند. حالا دستوری که از سمت کلاینت برسه در shell اجرا میشه و نتیجه برای کلاینت ارسال میشود.
در مقاله های بعدی پروژه های جالبتر و بهتری رو برای علاقه مندان به این شاخه از برنامه نویسی قرار میدهم.
با ZeroToHero همراه باشید…
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.