سلام بچه ها چند وقتی هست که فکرم درگیر نوشتن یه سری اسکریپت هوشمند هست که بتونن خیلی از کارهایی که روی سرور باید توسط ادمین به صورت منظم یا نا منظم انجام بشه رو انجام بدن مثلا اینکه اسکریپتی باشه که مدام صفحات وب رو بررسی بکنه و اگر تغییری مبنی بر هک روی وب سایت صورت گرفته باشه رو تشخیص بده ، خوب برای اینکار ما چندین راه داریم یکی اینکه توی اسکریپت Integrity فایل ها کنترل بشه و یک بار md5 یا sha1 فایل مورد نظر ذخیره بشه و مدام کنترل و مقایسه بشه اما به نظرتون اینجا چه اشکالی هست ؟
خوب یه سری سایت ها هستن که خود فایل به عنوان مثال index.php دائم در حال تغییر هست مثل سایت های فروشگاهی و خبری و … پس Check sum روش مناسبی برای اینکار نیست حالا با این تفاسیر چه روش بهتری برای اینکار هست ؟
یه راه مناسب و بهتر هست اونم چک کردن Keyword روی خود صفحه html هست ، چطوری ؟ یه دایره لغت از سایتهایی که تا بحال هک شدن تهیه میکنیم و به اسکریپتمون میگیم این کلماتو چک کن ، اگه دیدی کارهایی که بهت میگمو انجام بده !
خوب اینطوری بهتر نیست ؟ پس شروع کنیم به نوشتن اسکریپت
اول باید مشخص بکنیم که چه چیز هایی چک بشه و چه کارهایی انجام بده .
1 . یک سری کلمات رو توی یه فایل جدا یا تو دل خود اسکریپت برای کنترل باید قرار بدیم .
2 . اگر Defacement Detect شد چند تا کار انجام بده :
– یه پیامک به ادمین سرور بزن
– یه ایمیلم واسه دلخوشی بزن
– فایل اصلی رو جایگزین صفحه دیفیس شده قرار بده ( که این روش پیشنهاد نمیشه ، چون طرف باز هم دسترسی داره و …)
– با فایروال دسترسی به وب سرور یا صرفا دامینی که مورد حمله قرارگرفته رو ببند .
– کل کارهایی هم که اسکریپت داره انجام میده رو یه جایی لاگ بنداز.
برای شروع اسکریپت از شی بنگ استفاده میکنیم :
#!/bin/bash
خوب حالا باید ببینیم چه آرگومان هایی تو اسکریپت لازم داریم تاریخ ، ایمیل و شماره موبایل ادمین فعلا لازمه ، تاریخ رو هم به شکل مناسب باید تعیین بکنیم :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice'
خوب بعد از مشخص کردن var ها باید کاراهایی که باید انجام بده رو مشخص کنیم . برای اینکه مدام بتونیم ایندکس یا هرجای دیگه وب سایتمون رو ببینیم و فرآیند کنترلی رو روش انجام بدیم از دستوراتی مثل lynx ، wget ، curl و … میتونیم استفاده کنیم . به طور مثال برای wget
wget -o /dev/null -O - http://oslearn.ir
یا برای lynx
lynx -dump oslearn.ir
نکته : اگر lynx نصب نیست از دستور زیر برای نصبش استفاده کنید :
yum install lynx or apt-get install lynx
من توی این اسکریپت از wget استفاده میکنم .
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' wget -o /dev/null -O - http://oslearn.ir
حالا باید بگیم ایندکسی که گرفتی رو با keyword هایی که تعیین میکنیم کنترل کن . نمونه کیورد ها :
Hacked ,HACKED BY,defaced,cyberwar,low security,greets,was here,were here,H4CKED
توی اسکریپت :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' wget -o /dev/null -O - http://oslearn.ir | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED"
اگه این اسکریپت رو اجرا کنید ، کل ایندکس رو نشون میده ، در صورتی که ما فقط به استاتوس کدش احتیاج داریم ، پس باید کل خروجی رو بفرستیم به ناکجاآباد سرور یعنی کجا ؟ /dev/null
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' wget -o /dev/null -O - http://oslearn.ir | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED" > /dev/null
برای دیدن استاتوس کد قبل از شرط هم میتونیم با یه echo $? مشکل رو حل کنیم ، اما این برای تست خودتون هست نیازی به اینکار نداریم . باید شرط بزاریم که اگر استاتوس کد true بود کارایی که لازمه رو انجام بده :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' wget -o /dev/null -O - http://oslearn.ir | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED" > /dev/null if [ $? = 0 ];then echo "Defacement Detected on site" fi
اگه این اسکریپت اجرا بشه و اون کلمات رو پوشش بده یه پیام میده که Defacement دیده شده .
حالا باید با دستور میل به ادمین ایمیل بزنیم . توی شرط به جای echo باید این دستور رو جایگزین کنیم :
mail -s "Defacement Detected on WebSite" $EMAIL
برای ارسال پیامک هم بسته به نوع وب سرویس المان های ارسالی فرق میکنه که باید از جایی که سرویس میگیرید کمک بگیرید اما به طور کلی به شکل زیر هست :
curl --data "username=mohammad&password=oslearn&from=100000000&to=$PHONE&text=Defacement Detected on Website" $WEBSERVICE
خوب اسکریپت به شکل زیر در میاد :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' wget -o /dev/null -O - http://oslearn.ir | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED" > /dev/null if [ $? = 0 ];then mail -s "Defacement Detected on WebSite" $EMAIL curl --data "username=mohammad&password=oslearn&from=100000000&to=$PHONE&text=Defacement Detected on WebSite" $WEBSERVICE fi
بعد از اینکار میتونیم چند تا کار بکنیم ، یکی اینکه دسترسی رو به وب سایت روی فایروال ببندیم یا اینکه کلا وب سرور رو متوقف کنیم .
برای بستن روی فایروال :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' WEB='oslearn.ir' wget -o /dev/null -O - $WEB | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED" > /dev/null if [ $? = 0 ];then /bin/mail -s "Defacement Detected on WebSite" $EMAIL /usr/bin/curl --data "username=mohammad&password=oslearn&from=100000000&to=$PHONE&text=Defacement Detected on WebSite" $WEBSERVICE /sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "Host: $WEB" --algo bm --to 65535 -j DROP /sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "Host: www.$WEB" --algo bm --to 65535 -j DROP /sbin/iptables -A INPUT -p tcp -m tcp --dport 443 -m string --string "Host: $WEB" --algo bm --to 65535 -j DROP /sbin/iptables -A INPUT -p tcp -m tcp --dport 443 -m string --string "Host: www.$WEB" --algo bm --to 65535 -j DROP fi
برای متوقف کردن وب سرور :
#!/bin/bash DATE=`date +"%d-%m-%Y-%I_%M"` EMAIL='mohammad@oslearn.ir' PHONE='09121234567' WEBSERVICE='link webservice' WEB='oslearn.ir' wget -o /dev/null -O - $WEB | grep "Hacked|HACKED BY|defaced|cyberwar|low security|greets|was here|were here|H4CKED" > /dev/null if [ $? = 0 ];then /bin/mail -s "Defacement Detected on WebSite" $EMAIL /usr/bin/curl --data "username=mohammad&password=oslearn&from=100000000&to=$PHONE&text=Defacement Detected on WebSite" $WEBSERVICE /etc/init.d/httpd stop fi
حالا بسته به سلیقه ادمین این اسکریپت قابل تغییر هست .
خوب به نظرتون الان ایراد کار کجاست ؟
ایراد اینجاست که اگه توی مطالب وب سایت کلمه ای باشه که اسکریپت detect کنه و اون کلمه توسط نویسنده های خود وب سایت ایجاد شده باشه ، اسکریپت کار خودشو میکنه راهکار چیه ؟ اگه راهکار خوبی دارید در قالب کامنت بگید ولی در هر صورت توی پست بعد به طور کامل میگم که چطور میشه اون موارد رو exclude کرد .
برای اجرای مرتب هم روی سرور از crontab استفاده کنید .
* * * * * /root/src
لازم به ذکره که نرم افزار برای اینکار خیلی زیاده از جمله inotify و …. اما به نظر شخص بنده اگه یه اسکریپت ساده باشه که باری روی سرور نندازه و کار رو هم انجام بده بهتره .
امیدوارم که از این پست نهایت استفاده رو برده باشید و مفید واقع شده باشه .
سوالی هست بپرسید .
نویسنده : محمد ورمزیار
منبع : او اس لرن دات آی آر